libnet4r 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. data/CHANGELOG +15 -0
  2. data/LICENSE +28 -0
  3. data/README +187 -0
  4. data/Rakefile +110 -0
  5. data/ext/extconf.rb +60 -0
  6. data/ext/libnet.c +705 -0
  7. data/ext/libnet_arp.c +152 -0
  8. data/ext/libnet_ethernet.c +115 -0
  9. data/ext/libnet_ipv4.c +140 -0
  10. data/ext/libnet_ipv6.c +138 -0
  11. data/ext/libnet_udp.c +112 -0
  12. data/ext/libnet_vlan.c +131 -0
  13. data/lib/libnet4r/header.rb +609 -0
  14. data/lib/libnet4r/helpers.rb +19 -0
  15. data/lib/libnet4r/libnet.rb +39 -0
  16. data/libnet/CVS/Entries +24 -0
  17. data/libnet/CVS/Repository +1 -0
  18. data/libnet/CVS/Root +1 -0
  19. data/libnet/Makefile.am +15 -0
  20. data/libnet/Makefile.am.common +10 -0
  21. data/libnet/Makefile.in +443 -0
  22. data/libnet/README +21 -0
  23. data/libnet/VERSION +1 -0
  24. data/libnet/acconfig.h +36 -0
  25. data/libnet/acinclude.m4 +463 -0
  26. data/libnet/aclocal.m4 +1337 -0
  27. data/libnet/autom4te.cache/CVS/Entries +1 -0
  28. data/libnet/autom4te.cache/CVS/Repository +1 -0
  29. data/libnet/autom4te.cache/CVS/Root +1 -0
  30. data/libnet/autom4te.cache/output.0 +6225 -0
  31. data/libnet/autom4te.cache/requests +111 -0
  32. data/libnet/autom4te.cache/traces.0 +272 -0
  33. data/libnet/config.guess +1314 -0
  34. data/libnet/config.sub +1410 -0
  35. data/libnet/configure +6225 -0
  36. data/libnet/configure.in +235 -0
  37. data/libnet/doc/BUGS +19 -0
  38. data/libnet/doc/CHANGELOG +527 -0
  39. data/libnet/doc/CONTRIB +53 -0
  40. data/libnet/doc/COPYING +31 -0
  41. data/libnet/doc/CVS/Entries +12 -0
  42. data/libnet/doc/CVS/Repository +1 -0
  43. data/libnet/doc/CVS/Root +1 -0
  44. data/libnet/doc/DESIGN_NOTES +134 -0
  45. data/libnet/doc/MIGRATION +172 -0
  46. data/libnet/doc/PACKET_BUILDING +161 -0
  47. data/libnet/doc/PORTED +45 -0
  48. data/libnet/doc/RAWSOCKET_NON_SEQUITUR +41 -0
  49. data/libnet/doc/TODO +96 -0
  50. data/libnet/doc/html/acconfig_8h-source.html +49 -0
  51. data/libnet/doc/html/annotated.html +17 -0
  52. data/libnet/doc/html/bpf_8h-source.html +277 -0
  53. data/libnet/doc/html/config_8h-source.html +125 -0
  54. data/libnet/doc/html/doxygen.css +169 -0
  55. data/libnet/doc/html/doxygen.png +0 -0
  56. data/libnet/doc/html/files.html +29 -0
  57. data/libnet/doc/html/functions.html +26 -0
  58. data/libnet/doc/html/functions_vars.html +26 -0
  59. data/libnet/doc/html/getopt_8h-source.html +97 -0
  60. data/libnet/doc/html/globals.html +219 -0
  61. data/libnet/doc/html/globals_defs.html +104 -0
  62. data/libnet/doc/html/globals_func.html +136 -0
  63. data/libnet/doc/html/gnuc_8h-source.html +56 -0
  64. data/libnet/doc/html/graph_legend.dot +22 -0
  65. data/libnet/doc/html/graph_legend.html +75 -0
  66. data/libnet/doc/html/ifaddrlist_8h-source.html +65 -0
  67. data/libnet/doc/html/in__systm_8h-source.html +90 -0
  68. data/libnet/doc/html/index.html +17 -0
  69. data/libnet/doc/html/libnet-asn1_8h-source.html +268 -0
  70. data/libnet/doc/html/libnet-functions_8h-source.html +742 -0
  71. data/libnet/doc/html/libnet-functions_8h.html +8844 -0
  72. data/libnet/doc/html/libnet-headers_8h-source.html +1655 -0
  73. data/libnet/doc/html/libnet-headers_8h.html +3053 -0
  74. data/libnet/doc/html/libnet-macros_8h-source.html +161 -0
  75. data/libnet/doc/html/libnet-macros_8h.html +358 -0
  76. data/libnet/doc/html/libnet-structures_8h-source.html +233 -0
  77. data/libnet/doc/html/libnet-types_8h-source.html +58 -0
  78. data/libnet/doc/html/libnet_8h-source.html +119 -0
  79. data/libnet/doc/html/libnet_8h.html +24 -0
  80. data/libnet/doc/html/structlibnet__802__1q__hdr.html +145 -0
  81. data/libnet/doc/html/structlibnet__802__1x__hdr.html +97 -0
  82. data/libnet/doc/libnet.doxygen.conf +1102 -0
  83. data/libnet/doc/man/CVS/Entries +1 -0
  84. data/libnet/doc/man/CVS/Repository +1 -0
  85. data/libnet/doc/man/CVS/Root +1 -0
  86. data/libnet/doc/man/man3/libnet-functions.h.3 +3136 -0
  87. data/libnet/doc/man/man3/libnet-headers.h.3 +1872 -0
  88. data/libnet/doc/man/man3/libnet-macros.h.3 +172 -0
  89. data/libnet/doc/man/man3/libnet.h.3 +17 -0
  90. data/libnet/doc/man/man3/libnet_802_1q_hdr.3 +53 -0
  91. data/libnet/doc/man/man3/libnet_802_1x_hdr.3 +41 -0
  92. data/libnet/include/CVS/Entries +10 -0
  93. data/libnet/include/CVS/Repository +1 -0
  94. data/libnet/include/CVS/Root +1 -0
  95. data/libnet/include/Makefile.am +7 -0
  96. data/libnet/include/Makefile.in +395 -0
  97. data/libnet/include/bpf.h +264 -0
  98. data/libnet/include/config.h.in +118 -0
  99. data/libnet/include/gnuc.h +43 -0
  100. data/libnet/include/ifaddrlist.h +52 -0
  101. data/libnet/include/libnet/CVS/Entries +9 -0
  102. data/libnet/include/libnet/CVS/Repository +1 -0
  103. data/libnet/include/libnet/CVS/Root +1 -0
  104. data/libnet/include/libnet/Makefile.am +12 -0
  105. data/libnet/include/libnet/Makefile.in +294 -0
  106. data/libnet/include/libnet/libnet-asn1.h +255 -0
  107. data/libnet/include/libnet/libnet-functions.h +2157 -0
  108. data/libnet/include/libnet/libnet-headers.h +1662 -0
  109. data/libnet/include/libnet/libnet-macros.h +186 -0
  110. data/libnet/include/libnet/libnet-structures.h +222 -0
  111. data/libnet/include/libnet/libnet-types.h +45 -0
  112. data/libnet/include/libnet.h.in +132 -0
  113. data/libnet/include/stamp-h.in +1 -0
  114. data/libnet/include/win32/CVS/Entries +5 -0
  115. data/libnet/include/win32/CVS/Repository +1 -0
  116. data/libnet/include/win32/CVS/Root +1 -0
  117. data/libnet/include/win32/config.h +112 -0
  118. data/libnet/include/win32/getopt.h +84 -0
  119. data/libnet/include/win32/in_systm.h +77 -0
  120. data/libnet/include/win32/libnet.h +106 -0
  121. data/libnet/install-sh +250 -0
  122. data/libnet/libnet-config.in +62 -0
  123. data/libnet/libnet.doxygen.conf +1102 -0
  124. data/libnet/man/CVS/Entries +1 -0
  125. data/libnet/man/CVS/Repository +1 -0
  126. data/libnet/man/CVS/Root +1 -0
  127. data/libnet/missing +283 -0
  128. data/libnet/mkinstalldirs +40 -0
  129. data/libnet/sample/CVS/Entries +47 -0
  130. data/libnet/sample/CVS/Repository +1 -0
  131. data/libnet/sample/CVS/Root +1 -0
  132. data/libnet/sample/Makefile.am +63 -0
  133. data/libnet/sample/Makefile.in +729 -0
  134. data/libnet/sample/arp-new.c +144 -0
  135. data/libnet/sample/arp.c +151 -0
  136. data/libnet/sample/bgp4_hdr.c +225 -0
  137. data/libnet/sample/bgp4_notification.c +242 -0
  138. data/libnet/sample/bgp4_open.c +266 -0
  139. data/libnet/sample/bgp4_update.c +337 -0
  140. data/libnet/sample/cdp.c +187 -0
  141. data/libnet/sample/dhcp_discover.c +257 -0
  142. data/libnet/sample/dns.c +260 -0
  143. data/libnet/sample/dot1x.c +113 -0
  144. data/libnet/sample/fddi_tcp1.c +213 -0
  145. data/libnet/sample/fddi_tcp2.c +209 -0
  146. data/libnet/sample/get_addr.c +112 -0
  147. data/libnet/sample/gre.c +410 -0
  148. data/libnet/sample/icmp6_echoreq.c +184 -0
  149. data/libnet/sample/icmp_echo_cq.c +201 -0
  150. data/libnet/sample/icmp_redirect.c +200 -0
  151. data/libnet/sample/icmp_timeexceed.c +190 -0
  152. data/libnet/sample/icmp_timestamp.c +157 -0
  153. data/libnet/sample/icmp_unreach.c +204 -0
  154. data/libnet/sample/ieee.c +177 -0
  155. data/libnet/sample/ip_link.c +201 -0
  156. data/libnet/sample/ip_raw.c +180 -0
  157. data/libnet/sample/isl.c +167 -0
  158. data/libnet/sample/libnet_test.h +60 -0
  159. data/libnet/sample/mpls.c +251 -0
  160. data/libnet/sample/ntp.c +193 -0
  161. data/libnet/sample/ospf_hello.c +179 -0
  162. data/libnet/sample/ospf_lsa.c +190 -0
  163. data/libnet/sample/ping_of_death.c +171 -0
  164. data/libnet/sample/rpc_tcp.c +214 -0
  165. data/libnet/sample/rpc_udp.c +213 -0
  166. data/libnet/sample/sebek.c +299 -0
  167. data/libnet/sample/smurf.c +194 -0
  168. data/libnet/sample/stp.c +227 -0
  169. data/libnet/sample/synflood.c +200 -0
  170. data/libnet/sample/synflood6.c +209 -0
  171. data/libnet/sample/synflood6_frag.c +234 -0
  172. data/libnet/sample/tcp1.c +227 -0
  173. data/libnet/sample/tcp2.c +192 -0
  174. data/libnet/sample/tftp.c +207 -0
  175. data/libnet/sample/tring_tcp1.c +214 -0
  176. data/libnet/sample/tring_tcp2.c +210 -0
  177. data/libnet/sample/udp1.c +223 -0
  178. data/libnet/sample/udp2.c +232 -0
  179. data/libnet/sample/win32/CVS/Entries +9 -0
  180. data/libnet/sample/win32/CVS/Repository +1 -0
  181. data/libnet/sample/win32/CVS/Root +1 -0
  182. data/libnet/sample/win32/arp/CVS/Entries +2 -0
  183. data/libnet/sample/win32/arp/CVS/Repository +1 -0
  184. data/libnet/sample/win32/arp/CVS/Root +1 -0
  185. data/libnet/sample/win32/arp/arp.vcproj +136 -0
  186. data/libnet/sample/win32/cdp/CVS/Entries +2 -0
  187. data/libnet/sample/win32/cdp/CVS/Repository +1 -0
  188. data/libnet/sample/win32/cdp/CVS/Root +1 -0
  189. data/libnet/sample/win32/cdp/cdp.vcproj +136 -0
  190. data/libnet/sample/win32/dhcp_discover/CVS/Entries +2 -0
  191. data/libnet/sample/win32/dhcp_discover/CVS/Repository +1 -0
  192. data/libnet/sample/win32/dhcp_discover/CVS/Root +1 -0
  193. data/libnet/sample/win32/dhcp_discover/dhcp_discover.vcproj +139 -0
  194. data/libnet/sample/win32/dns/CVS/Entries +2 -0
  195. data/libnet/sample/win32/dns/CVS/Repository +1 -0
  196. data/libnet/sample/win32/dns/CVS/Root +1 -0
  197. data/libnet/sample/win32/dns/dns.vcproj +139 -0
  198. data/libnet/sample/win32/get_addr/CVS/Entries +2 -0
  199. data/libnet/sample/win32/get_addr/CVS/Repository +1 -0
  200. data/libnet/sample/win32/get_addr/CVS/Root +1 -0
  201. data/libnet/sample/win32/get_addr/get_addr.vcproj +139 -0
  202. data/libnet/sample/win32/getopt.c +121 -0
  203. data/libnet/sample/win32/icmp_echo_cq/CVS/Entries +2 -0
  204. data/libnet/sample/win32/icmp_echo_cq/CVS/Repository +1 -0
  205. data/libnet/sample/win32/icmp_echo_cq/CVS/Root +1 -0
  206. data/libnet/sample/win32/icmp_echo_cq/icmp_echo_cq.vcproj +139 -0
  207. data/libnet/sample/win32/tcp1/CVS/Entries +2 -0
  208. data/libnet/sample/win32/tcp1/CVS/Repository +1 -0
  209. data/libnet/sample/win32/tcp1/CVS/Root +1 -0
  210. data/libnet/sample/win32/tcp1/tcp1.vcproj +142 -0
  211. data/libnet/sample/win32/udp1/CVS/Entries +3 -0
  212. data/libnet/sample/win32/udp1/CVS/Repository +1 -0
  213. data/libnet/sample/win32/udp1/CVS/Root +1 -0
  214. data/libnet/sample/win32/udp1/dns.vcproj +125 -0
  215. data/libnet/sample/win32/udp1/udp1.vcproj +139 -0
  216. data/libnet/src/CVS/Entries +60 -0
  217. data/libnet/src/CVS/Repository +1 -0
  218. data/libnet/src/CVS/Root +1 -0
  219. data/libnet/src/Makefile.am +71 -0
  220. data/libnet/src/Makefile.in +428 -0
  221. data/libnet/src/libnet_advanced.c +136 -0
  222. data/libnet/src/libnet_asn1.c +436 -0
  223. data/libnet/src/libnet_build_802.1q.c +115 -0
  224. data/libnet/src/libnet_build_802.1x.c +103 -0
  225. data/libnet/src/libnet_build_802.2.c +167 -0
  226. data/libnet/src/libnet_build_802.3.c +101 -0
  227. data/libnet/src/libnet_build_arp.c +169 -0
  228. data/libnet/src/libnet_build_bgp.c +350 -0
  229. data/libnet/src/libnet_build_cdp.c +191 -0
  230. data/libnet/src/libnet_build_data.c +90 -0
  231. data/libnet/src/libnet_build_dhcp.c +156 -0
  232. data/libnet/src/libnet_build_dns.c +129 -0
  233. data/libnet/src/libnet_build_ethernet.c +173 -0
  234. data/libnet/src/libnet_build_fddi.c +191 -0
  235. data/libnet/src/libnet_build_gre.c +427 -0
  236. data/libnet/src/libnet_build_icmp.c +437 -0
  237. data/libnet/src/libnet_build_igmp.c +112 -0
  238. data/libnet/src/libnet_build_ip.c +892 -0
  239. data/libnet/src/libnet_build_ipsec.c +232 -0
  240. data/libnet/src/libnet_build_isl.c +113 -0
  241. data/libnet/src/libnet_build_link.c +90 -0
  242. data/libnet/src/libnet_build_mpls.c +112 -0
  243. data/libnet/src/libnet_build_ntp.c +121 -0
  244. data/libnet/src/libnet_build_ospf.c +699 -0
  245. data/libnet/src/libnet_build_rip.c +108 -0
  246. data/libnet/src/libnet_build_rpc.c +138 -0
  247. data/libnet/src/libnet_build_sebek.c +108 -0
  248. data/libnet/src/libnet_build_snmp.c +52 -0
  249. data/libnet/src/libnet_build_stp.c +222 -0
  250. data/libnet/src/libnet_build_tcp.c +365 -0
  251. data/libnet/src/libnet_build_token_ring.c +193 -0
  252. data/libnet/src/libnet_build_udp.c +111 -0
  253. data/libnet/src/libnet_build_vrrp.c +117 -0
  254. data/libnet/src/libnet_checksum.c +376 -0
  255. data/libnet/src/libnet_cq.c +395 -0
  256. data/libnet/src/libnet_crc.c +113 -0
  257. data/libnet/src/libnet_dll.c +47 -0
  258. data/libnet/src/libnet_error.c +55 -0
  259. data/libnet/src/libnet_if_addr.c +415 -0
  260. data/libnet/src/libnet_init.c +234 -0
  261. data/libnet/src/libnet_internal.c +310 -0
  262. data/libnet/src/libnet_link_bpf.c +348 -0
  263. data/libnet/src/libnet_link_dlpi.c +785 -0
  264. data/libnet/src/libnet_link_linux.c +310 -0
  265. data/libnet/src/libnet_link_nit.c +125 -0
  266. data/libnet/src/libnet_link_none.c +66 -0
  267. data/libnet/src/libnet_link_pf.c +179 -0
  268. data/libnet/src/libnet_link_snit.c +149 -0
  269. data/libnet/src/libnet_link_snoop.c +166 -0
  270. data/libnet/src/libnet_link_win32.c +346 -0
  271. data/libnet/src/libnet_pblock.c +511 -0
  272. data/libnet/src/libnet_port_list.c +295 -0
  273. data/libnet/src/libnet_prand.c +106 -0
  274. data/libnet/src/libnet_raw.c +257 -0
  275. data/libnet/src/libnet_resolve.c +414 -0
  276. data/libnet/src/libnet_version.c +54 -0
  277. data/libnet/src/libnet_write.c +502 -0
  278. data/libnet/version.h.in +6 -0
  279. data/libnet/win32/CVS/Entries +15 -0
  280. data/libnet/win32/CVS/Repository +1 -0
  281. data/libnet/win32/CVS/Root +1 -0
  282. data/libnet/win32/Libnet-1.1.1-2002.sln +77 -0
  283. data/libnet/win32/Libnet-1.1.1-2003.ncb +0 -0
  284. data/libnet/win32/Libnet-1.1.1-2003.sln +84 -0
  285. data/libnet/win32/Libnet-1.1.1-2003.suo +0 -0
  286. data/libnet/win32/Libnet-1.1.1.vcproj +311 -0
  287. data/libnet/win32/Libnet-latest.ncb +0 -0
  288. data/libnet/win32/Libnet-latest.opt +0 -0
  289. data/libnet/win32/Libnet-latest.sln +77 -0
  290. data/libnet/win32/Libnet-latest.suo +0 -0
  291. data/libnet/win32/Libnet-latest.vcproj +311 -0
  292. data/libnet/win32/Libnet.dsp +337 -0
  293. data/libnet/win32/Libnet.dsw +32 -0
  294. data/libnet/win32/README.txt +57 -0
  295. data/libnet/win32/libnet_dll.def +164 -0
  296. data/test/tc_arp.rb +169 -0
  297. data/test/tc_class.rb +219 -0
  298. data/test/tc_ethernet.rb +97 -0
  299. data/test/tc_header.rb +163 -0
  300. data/test/tc_init.rb +25 -0
  301. data/test/tc_ipv4.rb +219 -0
  302. data/test/tc_ipv6.rb +235 -0
  303. data/test/tc_udp.rb +229 -0
  304. data/test/tc_vlan.rb +118 -0
  305. data/test/ts_all.rb +15 -0
  306. metadata +401 -0
@@ -0,0 +1,310 @@
1
+ /*
2
+ * $Id: libnet_link_linux.c,v 1.5 2004/01/03 20:31:02 mike Exp $
3
+ *
4
+ * libnet 1.1
5
+ * libnet_link_linux.c - linux packet socket and pack socket routines
6
+ *
7
+ * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
8
+ * All rights reserved.
9
+ *
10
+ * Redistribution and use in source and binary forms, with or without
11
+ * modification, are permitted provided that: (1) source code distributions
12
+ * retain the above copyright notice and this paragraph in its entirety, (2)
13
+ * distributions including binary code include the above copyright notice and
14
+ * this paragraph in its entirety in the documentation or other materials
15
+ * provided with the distribution, and (3) all advertising materials mentioning
16
+ * features or use of this software display the following acknowledgement:
17
+ * ``This product includes software developed by the University of California,
18
+ * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
19
+ * the University nor the names of its contributors may be used to endorse
20
+ * or promote products derived from this software without specific prior
21
+ * written permission.
22
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
23
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
24
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
25
+ */
26
+
27
+ #if (HAVE_CONFIG_H)
28
+ #include "../include/config.h"
29
+ #endif
30
+ #include <sys/time.h>
31
+
32
+ #include <net/if.h>
33
+ #if (__GLIBC__)
34
+ #include <netinet/if_ether.h>
35
+ #include <net/if_arp.h>
36
+ #else
37
+ #include <linux/if_arp.h>
38
+ #include <linux/if_ether.h>
39
+ #endif
40
+
41
+ #if (HAVE_PACKET_SOCKET)
42
+ #ifndef SOL_PACKET
43
+ #define SOL_PACKET 263
44
+ #endif /* SOL_PACKET */
45
+ #if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
46
+ #include <netpacket/packet.h>
47
+ #include <net/ethernet.h> /* the L2 protocols */
48
+ #else
49
+ #include <asm/types.h>
50
+ #include <linux/if_packet.h>
51
+ #include <linux/if_ether.h> /* The L2 protocols */
52
+ #endif
53
+ #endif /* HAVE_PACKET_SOCKET */
54
+
55
+ #include "../include/bpf.h"
56
+ #include "../include/libnet.h"
57
+
58
+ #include "../include/gnuc.h"
59
+ #ifdef HAVE_OS_PROTO_H
60
+ #include "../include/os-proto.h"
61
+ #endif
62
+
63
+
64
+ int
65
+ libnet_open_link(libnet_t *l)
66
+ {
67
+ struct ifreq ifr;
68
+ int n = 1;
69
+
70
+ if (l == NULL)
71
+ {
72
+ return (-1);
73
+ }
74
+
75
+ #if (HAVE_PACKET_SOCKET)
76
+ l->fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
77
+ #else
78
+ l->fd = socket(PF_INET, SOCK_PACKET, htons(ETH_P_ALL));
79
+ #endif
80
+ if (l->fd == -1)
81
+ {
82
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
83
+ "socket: %s", strerror(errno));
84
+ goto bad;
85
+ }
86
+
87
+ memset(&ifr, 0, sizeof (ifr));
88
+ strncpy(ifr.ifr_name, l->device, sizeof (ifr.ifr_name) -1);
89
+ ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0';
90
+
91
+ if (ioctl(l->fd, SIOCGIFHWADDR, &ifr) < 0 )
92
+ {
93
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
94
+ "SIOCGIFHWADDR: %s", strerror(errno));
95
+ goto bad;
96
+ }
97
+
98
+ switch (ifr.ifr_hwaddr.sa_family)
99
+ {
100
+ case ARPHRD_ETHER:
101
+ case ARPHRD_METRICOM:
102
+ #ifdef ARPHRD_LOOPBACK
103
+ case ARPHRD_LOOPBACK:
104
+ #endif
105
+ l->link_type = DLT_EN10MB;
106
+ l->link_offset = 0xe;
107
+ break;
108
+ case ARPHRD_SLIP:
109
+ case ARPHRD_CSLIP:
110
+ case ARPHRD_SLIP6:
111
+ case ARPHRD_CSLIP6:
112
+ case ARPHRD_PPP:
113
+ l->link_type = DLT_RAW;
114
+ break;
115
+ case ARPHRD_FDDI:
116
+ l->link_type = DLT_FDDI;
117
+ l->link_offset = 0x15;
118
+ break;
119
+ /* Token Ring */
120
+ case ARPHRD_IEEE802:
121
+ case ARPHRD_IEEE802_TR:
122
+ case ARPHRD_PRONET:
123
+ l->link_type = DLT_PRONET;
124
+ l->link_offset = 0x16;
125
+ break;
126
+
127
+ default:
128
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
129
+ "unknown physical layer type 0x%x\n",
130
+ ifr.ifr_hwaddr.sa_family);
131
+ goto bad;
132
+ }
133
+ #ifdef SO_BROADCAST
134
+ /*
135
+ * man 7 socket
136
+ *
137
+ * Set or get the broadcast flag. When enabled, datagram sockets
138
+ * receive packets sent to a broadcast address and they are allowed
139
+ * to send packets to a broadcast address. This option has no
140
+ * effect on stream-oriented sockets.
141
+ */
142
+ if (setsockopt(l->fd, SOL_SOCKET, SO_BROADCAST, &n, sizeof(n)) == -1)
143
+ {
144
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
145
+ "%s: set SO_BROADCAST failed: %s\n",
146
+ __func__, strerror(errno));
147
+ goto bad;
148
+ }
149
+ #endif /* SO_BROADCAST */
150
+
151
+ return (1);
152
+
153
+ bad:
154
+ if (l->fd >= 0)
155
+ {
156
+ close(l->fd);
157
+ }
158
+ return (-1);
159
+ }
160
+
161
+
162
+ int
163
+ libnet_close_link(libnet_t *l)
164
+ {
165
+ if (close(l->fd) == 0)
166
+ {
167
+ return (1);
168
+ }
169
+ else
170
+ {
171
+ return (-1);
172
+ }
173
+ }
174
+
175
+
176
+ #if (HAVE_PACKET_SOCKET)
177
+ static int
178
+ get_iface_index(int fd, const int8_t *device)
179
+ {
180
+ struct ifreq ifr;
181
+
182
+ /* memset(&ifr, 0, sizeof(ifr)); */
183
+ strncpy (ifr.ifr_name, device, sizeof(ifr.ifr_name) - 1);
184
+ ifr.ifr_name[sizeof(ifr.ifr_name)-1] = '\0';
185
+
186
+ if (ioctl(fd, SIOCGIFINDEX, &ifr) == -1)
187
+ {
188
+ return (-1);
189
+ }
190
+
191
+ return ifr.ifr_ifindex;
192
+ }
193
+ #endif
194
+
195
+
196
+ int
197
+ libnet_write_link(libnet_t *l, u_int8_t *packet, u_int32_t size)
198
+ {
199
+ int c;
200
+ #if (HAVE_PACKET_SOCKET)
201
+ struct sockaddr_ll sa;
202
+ #else
203
+ struct sockaddr sa;
204
+ #endif
205
+
206
+ /* corey: move check for UID/EUID of 0 from libnet_init() to here */
207
+ if (getuid() && geteuid())
208
+ {
209
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
210
+ "%s(): UID or EUID of 0 required\n", __func__);
211
+ return -1;
212
+ }
213
+
214
+ if (l == NULL)
215
+ {
216
+ return (-1);
217
+ }
218
+
219
+ /* corey: open socket if necessary */
220
+ if (l->fd == -1) {
221
+ if (libnet_open_socket(l) == -1) {
222
+ return -1;
223
+ }
224
+ }
225
+
226
+ memset(&sa, 0, sizeof (sa));
227
+ #if (HAVE_PACKET_SOCKET)
228
+ sa.sll_family = AF_PACKET;
229
+ sa.sll_ifindex = get_iface_index(l->fd, l->device);
230
+ if (sa.sll_ifindex == -1)
231
+ {
232
+ return (-1);
233
+ }
234
+ sa.sll_protocol = htons(ETH_P_ALL);
235
+ #else
236
+ strncpy(sa.sa_data, l->device, sizeof (sa.sa_data) - 1);
237
+ sa.sa_data[sizeof (sa.sa_data) - 1] = 0;
238
+ #endif
239
+
240
+ c = sendto(l->fd, packet, size, 0,
241
+ (struct sockaddr *)&sa, sizeof (sa));
242
+ if (c != size)
243
+ {
244
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
245
+ "libnet_write_link(): only %d bytes written (%s)\n", c,
246
+ strerror(errno));
247
+ }
248
+ return (c);
249
+ }
250
+
251
+
252
+ struct libnet_ether_addr *
253
+ libnet_get_hwaddr(libnet_t *l)
254
+ {
255
+ int fd;
256
+ struct ifreq ifr;
257
+ struct libnet_ether_addr *eap;
258
+ /*
259
+ * XXX - non-re-entrant!
260
+ */
261
+ static struct libnet_ether_addr ea;
262
+
263
+ if (l == NULL)
264
+ {
265
+ return (NULL);
266
+ }
267
+
268
+ if (l->device == NULL)
269
+ {
270
+ if (libnet_select_device(l) == -1)
271
+ {
272
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
273
+ "libnet_get_hwaddr: can't figure out a device to use\n");
274
+ return (NULL);
275
+ }
276
+ }
277
+
278
+ /*
279
+ * Create dummy socket to perform an ioctl upon.
280
+ */
281
+ fd = socket(AF_INET, SOCK_DGRAM, 0);
282
+ if (fd < 0)
283
+ {
284
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
285
+ "socket: %s", strerror(errno));
286
+ goto bad;
287
+ }
288
+
289
+ memset(&ifr, 0, sizeof(ifr));
290
+ eap = &ea;
291
+ strncpy(ifr.ifr_name, l->device, sizeof(ifr.ifr_name) - 1);
292
+ ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0';
293
+
294
+ if (ioctl(fd, SIOCGIFHWADDR, (int8_t *)&ifr) < 0)
295
+ {
296
+ close(fd);
297
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
298
+ "ioctl: %s", strerror(errno));
299
+ goto bad;
300
+ }
301
+ memcpy(eap, &ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN);
302
+ close(fd);
303
+ return (eap);
304
+
305
+ bad:
306
+ return (NULL);
307
+ }
308
+
309
+
310
+ /* EOF */
@@ -0,0 +1,125 @@
1
+ /*
2
+ * $Id: libnet_link_nit.c,v 1.6 2004/01/03 20:31:02 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_nit.c - network interface tap routines
6
+ *
7
+ * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
8
+ * All rights reserved.
9
+ *
10
+ * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996
11
+ * The Regents of the University of California. All rights reserved.
12
+ *
13
+ * Redistribution and use in source and binary forms, with or without
14
+ * modification, are permitted provided that: (1) source code distributions
15
+ * retain the above copyright notice and this paragraph in its entirety, (2)
16
+ * distributions including binary code include the above copyright notice and
17
+ * this paragraph in its entirety in the documentation or other materials
18
+ * provided with the distribution, and (3) all advertising materials mentioning
19
+ * features or use of this software display the following acknowledgement:
20
+ * ``This product includes software developed by the University of California,
21
+ * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
22
+ * the University nor the names of its contributors may be used to endorse
23
+ * or promote products derived from this software without specific prior
24
+ * written permission.
25
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
26
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
27
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
28
+ */
29
+
30
+ #if (HAVE_CONFIG_H)
31
+ #include "../include/config.h"
32
+ #endif
33
+ #if (!(_WIN32) || (__CYGWIN__))
34
+ #include "../include/libnet.h"
35
+ #else
36
+ #include "../include/win32/libnet.h"
37
+ #endif
38
+
39
+ #include "../include/gnuc.h"
40
+ #ifdef HAVE_OS_PROTO_H
41
+ #include "../include/os-proto.h"
42
+ #endif
43
+
44
+ struct libnet_link_int *
45
+ libnet_open_link_interface(int8_t *device, int8_t *ebuf)
46
+ {
47
+ struct sockaddr_nit snit;
48
+ register struct libnet_link_int *l;
49
+
50
+ l = (struct libnet_link_int *)malloc(sizeof(*p));
51
+ if (l == NULL)
52
+ {
53
+ strcpy(ebuf, strerror(errno));
54
+ return (NULL);
55
+ }
56
+
57
+ memset(l, 0, sizeof(*l));
58
+
59
+ l->fd = socket(AF_NIT, SOCK_RAW, NITPROTO_RAW);
60
+ if (l->fd < 0)
61
+ {
62
+ sprintf(ebuf, "socket: %s", strerror(errno));
63
+ goto bad;
64
+ }
65
+ snit.snit_family = AF_NIT;
66
+ strncpy(snit.snit_ifname, device, NITIFSIZ -1);
67
+ snit.snit_ifname[NITIFSIZ] = '\0';
68
+
69
+ if (bind(l->fd, (struct sockaddr *)&snit, sizeof(snit)))
70
+ {
71
+ sprintf(ebuf, "bind: %s: %s", snit.snit_ifname, strerror(errno));
72
+ goto bad;
73
+ }
74
+
75
+ /*
76
+ * NIT supports only ethernets.
77
+ */
78
+ l->linktype = DLT_EN10MB;
79
+
80
+ return (l);
81
+
82
+ bad:
83
+ if (l->fd >= 0)
84
+ {
85
+ close(l->fd);
86
+ }
87
+ free(l);
88
+ return (NULL);
89
+ }
90
+
91
+
92
+ int
93
+ libnet_close_link_interface(struct libnet_link_int *l)
94
+ {
95
+ if (close(l->fd) == 0)
96
+ {
97
+ free(l);
98
+ return (1);
99
+ }
100
+ else
101
+ {
102
+ free(l);
103
+ return (-1);
104
+ }
105
+ }
106
+
107
+
108
+ int
109
+ write_link_layer(struct libnet_link_int *l, const int8_t *device,
110
+ u_int8_t *buf, int len)
111
+ {
112
+ int c;
113
+ struct sockaddr sa;
114
+
115
+ memset(&sa, 0, sizeof(sa));
116
+ strncpy(sa.sa_data, device, sizeof(sa.sa_data));
117
+
118
+ c = sendto(l->fd, buf, len, 0, &sa, sizeof(sa));
119
+ if (c != len)
120
+ {
121
+ /* error */
122
+ }
123
+ return (c);
124
+ }
125
+
@@ -0,0 +1,66 @@
1
+ /*
2
+ * $Id: libnet_link_none.c,v 1.5 2004/01/03 20:31:02 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_none.c - dummy routines for suckers with no link-layer interface
6
+ *
7
+ * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
8
+ * All rights reserved.
9
+ *
10
+ * Copyright (c) 1993, 1994, 1995, 1996, 1998
11
+ * The Regents of the University of California. All rights reserved.
12
+ *
13
+ * Redistribution and use in source and binary forms, with or without
14
+ * modification, are permitted provided that: (1) source code distributions
15
+ * retain the above copyright notice and this paragraph in its entirety, (2)
16
+ * distributions including binary code include the above copyright notice and
17
+ * this paragraph in its entirety in the documentation or other materials
18
+ * provided with the distribution, and (3) all advertising materials mentioning
19
+ * features or use of this software display the following acknowledgement:
20
+ * ``This product includes software developed by the University of California,
21
+ * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
22
+ * the University nor the names of its contributors may be used to endorse
23
+ * or promote products derived from this software without specific prior
24
+ * written permission.
25
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
26
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
27
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
28
+ */
29
+
30
+ #if (HAVE_CONFIG_H)
31
+ #include "../include/config.h"
32
+ #endif
33
+ #if (!(_WIN32) || (__CYGWIN__))
34
+ #include "../include/libnet.h"
35
+ #else
36
+ #include "../include/win32/libnet.h"
37
+ #endif
38
+
39
+ int
40
+ libnet_open_link(libnet_t *l)
41
+ {
42
+ return (NULL);
43
+ }
44
+
45
+
46
+ int
47
+ libnet_close_link(libnet_t *l)
48
+ {
49
+ return (-1);
50
+ }
51
+
52
+
53
+ int
54
+ libnet_write_link(libnet_t *l, u_int8_t *packet, u_int32_t size)
55
+ {
56
+ return (-1);
57
+ }
58
+
59
+
60
+ struct libnet_ether_addr *
61
+ libnet_get_hwaddr(libnet_t *l)
62
+ {
63
+ return (NULL);
64
+ }
65
+
66
+ /* EOF */
@@ -0,0 +1,179 @@
1
+ /*
2
+ * $Id: libnet_link_pf.c,v 1.3 2004/01/03 20:31:02 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_pf.c - pf routines
6
+ *
7
+ * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
8
+ * All rights reserved.
9
+ *
10
+ * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996
11
+ * The Regents of the University of California. All rights reserved.
12
+ *
13
+ * Redistribution and use in source and binary forms, with or without
14
+ * modification, are permitted provided that: (1) source code distributions
15
+ * retain the above copyright notice and this paragraph in its entirety, (2)
16
+ * distributions including binary code include the above copyright notice and
17
+ * this paragraph in its entirety in the documentation or other materials
18
+ * provided with the distribution, and (3) all advertising materials mentioning
19
+ * features or use of this software display the following acknowledgement:
20
+ * ``This product includes software developed by the University of California,
21
+ * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
22
+ * the University nor the names of its contributors may be used to endorse
23
+ * or promote products derived from this software without specific prior
24
+ * written permission.
25
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
26
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
27
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
28
+ *
29
+ * packet filter subroutines for tcpdump
30
+ * Extraction/creation by Jeffrey Mogul, DECWRL
31
+ */
32
+
33
+ #if (HAVE_CONFIG_H)
34
+ #include "../include/config.h"
35
+ #endif
36
+ #include "../include/low_libnet.h"
37
+
38
+ #include "../include/gnuc.h"
39
+ #ifdef HAVE_OS_PROTO_H
40
+ #include "../include/os-proto.h"
41
+ #endif
42
+
43
+ struct libnet_link_int *
44
+ libnet_open_link_interface(int8_t *device, int8_t *ebuf)
45
+ {
46
+ register struct libnet_link_int *l;
47
+ int16_t enmode;
48
+ int backlog = -1; /* request the most */
49
+ struct enfilter Filter;
50
+ struct endevp devparams;
51
+
52
+ l = (struct libnet_link_int *)malloc(sizeof(*l));
53
+ if (l == NULL)
54
+ {
55
+ sprintf(ebuf, "libnet_open_link_int: %s", strerror(errno));
56
+ return (0);
57
+ }
58
+ memset(l, 0, sizeof(*l));
59
+ l->fd = pfopen(device, O_RDWR);
60
+ if (l->fd < 0)
61
+ {
62
+ sprintf(ebuf, "pf open: %s: %s\n\your system may not be properly configured; see \"man packetfilter(4)\"\n",
63
+ device, strerror(errno));
64
+ goto bad;
65
+ }
66
+
67
+ enmode = ENTSTAMP|ENBATCH|ENNONEXCL;
68
+ if (ioctl(l->fd, EIOCMBIS, (caddr_t)&enmode) < 0)
69
+ {
70
+ sprintf(ebuf, "EIOCMBIS: %s", strerror(errno));
71
+ goto bad;
72
+ }
73
+ #ifdef ENCOPYALL
74
+ /* Try to set COPYALL mode so that we see packets to ourself */
75
+ enmode = ENCOPYALL;
76
+ ioctl(l->fd, EIOCMBIS, (caddr_t)&enmode); /* OK if this fails */
77
+ #endif
78
+ /* set the backlog */
79
+ if (ioctl(l->fd, EIOCSETW, (caddr_t)&backlog) < 0)
80
+ {
81
+ sprintf(ebuf, "EIOCSETW: %s", strerror(errno));
82
+ goto bad;
83
+ }
84
+ /*
85
+ * discover interface type
86
+ */
87
+ if (ioctl(l->fd, EIOCDEVP, (caddr_t)&devparams) < 0)
88
+ {
89
+ sprintf(ebuf, "EIOCDEVP: %s", strerror(errno));
90
+ goto bad;
91
+ }
92
+
93
+ /* HACK: to compile prior to Ultrix 4.2 */
94
+ #ifndef ENDT_FDDI
95
+ #define ENDT_FDDI 4
96
+ #endif
97
+ switch (devparams.end_dev_type)
98
+ {
99
+ case ENDT_10MB:
100
+ l->linktype = DLT_EN10MB;
101
+ break;
102
+ case ENDT_FDDI:
103
+ l->linktype = DLT_FDDI;
104
+ break;
105
+ default:
106
+ /*
107
+ * XXX
108
+ * Currently, the Ultrix packet filter supports only
109
+ * Ethernet and FDDI. Eventually, support for SLIP and PPP
110
+ * (and possibly others: T1?) should be added.
111
+ */
112
+ l->linktype = DLT_EN10MB;
113
+ break;
114
+ }
115
+ /*
116
+ * acceptag all packets
117
+ */
118
+ bzero((int8_t *)&Filter, sizeof(Filter));
119
+ Filter.enf_Priority = 37; /* anything > 2 */
120
+ Filter.enf_FilterLen = 0; /* means "always true" */
121
+ if (ioctl(l->fd, EIOCSETF, (caddr_t)&Filter) < 0)
122
+ {
123
+ sprintf(ebuf, "EIOCSETF: %s", strerror(errno));
124
+ goto bad;
125
+ }
126
+
127
+ return (l);
128
+ bad:
129
+ free(l);
130
+ return (NULL);
131
+ }
132
+
133
+
134
+ int
135
+ libnet_close_link_interface(struct libnet_link_int *l)
136
+ {
137
+ if (close(l->fd) == 0)
138
+ {
139
+ free(l);
140
+ return (1);
141
+ }
142
+ else
143
+ {
144
+ free(l);
145
+ return (-1);
146
+ }
147
+ }
148
+
149
+
150
+ int
151
+ libnet_write_link_layer(struct libnet_link_int *l, const int8_t *device,
152
+ const u_int8_t *buf, int len)
153
+ {
154
+ int c;
155
+
156
+ /* corey: move check for UID/EUID of 0 from libnet_init() to here */
157
+ if (getuid() && geteuid())
158
+ {
159
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
160
+ "%s(): UID or EUID of 0 required\n", __func__);
161
+ return -1;
162
+ }
163
+
164
+ /* corey: open socket if necessary */
165
+ if (l->fd == -1) {
166
+ if (libnet_open_socket(l) == -1) {
167
+ return -1;
168
+ }
169
+ }
170
+
171
+ c = write(l->fd, buf, len);
172
+ if (c != len)
173
+ {
174
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
175
+ "libnet_write_link: %d bytes written (%s)\n", c,
176
+ strerror(errno));
177
+ }
178
+ return (c);
179
+ }