00001
00002
00028
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
00069
00070
00071 #define __IP_C
00072
00073 #include "TCPIP.h"
00074
00075
00076 #define IPv4 (0x40u)
00077 #define IP_VERSION IPv4
00078
00079
00080
00081
00082 #define IP_IHL (0x05)
00083
00084 #define IP_SERVICE_NW_CTRL (0x07)
00085 #define IP_SERVICE_IN_CTRL (0x06)
00086 #define IP_SERVICE_ECP (0x05)
00087 #define IP_SERVICE_OVR (0x04)
00088 #define IP_SERVICE_FLASH (0x03)
00089 #define IP_SERVICE_IMM (0x02)
00090 #define IP_SERVICE_PRIOR (0x01)
00091 #define IP_SERVICE_ROUTINE (0x00)
00092
00093 #define IP_SERVICE_N_DELAY (0x00)
00094 #define IP_SERCICE_L_DELAY (0x08)
00095 #define IP_SERVICE_N_THRPT (0x00)
00096 #define IP_SERVICE_H_THRPT (0x10)
00097 #define IP_SERVICE_N_RELIB (0x00)
00098 #define IP_SERVICE_H_RELIB (0x20)
00099
00100 #define IP_SERVICE (IP_SERVICE_ROUTINE | IP_SERVICE_N_DELAY)
00101
00102 #define MY_IP_TTL (255) // Time-To-Live in hops
00103
00104
00105
00106
00107 static WORD _Identifier = 0;
00108 static BYTE IPHeaderLen;
00109
00110
00111 static void SwapIPHeader(IP_HEADER* h);
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 BOOL IPGetHeader(IP_ADDR *localIP,
00143 NODE_INFO *remote,
00144 BYTE *protocol,
00145 WORD *len)
00146 {
00147 WORD_VAL CalcChecksum;
00148 IP_HEADER header;
00149
00150 #if defined(NON_MCHP_MAC)
00151 WORD_VAL ReceivedChecksum;
00152 WORD checksums[2];
00153 BYTE optionsLen;
00154 #define MAX_OPTIONS_LEN (40) // As per RFC 791.
00155 BYTE options[MAX_OPTIONS_LEN];
00156 #endif
00157
00158
00159 MACGetArray((BYTE*)&header, sizeof(header));
00160
00161
00162 if ( (header.VersionIHL & 0xf0) != IP_VERSION )
00163 return FALSE;
00164
00165
00166
00167 if(header.FragmentInfo & 0xFF1F)
00168 return FALSE;
00169
00170 IPHeaderLen = (header.VersionIHL & 0x0f) << 2;
00171
00172 #if !defined(NON_MCHP_MAC)
00173
00174
00175
00176
00177 CalcChecksum.Val = MACCalcRxChecksum(0, IPHeaderLen);
00178
00179
00180 MACSetReadPtrInRx(IPHeaderLen);
00181
00182 if(CalcChecksum.Val)
00183 #else
00184
00185
00186
00187 optionsLen = IPHeaderLen - sizeof(header);
00188
00189
00190
00191 if ( optionsLen > MAX_OPTIONS_LEN )
00192 return FALSE;
00193
00194 if ( optionsLen > 0 )
00195 MACGetArray(options, optionsLen);
00196
00197
00198 ReceivedChecksum.Val = header.HeaderChecksum;
00199 header.HeaderChecksum = 0;
00200
00201
00202 checksums[0] = ~CalcIPChecksum((BYTE*)&header, sizeof(header));
00203
00204
00205 if ( optionsLen > 0 )
00206 checksums[1] = ~CalcIPChecksum((BYTE*)options, optionsLen);
00207 else
00208 checksums[1] = 0;
00209
00210 CalcChecksum.Val = CalcIPChecksum((BYTE*)checksums,
00211 2 * sizeof(WORD));
00212
00213
00214 if ( ReceivedChecksum.Val != CalcChecksum.Val )
00215 #endif
00216 {
00217
00218
00219 return FALSE;
00220 }
00221
00222
00223 SwapIPHeader(&header);
00224
00225
00226
00227 if (localIP)
00228 localIP->Val = header.DestAddress.Val;
00229
00230 remote->IPAddr.Val = header.SourceAddress.Val;
00231 *protocol = header.Protocol;
00232 *len = header.TotalLength - IPHeaderLen;
00233
00234 return TRUE;
00235 }
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 WORD IPPutHeader(NODE_INFO *remote,
00259 BYTE protocol,
00260 WORD len)
00261 {
00262 IP_HEADER header;
00263
00264 IPHeaderLen = sizeof(IP_HEADER);
00265
00266 header.VersionIHL = IP_VERSION | IP_IHL;
00267 header.TypeOfService = IP_SERVICE;
00268 header.TotalLength = sizeof(header) + len;
00269 header.Identification = ++_Identifier;
00270 header.FragmentInfo = 0;
00271 header.TimeToLive = MY_IP_TTL;
00272 header.Protocol = protocol;
00273 header.HeaderChecksum = 0;
00274
00275 header.SourceAddress = sIPConfig.MyIPAddr;
00276
00277 header.DestAddress.Val = remote->IPAddr.Val;
00278
00279 SwapIPHeader(&header);
00280
00281 header.HeaderChecksum = CalcIPChecksum((BYTE*)&header, sizeof(header));
00282
00283 MACPutHeader(&remote->MACAddr, MAC_IP, (sizeof(header)+len));
00284 MACPutArray((BYTE*)&header, sizeof(header));
00285
00286 return 0x0000;
00287
00288 }
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306 void IPSetRxBuffer(WORD Offset)
00307 {
00308 MACSetReadPtrInRx(Offset+IPHeaderLen);
00309 }
00310
00311
00312
00313 static void SwapIPHeader(IP_HEADER* h)
00314 {
00315 h->TotalLength = swaps(h->TotalLength);
00316 h->Identification = swaps(h->Identification);
00317 h->HeaderChecksum = swaps(h->HeaderChecksum);
00318 }
00319
00320
00321 DWORD IPConvertSubnetToMask(BYTE Subnet)
00322 {
00323 int i = 0;
00324 DWORD mask = 0x80000000ul;
00325 for (i = 1; i < Subnet; i++)
00326 {
00327 mask |= mask >> 1;
00328 }
00329
00330 mask = swapl(mask);
00331 return mask;
00332 }
00333
00334 BYTE IPConvertMaskToSubnet(BYTE * MaskArray)
00335 {
00336 BYTE subnet = 0;
00337
00338 DWORD mask = swapl(*((DWORD *)MaskArray));
00339 while(mask & 0x80000000ul)
00340 {
00341 mask = mask << 1;
00342 subnet++;
00343 }
00344
00345 return subnet;
00346 }
00347
00348