00001
00002
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
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 #define __DHCP_C
00101 #include "TCPIP.h"
00102
00103
00104 #define DHCP_TIMEOUT (TICK)(2*TICK_SECOND)
00105
00106 #define DHCP_TIMEOUT2 (TICK)(180*TICK_SECOND)
00107
00108
00109 SM_DHCP smDHCPState = SM_DHCP_GET_SOCKET;
00110
00111
00112 DHCP_CLIENT_FLAGS DHCPFlags = {{0x00}};
00113
00114
00115 static UDP_SOCKET DHCPSocket = INVALID_UDP_SOCKET;
00116
00117
00118 BYTE DHCPDiscRetry = 0;
00119
00120 BYTE DHCPBindCount = 0;
00121 static DWORD_VAL DHCPServerID;
00122 static DWORD_VAL DHCPLeaseTime;
00123 static IP_ADDR tempIPAddress;
00124 static IP_ADDR tempGateway;
00125 static IP_ADDR tempMask;
00126
00127
00128
00129
00130 static union
00131 {
00132 struct
00133 {
00134 char IPAddress:1;
00135 char Gateway:1;
00136 char Mask:1;
00137 char DNS:1;
00138 char DNS2:1;
00139 char HostName:1;
00140 } bits;
00141 BYTE Val;
00142 } ValidValues;
00143
00144
00145 static BYTE _DHCPReceive(void);
00146 static void _DHCPSend(BYTE messageType, BOOL bRenewing);
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 void DHCPReset( BOOL bNoAutoIP )
00173 {
00174
00175 if(smDHCPState == SM_DHCP_DISABLED)
00176 return;
00177
00178 if(DHCPSocket != INVALID_UDP_SOCKET)
00179
00180
00181 smDHCPState = SM_DHCP_AUTOIP;
00182 else
00183 smDHCPState = SM_DHCP_GET_SOCKET;
00184
00185
00186
00187
00188 if ( ( bNoAutoIP == FALSE ) || ( sIPConfig.Flags.bIPunique == FALSE ) )
00189 {
00190 sIPConfig.MyIPAddr.Val = 0;
00191 sIPConfig.MyMask.Val = 0;
00192 sIPConfig.MyGateway.Val = 0;
00193 sIPConfig.Flags.bIPunique = FALSE;
00194 }
00195
00196 DHCPBindCount = 0;
00197 DHCPDiscRetry = 0;
00198 DHCPFlags.bits.bIsBound = FALSE;
00199
00200
00201 DHCPFlags.bits.bDHCPServerDetected = FALSE;
00202 }
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 void DHCPDisable(void)
00234 {
00235 if(DHCPSocket != INVALID_UDP_SOCKET)
00236 {
00237 UDPClose(DHCPSocket);
00238 DHCPSocket = INVALID_UDP_SOCKET;
00239 }
00240
00241 smDHCPState = SM_DHCP_DISABLED;
00242
00243
00244
00245 sPCommonConfig.Flags.bIsDHCPEnabled = 0;
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269 void DHCPEnable(void)
00270 {
00271 if(smDHCPState == SM_DHCP_DISABLED)
00272 {
00273
00274
00275
00276 smDHCPState = SM_DHCP_GET_SOCKET;
00277 DHCPBindCount = 0;
00278 DHCPFlags.bits.bIsBound = FALSE;
00279 }
00280 }
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307 void DHCPTask(void)
00308 {
00309 static TICK eventTime;
00310
00311 switch(smDHCPState)
00312 {
00313 case SM_DHCP_GET_SOCKET:
00314
00315 DHCPSocket = UDPOpen(DHCP_CLIENT_PORT, NULL, DHCP_SERVER_PORT);
00316 if(DHCPSocket == INVALID_UDP_SOCKET)
00317 break;
00318
00319 smDHCPState = SM_DHCP_AUTOIP;
00320
00321
00322
00323 case SM_DHCP_AUTOIP:
00324 if (sIPConfig.MyIPAddr.Val == 0)
00325 {
00326 if ((DHCPDiscRetry > 0) && (DHCPDiscRetry < 4))
00327 {
00328
00329
00330
00331 MAC_ADDR dummy;
00332 if (ARPIsResolved(&sPCommonConfig.LastAutoIP, &dummy) == FALSE)
00333 ARPResolve(&sPCommonConfig.LastAutoIP);
00334 else
00335 {
00336 sPCommonConfig.LastAutoIP = GenerateAutoIP(&sPCommonConfig.LastAutoIP);
00337
00338 DHCPDiscRetry = 1;
00339 ARPResolve(&sPCommonConfig.LastAutoIP);
00340 }
00341 }
00342 else if (DHCPDiscRetry == 4)
00343 {
00344
00345 sIPConfig.MyIPAddr = sPCommonConfig.LastAutoIP;
00346 sIPConfig.MyMask.Val = 0xFFFF;
00347
00348
00349 }
00350 }
00351 smDHCPState = SM_DHCP_SEND_DISCOVERY;
00352
00353
00354 case SM_DHCP_SEND_DISCOVERY:
00355 if(UDPIsPutReady(DHCPSocket) < 300u)
00356 break;
00357
00358
00359
00360 memset((void*)&UDPSocketInfo[DHCPSocket].remoteNode, 0xFF, sizeof(UDPSocketInfo[DHCPSocket].remoteNode));
00361
00362
00363
00364
00365 DHCPLeaseTime.Val = 60;
00366 ValidValues.Val = 0x00;
00367 DHCPBindCount = 0;
00368 DHCPFlags.bits.bIsBound = FALSE;
00369 DHCPFlags.bits.bOfferReceived = FALSE;
00370
00371
00372 _DHCPSend(DHCP_DISCOVER_MESSAGE, FALSE);
00373
00374
00375 eventTime = TickGet();
00376
00377 smDHCPState = SM_DHCP_GET_OFFER;
00378 break;
00379
00380 case SM_DHCP_GET_OFFER:
00381
00382 if(UDPIsGetReady(DHCPSocket) < 250u)
00383 {
00384
00385 DWORD tmp = DHCP_TIMEOUT2;
00386 if (DHCPDiscRetry != 5)
00387 tmp = DHCP_TIMEOUT;
00388
00389
00390 if (TickGet() - eventTime >= tmp)
00391 {
00392
00393 smDHCPState = SM_DHCP_AUTOIP;
00394
00395
00396 if (DHCPDiscRetry != 5)
00397 DHCPDiscRetry++;
00398 }
00399 break;
00400 }
00401
00402
00403
00404 DHCPFlags.bits.bDHCPServerDetected = TRUE;
00405
00406
00407 if(_DHCPReceive() != DHCP_OFFER_MESSAGE)
00408 break;
00409
00410 smDHCPState = SM_DHCP_SEND_REQUEST;
00411
00412
00413 case SM_DHCP_SEND_REQUEST:
00414 if(UDPIsPutReady(DHCPSocket) < 258u)
00415 break;
00416
00417
00418 _DHCPSend(DHCP_REQUEST_MESSAGE, FALSE);
00419
00420
00421 eventTime = TickGet();
00422 smDHCPState = SM_DHCP_GET_REQUEST_ACK;
00423 break;
00424
00425 case SM_DHCP_GET_REQUEST_ACK:
00426
00427 if(UDPIsGetReady(DHCPSocket) < 250u)
00428 {
00429
00430 if(TickGet() - eventTime >= DHCP_TIMEOUT)
00431 smDHCPState = SM_DHCP_AUTOIP;
00432 break;
00433 }
00434
00435
00436 switch(_DHCPReceive())
00437 {
00438 case DHCP_ACK_MESSAGE:
00439 UDPClose(DHCPSocket);
00440 DHCPSocket = INVALID_UDP_SOCKET;
00441 eventTime = TickGet();
00442 smDHCPState = SM_DHCP_BOUND;
00443
00444 DHCPFlags.bits.bIsBound = TRUE;
00445 DHCPBindCount++;
00446 if(ValidValues.bits.IPAddress)
00447
00448 sIPConfig.MyIPAddr = tempIPAddress;
00449 if(ValidValues.bits.Mask)
00450
00451 sIPConfig.MyMask = tempMask;
00452 if(ValidValues.bits.Gateway)
00453
00454 sIPConfig.MyGateway = tempGateway;
00455 #if defined(STACK_USE_DNS)
00456 if(ValidValues.bits.DNS)
00457
00458 sIPConfig.PrimaryDNSServer = tempDNS;
00459 if(ValidValues.bits.DNS2)
00460
00461 sIPConfig.SecondaryDNSServer = tempDNS2;
00462 #endif
00463
00464
00465
00466 break;
00467
00468 case DHCP_NAK_MESSAGE:
00469
00470 smDHCPState = SM_DHCP_AUTOIP;
00471 break;
00472 }
00473 break;
00474
00475 case SM_DHCP_BOUND:
00476 if(TickGet() - eventTime < TICK_SECOND)
00477 break;
00478
00479
00480
00481 if(DHCPLeaseTime.Val >= 2ul)
00482 {
00483 eventTime += TICK_SECOND;
00484 DHCPLeaseTime.Val--;
00485 break;
00486 }
00487
00488
00489 DHCPSocket = UDPOpen(DHCP_CLIENT_PORT, NULL, DHCP_SERVER_PORT);
00490 if(DHCPSocket == INVALID_UDP_SOCKET)
00491 break;
00492
00493 smDHCPState = SM_DHCP_SEND_RENEW;
00494
00495
00496 case SM_DHCP_SEND_RENEW:
00497 case SM_DHCP_SEND_RENEW2:
00498 case SM_DHCP_SEND_RENEW3:
00499 if(UDPIsPutReady(DHCPSocket) < 258u)
00500 break;
00501
00502
00503 _DHCPSend(DHCP_REQUEST_MESSAGE, TRUE);
00504 DHCPFlags.bits.bOfferReceived = FALSE;
00505
00506
00507 eventTime = TickGet();
00508 smDHCPState++;
00509 break;
00510
00511 case SM_DHCP_GET_RENEW_ACK:
00512 case SM_DHCP_GET_RENEW_ACK2:
00513 case SM_DHCP_GET_RENEW_ACK3:
00514
00515 if(UDPIsGetReady(DHCPSocket) < 250u)
00516 {
00517
00518 if(TickGet() - eventTime >= DHCP_TIMEOUT)
00519 {
00520
00521
00522 if(++smDHCPState > SM_DHCP_GET_RENEW_ACK3)
00523 smDHCPState = SM_DHCP_AUTOIP;
00524 }
00525 break;
00526 }
00527
00528
00529 switch(_DHCPReceive())
00530 {
00531 case DHCP_ACK_MESSAGE:
00532 UDPClose(DHCPSocket);
00533 DHCPSocket = INVALID_UDP_SOCKET;
00534 eventTime = TickGet();
00535 DHCPBindCount++;
00536 smDHCPState = SM_DHCP_BOUND;
00537 break;
00538
00539 case DHCP_NAK_MESSAGE:
00540
00541 smDHCPState = SM_DHCP_AUTOIP;
00542 break;
00543 }
00544 break;
00545
00546
00547
00548 default:
00549 break;
00550 }
00551 }
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570 static BYTE _DHCPReceive(void)
00571 {
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608 BYTE v;
00609 BYTE i, j;
00610 BYTE type;
00611 BOOL lbDone;
00612 DWORD_VAL tempServerID;
00613
00614
00615
00616 type = DHCP_UNKNOWN_MESSAGE;
00617
00618 UDPGet(&v);
00619
00620
00621 if ( v == BOOT_REPLY )
00622 {
00623
00624 for ( i = 0; i < 15u; i++ )
00625 UDPGet(&v);
00626
00627
00628 if(DHCPFlags.bits.bOfferReceived)
00629 {
00630
00631 for ( i = 0; i < 4u; i++ )
00632 UDPGet(&v);
00633 }
00634 else
00635 {
00636
00637 UDPGetArray((BYTE*)&tempIPAddress, sizeof(tempIPAddress));
00638 ValidValues.bits.IPAddress = 1;
00639 }
00640
00641
00642 for ( i = 0; i < 8u; i++ )
00643 UDPGet(&v);
00644
00645
00646 for ( i = 0; i < 6u; i++ )
00647 {
00648 UDPGet(&v);
00649
00650 if ( v != pu8MAC[i])
00651 goto UDPInvalid;
00652 }
00653
00654
00655
00656 for ( i = 0; i < 206u; i++ )
00657 UDPGet(&v);
00658
00659 lbDone = FALSE;
00660 do
00661 {
00662
00663
00664
00665 if(!UDPGet(&v))
00666 {
00667 lbDone = TRUE;
00668 break;
00669 }
00670
00671 switch(v)
00672 {
00673 case DHCP_MESSAGE_TYPE:
00674 UDPGet(&v);
00675
00676 if ( v == 1u )
00677 {
00678 UDPGet(&type);
00679
00680
00681 if(DHCPFlags.bits.bOfferReceived && (type == DHCP_OFFER_MESSAGE))
00682 {
00683 goto UDPInvalid;
00684 }
00685 }
00686 else
00687 goto UDPInvalid;
00688 break;
00689
00690 case DHCP_SUBNET_MASK:
00691 UDPGet(&v);
00692
00693 if ( v == 4u )
00694 {
00695
00696 if(DHCPFlags.bits.bOfferReceived)
00697 {
00698
00699 for ( i = 0; i < 4u; i++ )
00700 UDPGet(&v);
00701 }
00702 else
00703 {
00704 UDPGetArray((BYTE*)&tempMask, sizeof(tempMask));
00705 ValidValues.bits.Mask = 1;
00706 }
00707 }
00708 else
00709 goto UDPInvalid;
00710 break;
00711
00712 case DHCP_ROUTER:
00713 UDPGet(&j);
00714
00715 if ( j >= 4u )
00716 {
00717
00718 if(DHCPFlags.bits.bOfferReceived)
00719 {
00720
00721 for ( i = 0; i < 4u; i++ )
00722 UDPGet(&v);
00723 }
00724 else
00725 {
00726 UDPGetArray((BYTE*)&tempGateway, sizeof(tempGateway));
00727 ValidValues.bits.Gateway = 1;
00728 }
00729 }
00730 else
00731 goto UDPInvalid;
00732
00733
00734 j -= 4;
00735 while(j--)
00736 UDPGet(&v);
00737 break;
00738
00739 #if defined(STACK_USE_DNS)
00740 case DHCP_DNS:
00741 UDPGet(&j);
00742
00743 if(j < 4u)
00744 goto UDPInvalid;
00745
00746
00747 if(!DHCPFlags.bits.bOfferReceived)
00748 {
00749 UDPGetArray((BYTE*)&tempDNS, sizeof(tempDNS));
00750 ValidValues.bits.DNS = 1;
00751 j -= 4;
00752 }
00753
00754
00755 if(j >= 4u)
00756 {
00757
00758 if(!DHCPFlags.bits.bOfferReceived)
00759 {
00760 UDPGetArray((BYTE*)&tempDNS2, sizeof(tempDNS2));
00761 ValidValues.bits.DNS2 = 1;
00762 j -= 4;
00763 }
00764 }
00765
00766
00767 while(j--)
00768 UDPGet(&v);
00769 break;
00770 #endif
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800 case DHCP_SERVER_IDENTIFIER:
00801 UDPGet(&v);
00802
00803 if ( v == 4u )
00804 {
00805 UDPGet(&tempServerID.v[3]);
00806 UDPGet(&tempServerID.v[2]);
00807 UDPGet(&tempServerID.v[1]);
00808 UDPGet(&tempServerID.v[0]);
00809 }
00810 else
00811 goto UDPInvalid;
00812 break;
00813
00814 case DHCP_END_OPTION:
00815 lbDone = TRUE;
00816 break;
00817
00818 case DHCP_IP_LEASE_TIME:
00819 UDPGet(&v);
00820
00821 if ( v == 4u )
00822 {
00823
00824 if(DHCPFlags.bits.bOfferReceived)
00825 {
00826
00827 for ( i = 0; i < 4u; i++ )
00828 UDPGet(&v);
00829 }
00830 else
00831 {
00832 UDPGet(&DHCPLeaseTime.v[3]);
00833 UDPGet(&DHCPLeaseTime.v[2]);
00834 UDPGet(&DHCPLeaseTime.v[1]);
00835 UDPGet(&DHCPLeaseTime.v[0]);
00836
00837
00838
00839
00840 DHCPLeaseTime.Val -= DHCPLeaseTime.Val>>5;
00841 }
00842 }
00843 else
00844 goto UDPInvalid;
00845 break;
00846
00847 default:
00848
00849 UDPGet(&j);
00850 while( j-- )
00851 UDPGet(&v);
00852 }
00853 } while( !lbDone );
00854 }
00855
00856
00857 if ( type == DHCP_OFFER_MESSAGE )
00858 {
00859 DHCPServerID.Val = tempServerID.Val;
00860 DHCPFlags.bits.bOfferReceived = TRUE;
00861 }
00862 else
00863 {
00864
00865
00866 if ( DHCPServerID.Val != tempServerID.Val )
00867 type = DHCP_UNKNOWN_MESSAGE;
00868 }
00869
00870 UDPDiscard();
00871 return type;
00872
00873 UDPInvalid:
00874 UDPDiscard();
00875 return DHCP_UNKNOWN_MESSAGE;
00876
00877 }
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898 static void _DHCPSend(BYTE messageType, BOOL bRenewing)
00899 {
00900 BYTE i;
00901 IP_ADDR MyIP;
00902
00903
00904 UDPPut(BOOT_REQUEST);
00905 UDPPut(BOOT_HW_TYPE);
00906 UDPPut(BOOT_LEN_OF_HW_TYPE);
00907 UDPPut(0);
00908 UDPPut(0x12);
00909 UDPPut(0x23);
00910 UDPPut(0x34);
00911 UDPPut(0x56);
00912 UDPPut(0);
00913 UDPPut(0);
00914 UDPPut(0x80);
00915 UDPPut(0);
00916
00917
00918 if((messageType == DHCP_REQUEST_MESSAGE) && bRenewing)
00919 {
00920 UDPPutArray((BYTE*)&tempIPAddress, sizeof(tempIPAddress));
00921 }
00922 else
00923 {
00924 UDPPut(0x00);
00925 UDPPut(0x00);
00926 UDPPut(0x00);
00927 UDPPut(0x00);
00928 }
00929
00930
00931 for ( i = 0; i < 12u; i++ )
00932 UDPPut(0x00);
00933
00934
00935
00936 UDPPutROMArray( ( ROM BYTE *) pu8MAC, sizeof( MAC_ADDR ) );
00937
00938
00939 for ( i = 0; i < 202u; i++ )
00940 UDPPut(0);
00941
00942
00943 UDPPut(99);
00944 UDPPut(130);
00945 UDPPut(83);
00946 UDPPut(99);
00947
00948
00949 UDPPut(DHCP_MESSAGE_TYPE);
00950 UDPPut(DHCP_MESSAGE_TYPE_LEN);
00951 UDPPut(messageType);
00952
00953 if(messageType == DHCP_DISCOVER_MESSAGE)
00954 {
00955
00956 DHCPFlags.bits.bOfferReceived = FALSE;
00957 }
00958
00959
00960 if((messageType == DHCP_REQUEST_MESSAGE) && !bRenewing)
00961 {
00962
00963
00964
00965
00966
00967
00968 UDPPut(DHCP_SERVER_IDENTIFIER);
00969 UDPPut(DHCP_SERVER_IDENTIFIER_LEN);
00970 UDPPut(DHCPServerID.v[3]);
00971 UDPPut(DHCPServerID.v[2]);
00972 UDPPut(DHCPServerID.v[1]);
00973 UDPPut(DHCPServerID.v[0]);
00974 }
00975
00976
00977
00978
00979 UDPPut(DHCP_PARAM_REQUEST_LIST);
00980 UDPPut(DHCP_PARAM_REQUEST_LIST_LEN);
00981 UDPPut(DHCP_SUBNET_MASK);
00982 UDPPut(DHCP_ROUTER);
00983 UDPPut(DHCP_DNS);
00984 UDPPut(DHCP_HOST_NAME);
00985
00986
00987 if( ((messageType == DHCP_REQUEST_MESSAGE) && !bRenewing) ||
00988 ((messageType == DHCP_DISCOVER_MESSAGE) && tempIPAddress.Val))
00989 {
00990 UDPPut(DHCP_PARAM_REQUEST_IP_ADDRESS);
00991 UDPPut(DHCP_PARAM_REQUEST_IP_ADDRESS_LEN);
00992 UDPPutArray((BYTE*)&tempIPAddress, DHCP_PARAM_REQUEST_IP_ADDRESS_LEN);
00993 }
00994
00995
00996
00997
00998 UDPPut(DHCP_END_OPTION);
00999
01000
01001 while(UDPTxCount < 300u)
01002 UDPPut(0);
01003
01004
01005
01006 MyIP.Val = sIPConfig.MyIPAddr.Val;
01007 if(!bRenewing)
01008 sIPConfig.MyIPAddr.Val = 0x00000000;
01009 UDPFlush();
01010 sIPConfig.MyIPAddr.Val = MyIP.Val;
01011 }
01012
01013
01014
01015
01016
01017 IP_ADDR GenerateAutoIP( IP_ADDR * lastIP )
01018 {
01019 IP_ADDR newIP;
01020 newIP.v[0] = 169;
01021 newIP.v[1] = 254;
01022
01023 if ( lastIP == 0 )
01024 {
01025 newIP.v[2] = pu8MAC[4];
01026 newIP.v[3] = pu8MAC[5];
01027 }
01028 else
01029 newIP.w[1] = lastIP->w[1] + TickGet();
01030
01031 while ( newIP.w[1] < 256 || newIP.w[1] > 65279 )
01032 newIP.w[1] += TickGet();
01033
01034 return newIP;
01035 }
01036