Andrew Boyson / net

Dependents:   oldheating gps motorhome heating

Committer:
andrewboyson
Date:
Thu Nov 02 08:10:55 2017 +0000
Revision:
49:1a6336f2b3f9
Parent:
44:83ce5ace337b
Child:
52:fbc5a46b5e16
Separated the address handling parts of IP4 and IP6 from the protocol parts.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 37:793b39683406 1 #include "mbed.h"
andrewboyson 37:793b39683406 2 #include "log.h"
andrewboyson 37:793b39683406 3 #include "net.h"
andrewboyson 37:793b39683406 4 #include "action.h"
andrewboyson 37:793b39683406 5 #include "tcp.h"
andrewboyson 37:793b39683406 6 #include "tcb.h"
andrewboyson 37:793b39683406 7 #include "ip4.h"
andrewboyson 37:793b39683406 8 #include "dhcp.h"
andrewboyson 49:1a6336f2b3f9 9 #include "http.h"
andrewboyson 10:f0854784e960 10
andrewboyson 10:f0854784e960 11 #define MAX_MSS 536 //This is 576 - 20 - 20
andrewboyson 10:f0854784e960 12
andrewboyson 10:f0854784e960 13 __packed struct header
andrewboyson 10:f0854784e960 14 {
andrewboyson 10:f0854784e960 15 uint16_t srcPort;
andrewboyson 10:f0854784e960 16 uint16_t dstPort;
andrewboyson 10:f0854784e960 17 uint32_t seqnum;
andrewboyson 10:f0854784e960 18 uint32_t acknum;
andrewboyson 10:f0854784e960 19 uint8_t dataOffset;
andrewboyson 10:f0854784e960 20 uint8_t flags;
andrewboyson 10:f0854784e960 21 uint16_t window;
andrewboyson 10:f0854784e960 22 uint16_t checksum;
andrewboyson 10:f0854784e960 23 uint16_t urgent;
andrewboyson 10:f0854784e960 24 };
andrewboyson 10:f0854784e960 25
andrewboyson 10:f0854784e960 26 uint32_t now = 0;
andrewboyson 10:f0854784e960 27 static void ticked()
andrewboyson 10:f0854784e960 28 {
andrewboyson 10:f0854784e960 29 now++;
andrewboyson 10:f0854784e960 30 TcbReap(now);
andrewboyson 10:f0854784e960 31 }
andrewboyson 10:f0854784e960 32 static Ticker ticker;
andrewboyson 10:f0854784e960 33
andrewboyson 10:f0854784e960 34 void TcpInit()
andrewboyson 10:f0854784e960 35 {
andrewboyson 10:f0854784e960 36 ticker.attach(&ticked, 1);
andrewboyson 10:f0854784e960 37 TcbInit();
andrewboyson 10:f0854784e960 38 }
andrewboyson 10:f0854784e960 39
andrewboyson 10:f0854784e960 40 //Header variables
andrewboyson 10:f0854784e960 41
andrewboyson 10:f0854784e960 42 static uint16_t srcPort;
andrewboyson 10:f0854784e960 43 static uint16_t dstPort;
andrewboyson 10:f0854784e960 44 static uint32_t seqnum;
andrewboyson 10:f0854784e960 45 static uint32_t acknum;
andrewboyson 10:f0854784e960 46 static int headersize;
andrewboyson 10:f0854784e960 47 static uint8_t flags;
andrewboyson 10:f0854784e960 48 static bool URG; //indicates that the Urgent pointer field is significant
andrewboyson 10:f0854784e960 49 static bool ACK; //indicates that the Acknowledgment field is significant. All packets after the initial SYN packet sent by the client should have this flag set.
andrewboyson 10:f0854784e960 50 static bool PSH; //Push function. Asks to push the buffered data to the receiving application.
andrewboyson 10:f0854784e960 51 static bool RST; //Reset the connection
andrewboyson 10:f0854784e960 52 static bool SYN; //Synchronize sequence numbers. Only the first packet sent from each end should have this flag set. Some other flags and fields change meaning based on this flag, and some are only valid for when it is set, and others when it is clear.
andrewboyson 10:f0854784e960 53 static bool FIN; //No more data from sender
andrewboyson 10:f0854784e960 54
andrewboyson 10:f0854784e960 55 static uint16_t window;
andrewboyson 10:f0854784e960 56 static uint16_t checksum;
andrewboyson 10:f0854784e960 57 static uint16_t urgent;
andrewboyson 10:f0854784e960 58 static int optionLength;
andrewboyson 10:f0854784e960 59
andrewboyson 10:f0854784e960 60 static char* pOptions;
andrewboyson 10:f0854784e960 61 static void* pData;
andrewboyson 10:f0854784e960 62 static int dataLength;
andrewboyson 10:f0854784e960 63 static uint16_t mss;
andrewboyson 10:f0854784e960 64
andrewboyson 37:793b39683406 65 void TcpLogHeader(uint16_t calculatedChecksum)
andrewboyson 43:bc028d5a6424 66 {
andrewboyson 43:bc028d5a6424 67 if (NetTraceVerbose)
andrewboyson 43:bc028d5a6424 68 {
andrewboyson 43:bc028d5a6424 69 Log("TCP header\r\n");
andrewboyson 43:bc028d5a6424 70 LogF(" Source port %hu\r\n", srcPort);
andrewboyson 43:bc028d5a6424 71 LogF(" Destination port %hu\r\n", dstPort);
andrewboyson 43:bc028d5a6424 72 LogF(" Sequence number %u\r\n", seqnum);
andrewboyson 43:bc028d5a6424 73 LogF(" Ack number %u\r\n", acknum);
andrewboyson 43:bc028d5a6424 74 LogF(" Header size %u\r\n", headersize);
andrewboyson 43:bc028d5a6424 75 LogF(" Flags %02X", flags);
andrewboyson 43:bc028d5a6424 76 if (URG) LogF(" URG");
andrewboyson 43:bc028d5a6424 77 if (ACK) LogF(" ACK");
andrewboyson 43:bc028d5a6424 78 if (PSH) LogF(" PSH");
andrewboyson 43:bc028d5a6424 79 if (RST) LogF(" RST");
andrewboyson 43:bc028d5a6424 80 if (SYN) LogF(" SYN");
andrewboyson 43:bc028d5a6424 81 if (FIN) LogF(" FIN");
andrewboyson 43:bc028d5a6424 82 LogF("\r\n");
andrewboyson 43:bc028d5a6424 83 LogF(" Window %hu\r\n", window);
andrewboyson 43:bc028d5a6424 84 LogF(" Checksum (hex) %04hX\r\n", checksum);
andrewboyson 43:bc028d5a6424 85 LogF(" Calculated (hex) %04hX\r\n", calculatedChecksum);
andrewboyson 43:bc028d5a6424 86 LogF(" Urgent pointer %hu\r\n", urgent);
andrewboyson 43:bc028d5a6424 87 LogF(" Option length %d\r\n", optionLength);
andrewboyson 43:bc028d5a6424 88 LogF(" Data length %d\r\n", dataLength);
andrewboyson 43:bc028d5a6424 89 }
andrewboyson 43:bc028d5a6424 90 else
andrewboyson 43:bc028d5a6424 91 {
andrewboyson 44:83ce5ace337b 92 LogF("TCP header %hu >>> %hu", srcPort, dstPort);
andrewboyson 44:83ce5ace337b 93 if (URG) Log(" URG");
andrewboyson 44:83ce5ace337b 94 if (ACK) Log(" ACK");
andrewboyson 44:83ce5ace337b 95 if (PSH) Log(" PSH");
andrewboyson 44:83ce5ace337b 96 if (RST) Log(" RST");
andrewboyson 44:83ce5ace337b 97 if (SYN) Log(" SYN");
andrewboyson 44:83ce5ace337b 98 if (FIN) Log(" FIN");
andrewboyson 43:bc028d5a6424 99 LogF("\r\n");
andrewboyson 43:bc028d5a6424 100 }
andrewboyson 10:f0854784e960 101 }
andrewboyson 10:f0854784e960 102 void TcpAddChecksum(void* pPacket, uint16_t checksum)
andrewboyson 10:f0854784e960 103 {
andrewboyson 10:f0854784e960 104 struct header* pHeader = (header*)pPacket;
andrewboyson 10:f0854784e960 105 pHeader->checksum = checksum;
andrewboyson 10:f0854784e960 106 }
andrewboyson 10:f0854784e960 107 static void readOptions()
andrewboyson 10:f0854784e960 108 {
andrewboyson 10:f0854784e960 109 mss = 536; //default MSS for IPv4 [576 - 20(TCP) - 20(IP)];
andrewboyson 10:f0854784e960 110 for (char* p = pOptions; p < pOptions + optionLength; p++)
andrewboyson 10:f0854784e960 111 {
andrewboyson 10:f0854784e960 112 switch (*p)
andrewboyson 10:f0854784e960 113 {
andrewboyson 10:f0854784e960 114 case 0: break; //End of options - used to pad to 32 bit boundary
andrewboyson 10:f0854784e960 115 case 1: break; //NOP, padding - optional
andrewboyson 10:f0854784e960 116 case 2:
andrewboyson 10:f0854784e960 117 p++;
andrewboyson 10:f0854784e960 118 if (*p != 4) LogTimeF("MSS option width %d when expected 4\r\n", *p);
andrewboyson 10:f0854784e960 119 p++;
andrewboyson 10:f0854784e960 120 mss = ((uint16_t)*p) << 8;
andrewboyson 10:f0854784e960 121 p++;
andrewboyson 10:f0854784e960 122 mss += *p;
andrewboyson 10:f0854784e960 123 return;
andrewboyson 10:f0854784e960 124 default: LogTimeF("Unrecognised TCP option %d\r\n", *p);
andrewboyson 10:f0854784e960 125 }
andrewboyson 10:f0854784e960 126 }
andrewboyson 10:f0854784e960 127 if (mss > MAX_MSS) mss = MAX_MSS;
andrewboyson 10:f0854784e960 128 }
andrewboyson 10:f0854784e960 129 static void writeOptions()
andrewboyson 10:f0854784e960 130 {
andrewboyson 10:f0854784e960 131 pOptions[0] = 2;
andrewboyson 10:f0854784e960 132 pOptions[1] = 4;
andrewboyson 10:f0854784e960 133 pOptions[2] = mss >> 8;
andrewboyson 10:f0854784e960 134 pOptions[3] = mss & 0xFF;
andrewboyson 10:f0854784e960 135 optionLength = 4;
andrewboyson 10:f0854784e960 136 }
andrewboyson 10:f0854784e960 137
andrewboyson 10:f0854784e960 138 void TcpReadHeader(void* pPacket, uint16_t size)
andrewboyson 10:f0854784e960 139 {
andrewboyson 10:f0854784e960 140 struct header* pHeader = (header*)pPacket;
andrewboyson 10:f0854784e960 141
andrewboyson 10:f0854784e960 142 srcPort = NetToHost16(pHeader->srcPort);
andrewboyson 10:f0854784e960 143 dstPort = NetToHost16(pHeader->dstPort);
andrewboyson 10:f0854784e960 144 seqnum = NetToHost32(pHeader->seqnum);
andrewboyson 10:f0854784e960 145 acknum = NetToHost32(pHeader->acknum);
andrewboyson 10:f0854784e960 146 headersize = (pHeader->dataOffset >> 2) & 0xFC; //Same as right shifting by 4 bits and multiplying by 4
andrewboyson 10:f0854784e960 147 flags = pHeader->flags;
andrewboyson 10:f0854784e960 148 URG = flags & 0x20; //indicates that the Urgent pointer field is significant
andrewboyson 10:f0854784e960 149 ACK = flags & 0x10; //indicates that the Acknowledgment field is significant. All packets after the initial SYN packet sent by the client should have this flag set.
andrewboyson 10:f0854784e960 150 PSH = flags & 0x08; //Push function. Asks to push the buffered data to the receiving application.
andrewboyson 10:f0854784e960 151 RST = flags & 0x04; //Reset the connection
andrewboyson 10:f0854784e960 152 SYN = flags & 0x02; //Synchronize sequence numbers. Only the first packet sent from each end should have this flag set. Some other flags and fields change meaning based on this flag, and some are only valid for when it is set, and others when it is clear.
andrewboyson 10:f0854784e960 153 FIN = flags & 0x01; //No more data from sender
andrewboyson 10:f0854784e960 154
andrewboyson 10:f0854784e960 155 window = NetToHost16(pHeader->window);
andrewboyson 10:f0854784e960 156 checksum = NetToHost16(pHeader->checksum);
andrewboyson 10:f0854784e960 157 urgent = NetToHost16(pHeader->urgent);
andrewboyson 10:f0854784e960 158 pOptions = (char*)pPacket + 20;
andrewboyson 10:f0854784e960 159 optionLength = headersize - 20;
andrewboyson 10:f0854784e960 160
andrewboyson 10:f0854784e960 161 pData = (char*)pPacket + headersize;
andrewboyson 10:f0854784e960 162 dataLength = size - headersize;
andrewboyson 10:f0854784e960 163 }
andrewboyson 10:f0854784e960 164
andrewboyson 10:f0854784e960 165 void TcpMakeHeader(int size, void* pPacket)
andrewboyson 10:f0854784e960 166 {
andrewboyson 10:f0854784e960 167 struct header* pHeader = (header*)pPacket;
andrewboyson 10:f0854784e960 168
andrewboyson 10:f0854784e960 169 pHeader->dstPort = NetToHost16(dstPort);
andrewboyson 10:f0854784e960 170 pHeader->srcPort = NetToHost16(srcPort);
andrewboyson 10:f0854784e960 171 pHeader->seqnum = NetToHost32(seqnum); //This is the sequence number of the first byte of this message
andrewboyson 10:f0854784e960 172 pHeader->acknum = NetToHost32(acknum); //This is the sequence number we expect in the next message
andrewboyson 10:f0854784e960 173 pHeader->dataOffset = headersize << 2; //Same as dividing by 4 to get bytes and left shifting by 4 bits
andrewboyson 10:f0854784e960 174 flags = 0;
andrewboyson 10:f0854784e960 175 if(URG) flags |= 0x20; //indicates that the Urgent pointer field is significant
andrewboyson 10:f0854784e960 176 if(ACK) flags |= 0x10; //indicates that the Acknowledgment field is significant. All packets after the initial SYN packet sent by the client should have this flag set.
andrewboyson 10:f0854784e960 177 if(PSH) flags |= 0x08; //Push function. Asks to push the buffered data to the receiving application.
andrewboyson 10:f0854784e960 178 if(RST) flags |= 0x04; //Reset the connection
andrewboyson 10:f0854784e960 179 if(SYN) flags |= 0x02; //Synchronize sequence numbers. Only the first packet sent from each end should have this flag set. Some other flags and fields change meaning based on this flag, and some are only valid for when it is set, and others when it is clear.
andrewboyson 10:f0854784e960 180 if(FIN) flags |= 0x01; //No more data from sender
andrewboyson 10:f0854784e960 181 pHeader->flags = flags;
andrewboyson 10:f0854784e960 182 pHeader->window = NetToHost16(window);
andrewboyson 10:f0854784e960 183 pHeader->urgent = NetToHost16(urgent);
andrewboyson 10:f0854784e960 184
andrewboyson 10:f0854784e960 185 pHeader->checksum = 0;
andrewboyson 10:f0854784e960 186 }
andrewboyson 10:f0854784e960 187 static int stateClosed(struct tcb* pTcb)
andrewboyson 10:f0854784e960 188 {
andrewboyson 10:f0854784e960 189 if (!SYN) //Reset if anything other than a request to establish conection from client
andrewboyson 10:f0854784e960 190 {
andrewboyson 10:f0854784e960 191 dataLength = 0;
andrewboyson 10:f0854784e960 192 headersize = 20;
andrewboyson 10:f0854784e960 193 seqnum = acknum;
andrewboyson 10:f0854784e960 194 acknum = 0;
andrewboyson 10:f0854784e960 195 ACK = false; //Send RST
andrewboyson 10:f0854784e960 196 PSH = false;
andrewboyson 10:f0854784e960 197 RST = true;
andrewboyson 10:f0854784e960 198 SYN = false;
andrewboyson 10:f0854784e960 199 FIN = false;
andrewboyson 10:f0854784e960 200 return 1;
andrewboyson 10:f0854784e960 201 }
andrewboyson 10:f0854784e960 202
andrewboyson 10:f0854784e960 203 readOptions(); //Get the MSS
andrewboyson 10:f0854784e960 204 pTcb->mss = mss;
andrewboyson 10:f0854784e960 205
andrewboyson 10:f0854784e960 206 pTcb->state = TCB_SYN_RECEIVED;
andrewboyson 10:f0854784e960 207 pTcb->timer = now;
andrewboyson 10:f0854784e960 208 pTcb->port = srcPort;
andrewboyson 10:f0854784e960 209 pTcb->locIsn = TcbGetIsn();
andrewboyson 10:f0854784e960 210 pTcb->locSeq = pTcb->locIsn;
andrewboyson 10:f0854784e960 211 pTcb->remIsn = seqnum;
andrewboyson 10:f0854784e960 212 pTcb->remSeq = pTcb->remIsn;
andrewboyson 10:f0854784e960 213
andrewboyson 10:f0854784e960 214 pTcb->remSeq += 1; //Add one to acknowledge the SYN
andrewboyson 10:f0854784e960 215 acknum = pTcb->remSeq;
andrewboyson 10:f0854784e960 216
andrewboyson 10:f0854784e960 217 seqnum = pTcb->locSeq; //Set the sequence number to the first byte of this message
andrewboyson 10:f0854784e960 218 pTcb->locSeq += 1; //Add one to the next sequence number as we are sending a SYN
andrewboyson 10:f0854784e960 219
andrewboyson 10:f0854784e960 220 dataLength = 0;
andrewboyson 10:f0854784e960 221
andrewboyson 10:f0854784e960 222 mss = MAX_MSS; //Ethernet 1500 - 20 - 20; or, in our case 768 - 20 - 20
andrewboyson 10:f0854784e960 223 writeOptions();
andrewboyson 10:f0854784e960 224 headersize = 24; //20 header plus 4 option
andrewboyson 10:f0854784e960 225
andrewboyson 10:f0854784e960 226 ACK = true; //Send ACK and SYN
andrewboyson 10:f0854784e960 227 PSH = false;
andrewboyson 10:f0854784e960 228 RST = false;
andrewboyson 10:f0854784e960 229 SYN = true;
andrewboyson 10:f0854784e960 230 FIN = false;
andrewboyson 10:f0854784e960 231
andrewboyson 10:f0854784e960 232 return 1;
andrewboyson 10:f0854784e960 233 }
andrewboyson 10:f0854784e960 234 static int stateSynReceived(struct tcb* pTcb)
andrewboyson 10:f0854784e960 235 {
andrewboyson 10:f0854784e960 236 if (dataLength) LogTimeF("%d bytes data received before TCB established\r\n", dataLength);
andrewboyson 10:f0854784e960 237 if (ACK)
andrewboyson 10:f0854784e960 238 {
andrewboyson 10:f0854784e960 239 pTcb->state = TCB_ESTABLISHED;
andrewboyson 10:f0854784e960 240 pTcb->timer = now;
andrewboyson 10:f0854784e960 241 pTcb->tag = 0;
andrewboyson 10:f0854784e960 242 }
andrewboyson 10:f0854784e960 243 return 0;
andrewboyson 10:f0854784e960 244 }
andrewboyson 10:f0854784e960 245 static int stateEstablished(struct tcb* pTcb)
andrewboyson 10:f0854784e960 246 {
andrewboyson 10:f0854784e960 247 if (!ACK) return 0; //Ignore any packets which don't contain an ACK
andrewboyson 10:f0854784e960 248
andrewboyson 10:f0854784e960 249 //Handle reception of data
andrewboyson 10:f0854784e960 250 if (dataLength)
andrewboyson 10:f0854784e960 251 {
andrewboyson 10:f0854784e960 252 pTcb->tag = HttpRequest(seqnum - pTcb->remIsn - 1, dataLength, (char*)pData);
andrewboyson 10:f0854784e960 253 pTcb->remSeq = seqnum + dataLength;
andrewboyson 10:f0854784e960 254 }
andrewboyson 10:f0854784e960 255 acknum = pTcb->remSeq; //Set the ack num to the next byte expected from the client
andrewboyson 10:f0854784e960 256
andrewboyson 10:f0854784e960 257
andrewboyson 10:f0854784e960 258 //Rearrange the buffers
andrewboyson 10:f0854784e960 259 headersize = 20;
andrewboyson 10:f0854784e960 260 pData = pOptions;
andrewboyson 10:f0854784e960 261
andrewboyson 10:f0854784e960 262 //Handle sending of any data
andrewboyson 21:02c82594c8c0 263 dataLength = HttpReply(pTcb->locSeq - pTcb->locIsn - 1, mss, (char*)pData, pTcb->tag);
andrewboyson 10:f0854784e960 264
andrewboyson 10:f0854784e960 265 seqnum = pTcb->locSeq; //Set the sequence number to the first byte of this message
andrewboyson 10:f0854784e960 266
andrewboyson 10:f0854784e960 267 ACK = true; //Send ACK
andrewboyson 10:f0854784e960 268 RST = false;
andrewboyson 10:f0854784e960 269 SYN = false;
andrewboyson 22:914b970356f0 270 PSH = false;
andrewboyson 10:f0854784e960 271
andrewboyson 22:914b970356f0 272 pTcb->locSeq += dataLength; //Record the next sequence number
andrewboyson 22:914b970356f0 273
andrewboyson 22:914b970356f0 274 if (dataLength < mss) //If a part packet then there can be no more to send
andrewboyson 10:f0854784e960 275 {
andrewboyson 22:914b970356f0 276 FIN = true; //Inform the client that we have no more to send after this
andrewboyson 22:914b970356f0 277 pTcb->locSeq += 1; //Record the FIN in the sequence
andrewboyson 10:f0854784e960 278 pTcb->state = TCB_CLOSING; //Start closing
andrewboyson 10:f0854784e960 279 }
andrewboyson 22:914b970356f0 280
andrewboyson 10:f0854784e960 281 pTcb->timer = now;
andrewboyson 10:f0854784e960 282 return 1;
andrewboyson 10:f0854784e960 283 }
andrewboyson 10:f0854784e960 284 static int stateClosing(struct tcb* pTcb)
andrewboyson 10:f0854784e960 285 {
andrewboyson 10:f0854784e960 286 if (!FIN) return 0; //Ignore any packets which don't contain a FIN
andrewboyson 10:f0854784e960 287
andrewboyson 10:f0854784e960 288 pTcb->remSeq += 1; //Add one to acknowledge the FIN
andrewboyson 10:f0854784e960 289 acknum = pTcb->remSeq;
andrewboyson 10:f0854784e960 290
andrewboyson 10:f0854784e960 291 seqnum = pTcb->locSeq; //Set the sequence number to the first byte of this message
andrewboyson 10:f0854784e960 292 //but don't change it for the next
andrewboyson 10:f0854784e960 293
andrewboyson 10:f0854784e960 294 ACK = true; //Send ACK
andrewboyson 10:f0854784e960 295 PSH = false;
andrewboyson 10:f0854784e960 296 RST = false;
andrewboyson 10:f0854784e960 297 SYN = false;
andrewboyson 10:f0854784e960 298 FIN = false;
andrewboyson 10:f0854784e960 299
andrewboyson 10:f0854784e960 300 headersize = 20;
andrewboyson 10:f0854784e960 301 dataLength = 0;
andrewboyson 10:f0854784e960 302
andrewboyson 10:f0854784e960 303 pTcb->state = TCB_CLOSED;
andrewboyson 10:f0854784e960 304
andrewboyson 10:f0854784e960 305 return 1;
andrewboyson 10:f0854784e960 306 }
andrewboyson 10:f0854784e960 307
andrewboyson 37:793b39683406 308 int TcpHandleReceivedPacket(void (*traceback)(void), int* pSize, void* pPacket)
andrewboyson 10:f0854784e960 309 {
andrewboyson 10:f0854784e960 310 struct tcb* pTcb = TcbGetExisting(srcPort);
andrewboyson 10:f0854784e960 311 if (!pTcb) pTcb = TcbGetEmpty();
andrewboyson 10:f0854784e960 312 if (!pTcb) return DO_NOTHING; //Bomb out if no more tcbs are available
andrewboyson 10:f0854784e960 313
andrewboyson 10:f0854784e960 314 if (RST)
andrewboyson 10:f0854784e960 315 {
andrewboyson 10:f0854784e960 316 pTcb->state = TCB_CLOSED; //Reset connection
andrewboyson 10:f0854784e960 317 return DO_NOTHING; //Bomb out
andrewboyson 10:f0854784e960 318 }
andrewboyson 10:f0854784e960 319
andrewboyson 10:f0854784e960 320 switch (dstPort)
andrewboyson 10:f0854784e960 321 {
andrewboyson 10:f0854784e960 322 case 80: break;
andrewboyson 10:f0854784e960 323 default: return DO_NOTHING; //This needs to become a reset
andrewboyson 10:f0854784e960 324 }
andrewboyson 10:f0854784e960 325
andrewboyson 10:f0854784e960 326 //Drop duplicate packets
andrewboyson 10:f0854784e960 327 //if (!TCB_CLOSED && (int32_t)(seqnum - pTcb->remSeq) < 0)
andrewboyson 10:f0854784e960 328 //{
andrewboyson 10:f0854784e960 329 // LogTimeF("Dropped duplicate seq num=%d expected=%d packet length %d from port %u\r\n", seqnum, pTcb->remSeq, size, srcPort);
andrewboyson 10:f0854784e960 330 // return IP4_DO_NOTHING;
andrewboyson 10:f0854784e960 331 //}
andrewboyson 10:f0854784e960 332
andrewboyson 10:f0854784e960 333 switch (pTcb->state)
andrewboyson 10:f0854784e960 334 {
andrewboyson 10:f0854784e960 335 case TCB_CLOSED: if (stateClosed (pTcb)) break; return DO_NOTHING;
andrewboyson 10:f0854784e960 336 case TCB_SYN_RECEIVED: if (stateSynReceived(pTcb)) break; return DO_NOTHING;
andrewboyson 10:f0854784e960 337 case TCB_ESTABLISHED: if (stateEstablished(pTcb)) break; return DO_NOTHING;
andrewboyson 10:f0854784e960 338 case TCB_CLOSING: if (stateClosing (pTcb)) break; return DO_NOTHING;
andrewboyson 10:f0854784e960 339 }
andrewboyson 10:f0854784e960 340
andrewboyson 10:f0854784e960 341 srcPort = dstPort;
andrewboyson 10:f0854784e960 342 dstPort = pTcb->port;
andrewboyson 10:f0854784e960 343
andrewboyson 10:f0854784e960 344 *pSize = dataLength + headersize;
andrewboyson 10:f0854784e960 345 return UNICAST;
andrewboyson 10:f0854784e960 346
andrewboyson 10:f0854784e960 347 }