00001
00002
00003
00004
00005
00006
00007 #include "pkt.h"
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 Pkt_LibNet_t *
00027 Pkt_InitLibNet (char *interfaceName)
00028 {
00029 Pkt_LibNet_t *result;
00030
00031 result = (Pkt_LibNet_t *) malloc (sizeof (Pkt_LibNet_t));
00032
00033 result->interfaceName = interfaceName ? strdup (interfaceName) : (char *) "eth0";
00034 result->errbuf = (char *) malloc (LIBNET_ERRBUF_SIZE * sizeof (char));
00035 result->l = libnet_init (LIBNET_LINK_ADV,
00036 result->interfaceName,
00037 result->errbuf);
00038
00039 if (result->l == NIL (libnet_t))
00040 {
00041 fprintf (stderr, "Can not initialize libnet: interface %s"
00042 "\n\tLibnet error message: %s\n", result->interfaceName,
00043 result->errbuf);
00044 exit (-1);
00045 }
00046
00047 return result;
00048 }
00049
00050
00051
00052
00053
00054
00055 int
00056 Pkt_LibNetFinish (Pkt_LibNet_t * obj)
00057 {
00058 free (obj->interfaceName);
00059 free (obj->errbuf);
00060 libnet_destroy (obj->l);
00061 return 0;
00062 }
00063
00064
00065
00066
00067
00068
00069
00070
00071 int
00072 Pkt_EthPktWrite (Pkt_EthernetHdr_t * anEth,
00073 int anEthLength, Pkt_LibNet_t * aNetObj)
00074 {
00075 int count;
00076 Pkt_HTON (anEth);
00077 count =
00078 libnet_adv_write_link (aNetObj->l, (u_int8_t *) anEth,
00079 (u_int32_t) anEthLength);
00080 if (count == -1)
00081 {
00082
00083 return 0;
00084 }
00085
00086
00087 Pkt_NTOH (anEth);
00088 return count;
00089
00090 }
00091
00092
00093
00094
00095
00096
00097 array_t *
00098 Pkt_InitLibPcapArray (array_t * inArray)
00099 {
00100 array_t *result = array_alloc (Pkt_LibPcap_t *, 0);
00101 int i;
00102 for (i = 0; i < array_n (inArray); i++)
00103 {
00104 char *ifName = array_fetch (char *, inArray, i);
00105 Pkt_LibPcap_t *aPcapObj = Pkt_InitLibPcap (ifName);
00106 array_insert_last (Pkt_LibPcap_t *, result, aPcapObj);
00107 }
00108 return result;
00109 }
00110
00111
00112
00113
00114
00115
00116 array_t *
00117 Pkt_InitLibNetArray (array_t * outArray)
00118 {
00119 array_t *result = array_alloc (Pkt_LibNet_t *, 0);
00120 int i;
00121 for (i = 0; i < array_n (outArray); i++)
00122 {
00123 char *ifName = array_fetch (char *, outArray, i);
00124 Pkt_LibNet_t *aLibnetObj = Pkt_InitLibNet (ifName);
00125 array_insert_last (Pkt_LibNet_t *, result, aLibnetObj);
00126 }
00127 return result;
00128 }
00129
00130
00131
00132
00133
00134
00135 Pkt_LibPcap_t *
00136 Pkt_InitLibPcap (char *interfaceName)
00137 {
00138 Pkt_LibPcap_t *result = (Pkt_LibPcap_t *) malloc (sizeof (Pkt_LibPcap_t));
00139 pcap_t *p;
00140 char *device;
00141 char errbuf[PCAP_ERRBUF_SIZE];
00142 struct bpf_program filterCode;
00143 u_int32_t localNet, netmask;
00144 bzero (errbuf, PCAP_ERRBUF_SIZE);
00145
00146 device = NIL (char);
00147 device = interfaceName;
00148
00149 if (device == NIL (char))
00150 {
00151 device = pcap_lookupdev (errbuf);
00152 if (device == NIL (char))
00153 {
00154 fprintf (stderr, "pcap_lookupdev() failed:%s\n", errbuf);
00155 exit (-1);
00156 }
00157 }
00158 result->interfaceName = device;
00159
00160
00161
00162 int snaplen = 1540;
00163 int promisc = 1;
00164 int timeout = -1;
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
00209
00210 p = pcap_open_live (device, snaplen, promisc, timeout, errbuf);
00211 if (p == NIL (pcap_t))
00212 {
00213 fprintf (stderr, "pcap_open_live() failed:%s\n", errbuf);
00214 exit (-1);
00215 }
00216
00217 if (pcap_lookupnet (device, &localNet, &netmask, errbuf) == -1)
00218 {
00219 fprintf (stderr, "pcap_lookupnet() failed (no IP stack?):%s\n"
00220 "Using default 255.255.255.255\n", errbuf);
00221 localNet = ~0x0;
00222 netmask = ~0x0;
00223 }
00224 result->localNet = localNet;
00225 result->netmask = netmask;
00226
00227
00228
00229 char *filter = "";
00230 if (pcap_compile (p, &filterCode, filter, 1, netmask) == -1)
00231 {
00232 fprintf (stderr, "pcap_compile() failed:%s\n", errbuf);
00233 exit (-1);
00234 }
00235
00236 if (pcap_setfilter (p, &filterCode) == -1)
00237 {
00238 fprintf (stderr, "pcap_setfilter() failed:%s\n", errbuf);
00239 exit (-1);
00240 }
00241 result->filterCode = filterCode;
00242
00243
00244 pcap_setdirection (p, PCAP_D_IN);
00245
00246 result->p = p;
00247
00248 return result;
00249 }
00250
00251
00252
00253
00254 int
00255 Pkt_LibPcapFinish (Pkt_LibPcap_t * obj)
00256 {
00257 pcap_close (obj->p);
00258 free (obj);
00259 return 0;
00260 }