00001
00002
00003
00004
00005
00006
00007 #ifndef _PKT
00008 #define _PKT
00009
00010 #ifdef __cplusplus
00011 extern "C" {
00012 #endif
00013
00014 #include "nm.h"
00015
00016
00017
00018
00019
00020
00021
00022 typedef enum
00023 {
00024 Pkt_L3ProtIp_c = 0x0008,
00025 Pkt_L3ProtComp_c = 0x0009,
00026 Pkt_L3ProtArp_c = 0x0608,
00027 Pkt_L3ProtRarp_c = 0x3580,
00028 Pkt_L3ProtUndef_c = 0x0000
00029 } Pkt_L3ProtType_t;
00030
00031
00032
00033
00034
00035
00036
00037
00038 typedef enum
00039 {
00040 Pkt_L4ProtTcp_c = 6,
00041 Pkt_L4ProtUdp_c = 17,
00042 Pkt_L4ProtIcmp_c = 1,
00043 Pkt_L4ProtIgmp_c = 2,
00044 Pkt_L4ProtRsvp_c = 46,
00045 Pkt_L4ProtIPv6_c = 41,
00046 Pkt_L4ProtPIM_c = 103,
00047 Pkt_L4ProtRaw_c = 255,
00048 Pkt_L4ProtUndef_c = 0
00049 } Pkt_L4ProtType_t;
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 struct Pkt_EthernetHdr_t
00060 {
00061
00062 u_int8_t dhost[6];
00063 u_int8_t shost[6];
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 u_int16_t type;
00074
00075
00076
00077 };
00078
00079 typedef struct Pkt_EthernetHdr_t Pkt_EthernetHdr_t;
00080
00081
00082
00083
00084
00085
00086 struct Pkt_WifiHdr_t
00087 {
00088 u_int16_t frame_control;
00089 u_int16_t duration_id;
00090 u_int8_t addr1[6];
00091 u_int8_t addr2[6];
00092 u_int8_t addr3[6];
00093 u_int16_t seq_control;
00094 u_int8_t addr4[6];
00095 };
00096
00097 typedef struct Pkt_WifiHdr_t Pkt_WifiHdr_t;
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 struct Pkt_IpHdr_t
00110 {
00111
00112
00113
00114
00115 u_int8_t ihl:4,
00116
00117 version:4;
00118
00119 u_int8_t TOS;
00120
00121 u_int16_t length;
00122
00123 u_int16_t id;
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 u_int16_t RB:1, DF:1, MF:1, offset:13;
00141
00142 u_int8_t TTL;
00143
00144 u_int8_t protocol;
00145
00146
00147
00148
00149
00150 u_int16_t checksum;
00151
00152 u_int32_t sourceIp;
00153 u_int32_t destIp;
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 };
00207
00208 typedef struct Pkt_IpHdr_t Pkt_IpHdr_t;
00209
00210
00211
00212
00213
00214
00215
00216
00217 typedef enum
00218 {
00219 Pkt_SrcIpFlow_c,
00220 Pkt_DestIpFlow_c,
00221 Pkt_SrcDestIpFlow_c,
00222 Pkt_SrcDestTcpIpFlow_c,
00223 Pkt_DestTcpIpFlow_c
00224 } Pkt_FlowType_t;
00225
00226
00227
00228
00229
00230
00231
00232
00233 typedef enum
00234 {
00235 Pkt_HostByteOrder_c,
00236 Pkt_NetworkByteOrder_c
00237 } Pkt_ByteOrder_t;
00238
00239
00240
00241
00242
00243
00244
00245
00246 typedef enum
00247 {
00248 Pkt_TcpFin_c,
00249 Pkt_TcpSyn_c,
00250 Pkt_TcpRst_c,
00251 Pkt_TcpPsh_c,
00252 Pkt_TcpAck_c,
00253 Pkt_TcpUrg_c,
00254 Pkt_TcpEce_c,
00255 Pkt_TcpCwr_c
00256 } Pkt_TcpFlags_t;
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 struct Pkt_TcpHdr_t
00269 {
00270
00271 u_int16_t srcPort;
00272 u_int16_t destPort;
00273
00274
00275
00276
00277
00278 u_int32_t seqNum;
00279 u_int32_t ackNum;
00280
00281
00282 u_int16_t res1:4, doff:4,
00283
00284
00285
00286
00287
00288
00289
00290 fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, ece:1, cwr:1;
00291
00292 u_int16_t advWindow;
00293
00294 u_int16_t checkSum;
00295 u_int16_t urgPtr;
00296
00297
00298
00299
00300 };
00301
00302 typedef struct Pkt_TcpHdr_t Pkt_TcpHdr_t;
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312 struct Pkt_UdpHdr_t
00313 {
00314
00315 u_int16_t srcPort;
00316 u_int16_t destPort;
00317
00318 u_int16_t checkSum;
00319 u_int16_t length;
00320
00321 };
00322
00323 typedef struct Pkt_UdpHdr_t Pkt_UdpHdr_t;
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333 struct Pkt_IcmpHdr_t
00334 {
00335 u_int8_t type;
00336 u_int8_t code;
00337 u_int16_t checksum;
00338 union
00339 {
00340 struct
00341 {
00342 u_int16_t id;
00343 u_int16_t sequence;
00344 } echo;
00345 u_int16_t gateway;
00346 struct
00347 {
00348 u_int16_t unused;
00349 u_int16_t mtu;
00350 } frag;
00351 } un;
00352 };
00353
00354 typedef struct Pkt_IcmpHdr_t Pkt_IcmpHdr_t;
00355
00356
00357
00358
00359
00360
00361
00362 typedef struct Pkt_IpFlags_t
00363 {
00364 unsigned int RB:4;
00365 unsigned int DF:4;
00366 unsigned int MF:1;
00367 unsigned int offset:13;
00368 } Pkt_IpFlags_t;
00369
00370
00371
00372
00373
00374
00375 typedef struct Pkt_TcpResDoffFlags_t
00376 {
00377 unsigned int res1:4;
00378 unsigned int doff:4;
00379 unsigned int fin:1;
00380 unsigned int syn:1;
00381 unsigned int rst:1;
00382 unsigned int psh:1;
00383 unsigned int ack:1;
00384 unsigned int urg:1;
00385 unsigned int ece:1;
00386 unsigned int cwr:1;
00387 } Pkt_TcpResDoffFlags_t;
00388
00389
00390
00391
00392
00393
00394 struct Pkt_L4Flow_t
00395 {
00396
00397 unsigned int srcIp;
00398 unsigned int destIp;
00399
00400 unsigned short int srcPort;
00401 unsigned short int destPort;
00402
00403 };
00404
00405 typedef struct Pkt_L4Flow_t Pkt_L4Flow_t;
00406
00407
00408
00409
00410
00411
00412 struct Pkt_LibNet_t
00413 {
00414 char *interfaceName;
00415 char *errbuf;
00416 libnet_t *l;
00417 };
00418
00419 typedef struct Pkt_LibNet_t Pkt_LibNet_t;
00420
00421
00422
00423
00424
00425
00426 struct Pkt_LibPcap_t
00427 {
00428 pcap_t *p;
00429 char *interfaceName;
00430 struct pcap_stat ps;
00431 struct pcap_pkthdr hdr;
00432 u_int32_t localNet;
00433 u_int32_t netmask;
00434 struct bpf_program filterCode;
00435 };
00436
00437 typedef struct Pkt_LibPcap_t Pkt_LibPcap_t;
00438
00439
00440
00441
00442
00443
00444 struct Pkt_VectorBuff_t
00445 {
00446 int count;
00447 void **pktArray;
00448 int *pktArrayLength;
00449 };
00450
00451 typedef struct Pkt_VectorBuff_t Pkt_VectorBuff_t;
00452
00453
00454
00455
00456
00457
00458
00459 struct Pkt_ProcessPkt_t
00460 {
00461 Pkt_EthernetHdr_t *pkt;
00462 int length;
00463 int currentRule;
00464 Pkt_LibPcap_t *inIf;
00465 Pkt_LibNet_t *outIf;
00466 util_timing_t inTime;
00467 util_timing_t outTime;
00468
00469 array_t *applicableRules;
00470 };
00471
00472 typedef struct Pkt_ProcessPkt_t Pkt_ProcessPkt_t;
00473
00474
00475
00476
00477
00478
00479 struct Pkt_TfcMode_t
00480 {
00481 int size;
00482 char *srcMac;
00483 char *destMac;
00484 int numSeeds;
00485 double pktGap;
00486 };
00487
00488 typedef struct Pkt_TfcMode_t Pkt_TfcMode_t;
00489
00490
00491
00492
00493
00494
00495
00496
00497 extern Pkt_IpHdr_t *Pkt_EthernetExtractIp (Pkt_EthernetHdr_t * ethPkt);
00498 extern int Pkt_EthernetPktHdrReadLengthNetworkOrder (Pkt_EthernetHdr_t * pkt);
00499 extern int Pkt_EthernetPktHdrReadLength (Pkt_EthernetHdr_t * pkt);
00500 extern int Pkt_EthernetHdrFree (Pkt_EthernetHdr_t * pkt);
00501 extern int Pkt_ProcessPktFree (Pkt_ProcessPkt_t * pp);
00502 extern Pkt_IcmpHdr_t *Pkt_IpExtractIcmp (Pkt_IpHdr_t * anIpPkt);
00503 extern Pkt_UdpHdr_t *Pkt_IpExtractUdp (Pkt_IpHdr_t * anIpPkt);
00504 extern Pkt_TcpHdr_t *Pkt_IpExtractTcp (Pkt_IpHdr_t * anIpPkt);
00505 extern char *Pkt_IpExtractPayload (Pkt_IpHdr_t * anIpPkt);
00506 extern Pkt_UdpHdr_t *Pkt_EthernetExtractUdp (Pkt_EthernetHdr_t *
00507 aEthernetPkt);
00508 extern Pkt_TcpHdr_t *Pkt_EthernetExtractTcp (Pkt_EthernetHdr_t *
00509 aEthernetPkt);
00510 extern Pkt_IcmpHdr_t *Pkt_EthernetExtractIcmp (Pkt_EthernetHdr_t *
00511 aEthernetPkt);
00512 extern char *Pkt_UdpHdrReadPayload (Pkt_UdpHdr_t * aUdpPkt);
00513 extern char *Pkt_TcpHdrReadPayload (Pkt_TcpHdr_t * aTcpPkt);
00514 extern int Pkt_SrcIpFlowCmp (Pkt_EthernetHdr_t * pkt1,
00515 Pkt_EthernetHdr_t * pkt2);
00516 extern int Pkt_DestIpFlowCmp (Pkt_EthernetHdr_t * pkt1,
00517 Pkt_EthernetHdr_t * pkt2);
00518 extern int Pkt_SrcDestIpFlowCmp (Pkt_EthernetHdr_t * pkt1,
00519 Pkt_EthernetHdr_t * pkt2);
00520 extern int Pkt_DestTcpIpFlowCmp (Pkt_EthernetHdr_t * pkt1,
00521 Pkt_EthernetHdr_t * pkt2);
00522 extern int Pkt_SrcIpFlowHash (Pkt_EthernetHdr_t * pkt1, int modulus);
00523 extern int Pkt_DestIpFlowHash (Pkt_EthernetHdr_t * pkt1, int modulus);
00524 extern int Pkt_SrcDestIpFlowHash (Pkt_EthernetHdr_t * pkt1, int modulus);
00525 extern int Pkt_DestTcpIpFlowHash (Pkt_EthernetHdr_t * pkt1, int modulus);
00526 extern int Pkt_SrcDestTcpIpFlowHash (Pkt_EthernetHdr_t * pkt1, int modulus);
00527 extern int Pkt_SrcDestTcpIpFlowCmp (Pkt_EthernetHdr_t * pkt1,
00528 Pkt_EthernetHdr_t * pkt2);
00529 extern int Pkt_L4FlowCompareForSt (Pkt_L4Flow_t * foo, Pkt_L4Flow_t * bar);
00530 extern int Pkt_L4FlowCompare (Pkt_L4Flow_t * foo, Pkt_L4Flow_t * bar);
00531 extern int Pkt_L4FlowHashForSt (Pkt_L4Flow_t * anL4Flow_t, int modulus);
00532 extern unsigned int Pkt_L4FlowHash (Pkt_L4Flow_t * anL4Flow_t);
00533 extern Pkt_L4Flow_t *Pkt_EthPktToL4Flow (Pkt_EthernetHdr_t * anEthPkt);
00534 extern Pkt_L4Flow_t *Pkt_IpPktToL4Flow (Pkt_IpHdr_t * anIpPkt);
00535 extern int Pkt_EthernetReadL3Type (Pkt_EthernetHdr_t * anEth);
00536 extern int Pkt_PrintEthernet (Pkt_EthernetHdr_t * anEthPkt, int length);
00537 extern int Pkt_PrintWifi (Pkt_WifiHdr_t * aWifiPkt);
00538 extern int Pkt_PrintIp (Pkt_IpHdr_t * anIpPkt);
00539 extern void Pkt_PrintIpAddressDotted (u_int32_t aNumIp);
00540 extern void Pkt_PrintIpAddressDottedGeneral ( char *, u_int32_t aNumIp);
00541 extern Pkt_ProcessPkt_t *Pkt_AllocateProcessPacket (Pkt_EthernetHdr_t * pkt,
00542 array_t *
00543 applicableRules);
00544 extern int Pkt_DeviceSkb ();
00545 extern Pkt_VectorBuff_t *Pkt_SocketVectorWrite (int count);
00546 extern int Pkt_EthPacketWriteToFile (int fd, Pkt_EthernetHdr_t * anEthPkt,
00547 unsigned int length);
00548 extern int Pkt_EthPacketReadFromFile (int fd,
00549 Pkt_EthernetHdr_t ** anEthPktPtr);
00550 extern array_t *Pkt_CreatePktsFromString (char *pktFile);
00551 extern Pkt_EthernetHdr_t *Pkt_CreatePktFromString (char *pktString);
00552 extern int Pkt_Init (char *ifName, int numRounds, int markPoint);
00553 extern Pkt_LibNet_t *Pkt_InitLibNet (char *interfaceName);
00554 extern int Pkt_LibNetFinish (Pkt_LibNet_t * obj);
00555 extern int Pkt_EthPktWrite (Pkt_EthernetHdr_t * anEth, int anEthLength,
00556 Pkt_LibNet_t * aNetObj);
00557 extern array_t *Pkt_InitLibPcapArray (array_t * inArray);
00558 extern array_t *Pkt_InitLibNetArray (array_t * outArray);
00559 extern Pkt_LibPcap_t *Pkt_InitLibPcap (char *interfaceName);
00560 extern int Pkt_LibPcapFinish (Pkt_LibPcap_t * obj);
00561 extern util_byte_array_t *Pkt_CreateIcmpPkt (array_t * typeArray,
00562 array_t * codeArray,
00563 array_t * idArray,
00564 array_t * seqArray);
00565 extern util_byte_array_t *Pkt_CreateUdpPkt (array_t * srcPorts,
00566 array_t * destPorts,
00567 array_t * sizes,
00568 array_t * byteStrings);
00569 extern util_byte_array_t *Pkt_CreateTcpPkt (array_t * srcPorts,
00570 array_t * destPorts,
00571 array_t * seqNums,
00572 array_t * ackNums,
00573 st_table * flags, array_t * sizes,
00574 array_t * byteStrings);
00575 extern util_byte_array_t *Pkt_CreateIpPkt (array_t * srcIps,
00576 array_t * destIps,
00577 st_table * ipFlagsTable,
00578 array_t * offsets, array_t * ids,
00579 st_table * ipOptions,
00580 array_t * ttls,
00581 util_byte_array_t * l4Payload,
00582 int l4Protocol);
00583 extern Pkt_EthernetHdr_t *Pkt_CreateEthPkt (char *srcMac, char *destMac,
00584 util_byte_array_t * l3Payload,
00585 u_int16_t l3Protocol);
00586 extern Pkt_EthernetHdr_t *Pkt_CreateRandEthPkt (array_t * tmpArray);
00587 extern array_t *Pkt_SeedRandEthPktArray (Pkt_ByteOrder_t byteOrder,
00588 int numSeeds,
00589 Pkt_TfcMode_t * tfcMode);
00590 extern void Pkt_HTON (Pkt_EthernetHdr_t * anEth);
00591 extern void Pkt_NTOH (Pkt_EthernetHdr_t * anEth);
00592
00593
00594 extern int Rlp_UpdateDefineTable (st_table * aTable, char *anEntry);
00595 extern array_t *Rlp_L7StringParse (char *l7Rule);
00596 extern u_int32_t Rlp_DotToInt (char *);
00597
00598
00599
00600 #ifdef __cplusplus
00601 }
00602 #endif
00603
00604 #endif