00001
00002
00003
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 #define __TCP_C
00069
00070 #include "TCPIP.h"
00071
00072
00073
00074
00075
00076
00077
00078 #define LOCAL_PORT_START_NUMBER (1024u)
00079
00080 #define LOCAL_PORT_END_NUMBER (5000u)
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 #define TCP_OPTIMIZE_FOR_SIZE
00095
00096
00097
00098
00099
00100 #if defined(__C30__) && !defined(TCP_OPTIMIZE_FOR_SIZE)
00101 #define TCP_OPTIMIZE_FOR_SIZE
00102 #elif defined(__C32__) && defined(TCP_OPTIMIZE_FOR_SIZE)
00103 #undef TCP_OPTIMIZE_FOR_SIZE
00104 #endif
00105
00106
00107 #define TCP_MAX_SEG_SIZE (536u)
00108
00109
00110 #define TCP_START_TIMEOUT_VAL ((TICK)TICK_SECOND*1) // Timeout to retransmit unacked data
00111 #define TCP_DELAYED_ACK_TIMEOUT ((TICK)TICK_SECOND/10) // Timeout for delayed-acknowledgement algorithm
00112 #define TCP_FIN_WAIT_2_TIMEOUT ((TICK)TICK_SECOND*5) // Timeout for FIN WAIT 2 state
00113 #define TCP_KEEP_ALIVE_TIMEOUT ((TICK)TICK_SECOND*10) // Timeout for keep-alive messages when no traffic is sent
00114 #define TCP_CLOSE_WAIT_TIMEOUT ((TICK)TICK_SECOND/5) // Timeout for the CLOSE_WAIT state
00115 #define TCP_MAX_RETRIES (5u) // Maximum number of retransmission attempts
00116 #define TCP_MAX_UNACKED_KEEP_ALIVES (6u) // Maximum number of keep-alive messages that can be sent without receiving a response before automatically closing the connection
00117 #define TCP_MAX_SYN_RETRIES (2u) // Smaller than all other retries to reduce SYN flood DoS duration
00118
00119 #define TCP_AUTO_TRANSMIT_TIMEOUT_VAL (TICK_SECOND/25ull) // Timeout before automatically tranmitting unflushed data
00120
00121 #define TCP_SYN_QUEUE_MAX_ENTRIES (3u) // Number of TCP RX SYN packets to save if they cannot be serviced immediately
00122 #define TCP_SYN_QUEUE_TIMEOUT ((TICK)TICK_SECOND*3) // Timeout for when SYN queue entries are deleted if unserviceable
00123
00124
00125
00126
00127
00128
00129 #define FIN (0x01) // FIN Flag as defined in RFC
00130 #define SYN (0x02) // SYN Flag as defined in RFC
00131 #define RST (0x04) // Reset Flag as defined in RFC
00132 #define PSH (0x08) // Push Flag as defined in RFC
00133 #define ACK (0x10) // Acknowledge Flag as defined in RFC
00134 #define URG (0x20) // Urgent Flag as defined in RFC
00135
00136
00137 typedef struct _TCP_HEADER
00138 {
00139 WORD SourcePort;
00140 WORD DestPort;
00141 DWORD SeqNumber;
00142 DWORD AckNumber;
00143
00144 struct
00145 {
00146 unsigned char Reserved3 : 4;
00147 unsigned char Val : 4;
00148 } DataOffset;
00149
00150 union
00151 {
00152 struct
00153 {
00154 unsigned char flagFIN : 1;
00155 unsigned char flagSYN : 1;
00156 unsigned char flagRST : 1;
00157 unsigned char flagPSH : 1;
00158 unsigned char flagACK : 1;
00159 unsigned char flagURG : 1;
00160 unsigned char Reserved2 : 2;
00161 } bits;
00162 BYTE byte;
00163 } Flags;
00164
00165 WORD Window;
00166 WORD Checksum;
00167 WORD UrgentPointer;
00168 } TCP_HEADER;
00169
00170 #define TCP_OPTIONS_END_OF_LIST (0x00u) // End of List TCP Option Flag
00171 #define TCP_OPTIONS_NO_OP (0x01u) // No Op TCP Option
00172 #define TCP_OPTIONS_MAX_SEG_SIZE (0x02u) // Maximum segment size TCP flag
00173 typedef struct _TCP_OPTIONS
00174 {
00175 BYTE Kind;
00176 BYTE Length;
00177 WORD_VAL MaxSegSize;
00178 } TCP_OPTIONS;
00179
00180
00181
00182
00183
00184 typedef struct
00185 {
00186 NODE_INFO niSourceAddress;
00187 WORD wSourcePort;
00188 DWORD dwSourceSEQ;
00189 WORD wDestPort;
00190 WORD wTimestamp;
00191 } TCP_SYN_QUEUE;
00192
00193
00194 #if defined(STACK_CLIENT_MODE)
00195 static WORD NextPort __attribute__((persistent));
00196 #endif
00197
00198
00199
00200
00201
00202
00203
00204 #define TCP_SOCKET_COUNT (sizeof(TCPSocketInitializer)/sizeof(TCPSocketInitializer[0]))
00205
00206
00207 #if defined(HI_TECH_C)
00208
00209
00210 #pragma psect bigdata=TCB_uRAM_BIG
00211 #pragma psect data=TCB_uRAM
00212 static TCB_STUB TCBStubs[TCP_SOCKET_COUNT] = {'\0'};
00213 #pragma psect data=ordinary_data_sect
00214 #pragma psect bigdata=ordinary_data_sect_big
00215 #else
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 #pragma udata TCB_uRAM
00231 static TCB_STUB TCBStubs[TCP_SOCKET_COUNT];
00232 #pragma udata // Return to any other RAM section
00233 #endif
00234
00235 static TCB MyTCB;
00236 static TCP_SOCKET hCurrentTCP = INVALID_SOCKET;
00237 #if TCP_SYN_QUEUE_MAX_ENTRIES
00238 #pragma udata SYN_QUEUE_RAM_SECT
00239 static TCP_SYN_QUEUE SYNQueue[TCP_SYN_QUEUE_MAX_ENTRIES];
00240 #pragma udata
00241 #endif
00242
00243
00244
00245
00246
00247
00248 static void TCPRAMCopy(PTR_BASE wDest, BYTE vDestType, PTR_BASE wSource, BYTE vSourceType, WORD wLength);
00249
00250 #if defined(__18CXX)
00251 static void TCPRAMCopyROM(PTR_BASE wDest, BYTE wDestType, ROM BYTE* wSource, WORD wLength);
00252 #else
00253 #define TCPRAMCopyROM(a,b,c,d) TCPRAMCopy(a,b,c,TCP_PIC_RAM,d)
00254 #endif
00255
00256 static void SendTCP(BYTE vTCPFlags, BYTE vSendFlags);
00257 static void HandleTCPSeg(TCP_HEADER* h, WORD len);
00258 static BOOL FindMatchingSocket(TCP_HEADER* h, NODE_INFO* remote);
00259 static void SwapTCPHeader(TCP_HEADER* header);
00260 static void CloseSocket(void);
00261 static void SyncTCB(void);
00262
00263
00264 #define SENDTCP_RESET_TIMERS 0x01
00265
00266 #define SENDTCP_KEEP_ALIVE 0x02
00267
00268
00269
00270
00271
00272
00273
00274 #if defined(TCP_OPTIMIZE_FOR_SIZE)
00275 static TCB_STUB MyTCBStub;
00276
00277
00278
00279 static void SyncTCBStub(TCP_SOCKET hTCP)
00280 {
00281 if(hCurrentTCP == hTCP)
00282 return;
00283
00284 if(hCurrentTCP != INVALID_SOCKET)
00285 {
00286
00287 memcpy((void*)&TCBStubs[hCurrentTCP], (void*)&MyTCBStub, sizeof(MyTCBStub));
00288 }
00289
00290 hCurrentTCP = hTCP;
00291
00292 if(hTCP == INVALID_SOCKET)
00293 return;
00294
00295
00296 memcpy((void*)&MyTCBStub, (void*)&TCBStubs[hTCP], sizeof(MyTCBStub));
00297 }
00298 #else
00299
00300
00301 #define SyncTCBStub(a) hCurrentTCP = a
00302
00303 #define MyTCBStub TCBStubs[hCurrentTCP]
00304 #endif
00305
00306
00307
00308
00309
00310 static void SyncTCB(void)
00311 {
00312 static TCP_SOCKET hLastTCB = INVALID_SOCKET;
00313
00314 if(hLastTCB == hCurrentTCP)
00315 return;
00316
00317 if(hLastTCB != INVALID_SOCKET)
00318 {
00319
00320 TCPRAMCopy(TCBStubs[hLastTCB].bufferTxStart - sizeof(MyTCB), TCBStubs[hLastTCB].vMemoryMedium, (PTR_BASE)&MyTCB, TCP_PIC_RAM, sizeof(MyTCB));
00321 }
00322
00323
00324 hLastTCB = hCurrentTCP;
00325 TCPRAMCopy((PTR_BASE)&MyTCB, TCP_PIC_RAM, TCBStubs[hCurrentTCP].bufferTxStart - sizeof(MyTCB), TCBStubs[hLastTCB].vMemoryMedium, sizeof(MyTCB));
00326 }
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354 void TCPInit(void)
00355 {
00356 BYTE i;
00357 BYTE vSocketsAllocated;
00358 WORD wTXSize, wRXSize;
00359 PTR_BASE ptrBaseAddress;
00360 BYTE vMedium;
00361 #if TCP_ETH_RAM_SIZE > 0
00362 WORD wCurrentETHAddress = TCP_ETH_RAM_BASE_ADDRESS;
00363 #endif
00364 #if TCP_PIC_RAM_SIZE > 0
00365 PTR_BASE ptrCurrentPICAddress = TCP_PIC_RAM_BASE_ADDRESS;
00366 #endif
00367 #if TCP_SPI_RAM_SIZE > 0
00368 WORD wCurrentSPIAddress = TCP_SPI_RAM_BASE_ADDRESS;
00369 #endif
00370
00371
00372 #if TCP_SYN_QUEUE_MAX_ENTRIES
00373 memset((void*)SYNQueue, 0x00, sizeof(SYNQueue));
00374 #endif
00375
00376
00377 vSocketsAllocated = 0;
00378 for(i = 0; i < TCP_SOCKET_COUNT; i++)
00379 {
00380
00381 SyncTCBStub(i);
00382 SyncTCB();
00383
00384 vMedium = TCPSocketInitializer[i].vMemoryMedium;
00385 wTXSize = TCPSocketInitializer[i].wTXBufferSize;
00386 wRXSize = TCPSocketInitializer[i].wRXBufferSize;
00387
00388 switch(vMedium)
00389 {
00390 #if TCP_ETH_RAM_SIZE > 0
00391 case TCP_ETH_RAM:
00392 ptrBaseAddress = wCurrentETHAddress;
00393 wCurrentETHAddress += sizeof(TCB) + wTXSize+1 + wRXSize+1;
00394
00395
00396 while(wCurrentETHAddress > TCP_ETH_RAM_BASE_ADDRESS + TCP_ETH_RAM_SIZE);
00397 break;
00398 #endif
00399
00400 #if TCP_PIC_RAM_SIZE > 0
00401 case TCP_PIC_RAM:
00402 ptrBaseAddress = ptrCurrentPICAddress;
00403 ptrCurrentPICAddress += sizeof(TCB) + wTXSize+1 + wRXSize+1;
00404
00405
00406 while(ptrCurrentPICAddress > TCP_PIC_RAM_BASE_ADDRESS + TCP_PIC_RAM_SIZE);
00407 break;
00408 #endif
00409
00410 #if TCP_SPI_RAM_SIZE > 0
00411 case TCP_SPI_RAM:
00412 ptrBaseAddress = wCurrentSPIAddress;
00413 wCurrentSPIAddress += sizeof(TCB) + wTXSize+1 + wRXSize+1;
00414
00415
00416 while(wCurrentSPIAddress > TCP_SPI_RAM_BASE_ADDRESS + TCP_SPI_RAM_SIZE);
00417 break;
00418 #endif
00419
00420 default:
00421 while(1);
00422 }
00423
00424 MyTCB.vSocketPurpose = TCPSocketInitializer[i].vSocketPurpose;
00425
00426 MyTCBStub.vMemoryMedium = vMedium;
00427 MyTCBStub.bufferTxStart = ptrBaseAddress + sizeof(TCB);
00428 MyTCBStub.bufferRxStart = MyTCBStub.bufferTxStart + wTXSize + 1;
00429 MyTCBStub.bufferEnd = MyTCBStub.bufferRxStart + wRXSize;
00430 MyTCBStub.smState = TCP_CLOSED;
00431 MyTCBStub.Flags.bServer = FALSE;
00432 #if defined(STACK_USE_SSL)
00433 MyTCBStub.sslStubID = SSL_INVALID_ID;
00434 #endif
00435
00436 CloseSocket();
00437 }
00438 }
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530 TCP_SOCKET TCPOpen(DWORD dwRemoteHost, BYTE vRemoteHostType, WORD wPort, BYTE vSocketPurpose)
00531 {
00532 TCP_SOCKET hTCP;
00533
00534
00535 for(hTCP = 0; hTCP < TCP_SOCKET_COUNT; hTCP++)
00536 {
00537 SyncTCBStub(hTCP);
00538
00539
00540 if(MyTCBStub.smState != TCP_CLOSED)
00541 continue;
00542
00543 SyncTCB();
00544
00545
00546 if(MyTCB.vSocketPurpose != vSocketPurpose)
00547 continue;
00548
00549
00550 if(vRemoteHostType == TCP_OPEN_SERVER)
00551 {
00552 MyTCB.localPort.Val = wPort;
00553 MyTCBStub.Flags.bServer = TRUE;
00554 MyTCBStub.smState = TCP_LISTEN;
00555 MyTCBStub.remoteHash.Val = wPort;
00556 #if defined(STACK_USE_SSL_SERVER)
00557 MyTCB.localSSLPort.Val = 0;
00558 #endif
00559 }
00560
00561 else
00562 {
00563 #if defined(STACK_CLIENT_MODE)
00564 {
00565
00566
00567 if(NextPort < LOCAL_PORT_START_NUMBER || NextPort > LOCAL_PORT_END_NUMBER)
00568 NextPort = LOCAL_PORT_START_NUMBER;
00569
00570
00571 MyTCB.localPort.Val = NextPort++;
00572 MyTCB.remotePort.Val = wPort;
00573
00574
00575 MyTCBStub.eventTime = TickGet();
00576 MyTCBStub.Flags.bTimerEnabled = 1;
00577 MyTCBStub.Flags.bSocketReset = 0;
00578
00579 switch(vRemoteHostType)
00580 {
00581 #if defined(STACK_USE_DNS)
00582 case TCP_OPEN_RAM_HOST:
00583 case TCP_OPEN_ROM_HOST:
00584 MyTCB.remote.dwRemoteHost = dwRemoteHost;
00585 MyTCB.flags.bRemoteHostIsROM = (vRemoteHostType == TCP_OPEN_ROM_HOST);
00586 MyTCBStub.smState = TCP_GET_DNS_MODULE;
00587 break;
00588 #endif
00589
00590 case TCP_OPEN_IP_ADDRESS:
00591
00592
00593
00594 MyTCBStub.remoteHash.Val = (((DWORD_VAL*)&dwRemoteHost)->w[1]+((DWORD_VAL*)&dwRemoteHost)->w[0] + wPort) ^ MyTCB.localPort.Val;
00595 MyTCB.remote.niRemoteMACIP.IPAddr.Val = dwRemoteHost;
00596 MyTCB.retryCount = 0;
00597 MyTCB.retryInterval = (TICK_SECOND/4)/256;
00598 MyTCBStub.smState = TCP_GATEWAY_SEND_ARP;
00599 break;
00600
00601 case TCP_OPEN_NODE_INFO:
00602 MyTCBStub.remoteHash.Val = (((NODE_INFO*)(PTR_BASE)dwRemoteHost)->IPAddr.w[1]+((NODE_INFO*)(PTR_BASE)dwRemoteHost)->IPAddr.w[0] + wPort) ^ MyTCB.localPort.Val;
00603 memcpy((void*)(BYTE*)&MyTCB.remote, (void*)(BYTE*)(PTR_BASE)dwRemoteHost, sizeof(NODE_INFO));
00604 MyTCBStub.smState = TCP_SYN_SENT;
00605 SendTCP(SYN, SENDTCP_RESET_TIMERS);
00606 break;
00607 }
00608 }
00609 #else
00610 {
00611 return INVALID_SOCKET;
00612 }
00613 #endif
00614 }
00615
00616 return hTCP;
00617 }
00618
00619
00620 return INVALID_SOCKET;
00621 }
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660 BOOL TCPWasReset(TCP_SOCKET hTCP)
00661 {
00662 SyncTCBStub(hTCP);
00663
00664 if(MyTCBStub.Flags.bSocketReset)
00665 {
00666 MyTCBStub.Flags.bSocketReset = 0;
00667 return TRUE;
00668 }
00669
00670 return FALSE;
00671 }
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702 BOOL TCPIsConnected(TCP_SOCKET hTCP)
00703 {
00704 SyncTCBStub(hTCP);
00705 return (MyTCBStub.smState == TCP_ESTABLISHED);
00706 }
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740 void TCPDisconnect(TCP_SOCKET hTCP)
00741 {
00742 SyncTCBStub(hTCP);
00743
00744
00745
00746
00747
00748
00749
00750
00751 MyTCBStub.rxTail = MyTCBStub.rxHead;
00752
00753 switch(MyTCBStub.smState)
00754 {
00755 #if defined(STACK_CLIENT_MODE) && defined(STACK_USE_DNS)
00756 case TCP_DNS_RESOLVE:
00757 DNSEndUsage();
00758 CloseSocket();
00759 break;
00760 #endif
00761
00762 case TCP_SYN_SENT:
00763 CloseSocket();
00764 break;
00765
00766 case TCP_SYN_RECEIVED:
00767 case TCP_ESTABLISHED:
00768 #if defined(STACK_USE_SSL)
00769
00770 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
00771 {
00772
00773 SSLTxRecord(hTCP, MyTCBStub.sslStubID, SSL_APPLICATION);
00774 SSLTxMessage(hTCP, MyTCBStub.sslStubID, SSL_ALERT_CLOSE_NOTIFY);
00775 }
00776 #endif
00777
00778
00779 SendTCP(FIN | ACK, SENDTCP_RESET_TIMERS);
00780 MyTCBStub.smState = TCP_FIN_WAIT_1;
00781 break;
00782
00783 case TCP_CLOSE_WAIT:
00784
00785 SendTCP(FIN | ACK, SENDTCP_RESET_TIMERS);
00786 MyTCBStub.smState = TCP_LAST_ACK;
00787 break;
00788
00789
00790
00791
00792
00793
00794
00795
00796 case TCP_CLOSED_BUT_RESERVED:
00797 MyTCBStub.smState = TCP_CLOSED;
00798 break;
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809 case TCP_FIN_WAIT_1:
00810 case TCP_FIN_WAIT_2:
00811 case TCP_LAST_ACK:
00812 default:
00813 SendTCP(RST | ACK, 0);
00814 CloseSocket();
00815 break;
00816 }
00817 }
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843 SOCKET_INFO* TCPGetRemoteInfo(TCP_SOCKET hTCP)
00844 {
00845 static SOCKET_INFO RemoteInfo;
00846
00847 SyncTCB();
00848 memcpy((void*)&RemoteInfo.remote, (void*)&MyTCB.remote, sizeof(NODE_INFO));
00849 RemoteInfo.remotePort.Val = MyTCB.remotePort.Val;
00850
00851 return &RemoteInfo;
00852 }
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887 void TCPFlush(TCP_SOCKET hTCP)
00888 {
00889 SyncTCBStub(hTCP);
00890 SyncTCB();
00891
00892
00893
00894 if(MyTCBStub.txHead != MyTCB.txUnackedTail)
00895 {
00896
00897 SendTCP(ACK, SENDTCP_RESET_TIMERS);
00898 }
00899 }
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924 WORD TCPIsPutReady(TCP_SOCKET hTCP)
00925 {
00926 BYTE i;
00927
00928 SyncTCBStub(hTCP);
00929
00930 i = MyTCBStub.smState;
00931
00932
00933 if(!( (i == TCP_ESTABLISHED) || (i == TCP_CLOSE_WAIT) ))
00934 return 0;
00935
00936
00937 #if defined(STACK_USE_SSL)
00938 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
00939 {
00940 WORD rem;
00941
00942
00943 if(MyTCBStub.sslTxHead >= MyTCBStub.txTail)
00944 rem = (MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart - 1) - (MyTCBStub.sslTxHead - MyTCBStub.txTail);
00945 else
00946 rem = MyTCBStub.txTail - MyTCBStub.sslTxHead - 1;
00947
00948
00949 if(rem > 22)
00950 return rem - 22;
00951 else
00952 return 0;
00953 }
00954 #endif
00955
00956 if(MyTCBStub.txHead >= MyTCBStub.txTail)
00957 return (MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart - 1) - (MyTCBStub.txHead - MyTCBStub.txTail);
00958 else
00959 return MyTCBStub.txTail - MyTCBStub.txHead - 1;
00960 }
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981 BOOL TCPPut(TCP_SOCKET hTCP, BYTE byte)
00982 {
00983 WORD wFreeTXSpace;
00984
00985 SyncTCBStub(hTCP);
00986
00987 wFreeTXSpace = TCPIsPutReady(hTCP);
00988 if(wFreeTXSpace == 0u)
00989 return FALSE;
00990 else if(wFreeTXSpace == 1u)
00991 TCPFlush(hTCP);
00992
00993
00994
00995
00996 if((!MyTCBStub.Flags.bHalfFullFlush) && (wFreeTXSpace <= ((MyTCBStub.bufferRxStart-MyTCBStub.bufferTxStart)>>1)))
00997 {
00998 TCPFlush(hTCP);
00999 MyTCBStub.Flags.bHalfFullFlush = TRUE;
01000 }
01001
01002 #if defined(STACK_USE_SSL)
01003 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
01004 {
01005 TCPRAMCopy(MyTCBStub.sslTxHead, MyTCBStub.vMemoryMedium, (PTR_BASE)&byte, TCP_PIC_RAM, sizeof(byte));
01006 if(++MyTCBStub.sslTxHead >= MyTCBStub.bufferRxStart)
01007 MyTCBStub.sslTxHead = MyTCBStub.bufferTxStart;
01008 }
01009 else
01010 {
01011 TCPRAMCopy(MyTCBStub.txHead, MyTCBStub.vMemoryMedium, (PTR_BASE)&byte, TCP_PIC_RAM, sizeof(byte));
01012 if(++MyTCBStub.txHead >= MyTCBStub.bufferRxStart)
01013 MyTCBStub.txHead = MyTCBStub.bufferTxStart;
01014 }
01015 #else
01016 TCPRAMCopy(MyTCBStub.txHead, MyTCBStub.vMemoryMedium, (PTR_BASE)&byte, TCP_PIC_RAM, sizeof(byte));
01017 if(++MyTCBStub.txHead >= MyTCBStub.bufferRxStart)
01018 MyTCBStub.txHead = MyTCBStub.bufferTxStart;
01019 #endif
01020
01021
01022
01023 if(wFreeTXSpace == 1u)
01024 {
01025 TCPFlush(hTCP);
01026 }
01027
01028
01029
01030 else if(!MyTCBStub.Flags.bTimer2Enabled)
01031 {
01032 MyTCBStub.Flags.bTimer2Enabled = TRUE;
01033 MyTCBStub.eventTime2 = (WORD)TickGetDiv256() + TCP_AUTO_TRANSMIT_TIMEOUT_VAL/256ull;
01034 }
01035
01036 return TRUE;
01037 }
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058 WORD TCPPutArray(TCP_SOCKET hTCP, BYTE* data, WORD len)
01059 {
01060 WORD wActualLen;
01061 WORD wFreeTXSpace;
01062 WORD wRightLen = 0;
01063
01064 SyncTCBStub(hTCP);
01065
01066 wFreeTXSpace = TCPIsPutReady(hTCP);
01067 if(wFreeTXSpace == 0u)
01068 {
01069 TCPFlush(hTCP);
01070 return 0;
01071 }
01072
01073 wActualLen = wFreeTXSpace;
01074 if(wFreeTXSpace > len)
01075 wActualLen = len;
01076
01077
01078
01079
01080 if((!MyTCBStub.Flags.bHalfFullFlush) && (wFreeTXSpace <= ((MyTCBStub.bufferRxStart-MyTCBStub.bufferTxStart)>>1)))
01081 {
01082 TCPFlush(hTCP);
01083 MyTCBStub.Flags.bHalfFullFlush = TRUE;
01084 }
01085
01086 #if defined(STACK_USE_SSL)
01087 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
01088 {
01089
01090 if(MyTCBStub.sslTxHead + wActualLen >= MyTCBStub.bufferRxStart)
01091 {
01092 wRightLen = MyTCBStub.bufferRxStart-MyTCBStub.sslTxHead;
01093 TCPRAMCopy(MyTCBStub.sslTxHead, MyTCBStub.vMemoryMedium, (PTR_BASE)data, TCP_PIC_RAM, wRightLen);
01094 data += wRightLen;
01095 wActualLen -= wRightLen;
01096 MyTCBStub.sslTxHead = MyTCBStub.bufferTxStart;
01097 }
01098
01099 TCPRAMCopy(MyTCBStub.sslTxHead, MyTCBStub.vMemoryMedium, (PTR_BASE)data, TCP_PIC_RAM, wActualLen);
01100 MyTCBStub.sslTxHead += wActualLen;
01101 }
01102 else
01103 {
01104
01105 if(MyTCBStub.txHead + wActualLen >= MyTCBStub.bufferRxStart)
01106 {
01107 wRightLen = MyTCBStub.bufferRxStart-MyTCBStub.txHead;
01108 TCPRAMCopy(MyTCBStub.txHead, MyTCBStub.vMemoryMedium, (PTR_BASE)data, TCP_PIC_RAM, wRightLen);
01109 data += wRightLen;
01110 wActualLen -= wRightLen;
01111 MyTCBStub.txHead = MyTCBStub.bufferTxStart;
01112 }
01113
01114 TCPRAMCopy(MyTCBStub.txHead, MyTCBStub.vMemoryMedium, (PTR_BASE)data, TCP_PIC_RAM, wActualLen);
01115 MyTCBStub.txHead += wActualLen;
01116 }
01117 #else
01118
01119 if(MyTCBStub.txHead + wActualLen >= MyTCBStub.bufferRxStart)
01120 {
01121 wRightLen = MyTCBStub.bufferRxStart-MyTCBStub.txHead;
01122 TCPRAMCopy(MyTCBStub.txHead, MyTCBStub.vMemoryMedium, (PTR_BASE)data, TCP_PIC_RAM, wRightLen);
01123 data += wRightLen;
01124 wActualLen -= wRightLen;
01125 MyTCBStub.txHead = MyTCBStub.bufferTxStart;
01126 }
01127
01128 TCPRAMCopy(MyTCBStub.txHead, MyTCBStub.vMemoryMedium, (PTR_BASE)data, TCP_PIC_RAM, wActualLen);
01129 MyTCBStub.txHead += wActualLen;
01130 #endif
01131
01132
01133 if(wFreeTXSpace <= len)
01134 {
01135 TCPFlush(hTCP);
01136 }
01137
01138
01139
01140 else if(!MyTCBStub.Flags.bTimer2Enabled)
01141 {
01142 MyTCBStub.Flags.bTimer2Enabled = TRUE;
01143 MyTCBStub.eventTime2 = (WORD)TickGetDiv256() + TCP_AUTO_TRANSMIT_TIMEOUT_VAL/256ull;
01144 }
01145
01146 return wActualLen + wRightLen;
01147 }
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171 #if defined(__18CXX)
01172 WORD TCPPutROMArray(TCP_SOCKET hTCP, ROM BYTE* data, WORD len)
01173 {
01174 WORD wActualLen;
01175 WORD wFreeTXSpace;
01176 WORD wRightLen = 0;
01177
01178 SyncTCBStub(hTCP);
01179
01180 wFreeTXSpace = TCPIsPutReady(hTCP);
01181 if(wFreeTXSpace == 0u)
01182 {
01183 TCPFlush(hTCP);
01184 return 0;
01185 }
01186
01187
01188
01189
01190 if((!MyTCBStub.Flags.bHalfFullFlush) && (wFreeTXSpace <= ((MyTCBStub.bufferRxStart-MyTCBStub.bufferTxStart)>>1)))
01191 {
01192 TCPFlush(hTCP);
01193 MyTCBStub.Flags.bHalfFullFlush = TRUE;
01194 }
01195
01196 wActualLen = wFreeTXSpace;
01197 if(wFreeTXSpace > len)
01198 wActualLen = len;
01199
01200 #if defined(STACK_USE_SSL)
01201 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
01202 {
01203
01204 if(MyTCBStub.sslTxHead + wActualLen >= MyTCBStub.bufferRxStart)
01205 {
01206 wRightLen = MyTCBStub.bufferRxStart-MyTCBStub.sslTxHead;
01207 TCPRAMCopyROM(MyTCBStub.sslTxHead, MyTCBStub.vMemoryMedium, data, wRightLen);
01208 data += wRightLen;
01209 wActualLen -= wRightLen;
01210 MyTCBStub.sslTxHead = MyTCBStub.bufferTxStart;
01211 }
01212
01213 TCPRAMCopyROM(MyTCBStub.sslTxHead, MyTCBStub.vMemoryMedium, data, wActualLen);
01214 MyTCBStub.sslTxHead += wActualLen;
01215 }
01216 else
01217 {
01218
01219 if(MyTCBStub.txHead + wActualLen >= MyTCBStub.bufferRxStart)
01220 {
01221 wRightLen = MyTCBStub.bufferRxStart-MyTCBStub.txHead;
01222 TCPRAMCopyROM(MyTCBStub.txHead, MyTCBStub.vMemoryMedium, data, wRightLen);
01223 data += wRightLen;
01224 wActualLen -= wRightLen;
01225 MyTCBStub.txHead = MyTCBStub.bufferTxStart;
01226 }
01227
01228 TCPRAMCopyROM(MyTCBStub.txHead, MyTCBStub.vMemoryMedium, data, wActualLen);
01229 MyTCBStub.txHead += wActualLen;
01230 }
01231 #else
01232
01233 if(MyTCBStub.txHead + wActualLen >= MyTCBStub.bufferRxStart)
01234 {
01235 wRightLen = MyTCBStub.bufferRxStart-MyTCBStub.txHead;
01236 TCPRAMCopyROM(MyTCBStub.txHead, MyTCBStub.vMemoryMedium, data, wRightLen);
01237 data += wRightLen;
01238 wActualLen -= wRightLen;
01239 MyTCBStub.txHead = MyTCBStub.bufferTxStart;
01240 }
01241
01242 TCPRAMCopyROM(MyTCBStub.txHead, MyTCBStub.vMemoryMedium, data, wActualLen);
01243 MyTCBStub.txHead += wActualLen;
01244 #endif
01245
01246
01247 if(wFreeTXSpace <= len)
01248 {
01249 TCPFlush(hTCP);
01250 }
01251
01252
01253
01254 else if(!MyTCBStub.Flags.bTimer2Enabled)
01255 {
01256 MyTCBStub.Flags.bTimer2Enabled = TRUE;
01257 MyTCBStub.eventTime2 = (WORD)TickGetDiv256() + TCP_AUTO_TRANSMIT_TIMEOUT_VAL/256ull;
01258 }
01259
01260 return wActualLen + wRightLen;
01261 }
01262 #endif
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290
01291 BYTE* TCPPutString(TCP_SOCKET hTCP, BYTE* data)
01292 {
01293 return data + TCPPutArray(hTCP, data, strlen((char*)data));
01294 }
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325 #if defined(__18CXX)
01326 ROM BYTE* TCPPutROMString(TCP_SOCKET hTCP, ROM BYTE* data)
01327 {
01328 return data + TCPPutROMArray(hTCP, data, strlenpgm((ROM char*)data));
01329 }
01330 #endif
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348 WORD TCPGetTxFIFOFull(TCP_SOCKET hTCP)
01349 {
01350 WORD wDataLen;
01351 WORD wFIFOSize;
01352
01353 SyncTCBStub(hTCP);
01354
01355
01356 wFIFOSize = MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart - 1;
01357
01358
01359 wDataLen = TCPIsPutReady(hTCP);
01360
01361 return wFIFOSize - wDataLen;
01362 }
01363
01364
01365
01366
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384
01385
01386
01387 void TCPDiscard(TCP_SOCKET hTCP)
01388 {
01389 if(TCPIsGetReady(hTCP))
01390 {
01391 SyncTCBStub(hTCP);
01392
01393
01394 MyTCBStub.rxTail = MyTCBStub.rxHead;
01395
01396
01397 SendTCP(ACK, SENDTCP_RESET_TIMERS);
01398 }
01399 }
01400
01401
01402
01403
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423
01424 WORD TCPIsGetReady(TCP_SOCKET hTCP)
01425 {
01426 SyncTCBStub(hTCP);
01427
01428 if(MyTCBStub.rxHead >= MyTCBStub.rxTail)
01429 return MyTCBStub.rxHead - MyTCBStub.rxTail;
01430 else
01431 return (MyTCBStub.bufferEnd - MyTCBStub.rxTail + 1) + (MyTCBStub.rxHead - MyTCBStub.bufferRxStart);
01432 }
01433
01434
01435
01436
01437
01438
01439
01440
01441
01442
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453 BOOL TCPGet(TCP_SOCKET hTCP, BYTE* byte)
01454 {
01455 WORD wGetReadyCount;
01456
01457
01458 wGetReadyCount = TCPIsGetReady(hTCP);
01459 if(wGetReadyCount == 0u)
01460 return FALSE;
01461
01462 SyncTCBStub(hTCP);
01463
01464 if(byte)
01465 TCPRAMCopy((PTR_BASE)byte, TCP_PIC_RAM, MyTCBStub.rxTail, MyTCBStub.vMemoryMedium, 1);
01466 if(++MyTCBStub.rxTail > MyTCBStub.bufferEnd)
01467 MyTCBStub.rxTail = MyTCBStub.bufferRxStart;
01468
01469
01470 if(wGetReadyCount == 1u)
01471 {
01472 MyTCBStub.Flags.bTXASAPWithoutTimerReset = 1;
01473 }
01474
01475
01476 else if(!MyTCBStub.Flags.bTimer2Enabled)
01477 {
01478 MyTCBStub.Flags.bTimer2Enabled = TRUE;
01479 MyTCBStub.eventTime2 = (WORD)TickGetDiv256() + TCP_AUTO_TRANSMIT_TIMEOUT_VAL/256ull;
01480 }
01481
01482
01483 return TRUE;
01484 }
01485
01486
01487
01488
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506 WORD TCPGetArray(TCP_SOCKET hTCP, BYTE* buffer, WORD len)
01507 {
01508 WORD wGetReadyCount;
01509 WORD RightLen = 0;
01510
01511
01512 wGetReadyCount = TCPIsGetReady(hTCP);
01513 if(wGetReadyCount == 0u)
01514 return 0x0000u;
01515
01516 SyncTCBStub(hTCP);
01517
01518
01519 if(len > wGetReadyCount)
01520 len = wGetReadyCount;
01521
01522
01523 if(MyTCBStub.rxTail + len > MyTCBStub.bufferEnd)
01524 {
01525 RightLen = MyTCBStub.bufferEnd - MyTCBStub.rxTail + 1;
01526 if(buffer)
01527 {
01528 TCPRAMCopy((PTR_BASE)buffer, TCP_PIC_RAM, MyTCBStub.rxTail, MyTCBStub.vMemoryMedium, RightLen);
01529 buffer += RightLen;
01530 }
01531 len -= RightLen;
01532 MyTCBStub.rxTail = MyTCBStub.bufferRxStart;
01533 }
01534
01535 if(buffer)
01536 TCPRAMCopy((PTR_BASE)buffer, TCP_PIC_RAM, MyTCBStub.rxTail, MyTCBStub.vMemoryMedium, len);
01537 MyTCBStub.rxTail += len;
01538 len += RightLen;
01539
01540
01541 if(wGetReadyCount - len <= len)
01542 {
01543 MyTCBStub.Flags.bTXASAPWithoutTimerReset = 1;
01544 }
01545 else if(!MyTCBStub.Flags.bTimer2Enabled)
01546
01547
01548 {
01549 MyTCBStub.Flags.bTimer2Enabled = TRUE;
01550 MyTCBStub.eventTime2 = (WORD)TickGetDiv256() + TCP_AUTO_TRANSMIT_TIMEOUT_VAL/256ull;
01551 }
01552
01553 return len;
01554 }
01555
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570
01571
01572
01573
01574
01575 WORD TCPGetRxFIFOFree(TCP_SOCKET hTCP)
01576 {
01577 WORD wDataLen;
01578 WORD wFIFOSize;
01579
01580 SyncTCBStub(hTCP);
01581
01582
01583 wFIFOSize = MyTCBStub.bufferEnd - MyTCBStub.bufferRxStart;
01584
01585 #if defined(STACK_USE_SSL)
01586 {
01587 PTR_BASE SSLtemp = MyTCBStub.rxHead;
01588
01589
01590 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
01591 MyTCBStub.rxHead = MyTCBStub.sslRxHead;
01592
01593
01594 wDataLen = TCPIsGetReady(hTCP);
01595
01596
01597 MyTCBStub.rxHead = SSLtemp;
01598 }
01599 #else
01600 {
01601
01602 wDataLen = TCPIsGetReady(hTCP);
01603 }
01604 #endif
01605
01606
01607 return wFIFOSize - wDataLen;
01608 }
01609
01610
01611
01612
01613
01614
01615
01616
01617
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633
01634
01635
01636
01637
01638
01639
01640
01641
01642
01643
01644
01645
01646
01647
01648
01649
01650
01651
01652
01653
01654
01655
01656
01657
01658
01659
01660
01661
01662 WORD TCPFindArrayEx(TCP_SOCKET hTCP, BYTE* cFindArray, WORD wLen, WORD wStart, WORD wSearchLen, BOOL bTextCompare)
01663 {
01664 PTR_BASE ptrRead;
01665 WORD wDataLen;
01666 WORD wBytesUntilWrap;
01667 PTR_BASE ptrLocation;
01668 WORD wLenStart;
01669 BYTE *cFindArrayStart;
01670 BYTE i, j, k;
01671 BOOL isFinding;
01672 BYTE buffer[32];
01673
01674 if(wLen == 0u)
01675 return 0u;
01676
01677 SyncTCBStub(hTCP);
01678
01679
01680
01681 wDataLen = TCPIsGetReady(hTCP) - wStart;
01682 if(wDataLen < wLen)
01683 return 0xFFFFu;
01684 if(wSearchLen && wDataLen > wSearchLen)
01685 wDataLen = wSearchLen;
01686
01687 ptrLocation = MyTCBStub.rxTail + wStart;
01688 if(ptrLocation > MyTCBStub.bufferEnd)
01689 ptrLocation -= MyTCBStub.bufferEnd - MyTCBStub.bufferRxStart + 1;
01690 ptrRead = ptrLocation;
01691 wBytesUntilWrap = MyTCBStub.bufferEnd - ptrLocation + 1;
01692 ptrLocation = wStart;
01693 wLenStart = wLen;
01694 cFindArrayStart = cFindArray;
01695 j = *cFindArray++;
01696 isFinding = FALSE;
01697 if(bTextCompare)
01698 {
01699 if(j >= 'a' && j <= 'z')
01700 j += 'A'-'a';
01701 }
01702
01703
01704 while(1)
01705 {
01706
01707 k = sizeof(buffer);
01708 if(k > wBytesUntilWrap)
01709 k = wBytesUntilWrap;
01710 if((WORD)k > wDataLen)
01711 k = wDataLen;
01712
01713
01714 TCPRAMCopy((PTR_BASE)buffer, TCP_PIC_RAM, ptrRead, MyTCBStub.vMemoryMedium, (WORD)k);
01715 ptrRead += k;
01716 wBytesUntilWrap -= k;
01717
01718 if(wBytesUntilWrap == 0u)
01719 {
01720 ptrRead = MyTCBStub.bufferRxStart;
01721 wBytesUntilWrap = 0xFFFFu;
01722 }
01723
01724
01725 if(bTextCompare)
01726 {
01727 for(i = 0; i < k; i++)
01728 {
01729 if(buffer[i] >= 'a' && buffer[i] <= 'z')
01730 buffer[i] += 'A'-'a';
01731
01732 if(j == buffer[i])
01733 {
01734 if(--wLen == 0u)
01735 return ptrLocation-wLenStart + i + 1;
01736 j = *cFindArray++;
01737 isFinding = TRUE;
01738 if(j >= 'a' && j <= 'z')
01739 j += 'A'-'a';
01740 }
01741 else
01742 {
01743 wLen = wLenStart;
01744 if(isFinding)
01745 {
01746 cFindArray = cFindArrayStart;
01747 j = *cFindArray++;
01748 if(j >= 'a' && j <= 'z')
01749 j += 'A'-'a';
01750 isFinding = FALSE;
01751 }
01752 }
01753 }
01754 }
01755 else
01756 {
01757 for(i = 0; i < k; i++)
01758 {
01759 if(j == buffer[i])
01760 {
01761 if(--wLen == 0)
01762 return ptrLocation-wLenStart + i + 1;
01763 j = *cFindArray++;
01764 isFinding = TRUE;
01765 }
01766 else
01767 {
01768 wLen = wLenStart;
01769 if(isFinding)
01770 {
01771 cFindArray = cFindArrayStart;
01772 j = *cFindArray++;
01773 isFinding = FALSE;
01774 }
01775 }
01776 }
01777 }
01778
01779
01780 wDataLen -= k;
01781 if(wDataLen < wLen)
01782 return 0xFFFFu;
01783
01784 ptrLocation += k;
01785 }
01786 }
01787
01788
01789
01790
01791
01792
01793
01794
01795
01796
01797
01798
01799
01800
01801
01802
01803
01804
01805
01806
01807
01808
01809
01810
01811
01812
01813
01814
01815
01816
01817
01818
01819
01820
01821
01822
01823
01824
01825
01826
01827
01828
01829
01830
01831
01832
01833
01834
01835 #if defined(__18CXX)
01836 WORD TCPFindROMArrayEx(TCP_SOCKET hTCP, ROM BYTE* cFindArray, WORD wLen, WORD wStart, WORD wSearchLen, BOOL bTextCompare)
01837 {
01838 PTR_BASE ptrRead;
01839 WORD wDataLen;
01840 WORD wBytesUntilWrap;
01841 PTR_BASE ptrLocation;
01842 WORD wLenStart;
01843 ROM BYTE *cFindArrayStart;
01844 BYTE i, j, k;
01845 BOOL isFinding;
01846 BYTE buffer[32];
01847
01848 if(wLen == 0u)
01849 return 0u;
01850
01851 SyncTCBStub(hTCP);
01852
01853
01854
01855 wDataLen = TCPIsGetReady(hTCP) - wStart;
01856 if(wDataLen < wLen)
01857 return 0xFFFFu;
01858 if(wSearchLen && wDataLen > wSearchLen)
01859 wDataLen = wSearchLen;
01860
01861 ptrLocation = MyTCBStub.rxTail + wStart;
01862 if(ptrLocation > MyTCBStub.bufferEnd)
01863 ptrLocation -= MyTCBStub.bufferEnd - MyTCBStub.bufferRxStart + 1;
01864 ptrRead = ptrLocation;
01865 wBytesUntilWrap = MyTCBStub.bufferEnd - ptrLocation + 1;
01866 ptrLocation = wStart;
01867 wLenStart = wLen;
01868 cFindArrayStart = cFindArray;
01869 j = *cFindArray++;
01870 isFinding = FALSE;
01871 if(bTextCompare)
01872 {
01873 if(j >= 'a' && j <= 'z')
01874 j += 'A'-'a';
01875 }
01876
01877
01878 while(1)
01879 {
01880
01881 k = sizeof(buffer);
01882 if(k > wBytesUntilWrap)
01883 k = wBytesUntilWrap;
01884 if((WORD)k > wDataLen)
01885 k = wDataLen;
01886
01887
01888 TCPRAMCopy((PTR_BASE)buffer, TCP_PIC_RAM, ptrRead, MyTCBStub.vMemoryMedium, (WORD)k);
01889 ptrRead += k;
01890 wBytesUntilWrap -= k;
01891
01892 if(wBytesUntilWrap == 0)
01893 {
01894 ptrRead = MyTCBStub.bufferRxStart;
01895 wBytesUntilWrap = 0xFFFFu;
01896 }
01897
01898
01899 if(bTextCompare)
01900 {
01901 for(i = 0; i < k; i++)
01902 {
01903 if(buffer[i] >= 'a' && buffer[i] <= 'z')
01904 buffer[i] += 'A'-'a';
01905
01906 if(j == buffer[i])
01907 {
01908 if(--wLen == 0u)
01909 return ptrLocation-wLenStart + i + 1;
01910 j = *cFindArray++;
01911 isFinding = TRUE;
01912 if(j >= 'a' && j <= 'z')
01913 j += 'A'-'a';
01914 }
01915 else
01916 {
01917 wLen = wLenStart;
01918 if(isFinding)
01919 {
01920 cFindArray = cFindArrayStart;
01921 j = *cFindArray++;
01922 if(j >= 'a' && j <= 'z')
01923 j += 'A'-'a';
01924 isFinding = FALSE;
01925 }
01926 }
01927 }
01928 }
01929 else
01930 {
01931 for(i = 0; i < k; i++)
01932 {
01933 if(j == buffer[i])
01934 {
01935 if(--wLen == 0)
01936 return ptrLocation-wLenStart + i + 1;
01937 j = *cFindArray++;
01938 isFinding = TRUE;
01939 }
01940 else
01941 {
01942 wLen = wLenStart;
01943 if(isFinding)
01944 {
01945 cFindArray = cFindArrayStart;
01946 j = *cFindArray++;
01947 isFinding = FALSE;
01948 }
01949 }
01950 }
01951 }
01952
01953
01954 wDataLen -= k;
01955 if(wDataLen < wLen)
01956 return 0xFFFFu;
01957
01958 ptrLocation += k;
01959 }
01960 }
01961 #endif
01962
01963
01964
01965
01966
01967
01968
01969
01970
01971
01972
01973
01974
01975
01976
01977
01978
01979
01980
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993
01994
01995
01996
01997
01998
01999
02000
02001
02002
02003
02004
02005
02006
02007
02008 WORD TCPFindEx(TCP_SOCKET hTCP, BYTE cFind, WORD wStart, WORD wSearchLen, BOOL bTextCompare)
02009 {
02010 return TCPFindArrayEx(hTCP, &cFind, sizeof(cFind), wStart, wSearchLen, bTextCompare);
02011 }
02012
02013
02014
02015
02016
02017
02018
02019
02020
02021
02022
02023
02024
02025
02026
02027
02028
02029
02030
02031
02032
02033
02034
02035
02036
02037
02038
02039
02040
02041 void TCPTick(void)
02042 {
02043 TCP_SOCKET hTCP;
02044 BOOL bRetransmit;
02045 BOOL bCloseSocket;
02046 BYTE vFlags;
02047 WORD w;
02048
02049
02050 for(hTCP = 0; hTCP < TCP_SOCKET_COUNT; hTCP++)
02051 {
02052 SyncTCBStub(hTCP);
02053
02054
02055 #if defined(STACK_USE_SSL)
02056 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
02057 {
02058
02059 SSLPeriodic(hTCP, MyTCBStub.sslStubID);
02060
02061
02062 if(MyTCBStub.sslTxHead != MyTCBStub.txHead && TCPSSLGetPendingTxSize(hTCP) != 0)
02063 SSLTxRecord(hTCP, MyTCBStub.sslStubID, SSL_APPLICATION);
02064
02065
02066 if(MyTCBStub.sslReqMessage != SSL_NO_MESSAGE)
02067 SSLTxMessage(hTCP, MyTCBStub.sslStubID, MyTCBStub.sslReqMessage);
02068 }
02069 #endif
02070
02071 vFlags = 0x00;
02072 bRetransmit = FALSE;
02073 bCloseSocket = FALSE;
02074
02075
02076 if(MyTCBStub.Flags.bTXASAP || MyTCBStub.Flags.bTXASAPWithoutTimerReset)
02077 {
02078 if(MACIsTxReady())
02079 {
02080 vFlags = ACK;
02081 bRetransmit = MyTCBStub.Flags.bTXASAPWithoutTimerReset;
02082 }
02083 }
02084
02085
02086 if(MyTCBStub.Flags.bTimer2Enabled)
02087 {
02088
02089 if((SHORT)(MyTCBStub.eventTime2 - (WORD)TickGetDiv256()) <= (SHORT)0)
02090 vFlags = ACK;
02091 }
02092
02093
02094 if(MyTCBStub.Flags.bDelayedACKTimerEnabled)
02095 {
02096
02097 if((SHORT)(MyTCBStub.OverlappedTimers.delayedACKTime - (WORD)TickGetDiv256()) <= (SHORT)0)
02098 vFlags = ACK;
02099 }
02100
02101
02102 if(MyTCBStub.smState == TCP_CLOSE_WAIT)
02103 {
02104
02105
02106 if((SHORT)(MyTCBStub.OverlappedTimers.closeWaitTime - (WORD)TickGetDiv256()) <= (SHORT)0)
02107 {
02108 vFlags = FIN | ACK;
02109 MyTCBStub.smState = TCP_LAST_ACK;
02110 }
02111 }
02112
02113
02114 #if TCP_SYN_QUEUE_MAX_ENTRIES
02115 if(MyTCBStub.smState == TCP_LISTEN)
02116 {
02117 for(w = 0; w < TCP_SYN_QUEUE_MAX_ENTRIES; w++)
02118 {
02119
02120 if(SYNQueue[w].wDestPort == 0u)
02121 break;
02122
02123
02124 #if defined(STACK_USE_SSL_SERVER)
02125 if(SYNQueue[w].wDestPort == MyTCBStub.remoteHash.Val || SYNQueue[w].wDestPort == MyTCBStub.sslTxHead)
02126 #else
02127 if(SYNQueue[w].wDestPort == MyTCBStub.remoteHash.Val)
02128 #endif
02129 {
02130
02131 SyncTCB();
02132
02133 #if defined(STACK_USE_SSL_SERVER)
02134
02135
02136 if(SYNQueue[w].wDestPort == MyTCBStub.sslTxHead && !TCPStartSSLServer(hTCP))
02137 break;
02138 #endif
02139
02140 memcpy((void*)&MyTCB.remote.niRemoteMACIP, (void*)&SYNQueue[w].niSourceAddress, sizeof(NODE_INFO));
02141 MyTCB.remotePort.Val = SYNQueue[w].wSourcePort;
02142 MyTCB.RemoteSEQ = SYNQueue[w].dwSourceSEQ + 1;
02143 MyTCBStub.remoteHash.Val = (MyTCB.remote.niRemoteMACIP.IPAddr.w[1] + MyTCB.remote.niRemoteMACIP.IPAddr.w[0] + MyTCB.remotePort.Val) ^ MyTCB.localPort.Val;
02144 vFlags = SYN | ACK;
02145 MyTCBStub.smState = TCP_SYN_RECEIVED;
02146
02147
02148 TCPRAMCopy((PTR_BASE)&SYNQueue[w], TCP_PIC_RAM, (PTR_BASE)&SYNQueue[w+1], TCP_PIC_RAM, (TCP_SYN_QUEUE_MAX_ENTRIES-1u-w)*sizeof(TCP_SYN_QUEUE));
02149 SYNQueue[TCP_SYN_QUEUE_MAX_ENTRIES-1].wDestPort = 0u;
02150
02151 break;
02152 }
02153 }
02154 }
02155 #endif
02156
02157 if(vFlags)
02158 SendTCP(vFlags, bRetransmit ? 0 : SENDTCP_RESET_TIMERS);
02159
02160
02161
02162 if(!MyTCBStub.Flags.bTimerEnabled)
02163 {
02164 #if defined(TCP_KEEP_ALIVE_TIMEOUT)
02165
02166 if(MyTCBStub.smState == TCP_ESTABLISHED)
02167 {
02168
02169 if((LONG)(TickGet() - MyTCBStub.eventTime) < (LONG)0)
02170 continue;
02171
02172
02173
02174
02175
02176 if(MyTCBStub.Flags.vUnackedKeepalives == TCP_MAX_UNACKED_KEEP_ALIVES)
02177 {
02178 vFlags = MyTCBStub.Flags.bServer;
02179
02180
02181
02182
02183 TCPDisconnect(hTCP);
02184 TCPDisconnect(hTCP);
02185
02186
02187
02188
02189 if(!vFlags)
02190 MyTCBStub.smState = TCP_CLOSED_BUT_RESERVED;
02191
02192 continue;
02193 }
02194
02195
02196 SyncTCB();
02197 SendTCP(ACK, SENDTCP_KEEP_ALIVE);
02198 MyTCBStub.eventTime = TickGet() + TCP_KEEP_ALIVE_TIMEOUT;
02199 }
02200 #endif
02201 continue;
02202 }
02203
02204
02205 if((LONG)(TickGet() - MyTCBStub.eventTime) < (LONG)0)
02206 continue;
02207
02208
02209 SyncTCB();
02210
02211
02212
02213 switch(MyTCBStub.smState)
02214 {
02215 #if defined(STACK_CLIENT_MODE)
02216 #if defined(STACK_USE_DNS)
02217 case TCP_GET_DNS_MODULE:
02218 if(DNSBeginUsage())
02219 {
02220 MyTCBStub.smState = TCP_DNS_RESOLVE;
02221 #if defined(__C30__)
02222 DNSResolve((BYTE*)(WORD)MyTCB.remote.dwRemoteHost, DNS_TYPE_A);
02223 #else
02224 if(MyTCB.flags.bRemoteHostIsROM)
02225 DNSResolveROM((ROM BYTE*)MyTCB.remote.dwRemoteHost, DNS_TYPE_A);
02226 else
02227 DNSResolve((BYTE*)MyTCB.remote.dwRemoteHost, DNS_TYPE_A);
02228 #endif
02229 }
02230 break;
02231
02232 case TCP_DNS_RESOLVE:
02233 if(DNSIsResolved(&MyTCB.remote.niRemoteMACIP.IPAddr))
02234 {
02235 if(DNSEndUsage())
02236 {
02237 MyTCBStub.smState = TCP_GATEWAY_SEND_ARP;
02238 MyTCBStub.remoteHash.Val = (MyTCB.remote.niRemoteMACIP.IPAddr.w[1]+MyTCB.remote.niRemoteMACIP.IPAddr.w[0] + MyTCB.remotePort.Val) ^ MyTCB.localPort.Val;
02239 MyTCB.retryCount = 0;
02240 MyTCB.retryInterval = (TICK_SECOND/4)/256;
02241 }
02242 else
02243 {
02244 MyTCBStub.eventTime = TickGet() + 10*TICK_SECOND;
02245 MyTCBStub.smState = TCP_GET_DNS_MODULE;
02246 }
02247 }
02248 break;
02249 #endif // #if defined(STACK_USE_DNS)
02250
02251 case TCP_GATEWAY_SEND_ARP:
02252
02253 MyTCBStub.eventTime2 = TickGetDiv256();
02254 ARPResolve(&MyTCB.remote.niRemoteMACIP.IPAddr);
02255 MyTCBStub.smState = TCP_GATEWAY_GET_ARP;
02256 break;
02257
02258 case TCP_GATEWAY_GET_ARP:
02259
02260 if(!ARPIsResolved(&MyTCB.remote.niRemoteMACIP.IPAddr, &MyTCB.remote.niRemoteMACIP.MACAddr))
02261 {
02262
02263
02264
02265
02266 if(TickGetDiv256() - MyTCBStub.eventTime2 > MyTCB.retryInterval)
02267 {
02268
02269 if(MyTCB.retryCount < 6)
02270 {
02271 MyTCB.retryCount++;
02272 MyTCB.retryInterval <<= 1;
02273 }
02274
02275
02276 MyTCBStub.smState = TCP_GATEWAY_SEND_ARP;
02277 }
02278 break;
02279 }
02280
02281
02282
02283
02284 vFlags = SYN;
02285 bRetransmit = FALSE;
02286 MyTCBStub.smState = TCP_SYN_SENT;
02287 break;
02288 #endif // #if defined(STACK_CLIENT_MODE)
02289
02290 case TCP_SYN_SENT:
02291
02292
02293
02294 vFlags = SYN;
02295 bRetransmit = TRUE;
02296 break;
02297
02298 case TCP_SYN_RECEIVED:
02299
02300
02301
02302 if(MyTCB.retryCount < TCP_MAX_SYN_RETRIES)
02303 {
02304 vFlags = SYN | ACK;
02305 bRetransmit = TRUE;
02306 }
02307 else
02308 {
02309 if(MyTCBStub.Flags.bServer)
02310 {
02311 vFlags = RST | ACK;
02312 bCloseSocket = TRUE;
02313 }
02314 else
02315 {
02316 vFlags = SYN;
02317 }
02318 }
02319 break;
02320
02321 case TCP_ESTABLISHED:
02322 case TCP_CLOSE_WAIT:
02323
02324 if(MyTCB.retryCount < TCP_MAX_RETRIES)
02325 {
02326 vFlags = ACK;
02327 bRetransmit = TRUE;
02328 }
02329 else
02330 {
02331
02332
02333
02334 MyTCBStub.smState = TCP_FIN_WAIT_1;
02335 vFlags = FIN | ACK;
02336 }
02337 break;
02338
02339 case TCP_FIN_WAIT_1:
02340 if(MyTCB.retryCount < TCP_MAX_RETRIES)
02341 {
02342
02343 vFlags = FIN | ACK;
02344 bRetransmit = TRUE;
02345 }
02346 else
02347 {
02348
02349
02350 vFlags = RST | ACK;
02351 bCloseSocket = TRUE;
02352 }
02353 break;
02354
02355 case TCP_FIN_WAIT_2:
02356
02357
02358 vFlags = RST | ACK;
02359 bCloseSocket = TRUE;
02360 break;
02361
02362 case TCP_CLOSING:
02363 if(MyTCB.retryCount < TCP_MAX_RETRIES)
02364 {
02365
02366
02367
02368 vFlags = ACK;
02369 bRetransmit = TRUE;
02370 }
02371 else
02372 {
02373
02374
02375 vFlags = RST | ACK;
02376 bCloseSocket = TRUE;
02377 }
02378 break;
02379
02380
02381
02382
02383
02384
02385
02386 case TCP_LAST_ACK:
02387
02388 if(MyTCB.retryCount < TCP_MAX_RETRIES)
02389 {
02390 vFlags = FIN | ACK;
02391 bRetransmit = TRUE;
02392 }
02393 else
02394 {
02395 vFlags = RST | ACK;
02396 bCloseSocket = TRUE;
02397 }
02398 break;
02399
02400 default:
02401 break;
02402 }
02403
02404 if(vFlags)
02405 {
02406 if(bRetransmit)
02407 {
02408
02409 MyTCB.retryCount++;
02410 MyTCB.retryInterval <<= 1;
02411
02412
02413
02414 MyTCB.MySEQ -= (LONG)(SHORT)(MyTCB.txUnackedTail - MyTCBStub.txTail);
02415 if(MyTCB.txUnackedTail < MyTCBStub.txTail)
02416 MyTCB.MySEQ -= (LONG)(SHORT)(MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart);
02417 MyTCB.txUnackedTail = MyTCBStub.txTail;
02418 SendTCP(vFlags, 0);
02419 }
02420 else
02421 SendTCP(vFlags, SENDTCP_RESET_TIMERS);
02422
02423 }
02424
02425 if(bCloseSocket)
02426 CloseSocket();
02427 }
02428
02429
02430 #if TCP_SYN_QUEUE_MAX_ENTRIES
02431
02432 for(w = 0; w < TCP_SYN_QUEUE_MAX_ENTRIES; w++)
02433 {
02434
02435 if(SYNQueue[w].wDestPort == 0u)
02436 break;
02437
02438
02439 if((WORD)TickGetDiv256() - SYNQueue[w].wTimestamp > (WORD)(TCP_SYN_QUEUE_TIMEOUT/256ull))
02440 {
02441
02442 TCPRAMCopy((PTR_BASE)&SYNQueue[w], TCP_PIC_RAM, (PTR_BASE)&SYNQueue[w+1], TCP_PIC_RAM, (TCP_SYN_QUEUE_MAX_ENTRIES-1u-w)*sizeof(TCP_SYN_QUEUE));
02443 SYNQueue[TCP_SYN_QUEUE_MAX_ENTRIES-1].wDestPort = 0u;
02444
02445
02446
02447 w--;
02448 }
02449 }
02450 #endif
02451 }
02452
02453
02454
02455
02456
02457
02458
02459
02460
02461
02462
02463
02464
02465
02466
02467
02468
02469
02470
02471
02472
02473
02474
02475
02476
02477
02478 BOOL TCPProcess(NODE_INFO* remote, IP_ADDR* localIP, WORD len)
02479 {
02480 TCP_HEADER TCPHeader;
02481 PSEUDO_HEADER pseudoHeader;
02482 WORD_VAL checksum1;
02483 WORD_VAL checksum2;
02484 BYTE optionsSize;
02485
02486
02487 pseudoHeader.SourceAddress = remote->IPAddr;
02488 pseudoHeader.DestAddress = *localIP;
02489 pseudoHeader.Zero = 0x0;
02490 pseudoHeader.Protocol = IP_PROT_TCP;
02491 pseudoHeader.Length = len;
02492
02493 SwapPseudoHeader(pseudoHeader);
02494
02495 checksum1.Val = ~CalcIPChecksum((BYTE*)&pseudoHeader,
02496 sizeof(pseudoHeader));
02497
02498
02499
02500 checksum2.Val = CalcIPBufferChecksum(len);
02501
02502
02503 if(checksum1.Val != checksum2.Val)
02504 {
02505 MACDiscardRx();
02506 return TRUE;
02507 }
02508
02509 #if defined(DEBUG_GENERATE_RX_LOSS)
02510
02511 if(rand() > DEBUG_GENERATE_RX_LOSS)
02512 {
02513 MACDiscardRx();
02514 return TRUE;
02515 }
02516 #endif
02517
02518
02519 IPSetRxBuffer(0);
02520 MACGetArray((BYTE*)&TCPHeader, sizeof(TCPHeader));
02521 SwapTCPHeader(&TCPHeader);
02522
02523
02524
02525 optionsSize = (BYTE)((TCPHeader.DataOffset.Val << 2)-
02526 sizeof(TCPHeader));
02527 len = len - optionsSize - sizeof(TCPHeader);
02528
02529
02530 if(FindMatchingSocket(&TCPHeader, remote))
02531 {
02532 #if defined(STACK_USE_SSL)
02533 PTR_BASE prevRxHead = 0;
02534
02535 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
02536 {
02537 prevRxHead = MyTCBStub.rxHead;
02538 MyTCBStub.rxHead = MyTCBStub.sslRxHead;
02539 }
02540 #endif
02541
02542 HandleTCPSeg(&TCPHeader, len);
02543
02544 #if defined(STACK_USE_SSL)
02545 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
02546 {
02547
02548 MyTCBStub.sslRxHead = MyTCBStub.rxHead;
02549 MyTCBStub.rxHead = prevRxHead;
02550
02551
02552 TCPSSLHandleIncoming(hCurrentTCP);
02553 }
02554 #endif
02555 }
02556
02557
02558
02559
02560
02561
02562
02563
02564
02565
02566
02567
02568 MACDiscardRx();
02569
02570 return TRUE;
02571 }
02572
02573
02574
02575
02576
02577
02578
02579
02580
02581
02582
02583
02584
02585
02586
02587
02588
02589
02590
02591
02592
02593
02594
02595
02596
02597 static void SendTCP(BYTE vTCPFlags, BYTE vSendFlags)
02598 {
02599 WORD_VAL wVal;
02600 TCP_HEADER header;
02601 TCP_OPTIONS options;
02602 PSEUDO_HEADER pseudoHeader;
02603 WORD len;
02604 WORD wEffectiveWindow;
02605
02606 SyncTCB();
02607
02608
02609 if(vTCPFlags & FIN)
02610 {
02611 MyTCBStub.Flags.bTXFIN = 1;
02612 vTCPFlags &= ~FIN;
02613 }
02614
02615
02616
02617 MyTCBStub.Flags.bTimer2Enabled = 0;
02618 MyTCBStub.Flags.bDelayedACKTimerEnabled = 0;
02619 MyTCBStub.Flags.bOneSegmentReceived = 0;
02620 MyTCBStub.Flags.bTXASAP = 0;
02621 MyTCBStub.Flags.bTXASAPWithoutTimerReset = 0;
02622 MyTCBStub.Flags.bHalfFullFlush = 0;
02623
02624
02625 while(!IPIsTxReady());
02626
02627
02628 if(vTCPFlags & (SYN | RST))
02629 {
02630
02631 len = 0;
02632 }
02633 else
02634 {
02635
02636 if(MyTCBStub.txHead == MyTCB.txUnackedTail)
02637 {
02638
02639 len = 0;
02640
02641
02642 if(MyTCBStub.Flags.bTXFIN)
02643 {
02644 if(MyTCB.remoteWindow)
02645 vTCPFlags |= FIN;
02646 }
02647 }
02648 else if(MyTCBStub.txHead > MyTCB.txUnackedTail)
02649 {
02650 len = MyTCBStub.txHead - MyTCB.txUnackedTail;
02651 wEffectiveWindow = MyTCB.remoteWindow;
02652 if(MyTCB.txUnackedTail >= MyTCBStub.txTail)
02653 wEffectiveWindow -= MyTCB.txUnackedTail - MyTCBStub.txTail;
02654 else
02655 wEffectiveWindow -= (MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart) - (MyTCBStub.txTail - MyTCB.txUnackedTail);
02656
02657 if(len > wEffectiveWindow)
02658 len = wEffectiveWindow;
02659
02660 if(len > TCP_MAX_SEG_SIZE)
02661 {
02662 len = TCP_MAX_SEG_SIZE;
02663 MyTCBStub.Flags.bTXASAPWithoutTimerReset = 1;
02664 }
02665
02666
02667 if(MyTCBStub.Flags.bTXFIN)
02668 {
02669 if((len != wEffectiveWindow) && (len != TCP_MAX_SEG_SIZE))
02670 vTCPFlags |= FIN;
02671 }
02672
02673
02674 TCPRAMCopy(BASE_TX_ADDR+sizeof(ETHER_HEADER)+sizeof(IP_HEADER)+sizeof(TCP_HEADER), TCP_ETH_RAM, MyTCB.txUnackedTail, MyTCBStub.vMemoryMedium, len);
02675 MyTCB.txUnackedTail += len;
02676 }
02677 else
02678 {
02679 pseudoHeader.Length = MyTCBStub.bufferRxStart - MyTCB.txUnackedTail;
02680 len = pseudoHeader.Length + MyTCBStub.txHead - MyTCBStub.bufferTxStart;
02681
02682 wEffectiveWindow = MyTCB.remoteWindow;
02683 if(MyTCB.txUnackedTail >= MyTCBStub.txTail)
02684 wEffectiveWindow -= MyTCB.txUnackedTail - MyTCBStub.txTail;
02685 else
02686 wEffectiveWindow -= (MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart) - (MyTCBStub.txTail - MyTCB.txUnackedTail);
02687
02688 if(len > wEffectiveWindow)
02689 len = wEffectiveWindow;
02690
02691 if(len > TCP_MAX_SEG_SIZE)
02692 {
02693 len = TCP_MAX_SEG_SIZE;
02694 MyTCBStub.Flags.bTXASAPWithoutTimerReset = 1;
02695 }
02696
02697
02698 if(MyTCBStub.Flags.bTXFIN)
02699 {
02700 if((len != wEffectiveWindow) && (len != TCP_MAX_SEG_SIZE))
02701 vTCPFlags |= FIN;
02702 }
02703
02704 if(pseudoHeader.Length > len)
02705 pseudoHeader.Length = len;
02706
02707
02708 TCPRAMCopy(BASE_TX_ADDR+sizeof(ETHER_HEADER)+sizeof(IP_HEADER)+sizeof(TCP_HEADER), TCP_ETH_RAM, MyTCB.txUnackedTail, MyTCBStub.vMemoryMedium, pseudoHeader.Length);
02709 pseudoHeader.Length = len - pseudoHeader.Length;
02710
02711
02712 if(pseudoHeader.Length)
02713 {
02714 TCPRAMCopy(BASE_TX_ADDR+sizeof(ETHER_HEADER)+sizeof(IP_HEADER)+sizeof(TCP_HEADER)+(MyTCBStub.bufferRxStart-MyTCB.txUnackedTail), TCP_ETH_RAM, MyTCBStub.bufferTxStart, MyTCBStub.vMemoryMedium, pseudoHeader.Length);
02715 }
02716
02717 MyTCB.txUnackedTail += len;
02718 if(MyTCB.txUnackedTail >= MyTCBStub.bufferRxStart)
02719 MyTCB.txUnackedTail -= MyTCBStub.bufferRxStart-MyTCBStub.bufferTxStart;
02720 }
02721 }
02722
02723
02724
02725
02726 if(len || (vTCPFlags & (SYN | FIN)))
02727 {
02728
02729
02730 if(len)
02731 vTCPFlags |= PSH;
02732
02733 if(vSendFlags & SENDTCP_RESET_TIMERS)
02734 {
02735 MyTCB.retryCount = 0;
02736 MyTCB.retryInterval = TCP_START_TIMEOUT_VAL;
02737 }
02738
02739 MyTCBStub.eventTime = TickGet() + MyTCB.retryInterval;
02740 MyTCBStub.Flags.bTimerEnabled = 1;
02741 }
02742 else if(vSendFlags & SENDTCP_KEEP_ALIVE)
02743 {
02744
02745 MyTCBStub.Flags.vUnackedKeepalives++;
02746
02747
02748 MyTCB.MySEQ -= 1;
02749 len = 1;
02750 }
02751 else if(MyTCBStub.Flags.bTimerEnabled)
02752 {
02753
02754
02755
02756
02757 if(!(vSendFlags & SENDTCP_RESET_TIMERS))
02758 {
02759
02760 MyTCB.retryCount--;
02761 MyTCB.retryInterval >>= 1;
02762 }
02763
02764 MyTCBStub.eventTime = TickGet() + MyTCB.retryInterval;
02765 }
02766
02767
02768 header.SourcePort = MyTCB.localPort.Val;
02769 header.DestPort = MyTCB.remotePort.Val;
02770 header.SeqNumber = MyTCB.MySEQ;
02771 header.AckNumber = MyTCB.RemoteSEQ;
02772 header.Flags.bits.Reserved2 = 0;
02773 header.DataOffset.Reserved3 = 0;
02774 header.Flags.byte = vTCPFlags;
02775 header.UrgentPointer = 0;
02776
02777
02778
02779 MyTCB.MySEQ += (DWORD)len;
02780 if(vTCPFlags & SYN)
02781 {
02782 if(MyTCB.flags.bSYNSent)
02783 header.SeqNumber--;
02784 else
02785 {
02786 MyTCB.MySEQ++;
02787 MyTCB.flags.bSYNSent = 1;
02788 }
02789 }
02790 if(vTCPFlags & FIN)
02791 {
02792 if(MyTCB.flags.bFINSent)
02793 header.SeqNumber--;
02794 else
02795 {
02796 MyTCB.MySEQ++;
02797 MyTCB.flags.bFINSent = 1;
02798 }
02799 }
02800
02801
02802 if(MyTCBStub.rxHead >= MyTCBStub.rxTail)
02803 header.Window = (MyTCBStub.bufferEnd - MyTCBStub.bufferRxStart) - (MyTCBStub.rxHead - MyTCBStub.rxTail);
02804 else
02805 header.Window = MyTCBStub.rxTail - MyTCBStub.rxHead - 1;
02806
02807
02808 wVal.Val = MACGetFreeRxSize()-64;
02809 if((SHORT)wVal.Val < (SHORT)0)
02810 wVal.Val = 0;
02811
02812 if(header.Window > wVal.Val)
02813 header.Window = wVal.Val;
02814
02815 SwapTCPHeader(&header);
02816
02817
02818 len += sizeof(header);
02819 header.DataOffset.Val = sizeof(header) >> 2;
02820
02821
02822 if(vTCPFlags & SYN)
02823 {
02824 len += sizeof(options);
02825 options.Kind = TCP_OPTIONS_MAX_SEG_SIZE;
02826 options.Length = 0x04;
02827
02828
02829 options.MaxSegSize.Val = (((TCP_MAX_SEG_SIZE-4)&0x00FF)<<8) | (((TCP_MAX_SEG_SIZE-4)&0xFF00)>>8);
02830
02831 header.DataOffset.Val += sizeof(options) >> 2;
02832 }
02833
02834
02835
02836 pseudoHeader.SourceAddress = sIPConfig.MyIPAddr;
02837 pseudoHeader.DestAddress = MyTCB.remote.niRemoteMACIP.IPAddr;
02838 pseudoHeader.Zero = 0x0;
02839 pseudoHeader.Protocol = IP_PROT_TCP;
02840 pseudoHeader.Length = len;
02841 SwapPseudoHeader(pseudoHeader);
02842 header.Checksum = ~CalcIPChecksum((BYTE*)&pseudoHeader, sizeof(pseudoHeader));
02843
02844
02845 MACSetWritePtr(BASE_TX_ADDR + sizeof(ETHER_HEADER));
02846 IPPutHeader(&MyTCB.remote.niRemoteMACIP, IP_PROT_TCP, len);
02847 MACPutArray((BYTE*)&header, sizeof(header));
02848 if(vTCPFlags & SYN)
02849 MACPutArray((BYTE*)&options, sizeof(options));
02850
02851
02852 MACSetReadPtr(BASE_TX_ADDR + sizeof(ETHER_HEADER) + sizeof(IP_HEADER));
02853 wVal.Val = CalcIPBufferChecksum(len);
02854 #if defined(DEBUG_GENERATE_TX_LOSS)
02855
02856 if(rand() > DEBUG_GENERATE_TX_LOSS)
02857 {
02858 wVal.Val++;
02859 }
02860 #endif
02861 MACSetWritePtr(BASE_TX_ADDR + sizeof(ETHER_HEADER) + sizeof(IP_HEADER) + 16);
02862 MACPutArray((BYTE*)&wVal, sizeof(WORD));
02863
02864
02865 MACFlush();
02866 }
02867
02868
02869
02870
02871
02872
02873
02874
02875
02876
02877
02878
02879
02880
02881
02882
02883
02884
02885
02886
02887
02888
02889
02890
02891
02892 static BOOL FindMatchingSocket(TCP_HEADER* h, NODE_INFO* remote)
02893 {
02894 TCP_SOCKET hTCP;
02895 TCP_SOCKET partialMatch;
02896 WORD hash;
02897
02898
02899 if(h->DestPort == 0)
02900 return FALSE;
02901
02902 partialMatch = INVALID_SOCKET;
02903 hash = (remote->IPAddr.w[1]+remote->IPAddr.w[0] + h->SourcePort) ^ h->DestPort;
02904
02905
02906
02907 for(hTCP = 0; hTCP < TCP_SOCKET_COUNT; hTCP++ )
02908 {
02909 SyncTCBStub(hTCP);
02910
02911 if(MyTCBStub.smState == TCP_CLOSED)
02912 {
02913 continue;
02914 }
02915 else if(MyTCBStub.smState == TCP_LISTEN)
02916 {
02917 if(MyTCBStub.remoteHash.Val == h->DestPort)
02918 partialMatch = hTCP;
02919
02920 #if defined(STACK_USE_SSL_SERVER)
02921
02922
02923 if(MyTCBStub.sslTxHead == h->DestPort)
02924 partialMatch = hTCP;
02925 #endif
02926
02927 continue;
02928 }
02929 else if(MyTCBStub.remoteHash.Val != hash)
02930 {
02931 continue;
02932 }
02933
02934 SyncTCB();
02935 if( h->DestPort == MyTCB.localPort.Val &&
02936 h->SourcePort == MyTCB.remotePort.Val &&
02937 remote->IPAddr.Val == MyTCB.remote.niRemoteMACIP.IPAddr.Val)
02938 {
02939 return TRUE;
02940 }
02941 }
02942
02943
02944
02945
02946
02947
02948 if(partialMatch != INVALID_SOCKET)
02949 {
02950 SyncTCBStub(partialMatch);
02951 SyncTCB();
02952
02953
02954 #if defined(STACK_USE_SSL_SERVER)
02955 if(MyTCBStub.sslTxHead == h->DestPort)
02956 {
02957
02958
02959 if(!TCPStartSSLServer(partialMatch))
02960 partialMatch = INVALID_SOCKET;
02961 }
02962 #endif
02963
02964
02965
02966
02967 if(partialMatch != INVALID_SOCKET)
02968 {
02969 MyTCBStub.remoteHash.Val = hash;
02970
02971 memcpy((void*)&MyTCB.remote, (void*)remote, sizeof(NODE_INFO));
02972 MyTCB.remotePort.Val = h->SourcePort;
02973 MyTCB.localPort.Val = h->DestPort;
02974 MyTCB.txUnackedTail = MyTCBStub.bufferTxStart;
02975
02976
02977 return TRUE;
02978 }
02979 }
02980
02981
02982
02983
02984
02985 #if TCP_SYN_QUEUE_MAX_ENTRIES
02986 {
02987 WORD wQueueInsertPos;
02988
02989
02990 if(!h->Flags.bits.flagSYN)
02991 return FALSE;
02992
02993
02994 if(SYNQueue[TCP_SYN_QUEUE_MAX_ENTRIES-1].wDestPort)
02995 return FALSE;
02996
02997
02998
02999
03000 for(wQueueInsertPos = 0; wQueueInsertPos < TCP_SYN_QUEUE_MAX_ENTRIES; wQueueInsertPos++)
03001 {
03002
03003 if(SYNQueue[wQueueInsertPos].wDestPort == 0u)
03004 break;
03005
03006
03007 if(SYNQueue[wQueueInsertPos].wDestPort != h->DestPort)
03008 continue;
03009 if(SYNQueue[wQueueInsertPos].wSourcePort != h->SourcePort)
03010 continue;
03011 if(SYNQueue[wQueueInsertPos].niSourceAddress.IPAddr.Val != remote->IPAddr.Val)
03012 continue;
03013
03014
03015 SYNQueue[wQueueInsertPos].wTimestamp = TickGetDiv256();
03016 return FALSE;
03017 }
03018
03019
03020
03021
03022 for(hTCP = 0; hTCP < TCP_SOCKET_COUNT; hTCP++)
03023 {
03024 SyncTCBStub(hTCP);
03025 if(!MyTCBStub.Flags.bServer)
03026 continue;
03027
03028 SyncTCB();
03029 #if defined(STACK_USE_SSL_SERVER)
03030 if((MyTCB.localPort.Val != h->DestPort) && (MyTCB.localSSLPort.Val != h->DestPort))
03031 #else
03032 if(MyTCB.localPort.Val != h->DestPort)
03033 #endif
03034 continue;
03035
03036
03037 memcpy((void*)&SYNQueue[wQueueInsertPos].niSourceAddress, (void*)remote, sizeof(NODE_INFO));
03038 SYNQueue[wQueueInsertPos].wSourcePort = h->SourcePort;
03039 SYNQueue[wQueueInsertPos].dwSourceSEQ = h->SeqNumber;
03040 SYNQueue[wQueueInsertPos].wDestPort = h->DestPort;
03041 SYNQueue[wQueueInsertPos].wTimestamp = TickGetDiv256();
03042
03043 return FALSE;
03044 }
03045 }
03046 #endif
03047
03048 return FALSE;
03049
03050 }
03051
03052
03053
03054
03055
03056
03057
03058
03059
03060
03061
03062
03063
03064
03065
03066
03067
03068
03069
03070
03071
03072
03073 static void SwapTCPHeader(TCP_HEADER* header)
03074 {
03075 header->SourcePort = swaps(header->SourcePort);
03076 header->DestPort = swaps(header->DestPort);
03077 header->SeqNumber = swapl(header->SeqNumber);
03078 header->AckNumber = swapl(header->AckNumber);
03079 header->Window = swaps(header->Window);
03080 header->Checksum = swaps(header->Checksum);
03081 header->UrgentPointer = swaps(header->UrgentPointer);
03082 }
03083
03084
03085
03086
03087
03088
03089
03090
03091
03092
03093
03094
03095
03096
03097
03098
03099
03100
03101
03102
03103
03104
03105
03106
03107 static void CloseSocket(void)
03108 {
03109 SyncTCB();
03110
03111 MyTCBStub.remoteHash.Val = MyTCB.localPort.Val;
03112 MyTCBStub.txHead = MyTCBStub.bufferTxStart;
03113 MyTCBStub.txTail = MyTCBStub.bufferTxStart;
03114 MyTCBStub.rxHead = MyTCBStub.bufferRxStart;
03115 MyTCBStub.rxTail = MyTCBStub.bufferRxStart;
03116 MyTCBStub.smState = MyTCBStub.Flags.bServer ? TCP_LISTEN : TCP_CLOSED;
03117 MyTCBStub.Flags.vUnackedKeepalives = 0;
03118 MyTCBStub.Flags.bTimerEnabled = 0;
03119 MyTCBStub.Flags.bTimer2Enabled = 0;
03120 MyTCBStub.Flags.bDelayedACKTimerEnabled = 0;
03121 MyTCBStub.Flags.bOneSegmentReceived = 0;
03122 MyTCBStub.Flags.bHalfFullFlush = 0;
03123 MyTCBStub.Flags.bTXASAP = 0;
03124 MyTCBStub.Flags.bTXASAPWithoutTimerReset = 0;
03125 MyTCBStub.Flags.bTXFIN = 0;
03126 MyTCBStub.Flags.bSocketReset = 1;
03127
03128 #if defined(STACK_USE_SSL)
03129
03130 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
03131 {
03132 SSLTerminate(MyTCBStub.sslStubID);
03133 MyTCBStub.sslStubID = SSL_INVALID_ID;
03134
03135
03136 MyTCBStub.remoteHash.Val = MyTCB.localSSLPort.Val;
03137 MyTCB.localSSLPort.Val = MyTCB.localPort.Val;
03138 MyTCB.localPort.Val = MyTCBStub.remoteHash.Val;
03139 }
03140
03141
03142 MyTCBStub.sslRxHead = MyTCBStub.bufferRxStart;
03143 MyTCBStub.sslTxHead = MyTCBStub.bufferTxStart;
03144 #endif
03145
03146 #if defined(STACK_USE_SSL_SERVER)
03147 MyTCBStub.sslTxHead = MyTCB.localSSLPort.Val;
03148 #endif
03149
03150 MyTCB.flags.bFINSent = 0;
03151 MyTCB.flags.bSYNSent = 0;
03152 MyTCB.flags.bRXNoneACKed1 = 0;
03153 MyTCB.flags.bRXNoneACKed2 = 0;
03154 MyTCB.txUnackedTail = MyTCBStub.bufferTxStart;
03155 ((DWORD_VAL*)(&MyTCB.MySEQ))->w[0] = rand();
03156 ((DWORD_VAL*)(&MyTCB.MySEQ))->w[1] = rand();
03157 MyTCB.sHoleSize = -1;
03158 MyTCB.remoteWindow = 1;
03159 }
03160
03161
03162
03163
03164
03165
03166
03167
03168
03169
03170
03171
03172
03173
03174
03175
03176
03177
03178
03179
03180
03181
03182
03183
03184
03185
03186
03187 static void HandleTCPSeg(TCP_HEADER* h, WORD len)
03188 {
03189 DWORD dwTemp;
03190 PTR_BASE wTemp;
03191 LONG lMissingBytes;
03192 WORD wMissingBytes;
03193 WORD wFreeSpace;
03194 BYTE localHeaderFlags;
03195 DWORD localAckNumber;
03196 DWORD localSeqNumber;
03197 WORD wSegmentLength;
03198 BOOL bSegmentAcceptable;
03199
03200
03201
03202
03203 localHeaderFlags = h->Flags.byte;
03204 localAckNumber = h->AckNumber;
03205 localSeqNumber = h->SeqNumber;
03206
03207
03208 #if defined(TCP_KEEP_ALIVE_TIMEOUT)
03209 MyTCBStub.Flags.vUnackedKeepalives = 0;
03210 if(!MyTCBStub.Flags.bTimerEnabled)
03211 MyTCBStub.eventTime = TickGet() + TCP_KEEP_ALIVE_TIMEOUT;
03212 #endif
03213
03214
03215
03216
03217
03218 switch(MyTCBStub.smState)
03219 {
03220 case TCP_LISTEN:
03221
03222 if(localHeaderFlags & RST)
03223 {
03224 CloseSocket();
03225 return;
03226 }
03227
03228
03229 if(localHeaderFlags & ACK)
03230 {
03231
03232 MyTCB.MySEQ = localAckNumber;
03233 SendTCP(RST, 0);
03234 CloseSocket();
03235 return;
03236 }
03237
03238
03239 if(localHeaderFlags & SYN)
03240 {
03241
03242 MyTCB.RemoteSEQ = localSeqNumber + 1;
03243
03244
03245
03246
03247
03248 SendTCP(SYN | ACK, SENDTCP_RESET_TIMERS);
03249 MyTCBStub.smState = TCP_SYN_RECEIVED;
03250 }
03251 else
03252 {
03253 CloseSocket();
03254 }
03255
03256
03257
03258 return;
03259
03260 case TCP_SYN_SENT:
03261
03262
03263
03264
03265
03266 if(localHeaderFlags & RST)
03267 return;
03268
03269
03270 if(localHeaderFlags & ACK)
03271 {
03272 if(localAckNumber != MyTCB.MySEQ)
03273 {
03274
03275
03276 localSeqNumber = MyTCB.MySEQ;
03277 MyTCB.MySEQ = localAckNumber;
03278 SendTCP(RST, SENDTCP_RESET_TIMERS);
03279 MyTCB.MySEQ = localSeqNumber;
03280 return;
03281 }
03282 }
03283
03284
03285
03286
03287
03288 if(localHeaderFlags & SYN)
03289 {
03290
03291 MyTCB.RemoteSEQ = localSeqNumber + 1;
03292 MyTCB.remoteWindow = h->Window;
03293
03294 if(localHeaderFlags & ACK)
03295 {
03296 SendTCP(ACK, SENDTCP_RESET_TIMERS);
03297 MyTCBStub.smState = TCP_ESTABLISHED;
03298 MyTCBStub.Flags.bTimerEnabled = 0;
03299 }
03300 else
03301 {
03302 SendTCP(SYN | ACK, SENDTCP_RESET_TIMERS);
03303 MyTCBStub.smState = TCP_SYN_RECEIVED;
03304 }
03305 }
03306
03307
03308 return;
03309
03310 default:
03311 break;
03312 }
03313
03314
03315
03316
03317 wSegmentLength = len;
03318 if(localHeaderFlags & FIN)
03319 wSegmentLength++;
03320 if(localHeaderFlags & SYN)
03321 wSegmentLength++;
03322
03323
03324 if(MyTCBStub.rxHead >= MyTCBStub.rxTail)
03325 wFreeSpace = (MyTCBStub.bufferEnd - MyTCBStub.bufferRxStart) - (MyTCBStub.rxHead - MyTCBStub.rxTail);
03326 else
03327 wFreeSpace = MyTCBStub.rxTail - MyTCBStub.rxHead - 1;
03328
03329
03330 lMissingBytes = localSeqNumber - MyTCB.RemoteSEQ;
03331 wMissingBytes = (WORD)lMissingBytes;
03332
03333
03334 bSegmentAcceptable = FALSE;
03335 if(wSegmentLength)
03336 {
03337
03338 if(wFreeSpace)
03339 {
03340
03341 if((lMissingBytes >= (LONG)0) && (wFreeSpace > lMissingBytes))
03342 bSegmentAcceptable = TRUE;
03343 else
03344 {
03345
03346 if((lMissingBytes + (LONG)wSegmentLength > (LONG)0) && (lMissingBytes <= (LONG)(SHORT)(wFreeSpace - wSegmentLength)))
03347 bSegmentAcceptable = TRUE;
03348 }
03349
03350 if((lMissingBytes < (LONG)wFreeSpace) && ((SHORT)wMissingBytes + (SHORT)wSegmentLength > (SHORT)0))
03351 bSegmentAcceptable = TRUE;
03352 }
03353
03354 }
03355 else
03356 {
03357
03358
03359 if(lMissingBytes == 0)
03360 {
03361 bSegmentAcceptable = TRUE;
03362 }
03363 else
03364 {
03365
03366 if((lMissingBytes >= (LONG)0) && (wFreeSpace > lMissingBytes))
03367 bSegmentAcceptable = TRUE;
03368 }
03369 }
03370
03371 if(!bSegmentAcceptable)
03372 {
03373
03374 if(!(localHeaderFlags & RST))
03375 SendTCP(ACK, SENDTCP_RESET_TIMERS);
03376 return;
03377 }
03378
03379
03380
03381
03382
03383
03384
03385
03386
03387
03388 if(localHeaderFlags & (RST | SYN))
03389 {
03390 CloseSocket();
03391 return;
03392 }
03393
03394
03395
03396
03397
03398
03399
03400
03401
03402 if(!(localHeaderFlags & ACK))
03403 return;
03404
03405 switch(MyTCBStub.smState)
03406 {
03407 case TCP_SYN_RECEIVED:
03408 if(localAckNumber != MyTCB.MySEQ)
03409 {
03410
03411
03412 localSeqNumber = MyTCB.MySEQ;
03413 MyTCB.MySEQ = localAckNumber;
03414 SendTCP(RST, SENDTCP_RESET_TIMERS);
03415 MyTCB.MySEQ = localSeqNumber;
03416 return;
03417 }
03418 MyTCBStub.smState = TCP_ESTABLISHED;
03419
03420
03421 case TCP_ESTABLISHED:
03422 case TCP_FIN_WAIT_1:
03423 case TCP_FIN_WAIT_2:
03424 case TCP_CLOSE_WAIT:
03425 case TCP_CLOSING:
03426
03427 wTemp = MyTCBStub.txHead - MyTCB.txUnackedTail;
03428 if((SHORT)wTemp < (SHORT)0)
03429 wTemp += MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart;
03430 dwTemp = MyTCB.MySEQ + (DWORD)wTemp;
03431
03432
03433 if((LONG)(dwTemp - localAckNumber) < (LONG)0)
03434 {
03435 SendTCP(ACK, 0);
03436 return;
03437 }
03438
03439
03440
03441 dwTemp = MyTCB.MySEQ - (LONG)(SHORT)(MyTCB.txUnackedTail - MyTCBStub.txTail);
03442 if(MyTCB.txUnackedTail < MyTCBStub.txTail)
03443 dwTemp -= MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart;
03444
03445
03446 dwTemp = localAckNumber - dwTemp;
03447 if(((LONG)(dwTemp) > (LONG)0) && (dwTemp <= MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart))
03448 {
03449 MyTCB.flags.bRXNoneACKed1 = 0;
03450 MyTCB.flags.bRXNoneACKed2 = 0;
03451 MyTCBStub.Flags.bHalfFullFlush = FALSE;
03452
03453
03454 wTemp = MyTCBStub.txTail;
03455 MyTCBStub.txTail += dwTemp;
03456 if(MyTCB.txUnackedTail >= wTemp)
03457 {
03458 if(MyTCB.txUnackedTail < MyTCBStub.txTail)
03459 {
03460 MyTCB.MySEQ += MyTCBStub.txTail - MyTCB.txUnackedTail;
03461 MyTCB.txUnackedTail = MyTCBStub.txTail;
03462 }
03463 }
03464 else
03465 {
03466 wTemp = MyTCB.txUnackedTail + (MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart);
03467 if(wTemp < MyTCBStub.txTail)
03468 {
03469 MyTCB.MySEQ += MyTCBStub.txTail - wTemp;
03470 MyTCB.txUnackedTail = MyTCBStub.txTail;
03471 }
03472 }
03473 if(MyTCBStub.txTail >= MyTCBStub.bufferRxStart)
03474 MyTCBStub.txTail -= MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart;
03475 if(MyTCB.txUnackedTail >= MyTCBStub.bufferRxStart)
03476 MyTCB.txUnackedTail -= MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart;
03477 }
03478 else
03479 {
03480
03481 if(MyTCBStub.txTail != MyTCB.txUnackedTail)
03482 {
03483 if(MyTCB.flags.bRXNoneACKed1)
03484 {
03485 if(MyTCB.flags.bRXNoneACKed2)
03486 {
03487
03488
03489 MyTCB.MySEQ -= (LONG)(SHORT)(MyTCB.txUnackedTail - MyTCBStub.txTail);
03490 if(MyTCB.txUnackedTail < MyTCBStub.txTail)
03491 MyTCB.MySEQ -= (LONG)(SHORT)(MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart);
03492 MyTCB.txUnackedTail = MyTCBStub.txTail;
03493 MyTCBStub.Flags.bTXASAPWithoutTimerReset = 1;
03494 }
03495 MyTCB.flags.bRXNoneACKed2 = 1;
03496 }
03497 MyTCB.flags.bRXNoneACKed1 = 1;
03498 }
03499 }
03500
03501
03502 if(MyTCBStub.txTail == MyTCBStub.txHead)
03503 {
03504
03505 if(MyTCBStub.Flags.bTXFIN == 0)
03506 {
03507 MyTCBStub.Flags.bTimerEnabled = 0;
03508 }
03509 else
03510 {
03511
03512 if(MyTCB.MySEQ == localAckNumber)
03513 {
03514 MyTCBStub.Flags.bTimerEnabled = 0;
03515 MyTCBStub.Flags.bTXFIN = 0;
03516 MyTCB.flags.bFINSent = 0;
03517 }
03518 }
03519 }
03520
03521
03522
03523
03524 if((MyTCB.remoteWindow == 0u) && h->Window)
03525 MyTCBStub.Flags.bTXASAP = 1;
03526 MyTCB.remoteWindow = h->Window;
03527
03528
03529 if(MyTCBStub.smState == TCP_FIN_WAIT_1)
03530 {
03531
03532 if(MyTCB.MySEQ == localAckNumber)
03533 {
03534
03535
03536 MyTCBStub.eventTime = TickGet() + TCP_FIN_WAIT_2_TIMEOUT;
03537 MyTCBStub.Flags.bTimerEnabled = 1;
03538 MyTCBStub.smState = TCP_FIN_WAIT_2;
03539 }
03540 }
03541 else if(MyTCBStub.smState == TCP_FIN_WAIT_2)
03542 {
03543
03544
03545
03546
03547
03548
03549
03550
03551 if(!(localHeaderFlags & FIN))
03552 {
03553 MyTCB.MySEQ = localAckNumber;
03554 SendTCP(RST | ACK, 0);
03555 CloseSocket();
03556 return;
03557 }
03558 }
03559 else if(MyTCBStub.smState == TCP_CLOSING)
03560 {
03561
03562 if(MyTCB.MySEQ == localAckNumber)
03563 {
03564
03565
03566
03567
03568
03569
03570
03571
03572
03573 CloseSocket();
03574 }
03575
03576 return;
03577 }
03578
03579 break;
03580
03581 case TCP_LAST_ACK:
03582
03583 if(MyTCB.MySEQ == localAckNumber)
03584 CloseSocket();
03585 return;
03586
03587
03588
03589
03590
03591
03592 default:
03593 break;
03594 }
03595
03596
03597
03598
03599
03600
03601 if(localHeaderFlags & URG)
03602 return;
03603
03604
03605
03606
03607
03608 if(MyTCBStub.smState == TCP_CLOSE_WAIT)
03609 return;
03610 if(MyTCBStub.smState == TCP_CLOSING)
03611 return;
03612 if(MyTCBStub.smState == TCP_LAST_ACK)
03613 return;
03614
03615
03616
03617
03618 if(len)
03619 {
03620
03621 if((SHORT)wMissingBytes <= 0)
03622 {
03623
03624 IPSetRxBuffer((h->DataOffset.Val << 2) - wMissingBytes);
03625 len += wMissingBytes;
03626
03627
03628
03629 if(len > wFreeSpace)
03630 len = wFreeSpace;
03631
03632 MyTCB.RemoteSEQ += (DWORD)len;
03633
03634
03635
03636 if(MyTCBStub.rxHead + len > MyTCBStub.bufferEnd)
03637 {
03638 wTemp = MyTCBStub.bufferEnd - MyTCBStub.rxHead + 1;
03639 TCPRAMCopy(MyTCBStub.rxHead, MyTCBStub.vMemoryMedium, (PTR_BASE)-1, TCP_ETH_RAM, wTemp);
03640 TCPRAMCopy(MyTCBStub.bufferRxStart, MyTCBStub.vMemoryMedium, (PTR_BASE)-1, TCP_ETH_RAM, len - wTemp);
03641 MyTCBStub.rxHead = MyTCBStub.bufferRxStart + (len - wTemp);
03642 }
03643 else
03644 {
03645 TCPRAMCopy(MyTCBStub.rxHead, MyTCBStub.vMemoryMedium, (PTR_BASE)-1, TCP_ETH_RAM, len);
03646 MyTCBStub.rxHead += len;
03647 }
03648
03649
03650 if(MyTCB.sHoleSize != -1)
03651 {
03652 MyTCB.sHoleSize -= len;
03653 wTemp = MyTCB.wFutureDataSize + MyTCB.sHoleSize;
03654
03655
03656 if((SHORT)wTemp < (SHORT)0)
03657 {
03658 MyTCB.sHoleSize = -1;
03659 }
03660 else if(MyTCB.sHoleSize <= 0)
03661 {
03662 MyTCB.RemoteSEQ += wTemp;
03663 MyTCBStub.rxHead += wTemp;
03664 if(MyTCBStub.rxHead > MyTCBStub.bufferEnd)
03665 MyTCBStub.rxHead -= MyTCBStub.bufferEnd - MyTCBStub.bufferRxStart + 1;
03666 MyTCB.sHoleSize = -1;
03667 }
03668 }
03669 }
03670 else if((SHORT)wMissingBytes > 0)
03671 {
03672
03673 if(len + wMissingBytes > wFreeSpace)
03674 len = wFreeSpace - wMissingBytes;
03675
03676
03677 IPSetRxBuffer(h->DataOffset.Val << 2);
03678
03679
03680 if(MyTCBStub.rxHead + wMissingBytes + len > MyTCBStub.bufferEnd)
03681 {
03682
03683 wTemp = MyTCBStub.bufferEnd - MyTCBStub.rxHead + 1 - wMissingBytes;
03684 if((SHORT)wTemp >= 0)
03685 {
03686 TCPRAMCopy(MyTCBStub.rxHead + wMissingBytes, MyTCBStub.vMemoryMedium, (PTR_BASE)-1, TCP_ETH_RAM, wTemp);
03687 TCPRAMCopy(MyTCBStub.bufferRxStart, MyTCBStub.vMemoryMedium, (PTR_BASE)-1, TCP_ETH_RAM, len - wTemp);
03688 }
03689 else
03690 {
03691 TCPRAMCopy(MyTCBStub.rxHead + wMissingBytes - (MyTCBStub.bufferEnd - MyTCBStub.bufferRxStart + 1), MyTCBStub.vMemoryMedium, (PTR_BASE)-1, TCP_ETH_RAM, len);
03692 }
03693 }
03694 else
03695 {
03696 TCPRAMCopy(MyTCBStub.rxHead + wMissingBytes, MyTCBStub.vMemoryMedium, (PTR_BASE)-1, TCP_ETH_RAM, len);
03697 }
03698
03699
03700 if(MyTCB.sHoleSize == -1)
03701 {
03702 MyTCB.sHoleSize = wMissingBytes;
03703 MyTCB.wFutureDataSize = len;
03704 }
03705 else
03706 {
03707
03708
03709 if(wMissingBytes < (WORD)MyTCB.sHoleSize)
03710 {
03711 if((wMissingBytes + len > (WORD)MyTCB.sHoleSize + MyTCB.wFutureDataSize) || (wMissingBytes + len < (WORD)MyTCB.sHoleSize))
03712 MyTCB.wFutureDataSize = len;
03713 else
03714 MyTCB.wFutureDataSize = (WORD)MyTCB.sHoleSize + MyTCB.wFutureDataSize - wMissingBytes;
03715 MyTCB.sHoleSize = wMissingBytes;
03716 }
03717 else if(wMissingBytes + len > (WORD)MyTCB.sHoleSize + MyTCB.wFutureDataSize)
03718 {
03719
03720
03721 if(wMissingBytes <= (WORD)MyTCB.sHoleSize + MyTCB.wFutureDataSize)
03722 MyTCB.wFutureDataSize += wMissingBytes + len - (WORD)MyTCB.sHoleSize - MyTCB.wFutureDataSize;
03723 }
03724
03725 }
03726 }
03727 }
03728
03729
03730
03731
03732
03733
03734 if(wSegmentLength)
03735 {
03736
03737
03738
03739
03740
03741
03742
03743
03744
03745
03746 if(MyTCBStub.smState != TCP_ESTABLISHED)
03747 MyTCBStub.rxTail = MyTCBStub.rxHead;
03748
03749 if(MyTCBStub.Flags.bOneSegmentReceived)
03750 {
03751 SendTCP(ACK, SENDTCP_RESET_TIMERS);
03752 SyncTCB();
03753
03754 }
03755 else
03756 {
03757 MyTCBStub.Flags.bOneSegmentReceived = TRUE;
03758
03759
03760
03761
03762 if(!MyTCBStub.Flags.bDelayedACKTimerEnabled)
03763 {
03764 MyTCBStub.Flags.bDelayedACKTimerEnabled = 1;
03765 MyTCBStub.OverlappedTimers.delayedACKTime = (WORD)TickGetDiv256() + (WORD)((TCP_DELAYED_ACK_TIMEOUT)>>8);
03766 }
03767 }
03768 }
03769
03770
03771
03772
03773 if(localHeaderFlags & FIN)
03774 {
03775
03776
03777
03778 if(MyTCB.RemoteSEQ + 1 == localSeqNumber + (DWORD)wSegmentLength)
03779 {
03780
03781 MyTCB.RemoteSEQ++;
03782
03783 switch(MyTCBStub.smState)
03784 {
03785 case TCP_SYN_RECEIVED:
03786
03787
03788
03789
03790
03791 MyTCBStub.smState = TCP_LAST_ACK;
03792 SendTCP(FIN | ACK, SENDTCP_RESET_TIMERS);
03793 return;
03794
03795 case TCP_ESTABLISHED:
03796
03797 MyTCBStub.smState = TCP_CLOSE_WAIT;
03798
03799
03800
03801
03802
03803
03804 MyTCBStub.OverlappedTimers.closeWaitTime = (WORD)TickGetDiv256() + (WORD)((TCP_CLOSE_WAIT_TIMEOUT)>>8);
03805 break;
03806
03807 case TCP_FIN_WAIT_1:
03808 if(MyTCB.MySEQ == localAckNumber)
03809 {
03810
03811
03812
03813
03814
03815
03816
03817
03818
03819 SendTCP(ACK, 0);
03820 CloseSocket();
03821 return;
03822 }
03823 else
03824 {
03825 MyTCBStub.smState = TCP_CLOSING;
03826 }
03827 break;
03828
03829 case TCP_FIN_WAIT_2:
03830
03831
03832
03833
03834
03835
03836
03837
03838
03839 SendTCP(ACK, 0);
03840 CloseSocket();
03841 return;
03842
03843 default:
03844 break;
03845 }
03846
03847
03848 SendTCP(ACK, SENDTCP_RESET_TIMERS);
03849 }
03850 }
03851 }
03852
03853
03854
03855
03856
03857
03858
03859
03860
03861
03862
03863
03864
03865
03866
03867
03868
03869
03870
03871
03872
03873
03874
03875
03876
03877
03878
03879
03880
03881
03882
03883
03884
03885
03886
03887
03888
03889
03890
03891
03892
03893
03894
03895
03896
03897
03898
03899
03900
03901
03902
03903
03904
03905
03906
03907
03908 BOOL TCPAdjustFIFOSize(TCP_SOCKET hTCP, WORD wMinRXSize, WORD wMinTXSize, BYTE vFlags)
03909 {
03910 PTR_BASE ptrTemp, ptrHead;
03911 WORD wTXAllocation;
03912
03913
03914 SyncTCBStub(hTCP);
03915
03916
03917
03918 if(wMinRXSize == 0u)
03919 wMinRXSize = 1;
03920
03921
03922
03923 #if defined(STACK_USE_SSL)
03924 if(TCPIsSSL(hTCP) && wMinRXSize < 25)
03925 wMinRXSize = 25;
03926 if(TCPIsSSL(hTCP) && wMinTXSize < 25)
03927 wMinTXSize = 25;
03928 #endif
03929
03930
03931 ptrTemp = MyTCBStub.bufferEnd - MyTCBStub.bufferTxStart - 1;
03932 if(wMinRXSize + wMinTXSize > ptrTemp)
03933 return FALSE;
03934
03935 SyncTCB();
03936
03937
03938 if(!(vFlags & (TCP_ADJUST_GIVE_REST_TO_TX | TCP_ADJUST_GIVE_REST_TO_RX)))
03939 vFlags |= TCP_ADJUST_GIVE_REST_TO_TX | TCP_ADJUST_GIVE_REST_TO_RX;
03940
03941
03942
03943 wTXAllocation = wMinTXSize;
03944 ptrTemp -= wMinRXSize + wMinTXSize;
03945
03946
03947 if(vFlags & TCP_ADJUST_GIVE_REST_TO_TX)
03948 {
03949 if(vFlags & TCP_ADJUST_GIVE_REST_TO_RX)
03950 {
03951
03952 wTXAllocation += ptrTemp>>1;
03953 }
03954 else
03955 {
03956 wTXAllocation += ptrTemp;
03957 }
03958 }
03959
03960
03961 ptrTemp = MyTCBStub.bufferTxStart + wTXAllocation + 1;
03962
03963
03964 ptrHead = MyTCBStub.rxHead;
03965 #if defined(STACK_USE_SSL)
03966 if(TCPIsSSL(hTCP))
03967 ptrHead = MyTCBStub.sslRxHead;
03968 #endif
03969
03970
03971 if(MyTCB.sHoleSize != -1)
03972 {
03973 ptrHead += MyTCB.sHoleSize + MyTCB.wFutureDataSize;
03974 if(ptrHead > MyTCBStub.bufferEnd)
03975 ptrHead -= MyTCBStub.bufferEnd - MyTCBStub.bufferRxStart + 1;
03976 }
03977
03978
03979 if(MyTCBStub.rxTail < ptrHead)
03980 {
03981 if(ptrTemp > MyTCBStub.rxTail)
03982 {
03983 if(vFlags & TCP_ADJUST_PRESERVE_RX)
03984 return FALSE;
03985 else
03986 {
03987 MyTCBStub.rxTail = ptrTemp;
03988 MyTCBStub.rxHead = ptrTemp;
03989
03990 #if defined(STACK_USE_SSL)
03991 MyTCBStub.sslRxHead = ptrTemp;
03992 #endif
03993 }
03994 }
03995 }
03996 else if(MyTCBStub.rxTail > ptrHead)
03997 {
03998 if(ptrTemp > MyTCBStub.bufferRxStart)
03999 {
04000 if(vFlags & TCP_ADJUST_PRESERVE_RX)
04001 return FALSE;
04002 else
04003 {
04004 MyTCBStub.rxTail = ptrTemp;
04005 MyTCBStub.rxHead = ptrTemp;
04006
04007 #if defined(STACK_USE_SSL)
04008 MyTCBStub.sslRxHead = ptrTemp;
04009 #endif
04010 }
04011 }
04012 }
04013 else
04014 {
04015
04016
04017 MyTCBStub.rxTail = ptrTemp;
04018 MyTCBStub.rxHead = ptrTemp;
04019
04020 #if defined(STACK_USE_SSL)
04021 MyTCBStub.sslRxHead = ptrTemp;
04022 #endif
04023 }
04024
04025
04026 if(ptrHead < MyTCBStub.rxTail && (vFlags & TCP_ADJUST_PRESERVE_RX))
04027 {
04028 TCPRAMCopy(ptrTemp, MyTCBStub.vMemoryMedium,
04029 MyTCBStub.bufferRxStart, MyTCBStub.vMemoryMedium,
04030 ptrHead - MyTCBStub.bufferRxStart);
04031
04032
04033 #if defined(STACK_USE_SSL)
04034 if(TCPIsSSL(hTCP) && MyTCBStub.sslRxHead < MyTCBStub.rxTail)
04035 MyTCBStub.sslRxHead -= MyTCBStub.bufferRxStart - ptrTemp;
04036 #endif
04037 if(MyTCBStub.rxHead < MyTCBStub.rxTail)
04038 MyTCBStub.rxHead -= MyTCBStub.bufferRxStart - ptrTemp;
04039 }
04040
04041
04042 MyTCBStub.bufferRxStart = ptrTemp;
04043
04044
04045 MyTCB.txUnackedTail = MyTCBStub.bufferTxStart;
04046 MyTCBStub.txTail = MyTCBStub.bufferTxStart;
04047 MyTCBStub.txHead = MyTCBStub.bufferTxStart;
04048
04049 #if defined(STACK_USE_SSL)
04050 if(TCPIsSSL(hTCP))
04051 MyTCBStub.sslTxHead = MyTCBStub.txHead + 5;
04052 #endif
04053
04054
04055 if(MyTCBStub.smState == TCP_ESTABLISHED)
04056 SendTCP(ACK, SENDTCP_RESET_TIMERS);
04057
04058 return TRUE;
04059
04060 }
04061
04062
04063
04064
04065
04066
04067
04068
04069
04070
04071
04072
04073
04074
04075
04076
04077
04078
04079
04080
04081
04082
04083
04084
04085
04086
04087
04088
04089
04090
04091
04092 static void TCPRAMCopy(PTR_BASE ptrDest, BYTE vDestType, PTR_BASE ptrSource, BYTE vSourceType, WORD wLength)
04093 {
04094 #if defined(SPIRAM_CS_TRIS)
04095 BYTE vBuffer[16];
04096 WORD w;
04097 #endif
04098
04099 switch(vSourceType)
04100 {
04101 case TCP_PIC_RAM:
04102 switch(vDestType)
04103 {
04104 case TCP_PIC_RAM:
04105 memcpy((void*)(BYTE*)ptrDest, (void*)(BYTE*)ptrSource, wLength);
04106 break;
04107
04108 case TCP_ETH_RAM:
04109 if(!((WORD_VAL*)&ptrDest)->bits.b15)
04110 MACSetWritePtr((WORD)ptrDest);
04111 MACPutArray((BYTE*)ptrSource, wLength);
04112 break;
04113
04114 #if defined(SPIRAM_CS_TRIS)
04115 case TCP_SPI_RAM:
04116 SPIRAMPutArray(ptrDest, (BYTE*)ptrSource, wLength);
04117 break;
04118 #endif
04119 }
04120 break;
04121
04122 case TCP_ETH_RAM:
04123 switch(vDestType)
04124 {
04125 case TCP_PIC_RAM:
04126 if(!((WORD_VAL*)&ptrSource)->bits.b15)
04127 MACSetReadPtr(ptrSource);
04128 MACGetArray((BYTE*)ptrDest, wLength);
04129 break;
04130
04131 case TCP_ETH_RAM:
04132 MACMemCopyAsync(ptrDest, ptrSource, wLength);
04133 while(!MACIsMemCopyDone());
04134 break;
04135
04136 #if defined(SPIRAM_CS_TRIS)
04137 case TCP_SPI_RAM:
04138 if(!((WORD_VAL*)&ptrSource)->bits.b15)
04139 MACSetReadPtr(ptrSource);
04140 w = sizeof(vBuffer);
04141 while(wLength)
04142 {
04143 if(w > wLength)
04144 w = wLength;
04145
04146
04147 MACGetArray(vBuffer, w);
04148 SPIRAMPutArray(ptrDest, vBuffer, w);
04149 ptrDest += w;
04150 wLength -= w;
04151 }
04152 break;
04153 #endif
04154 }
04155 break;
04156
04157 #if defined(SPIRAM_CS_TRIS)
04158 case TCP_SPI_RAM:
04159 switch(vDestType)
04160 {
04161 case TCP_PIC_RAM:
04162 SPIRAMGetArray(ptrSource, (BYTE*)ptrDest, wLength);
04163 break;
04164
04165 case TCP_ETH_RAM:
04166 if(!((WORD_VAL*)&ptrDest)->bits.b15)
04167 MACSetWritePtr(ptrDest);
04168 w = sizeof(vBuffer);
04169 while(wLength)
04170 {
04171 if(w > wLength)
04172 w = wLength;
04173
04174
04175 SPIRAMGetArray(ptrSource, vBuffer, w);
04176 ptrSource += w;
04177 MACPutArray(vBuffer, w);
04178 wLength -= w;
04179 }
04180 break;
04181
04182 case TCP_SPI_RAM:
04183
04184 w = sizeof(vBuffer);
04185 while(wLength)
04186 {
04187 if(w > wLength)
04188 w = wLength;
04189
04190 SPIRAMGetArray(ptrSource, vBuffer, w);
04191 SPIRAMPutArray(ptrDest, vBuffer, w);
04192 ptrSource += w;
04193 ptrDest += w;
04194 wLength -= w;
04195 }
04196 break;
04197 }
04198 break;
04199 #endif
04200 }
04201 }
04202
04203
04204
04205
04206
04207
04208
04209
04210
04211
04212
04213
04214
04215
04216
04217
04218
04219
04220
04221
04222
04223
04224
04225
04226
04227
04228
04229
04230
04231
04232
04233
04234
04235 #if defined(__18CXX)
04236 static void TCPRAMCopyROM(PTR_BASE wDest, BYTE wDestType, ROM BYTE* wSource, WORD wLength)
04237 {
04238 BYTE vBuffer[16];
04239 WORD w;
04240
04241 switch(wDestType)
04242 {
04243 case TCP_PIC_RAM:
04244 memcpypgm2ram((void*)(BYTE*)wDest, (ROM void*)wSource, wLength);
04245 break;
04246
04247 case TCP_ETH_RAM:
04248 if(!((WORD_VAL*)&wDest)->bits.b15)
04249 MACSetWritePtr(wDest);
04250 w = sizeof(vBuffer);
04251 while(wLength)
04252 {
04253 if(w > wLength)
04254 w = wLength;
04255
04256
04257 memcpypgm2ram(vBuffer, (ROM void*)wSource, w);
04258 MACPutArray(vBuffer, w);
04259 wSource += w;
04260 wLength -= w;
04261 }
04262 break;
04263
04264 #if defined(SPIRAM_CS_TRIS)
04265 case TCP_SPI_RAM:
04266 w = sizeof(vBuffer);
04267 while(wLength)
04268 {
04269 if(w > wLength)
04270 w = wLength;
04271
04272
04273 memcpypgm2ram(vBuffer, (ROM void*)wSource, w);
04274 SPIRAMPutArray(wDest, vBuffer, w);
04275 wDest += w;
04276 wSource += w;
04277 wLength -= w;
04278 }
04279 break;
04280 #endif
04281 }
04282 }
04283 #endif
04284
04285
04286
04287
04288
04289
04290
04291
04292
04293
04294
04295
04296
04297
04298
04299
04300
04301
04302
04303
04304
04305
04306
04307
04308
04309
04310
04311
04312
04313
04314
04315 #if defined(STACK_USE_SSL_CLIENT)
04316 BOOL TCPStartSSLClient(TCP_SOCKET hTCP, BYTE* host)
04317 {
04318 BYTE i;
04319
04320 SyncTCBStub(hTCP);
04321
04322
04323 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
04324 return FALSE;
04325
04326
04327 MyTCBStub.sslStubID = SSLStartSession(hTCP);
04328
04329
04330 if(MyTCBStub.sslStubID == SSL_INVALID_ID)
04331 return FALSE;
04332
04333
04334 MyTCBStub.sslReqMessage = SSL_CLIENT_HELLO;
04335 MyTCBStub.sslRxHead = MyTCBStub.rxHead;
04336 MyTCBStub.sslTxHead = MyTCBStub.txHead;
04337 MyTCBStub.Flags.bSSLHandshaking = 1;
04338 for(i = 0; i < 5; i++)
04339 {
04340 if(++MyTCBStub.sslTxHead >= MyTCBStub.bufferRxStart)
04341 MyTCBStub.sslTxHead = MyTCBStub.bufferTxStart;
04342 }
04343 return TRUE;
04344 }
04345 #endif // SSL Client
04346
04347
04348
04349
04350
04351
04352
04353
04354
04355
04356
04357
04358
04359
04360
04361
04362
04363
04364
04365
04366
04367
04368 #if defined(STACK_USE_SSL_SERVER)
04369 BOOL TCPStartSSLServer(TCP_SOCKET hTCP)
04370 {
04371 BYTE i;
04372
04373 SyncTCBStub(hTCP);
04374 SyncTCB();
04375
04376
04377 if(MyTCBStub.sslStubID != SSL_INVALID_ID)
04378 return TRUE;
04379
04380
04381 MyTCBStub.sslStubID = SSLStartSession(hTCP);
04382
04383
04384 if(MyTCBStub.sslStubID == SSL_INVALID_ID)
04385 return FALSE;
04386
04387
04388 MyTCBStub.remoteHash.Val = MyTCB.localPort.Val;
04389 MyTCB.localPort.Val = MyTCB.localSSLPort.Val;
04390 MyTCB.localSSLPort.Val = MyTCBStub.remoteHash.Val;
04391
04392
04393 MyTCBStub.sslReqMessage = SSL_NO_MESSAGE;
04394 MyTCBStub.sslRxHead = MyTCBStub.rxHead;
04395 MyTCBStub.sslTxHead = MyTCBStub.txHead;
04396 MyTCBStub.Flags.bSSLHandshaking = 1;
04397 for(i = 0; i < 5; i++)
04398 {
04399 if(++MyTCBStub.sslTxHead >= MyTCBStub.bufferRxStart)
04400 MyTCBStub.sslTxHead = MyTCBStub.bufferTxStart;
04401 }
04402 return TRUE;
04403 }
04404 #endif // SSL Client
04405
04406
04407
04408
04409
04410
04411
04412
04413
04414
04415
04416
04417
04418
04419
04420
04421
04422
04423
04424
04425
04426
04427
04428 #if defined(STACK_USE_SSL_SERVER)
04429 BOOL TCPAddSSLListener(TCP_SOCKET hTCP, WORD port)
04430 {
04431 SyncTCBStub(hTCP);
04432
04433 if(MyTCBStub.smState != TCP_LISTEN)
04434 return FALSE;
04435
04436 SyncTCB();
04437
04438 MyTCB.localSSLPort.Val = port;
04439 MyTCBStub.sslTxHead = port;
04440
04441 return TRUE;
04442 }
04443 #endif // SSL Server
04444
04445
04446
04447
04448
04449
04450
04451
04452
04453
04454
04455
04456
04457
04458
04459
04460
04461
04462
04463
04464
04465
04466
04467 #if defined(STACK_USE_SSL)
04468 BOOL TCPRequestSSLMessage(TCP_SOCKET hTCP, BYTE msg)
04469 {
04470 SyncTCBStub(hTCP);
04471
04472 if(msg == SSL_NO_MESSAGE || MyTCBStub.sslReqMessage == SSL_NO_MESSAGE)
04473 {
04474 MyTCBStub.sslReqMessage = msg;
04475 return TRUE;
04476 }
04477
04478 return FALSE;
04479 }
04480 #endif // SSL
04481
04482
04483
04484
04485
04486
04487
04488
04489
04490
04491
04492
04493
04494
04495
04496
04497
04498
04499
04500
04501
04502
04503
04504 #if defined(STACK_USE_SSL)
04505 BOOL TCPSSLIsHandshaking(TCP_SOCKET hTCP)
04506 {
04507 SyncTCBStub(hTCP);
04508 return MyTCBStub.Flags.bSSLHandshaking;
04509 }
04510 #endif // SSL
04511
04512
04513
04514
04515
04516
04517
04518
04519
04520
04521
04522
04523
04524
04525
04526
04527
04528
04529
04530
04531
04532
04533 #if defined(STACK_USE_SSL)
04534 BOOL TCPIsSSL(TCP_SOCKET hTCP)
04535 {
04536 SyncTCBStub(hTCP);
04537
04538 if(MyTCBStub.sslStubID == SSL_INVALID_ID)
04539 return FALSE;
04540
04541 return TRUE;
04542 }
04543 #endif // SSL
04544
04545
04546
04547
04548
04549
04550
04551
04552
04553
04554
04555
04556
04557
04558
04559
04560
04561
04562
04563
04564
04565
04566
04567
04568
04569 #if defined(STACK_USE_SSL)
04570 void TCPSSLHandshakeComplete(TCP_SOCKET hTCP)
04571 {
04572 SyncTCBStub(hTCP);
04573 MyTCBStub.Flags.bSSLHandshaking = 0;
04574 }
04575 #endif // SSL
04576
04577
04578
04579
04580
04581
04582
04583
04584
04585
04586
04587
04588
04589
04590
04591
04592
04593
04594
04595
04596
04597
04598
04599
04600
04601
04602
04603
04604
04605
04606
04607 #if defined(STACK_USE_SSL)
04608 void TCPSSLDecryptMAC(TCP_SOCKET hTCP, ARCFOUR_CTX* ctx, WORD len, BOOL inPlace)
04609 {
04610 PTR_BASE wSrc, wDest, wBlockLen, wTemp;
04611 BYTE buffer[32];
04612
04613
04614 SyncTCBStub(hTCP);
04615 wSrc = MyTCBStub.rxTail;
04616 if(inPlace)
04617 wDest = wSrc;
04618 else
04619 wDest = MyTCBStub.sslRxHead;
04620
04621
04622 while(len)
04623 {
04624
04625 wBlockLen = sizeof(buffer);
04626 if(wBlockLen > len)
04627 wBlockLen = len;
04628
04629
04630 if(wSrc + wBlockLen > MyTCBStub.bufferEnd)
04631 {
04632 wTemp = MyTCBStub.bufferEnd - wSrc + 1;
04633 TCPRAMCopy((PTR_BASE)buffer, TCP_PIC_RAM, wSrc, MyTCBStub.vMemoryMedium, wTemp);
04634 TCPRAMCopy((PTR_BASE)buffer+wTemp, TCP_PIC_RAM, MyTCBStub.bufferRxStart, MyTCBStub.vMemoryMedium, wBlockLen - wTemp);
04635 wSrc = MyTCBStub.bufferRxStart + wBlockLen - wTemp;
04636 }
04637 else
04638 {
04639 TCPRAMCopy((PTR_BASE)buffer, TCP_PIC_RAM, wSrc, MyTCBStub.vMemoryMedium, wBlockLen);
04640 wSrc += wBlockLen;
04641 }
04642
04643
04644 ARCFOURCrypt(ctx, buffer, wBlockLen);
04645 SSLMACAdd(buffer, wBlockLen);
04646
04647
04648 if(wDest + wBlockLen > MyTCBStub.bufferEnd)
04649 {
04650 wTemp = MyTCBStub.bufferEnd - wDest + 1;
04651 TCPRAMCopy(wDest, MyTCBStub.vMemoryMedium, (PTR_BASE)buffer, TCP_PIC_RAM, wTemp);
04652 TCPRAMCopy(MyTCBStub.bufferRxStart, MyTCBStub.vMemoryMedium, (PTR_BASE)buffer+wTemp, TCP_PIC_RAM, wBlockLen - wTemp);
04653 wDest = MyTCBStub.bufferRxStart + wBlockLen - wTemp;
04654 }
04655 else
04656 {
04657 TCPRAMCopy(wDest, MyTCBStub.vMemoryMedium, (PTR_BASE)buffer, TCP_PIC_RAM, wBlockLen);
04658 wDest += wBlockLen;
04659 }
04660
04661
04662 len -= wBlockLen;
04663 }
04664
04665
04666 if(!inPlace)
04667 {
04668 MyTCBStub.sslRxHead = wDest;
04669 MyTCBStub.rxTail = wSrc;
04670 }
04671
04672 }
04673 #endif // SSL
04674
04675
04676
04677
04678
04679
04680
04681
04682
04683
04684
04685
04686
04687
04688
04689
04690
04691
04692
04693
04694
04695
04696
04697
04698
04699
04700
04701
04702
04703
04704 #if defined(STACK_USE_SSL)
04705 void TCPSSLInPlaceMACEncrypt(TCP_SOCKET hTCP, ARCFOUR_CTX* ctx, BYTE* MACSecret, WORD len)
04706 {
04707 PTR_BASE pos;
04708 WORD blockLen;
04709 BYTE buffer[32];
04710
04711
04712 SyncTCBStub(hTCP);
04713 pos = MyTCBStub.txHead;
04714 for(blockLen = 0; blockLen < 5; blockLen++)
04715 {
04716 if(++pos >= MyTCBStub.bufferRxStart)
04717 pos = MyTCBStub.bufferTxStart;
04718 }
04719
04720
04721 while(len)
04722 {
04723
04724 blockLen = sizeof(buffer);
04725 if(blockLen > len)
04726 blockLen = len;
04727 if(blockLen > MyTCBStub.bufferRxStart - pos)
04728 blockLen = MyTCBStub.bufferRxStart - pos;
04729
04730
04731 TCPRAMCopy((PTR_BASE)buffer, TCP_PIC_RAM, pos, MyTCBStub.vMemoryMedium, blockLen);
04732
04733
04734 SSLMACAdd(buffer, blockLen);
04735 ARCFOURCrypt(ctx, buffer, blockLen);
04736
04737
04738 TCPRAMCopy(pos, MyTCBStub.vMemoryMedium, (PTR_BASE)buffer, TCP_PIC_RAM, blockLen);
04739
04740
04741 pos += blockLen;
04742 len -= blockLen;
04743 if(pos >= MyTCBStub.bufferRxStart)
04744 pos = MyTCBStub.bufferTxStart;
04745 }
04746
04747
04748 SSLMACCalc(MACSecret, buffer);
04749 ARCFOURCrypt(ctx, buffer, 16);
04750
04751
04752
04753
04754
04755
04756 len = 16;
04757 blockLen = 0;
04758
04759 if(MyTCBStub.sslTxHead + len >= MyTCBStub.bufferRxStart)
04760 {
04761 blockLen = MyTCBStub.bufferRxStart-MyTCBStub.sslTxHead;
04762 TCPRAMCopy(MyTCBStub.sslTxHead, MyTCBStub.vMemoryMedium, (PTR_BASE)buffer, TCP_PIC_RAM, blockLen);
04763 len -= blockLen;
04764 MyTCBStub.sslTxHead = MyTCBStub.bufferTxStart;
04765 }
04766
04767 TCPRAMCopy(MyTCBStub.sslTxHead, MyTCBStub.vMemoryMedium, (PTR_BASE)&buffer[blockLen], TCP_PIC_RAM, len);
04768 MyTCBStub.sslTxHead += len;
04769
04770 }
04771 #endif // SSL
04772
04773
04774
04775
04776
04777
04778
04779
04780
04781
04782
04783
04784
04785
04786
04787
04788
04789
04790
04791
04792
04793
04794
04795
04796
04797
04798
04799
04800
04801
04802
04803
04804
04805
04806
04807
04808 #if defined(STACK_USE_SSL)
04809 void TCPSSLPutRecordHeader(TCP_SOCKET hTCP, BYTE* hdr, BOOL recDone)
04810 {
04811 BYTE i;
04812
04813
04814 SyncTCBStub(hTCP);
04815
04816
04817 if(hdr)
04818 {
04819 for(i = 0; i < 5; i++)
04820 {
04821 TCPRAMCopy(MyTCBStub.txHead, MyTCBStub.vMemoryMedium, (PTR_BASE)hdr+i, TCP_PIC_RAM, sizeof(BYTE));
04822 if(++MyTCBStub.txHead >= MyTCBStub.bufferRxStart)
04823 MyTCBStub.txHead = MyTCBStub.bufferTxStart;
04824 }
04825 }
04826
04827
04828
04829
04830
04831 TCPFlush(hTCP);
04832 MyTCBStub.txHead = MyTCBStub.sslTxHead;
04833 TCPFlush(hTCP);
04834
04835
04836
04837 if(recDone)
04838 {
04839 for(i = 0; i < 5; i++)
04840 {
04841 if(++MyTCBStub.sslTxHead >= MyTCBStub.bufferRxStart)
04842 MyTCBStub.sslTxHead = MyTCBStub.bufferTxStart;
04843 }
04844 }
04845 }
04846 #endif // SSL
04847
04848
04849
04850
04851
04852
04853
04854
04855
04856
04857
04858
04859
04860
04861
04862
04863
04864
04865
04866
04867
04868 #if defined(STACK_USE_SSL)
04869 WORD TCPSSLGetPendingTxSize(TCP_SOCKET hTCP)
04870 {
04871 SyncTCBStub(hTCP);
04872
04873
04874
04875
04876
04877
04878 if(MyTCBStub.sslTxHead > MyTCBStub.txHead)
04879 return MyTCBStub.sslTxHead - MyTCBStub.txHead - 5;
04880 else
04881 return (MyTCBStub.bufferRxStart - MyTCBStub.bufferTxStart - 1) - (MyTCBStub.txHead - MyTCBStub.sslTxHead - 1) - 5;
04882 }
04883 #endif
04884
04885
04886
04887
04888
04889
04890
04891
04892
04893
04894
04895
04896
04897
04898
04899
04900
04901
04902
04903
04904
04905
04906
04907
04908
04909
04910 #if defined(STACK_USE_SSL)
04911 void TCPSSLHandleIncoming(TCP_SOCKET hTCP)
04912 {
04913 PTR_BASE prevRxTail, prevRxHead, wSrc, wDest;
04914 WORD wToMove, wLen;
04915
04916
04917 SyncTCBStub(hTCP);
04918
04919
04920 if(MyTCBStub.sslRxHead != MyTCBStub.rxHead)
04921 {
04922
04923 SyncTCB();
04924
04925
04926 prevRxTail = MyTCBStub.rxTail;
04927 prevRxHead = MyTCBStub.rxHead;
04928 MyTCBStub.rxTail = MyTCBStub.rxHead;
04929 MyTCBStub.rxHead = MyTCBStub.sslRxHead;
04930 MyTCBStub.sslRxHead = prevRxHead;
04931
04932
04933 SSLRxRecord(hTCP, MyTCBStub.sslStubID);
04934
04935
04936
04937
04938
04939 if(prevRxHead == MyTCBStub.rxTail)
04940 {
04941 MyTCBStub.sslRxHead = MyTCBStub.rxHead;
04942 MyTCBStub.rxTail = prevRxTail;
04943 MyTCBStub.rxHead = prevRxHead;
04944 }
04945 else if(MyTCBStub.rxTail == MyTCBStub.rxHead && MyTCB.sHoleSize == -1)
04946 {
04947 MyTCBStub.rxTail = prevRxTail;
04948 MyTCBStub.rxHead = MyTCBStub.sslRxHead;
04949 }
04950 else if(prevRxTail == prevRxHead)
04951 {
04952 MyTCBStub.sslRxHead = MyTCBStub.rxHead;
04953 MyTCBStub.rxHead = MyTCBStub.rxTail;
04954 }
04955 else
04956 {
04957 if(MyTCB.sHoleSize == -1)
04958 {
04959 wToMove = TCPIsGetReady(hTCP);
04960 }
04961 else
04962 {
04963 wToMove = TCPIsGetReady(hTCP) + MyTCB.sHoleSize + MyTCB.wFutureDataSize;
04964 }
04965
04966
04967 wDest = MyTCBStub.sslRxHead;
04968 wSrc = MyTCBStub.rxTail;
04969
04970
04971
04972 if(wSrc > wDest)
04973 {
04974 wLen = MyTCBStub.bufferEnd - wSrc + 1;
04975 if(wLen > wToMove)
04976 wLen = wToMove;
04977 TCPRAMCopy(wDest, MyTCBStub.vMemoryMedium,
04978 wSrc, MyTCBStub.vMemoryMedium, wLen);
04979 wDest += wLen;
04980 wSrc = MyTCBStub.bufferRxStart;
04981 wToMove -= wLen;
04982 }
04983
04984
04985 if(wToMove > 0)
04986 {
04987 wLen = MyTCBStub.bufferEnd - wDest + 1;
04988 if(wLen > wToMove)
04989 wLen = wToMove;
04990 TCPRAMCopy(wDest, MyTCBStub.vMemoryMedium,
04991 wSrc, MyTCBStub.vMemoryMedium, wLen);
04992 wToMove -= wLen;
04993 wDest += wLen;
04994 wSrc += wLen;
04995 if(wDest > MyTCBStub.bufferEnd)
04996 wDest = MyTCBStub.bufferRxStart;
04997 }
04998
04999
05000 if(wToMove > 0)
05001 {
05002 TCPRAMCopy(wDest, MyTCBStub.vMemoryMedium,
05003 wSrc, MyTCBStub.vMemoryMedium, wToMove);
05004 wDest += wToMove;
05005 }
05006
05007
05008 MyTCBStub.rxTail = prevRxTail;
05009 MyTCBStub.rxHead = MyTCBStub.sslRxHead;
05010 MyTCBStub.sslRxHead = wDest;
05011 }
05012
05013 }
05014
05015 }
05016 #endif
05017