A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.

Dependents:   oldheating gps motorhome heating

Committer:
andrewboyson
Date:
Tue Mar 31 10:52:21 2020 +0000
Revision:
164:84b20bcd0941
Parent:
162:fe50a1dcd043
Child:
168:59d286f933a0
Corrected a bug whereby a TCP connection which was closed by the client (FIN) without ever being used was not closed (FIN) and so the client would keep it alive until we ran out of TCP connections.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 61:aad055f1b0d1 1 #include <stdint.h>
andrewboyson 61:aad055f1b0d1 2
andrewboyson 161:89609cf070b4 3 #include "log.h"
andrewboyson 161:89609cf070b4 4 #include "tcp.h"
andrewboyson 161:89609cf070b4 5 #include "tcb.h"
andrewboyson 161:89609cf070b4 6 #include "http.h"
andrewboyson 161:89609cf070b4 7 #include "mstimer.h"
andrewboyson 52:fbc5a46b5e16 8
andrewboyson 164:84b20bcd0941 9 #define TCB_COUNT 40
andrewboyson 10:f0854784e960 10
andrewboyson 10:f0854784e960 11 struct tcb tcbs[TCB_COUNT];
andrewboyson 10:f0854784e960 12
andrewboyson 10:f0854784e960 13 uint32_t TcbGetIsn()
andrewboyson 10:f0854784e960 14 {
andrewboyson 10:f0854784e960 15 static uint32_t isn = 0;
andrewboyson 10:f0854784e960 16 isn += 100000; //Gives each tcb 100,000 packets and won't repeat before 42,940 tcbs.
andrewboyson 10:f0854784e960 17 return isn;
andrewboyson 10:f0854784e960 18 }
andrewboyson 80:4ef1500fca1d 19 struct tcb* TcbGetExisting(int ipType, int remArIndex, int locIpScope, uint16_t remPort, uint16_t locPort)
andrewboyson 10:f0854784e960 20 {
andrewboyson 10:f0854784e960 21 for (int i = 0; i < TCB_COUNT; i++)
andrewboyson 10:f0854784e960 22 {
andrewboyson 10:f0854784e960 23 struct tcb* pTcb = tcbs + i;
andrewboyson 78:9d8fc88df405 24 if (pTcb->state &&
andrewboyson 78:9d8fc88df405 25 pTcb->ipType == ipType &&
andrewboyson 78:9d8fc88df405 26 pTcb->remArIndex == remArIndex &&
andrewboyson 80:4ef1500fca1d 27 pTcb->locIpScope == locIpScope &&
andrewboyson 80:4ef1500fca1d 28 pTcb->remPort == remPort &&
andrewboyson 80:4ef1500fca1d 29 pTcb->locPort == locPort) return pTcb;
andrewboyson 10:f0854784e960 30 }
andrewboyson 10:f0854784e960 31 return NULL;
andrewboyson 10:f0854784e960 32 }
andrewboyson 10:f0854784e960 33 struct tcb* TcbGetEmpty()
andrewboyson 10:f0854784e960 34 {
andrewboyson 10:f0854784e960 35 for (int i = 0; i < TCB_COUNT; i++)
andrewboyson 10:f0854784e960 36 {
andrewboyson 10:f0854784e960 37 struct tcb* pTcb = tcbs + i;
andrewboyson 57:e0fb648acf48 38 if (pTcb->state == TCB_EMPTY) return pTcb;
andrewboyson 10:f0854784e960 39 }
andrewboyson 10:f0854784e960 40 return NULL;
andrewboyson 10:f0854784e960 41 }
andrewboyson 83:08c983006a6e 42 struct tcb* TcbGetNext(struct tcb* pTcb)
andrewboyson 74:c3756bfa960e 43 {
andrewboyson 83:08c983006a6e 44 if (!pTcb) return tcbs; //Initialise if passed NULL
andrewboyson 83:08c983006a6e 45 ++pTcb; //Increment
andrewboyson 83:08c983006a6e 46 if (pTcb < tcbs + TCB_COUNT) return pTcb;
andrewboyson 83:08c983006a6e 47 else return tcbs;
andrewboyson 83:08c983006a6e 48
andrewboyson 74:c3756bfa960e 49 }
andrewboyson 161:89609cf070b4 50 void TcbSendAjax()
andrewboyson 161:89609cf070b4 51 {
andrewboyson 161:89609cf070b4 52 for (int i = 0; i < TCB_COUNT; i++)
andrewboyson 161:89609cf070b4 53 {
andrewboyson 161:89609cf070b4 54 struct tcb* pTcb = tcbs + i;
andrewboyson 161:89609cf070b4 55 if (pTcb->state)
andrewboyson 161:89609cf070b4 56 {
andrewboyson 162:fe50a1dcd043 57 HttpAddByteAsHex (pTcb->state); HttpAddChar('\t');
andrewboyson 161:89609cf070b4 58 HttpAddInt32AsHex(MsTimerCount - pTcb->timeLastRcvd); HttpAddChar('\t');
andrewboyson 161:89609cf070b4 59 HttpAddInt16AsHex(pTcb->ipType); HttpAddChar('\t');
andrewboyson 161:89609cf070b4 60 HttpAddInt32AsHex(pTcb->remArIndex); HttpAddChar('\t');
andrewboyson 162:fe50a1dcd043 61 HttpAddInt16AsHex(pTcb->locPort); HttpAddChar('\t');
andrewboyson 162:fe50a1dcd043 62 HttpAddInt16AsHex(pTcb->remPort); HttpAddChar('\t');
andrewboyson 162:fe50a1dcd043 63 HttpAddInt32AsHex(pTcb->bytesRcvdFromRem); HttpAddChar('\t');
andrewboyson 164:84b20bcd0941 64 HttpAddInt32AsHex(pTcb->bytesSentToRem); HttpAddChar('\n');
andrewboyson 161:89609cf070b4 65 }
andrewboyson 161:89609cf070b4 66 }
andrewboyson 161:89609cf070b4 67 }
andrewboyson 161:89609cf070b4 68
andrewboyson 156:be12b8fd5b21 69 int TcbGetId(struct tcb* pTcb) //0 means none
andrewboyson 156:be12b8fd5b21 70 {
andrewboyson 156:be12b8fd5b21 71 return pTcb - tcbs + 1;
andrewboyson 156:be12b8fd5b21 72 }
andrewboyson 10:f0854784e960 73 void TcbInit()
andrewboyson 10:f0854784e960 74 {
andrewboyson 57:e0fb648acf48 75 for (int i = 0; i < TCB_COUNT; i++) tcbs[i].state = TCB_EMPTY;
andrewboyson 52:fbc5a46b5e16 76 }