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
data/test/tc_ipv4.rb ADDED
@@ -0,0 +1,219 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'test/unit'
4
+ require 'libnet4r'
5
+
6
+ class TC_Libnet_IPv4 < Test::Unit::TestCase
7
+ def test_unpack
8
+ ip = [
9
+ 0x45, 0x12, 0x00, 0x40, 0x43, 0x21, 0x00, 0x00, 0x48, 0x11, 0xac, 0x24,
10
+ 0xc0, 0xa8, 0x01, 0x02, 0xc0, 0xa8, 0x01, 0x03, 0x74, 0x68, 0x65, 0x20,
11
+ 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
12
+ 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f,
13
+ 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79,
14
+ 0x20, 0x64, 0x6f, 0x67
15
+ ].pack("C*")
16
+
17
+ i = Libnet::IPv4.decode(ip)
18
+
19
+ assert_equal(4, i.version)
20
+ assert_equal(5, i.ihl)
21
+ assert_equal(0x12, i.tos)
22
+ assert_equal(0x40, i.length)
23
+ assert_equal(0x4321, i.id)
24
+ assert_equal(0x0, i.frag_off)
25
+ assert_equal(72, i.ttl)
26
+ assert_equal(Libnet::IPPROTO_UDP, i.protocol)
27
+ assert_equal(0x24, i.checksum)
28
+ assert_equal(0xc0a80102, i.src_ip)
29
+ assert_equal(0xc0a80103, i.dst_ip)
30
+ assert_equal("the quick brown fox jumped over the lazy dog", i.payload)
31
+
32
+ assert_raise ArgumentError do
33
+ Libnet::IPv4.decode("foobar")
34
+ end
35
+ end
36
+
37
+ def test_pack
38
+ ip = [
39
+ 0x45, 0x12, 0x00, 0x40, 0x43, 0x21, 0x00, 0x00, 0x48, 0x11, 0xac, 0x24,
40
+ 0xc0, 0xa8, 0x01, 0x02, 0xc0, 0xa8, 0x01, 0x03, 0x74, 0x68, 0x65, 0x20,
41
+ 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
42
+ 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f,
43
+ 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79,
44
+ 0x20, 0x64, 0x6f, 0x67
45
+ ].pack("C*")
46
+ payload = "the quick brown fox jumped over the lazy dog"
47
+
48
+ i = Libnet::IPv4.new
49
+
50
+ i.tos = 0x12
51
+ i.length = Libnet::HL_IPV4 + payload.length
52
+ i.id = 0x4321
53
+ i.frag_off = 0
54
+ i.ttl = 72
55
+ i.protocol = Libnet::IPPROTO_UDP
56
+ i.checksum = 0
57
+ i.src_ip = '192.168.1.2'
58
+ i.dst_ip = 0xc0a80103
59
+ i.payload = payload
60
+
61
+ l = Libnet.new
62
+
63
+ assert_nil(i.ptag)
64
+
65
+ l.build_ipv4(i)
66
+
67
+ assert(i.ptag > 0)
68
+ assert_equal(ip, l.pack)
69
+
70
+ l = Libnet.new
71
+
72
+ i = nil
73
+ l.build_ipv4 do |i|
74
+ i.tos = 0x12
75
+ i.length = Libnet::HL_IPV4 + payload.length
76
+ i.id = 0x4321
77
+ i.frag_off = 0
78
+ i.ttl = 72
79
+ i.protocol = Libnet::IPPROTO_UDP
80
+ i.checksum = 0
81
+ i.src_ip = '192.168.1.2'
82
+ i.dst_ip = 0xc0a80103
83
+ i.payload = payload
84
+ end
85
+
86
+ assert(i.ptag > 0)
87
+ assert_equal(ip, l.pack)
88
+ end
89
+
90
+ def test_modify_ptag
91
+ ip1 = [
92
+ 0x45, 0x12, 0x00, 0x40, 0x43, 0x21, 0x00, 0x00, 0x48, 0x11, 0xac, 0x24,
93
+ 0xc0, 0xa8, 0x01, 0x02, 0xc0, 0xa8, 0x01, 0x03, 0x74, 0x68, 0x65, 0x20,
94
+ 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
95
+ 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f,
96
+ 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79,
97
+ 0x20, 0x64, 0x6f, 0x67
98
+ ].pack("C*")
99
+ ip2 = [
100
+ 0x45, 0x12, 0x00, 0x40, 0x43, 0x21, 0x00, 0x00, 0x48, 0x11, 0xac, 0x23,
101
+ 0xc0, 0xa8, 0x01, 0x02, 0xc0, 0xa8, 0x01, 0x04, 0x74, 0x68, 0x65, 0x20,
102
+ 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
103
+ 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f,
104
+ 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79,
105
+ 0x20, 0x64, 0x6f, 0x67
106
+ ].pack("C*")
107
+ payload = "the quick brown fox jumped over the lazy dog"
108
+
109
+ l = Libnet.new
110
+
111
+ i = nil
112
+ l.build_ipv4 do |i|
113
+ i.tos = 0x12
114
+ i.length = Libnet::HL_IPV4 + payload.length
115
+ i.id = 0x4321
116
+ i.frag_off = 0
117
+ i.ttl = 72
118
+ i.protocol = Libnet::IPPROTO_UDP
119
+ i.checksum = 0
120
+ i.src_ip = '192.168.1.2'
121
+ i.dst_ip = 0xc0a80103
122
+ i.payload = payload
123
+ end
124
+
125
+ assert(i.ptag > 0)
126
+ assert_equal(ip1, l.pack)
127
+
128
+ ptag = i.ptag
129
+
130
+ i.dst_ip = '192.168.1.4'
131
+
132
+ l.build_ipv4(i)
133
+
134
+ assert_equal(ptag, i.ptag)
135
+ assert_equal(ip2, l.pack)
136
+ end
137
+
138
+ def test_ethernet
139
+ bytes = [
140
+ # ethernet
141
+ 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
142
+ 0x08, 0x00,
143
+ #ipv4
144
+ 0x45, 0x12, 0x00, 0x40, 0x43, 0x21, 0x00, 0x00, 0x48, 0x11, 0xac, 0x24,
145
+ 0xc0, 0xa8, 0x01, 0x02, 0xc0, 0xa8, 0x01, 0x03, 0x74, 0x68, 0x65, 0x20,
146
+ 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
147
+ 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f,
148
+ 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79,
149
+ 0x20, 0x64, 0x6f, 0x67
150
+ ].pack("C*")
151
+ payload = "the quick brown fox jumped over the lazy dog"
152
+
153
+ l = Libnet.new
154
+
155
+ l.build_ipv4 do |i|
156
+ i.tos = 0x12
157
+ i.length = Libnet::HL_IPV4 + payload.length
158
+ i.id = 0x4321
159
+ i.frag_off = 0
160
+ i.ttl = 72
161
+ i.protocol = Libnet::IPPROTO_UDP
162
+ i.checksum = 0
163
+ i.src_ip = '192.168.1.2'
164
+ i.dst_ip = 0xc0a80103
165
+ i.payload = payload
166
+ end
167
+
168
+ l.build_ethernet do |e|
169
+ e.dst = 'aa:bb:cc:dd:ee:ff'
170
+ e.src = '11:22:33:44:55:66'
171
+ e.type = 0x0800
172
+ end
173
+
174
+ assert_equal(bytes, l.pack)
175
+ end
176
+
177
+ def test_vlan
178
+ bytes = [
179
+ # vlan
180
+ 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
181
+ 0xbe, 0xef, 0xca, 0xaa, 0x08, 0x00,
182
+ #ipv4
183
+ 0x45, 0x12, 0x00, 0x40, 0x43, 0x21, 0x00, 0x00, 0x48, 0x11, 0xac, 0x24,
184
+ 0xc0, 0xa8, 0x01, 0x02, 0xc0, 0xa8, 0x01, 0x03, 0x74, 0x68, 0x65, 0x20,
185
+ 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
186
+ 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f,
187
+ 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79,
188
+ 0x20, 0x64, 0x6f, 0x67
189
+ ].pack("C*")
190
+ payload = "the quick brown fox jumped over the lazy dog"
191
+
192
+ l = Libnet.new
193
+
194
+ l.build_ipv4 do |i|
195
+ i.tos = 0x12
196
+ i.length = Libnet::HL_IPV4 + payload.length
197
+ i.id = 0x4321
198
+ i.frag_off = 0
199
+ i.ttl = 72
200
+ i.protocol = Libnet::IPPROTO_UDP
201
+ i.checksum = 0
202
+ i.src_ip = '192.168.1.2'
203
+ i.dst_ip = 0xc0a80103
204
+ i.payload = payload
205
+ end
206
+
207
+ l.build_vlan do |v|
208
+ v.dst = 'aa:bb:cc:dd:ee:ff'
209
+ v.src = '11:22:33:44:55:66'
210
+ v.tpi = 0xbeef
211
+ v.priority = 6
212
+ v.cfi = 0
213
+ v.id = 2730
214
+ v.type = 0x0800
215
+ end
216
+
217
+ assert_equal(bytes, l.pack)
218
+ end
219
+ end
data/test/tc_ipv6.rb ADDED
@@ -0,0 +1,235 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'test/unit'
4
+ require 'libnet4r'
5
+
6
+ class TC_Libnet_IPv6 < Test::Unit::TestCase
7
+ def test_unpack
8
+ bytes = [
9
+ 0x62, 0x2d, 0xbe, 0xef, 0x00, 0x2c, 0x11, 0x18, 0x00, 0x11, 0x22, 0x33,
10
+ 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
11
+ 0xaa, 0xbb, 0xaa, 0xbb, 0xcc, 0xdd, 0xcc, 0xdd, 0xee, 0xff, 0xee, 0xff,
12
+ 0x22, 0x33, 0x22, 0x33, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
13
+ 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20,
14
+ 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20,
15
+ 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
16
+ ].pack("C*")
17
+ src_ip = [
18
+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
19
+ 0xcc, 0xdd, 0xee, 0xff
20
+ ].pack("C*")
21
+ dst_ip = [
22
+ 0xaa, 0xbb, 0xaa, 0xbb, 0xcc, 0xdd, 0xcc, 0xdd, 0xee, 0xff, 0xee, 0xff,
23
+ 0x22, 0x33, 0x22, 0x33
24
+ ].pack("C*")
25
+ payload = "the quick brown fox jumped over the lazy dog"
26
+
27
+ i = Libnet::IPv6.decode(bytes)
28
+
29
+ assert_equal(6, i.version)
30
+ assert_equal(0x22, i.traffic_class)
31
+ assert_equal(0xdbeef, i.flow_label)
32
+ assert_equal(44, i.length)
33
+ assert_equal(Libnet::IPPROTO_UDP, i.next_header)
34
+ assert_equal(24, i.hop_limit)
35
+ assert_equal(src_ip, i.src_ip)
36
+ assert_equal(dst_ip, i.dst_ip)
37
+ assert_equal(payload, i.payload)
38
+
39
+ assert_raise ArgumentError do
40
+ Libnet::IPv6.decode("foobar")
41
+ end
42
+ end
43
+
44
+ def test_pack
45
+ bytes = [
46
+ 0x62, 0x2d, 0xbe, 0xef, 0x00, 0x54, 0x11, 0x18, 0x00, 0x11, 0x22, 0x33,
47
+ 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
48
+ 0xaa, 0xbb, 0xaa, 0xbb, 0xcc, 0xdd, 0xcc, 0xdd, 0xee, 0xff, 0xee, 0xff,
49
+ 0x22, 0x33, 0x22, 0x33, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
50
+ 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20,
51
+ 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20,
52
+ 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
53
+ ].pack("C*")
54
+ payload = "the quick brown fox jumped over the lazy dog"
55
+
56
+ i = Libnet::IPv6.new
57
+
58
+ i.traffic_class = 0x22
59
+ i.flow_label = 0xdbeef
60
+ i.length = Libnet::HL_IPV6 + payload.length
61
+ i.next_header = Libnet::IPPROTO_UDP
62
+ i.hop_limit = 24
63
+ i.src_ip = [
64
+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
65
+ 0xcc, 0xdd, 0xee, 0xff
66
+ ].pack("C*")
67
+ i.dst_ip = "aabb:aabb:ccdd:ccdd:eeff:eeff:2233:2233"
68
+ i.payload = payload
69
+
70
+ assert_nil(i.ptag)
71
+
72
+ l = Libnet.new
73
+
74
+ l.build_ipv6(i)
75
+
76
+ assert(i.ptag > 0)
77
+ assert_equal(bytes, l.pack)
78
+
79
+ l = Libnet.new
80
+
81
+ i = nil
82
+ l.build_ipv6 do |i|
83
+ i.traffic_class = 0x22
84
+ i.flow_label = 0xdbeef
85
+ i.length = Libnet::HL_IPV6 + payload.length
86
+ i.next_header = Libnet::IPPROTO_UDP
87
+ i.hop_limit = 24
88
+ i.src_ip = [
89
+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
90
+ 0xcc, 0xdd, 0xee, 0xff
91
+ ].pack("C*")
92
+ i.dst_ip = "aabb:aabb:ccdd:ccdd:eeff:eeff:2233:2233"
93
+ i.payload = payload
94
+ end
95
+
96
+ assert(i.ptag > 0)
97
+ assert_equal(bytes, l.pack)
98
+ end
99
+
100
+ def test_modify_ptag
101
+ bytes1 = [
102
+ 0x62, 0x2d, 0xbe, 0xef, 0x00, 0x54, 0x11, 0x18, 0x00, 0x11, 0x22, 0x33,
103
+ 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
104
+ 0xaa, 0xbb, 0xaa, 0xbb, 0xcc, 0xdd, 0xcc, 0xdd, 0xee, 0xff, 0xee, 0xff,
105
+ 0x22, 0x33, 0x22, 0x33, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
106
+ 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20,
107
+ 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20,
108
+ 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
109
+ ].pack("C*")
110
+ bytes2 = [
111
+ 0x62, 0x2a, 0xde, 0xad, 0x00, 0x54, 0x11, 0x18, 0x00, 0x11, 0x22, 0x33,
112
+ 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
113
+ 0xaa, 0xbb, 0xaa, 0xbb, 0xcc, 0xdd, 0xcc, 0xdd, 0xee, 0xff, 0xee, 0xff,
114
+ 0x22, 0x33, 0x22, 0x33, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
115
+ 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20,
116
+ 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20,
117
+ 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
118
+ ].pack("C*")
119
+ payload = "the quick brown fox jumped over the lazy dog"
120
+
121
+ l = Libnet.new
122
+
123
+ i = l.build_ipv6 do |i|
124
+ i.traffic_class = 0x22
125
+ i.flow_label = 0xdbeef
126
+ i.length = Libnet::HL_IPV6 + payload.length
127
+ i.next_header = Libnet::IPPROTO_UDP
128
+ i.hop_limit = 24
129
+ i.src_ip = [
130
+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
131
+ 0xcc, 0xdd, 0xee, 0xff
132
+ ].pack("C*")
133
+ i.dst_ip = "aabb:aabb:ccdd:ccdd:eeff:eeff:2233:2233"
134
+ i.payload = payload
135
+ end
136
+
137
+ assert_equal(bytes1, l.pack)
138
+
139
+ assert(i.ptag > 0)
140
+ ptag = i.ptag
141
+
142
+ i.flow_label = 0xadead
143
+
144
+ l.build_ipv6(i)
145
+
146
+ assert_equal(bytes2, l.pack)
147
+ assert(ptag, i.ptag)
148
+ end
149
+
150
+ def test_ethernet
151
+ bytes = [
152
+ # ethernet
153
+ 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
154
+ 0x86, 0xdd,
155
+ # ipv6
156
+ 0x62, 0x2d, 0xbe, 0xef, 0x00, 0x54, 0x11, 0x18, 0x00, 0x11, 0x22, 0x33,
157
+ 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
158
+ 0xaa, 0xbb, 0xaa, 0xbb, 0xcc, 0xdd, 0xcc, 0xdd, 0xee, 0xff, 0xee, 0xff,
159
+ 0x22, 0x33, 0x22, 0x33, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
160
+ 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20,
161
+ 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20,
162
+ 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
163
+ ].pack("C*")
164
+ payload = "the quick brown fox jumped over the lazy dog"
165
+
166
+ l = Libnet.new
167
+
168
+ l.build_ipv6 do |i|
169
+ i.traffic_class = 0x22
170
+ i.flow_label = 0xdbeef
171
+ i.length = Libnet::HL_IPV6 + payload.length
172
+ i.next_header = Libnet::IPPROTO_UDP
173
+ i.hop_limit = 24
174
+ i.src_ip = [
175
+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
176
+ 0xcc, 0xdd, 0xee, 0xff
177
+ ].pack("C*")
178
+ i.dst_ip = "aabb:aabb:ccdd:ccdd:eeff:eeff:2233:2233"
179
+ i.payload = payload
180
+ end
181
+
182
+ l.build_ethernet do |e|
183
+ e.dst = 'aa:bb:cc:dd:ee:ff'
184
+ e.src = '11:22:33:44:55:66'
185
+ e.type = 0x86dd
186
+ end
187
+
188
+ assert_equal(bytes, l.pack)
189
+ end
190
+
191
+ def test_vlan
192
+ bytes = [
193
+ # vlan
194
+ 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
195
+ 0xbe, 0xef, 0xca, 0xaa, 0x86, 0xdd,
196
+ # ipv6
197
+ 0x62, 0x2d, 0xbe, 0xef, 0x00, 0x54, 0x11, 0x18, 0x00, 0x11, 0x22, 0x33,
198
+ 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
199
+ 0xaa, 0xbb, 0xaa, 0xbb, 0xcc, 0xdd, 0xcc, 0xdd, 0xee, 0xff, 0xee, 0xff,
200
+ 0x22, 0x33, 0x22, 0x33, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
201
+ 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20,
202
+ 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20,
203
+ 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
204
+ ].pack("C*")
205
+ payload = "the quick brown fox jumped over the lazy dog"
206
+
207
+ l = Libnet.new
208
+
209
+ l.build_ipv6 do |i|
210
+ i.traffic_class = 0x22
211
+ i.flow_label = 0xdbeef
212
+ i.length = Libnet::HL_IPV6 + payload.length
213
+ i.next_header = Libnet::IPPROTO_UDP
214
+ i.hop_limit = 24
215
+ i.src_ip = [
216
+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
217
+ 0xcc, 0xdd, 0xee, 0xff
218
+ ].pack("C*")
219
+ i.dst_ip = "aabb:aabb:ccdd:ccdd:eeff:eeff:2233:2233"
220
+ i.payload = payload
221
+ end
222
+
223
+ l.build_vlan do |v|
224
+ v.dst = 'aa:bb:cc:dd:ee:ff'
225
+ v.src = '11:22:33:44:55:66'
226
+ v.tpi = 0xbeef
227
+ v.priority = 6
228
+ v.cfi = 0
229
+ v.id = 2730
230
+ v.type = 0x86dd
231
+ end
232
+
233
+ assert_equal(bytes, l.pack)
234
+ end
235
+ end
data/test/tc_udp.rb ADDED
@@ -0,0 +1,229 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'test/unit'
4
+ require 'libnet4r'
5
+
6
+ class TC_Libnet_UDP < Test::Unit::TestCase
7
+ def test_unpack
8
+ bytes = [
9
+ 0x43, 0x21, 0xab, 0xcd, 0x00, 0x34, 0x11, 0x11,
10
+ 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72,
11
+ 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
12
+ 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
13
+ 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
14
+ ].pack("C*")
15
+ payload = "the quick brown fox jumped over the lazy dog"
16
+
17
+ u = Libnet::UDP.decode(bytes)
18
+
19
+ assert_equal(0x4321, u.src_port)
20
+ assert_equal(0xabcd, u.dst_port)
21
+ assert_equal(0x0034, u.length)
22
+ assert_equal(0x1111, u.checksum)
23
+ assert_equal(payload, u.payload)
24
+
25
+ assert_raise ArgumentError do
26
+ Libnet::UDP.decode("foobar")
27
+ end
28
+ end
29
+
30
+ def test_pack
31
+ bytes = [
32
+ 0x43, 0x21, 0xab, 0xcd, 0x00, 0x34, 0x11, 0x11,
33
+ 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72,
34
+ 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
35
+ 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
36
+ 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
37
+ ].pack("C*")
38
+ payload = "the quick brown fox jumped over the lazy dog"
39
+
40
+ u = Libnet::UDP.new
41
+
42
+ u.src_port = 0x4321
43
+ u.dst_port = 0xabcd
44
+ u.length = Libnet::HL_UDP + payload.length
45
+ u.checksum = 0x1111
46
+ u.payload = payload
47
+
48
+ assert_nil(u.ptag)
49
+
50
+ l = Libnet.new
51
+
52
+ l.build_udp(u)
53
+
54
+ assert(u.ptag > 0)
55
+ assert_equal(bytes, l.pack)
56
+
57
+ l = Libnet.new
58
+
59
+ u = nil
60
+ l.build_udp do |u|
61
+ u.src_port = 0x4321
62
+ u.dst_port = 0xabcd
63
+ u.length = Libnet::HL_UDP + payload.length
64
+ u.checksum = 0x1111
65
+ u.payload = payload
66
+ end
67
+
68
+ assert(u.ptag > 0)
69
+ assert_equal(bytes, l.pack)
70
+ end
71
+
72
+ def test_modify_ptag
73
+ bytes1 = [
74
+ 0x43, 0x21, 0xab, 0xcd, 0x00, 0x34, 0x11, 0x11,
75
+ 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72,
76
+ 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
77
+ 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
78
+ 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
79
+ ].pack("C*")
80
+ bytes2 = [
81
+ 0xfe, 0xed, 0xfa, 0xce, 0x00, 0x34, 0x11, 0x11,
82
+ 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72,
83
+ 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
84
+ 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
85
+ 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
86
+ ].pack("C*")
87
+ payload = "the quick brown fox jumped over the lazy dog"
88
+
89
+ l = Libnet.new
90
+
91
+ u = l.build_udp do |u|
92
+ u.src_port = 0x4321
93
+ u.dst_port = 0xabcd
94
+ u.length = Libnet::HL_UDP + payload.length
95
+ u.checksum = 0x1111
96
+ u.payload = payload
97
+ end
98
+
99
+ assert(u.ptag > 0)
100
+ ptag = u.ptag
101
+ assert_equal(bytes1, l.pack)
102
+
103
+ u.src_port = 0xfeed
104
+ u.dst_port = 0xface
105
+
106
+ l.build_udp(u)
107
+
108
+ assert_equal(ptag, u.ptag)
109
+ assert_equal(bytes2, l.pack)
110
+ end
111
+
112
+ def test_ether_ipv4_udp
113
+ bytes = [
114
+ # ethernet
115
+ 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
116
+ 0x08, 0x00,
117
+ # ipv4
118
+ 0x45, 0x12, 0x00, 0x48, 0x43, 0x21, 0x00, 0x00, 0x48, 0x11, 0xac, 0x1c,
119
+ 0xc0, 0xa8, 0x01, 0x02, 0xc0, 0xa8, 0x01, 0x03,
120
+ # udp
121
+ 0x43, 0x21, 0xab, 0xcd,
122
+ 0x00, 0x34, 0xb8, 0xb6, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
123
+ 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20,
124
+ 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20,
125
+ 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
126
+ ].pack("C*")
127
+ payload = "the quick brown fox jumped over the lazy dog"
128
+
129
+ l = Libnet.new(:link)
130
+
131
+ u = l.build_udp do |u|
132
+ u.src_port = 0x4321
133
+ u.dst_port = 0xabcd
134
+ u.length = Libnet::HL_UDP + payload.length
135
+ u.checksum = 0
136
+ u.payload = payload
137
+ end
138
+
139
+ l.build_ipv4 do |i|
140
+ i.tos = 0x12
141
+ i.length = Libnet::HL_IPV4 + Libnet::HL_UDP + payload.length
142
+ i.id = 0x4321
143
+ i.frag_off = 0
144
+ i.ttl = 72
145
+ i.protocol = Libnet::IPPROTO_UDP
146
+ i.checksum = 0
147
+ i.src_ip = '192.168.1.2'
148
+ i.dst_ip = 0xc0a80103
149
+ end
150
+
151
+ l.build_ethernet do |e|
152
+ e.dst = 'aa:bb:cc:dd:ee:ff'
153
+ e.src = '11:22:33:44:55:66'
154
+ e.type = 0x0800
155
+ end
156
+
157
+ assert_equal(bytes, l.pack)
158
+
159
+ if Process.uid > 0 && Process.euid > 0
160
+ # user is not root, so we should get an exception here
161
+ assert_raise RuntimeError do
162
+ l.write
163
+ end
164
+ else
165
+ # user is root, so this should work
166
+ assert_equal(bytes.length, l.write)
167
+ end
168
+ end
169
+
170
+ def test_ether_ipv6_udp
171
+ bytes = [
172
+ # ethernet
173
+ 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
174
+ 0x86, 0xdd,
175
+ # ipv6
176
+ 0x62, 0x2d, 0xbe, 0xef, 0x00, 0x54, 0x11, 0x18, 0x00, 0x11, 0x22, 0x33,
177
+ 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
178
+ 0xaa, 0xbb, 0xaa, 0xbb, 0xcc, 0xdd, 0xcc, 0xdd, 0xee, 0xff, 0xee, 0xff,
179
+ 0x22, 0x33, 0x22, 0x33,
180
+ # udp
181
+ 0xfe, 0xed, 0xfa, 0xce, 0x00, 0x34, 0x63, 0x62,
182
+ 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72,
183
+ 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
184
+ 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
185
+ 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67
186
+ ].pack("C*")
187
+ payload = "the quick brown fox jumped over the lazy dog"
188
+
189
+ l = Libnet.new(:link)
190
+
191
+ u = l.build_udp do |u|
192
+ u.src_port = 0xfeed
193
+ u.dst_port = 0xface
194
+ u.length = Libnet::HL_UDP + payload.length
195
+ u.checksum = 0
196
+ u.payload = payload
197
+ end
198
+
199
+ l.build_ipv6 do |i|
200
+ i.traffic_class = 0x22
201
+ i.flow_label = 0xdbeef
202
+ i.length = Libnet::HL_IPV6 + payload.length
203
+ i.next_header = Libnet::IPPROTO_UDP
204
+ i.hop_limit = 24
205
+ i.src_ip = [
206
+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
207
+ 0xcc, 0xdd, 0xee, 0xff
208
+ ].pack("C*")
209
+ i.dst_ip = "aabb:aabb:ccdd:ccdd:eeff:eeff:2233:2233"
210
+ end
211
+
212
+ l.build_ethernet do |e|
213
+ e.dst = 'aa:bb:cc:dd:ee:ff'
214
+ e.src = '11:22:33:44:55:66'
215
+ e.type = 0x86dd
216
+ end
217
+
218
+ assert_equal(bytes, l.pack)
219
+ if Process.uid > 0 && Process.euid > 0
220
+ # user is not root, so we should get an exception here
221
+ assert_raise RuntimeError do
222
+ l.write
223
+ end
224
+ else
225
+ # user is root, so this should work
226
+ assert_equal(bytes.length, l.write)
227
+ end
228
+ end
229
+ end