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
tcp/tcb.c@162:fe50a1dcd043, 2020-03-11 (annotated)
- Committer:
- andrewboyson
- Date:
- Wed Mar 11 15:59:49 2020 +0000
- Revision:
- 162:fe50a1dcd043
- Parent:
- 161:89609cf070b4
- Child:
- 164:84b20bcd0941
Addede more fields for TCP connections Ajax
Who changed what in which revision?
User | Revision | Line number | New 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 | 88:1ba13e6062a3 | 9 | #define TCB_COUNT 20 |
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 | 162:fe50a1dcd043 | 64 | HttpAddInt32AsHex(pTcb->bytesSentToRem); HttpAddChar('\t'); |
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 | } |