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,699 @@
1
+ /*
2
+ * $Id: libnet_build_ospf.c,v 1.10 2004/03/01 20:26:12 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_build_ospf.c - OSPF packet assembler
6
+ *
7
+ * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
8
+ * All rights reserved.
9
+ *
10
+ * Copyright (c) 1999, 2000 Andrew Reiter <areiter@bindview.com>
11
+ * Bindview Development
12
+ *
13
+ * Redistribution and use in source and binary forms, with or without
14
+ * modification, are permitted provided that the following conditions
15
+ * are met:
16
+ * 1. Redistributions of source code must retain the above copyright
17
+ * notice, this list of conditions and the following disclaimer.
18
+ * 2. Redistributions in binary form must reproduce the above copyright
19
+ * notice, this list of conditions and the following disclaimer in the
20
+ * documentation and/or other materials provided with the distribution.
21
+ *
22
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
+ * SUCH DAMAGE.
33
+ *
34
+ */
35
+
36
+ #if (HAVE_CONFIG_H)
37
+ #include "../include/config.h"
38
+ #endif
39
+ #if (!(_WIN32) || (__CYGWIN__))
40
+ #include "../include/libnet.h"
41
+ #else
42
+ #include "../include/win32/libnet.h"
43
+ #endif
44
+
45
+ libnet_ptag_t
46
+ libnet_build_ospfv2(u_int16_t len, u_int8_t type, u_int32_t rtr_id,
47
+ u_int32_t area_id, u_int16_t sum, u_int16_t autype, u_int8_t *payload,
48
+ u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
49
+ {
50
+ u_int32_t n, h;
51
+ libnet_pblock_t *p;
52
+ struct libnet_ospf_hdr ospf_hdr;
53
+
54
+ if (l == NULL)
55
+ {
56
+ return (-1);
57
+ }
58
+
59
+ n = LIBNET_OSPF_H + payload_s;
60
+ h = LIBNET_OSPF_H + payload_s + len;
61
+
62
+ /*
63
+ * Find the existing protocol block if a ptag is specified, or create
64
+ * a new one.
65
+ */
66
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_H);
67
+ if (p == NULL)
68
+ {
69
+ return (-1);
70
+ }
71
+
72
+ memset(&ospf_hdr, 0, sizeof(ospf_hdr));
73
+ ospf_hdr.ospf_v = 2; /* OSPF version 2 */
74
+ ospf_hdr.ospf_type = type; /* Type of pkt */
75
+ ospf_hdr.ospf_len = htons(h); /* Pkt len */
76
+ ospf_hdr.ospf_rtr_id.s_addr = htonl(rtr_id); /* Router ID */
77
+ ospf_hdr.ospf_area_id.s_addr = htonl(area_id); /* Area ID */
78
+ ospf_hdr.ospf_sum = (sum ? htons(sum) : 0);
79
+ ospf_hdr.ospf_auth_type = htons(autype); /* Type of auth */
80
+
81
+ n = libnet_pblock_append(l, p, (u_int8_t *)&ospf_hdr, LIBNET_OSPF_H);
82
+ if (n == -1)
83
+ {
84
+ goto bad;
85
+ }
86
+
87
+ if ((payload && !payload_s) || (!payload && payload_s))
88
+ {
89
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
90
+ "%s(): payload inconsistency\n", __func__);
91
+ goto bad;
92
+ }
93
+
94
+ if (payload && payload_s)
95
+ {
96
+ n = libnet_pblock_append(l, p, payload, payload_s);
97
+ if (n == -1)
98
+ {
99
+ goto bad;
100
+ }
101
+ }
102
+
103
+ if (sum == 0)
104
+ {
105
+ /*
106
+ * If checksum is zero, by default libnet will compute a checksum
107
+ * for the user. The programmer can override this by calling
108
+ * libnet_toggle_checksum(l, ptag, 1);
109
+ */
110
+ libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
111
+ }
112
+ return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_OSPF_H));
113
+ bad:
114
+ libnet_pblock_delete(l, p);
115
+ return (-1);
116
+ }
117
+
118
+
119
+ libnet_ptag_t
120
+ libnet_build_ospfv2_hello(u_int32_t netmask, u_int16_t interval, u_int8_t opts,
121
+ u_int8_t priority, u_int32_t dead_int, u_int32_t des_rtr, u_int32_t bkup_rtr,
122
+ u_int32_t neighbor, u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
123
+ libnet_ptag_t ptag)
124
+ {
125
+ u_int32_t n, h;
126
+ libnet_pblock_t *p;
127
+ struct libnet_ospf_hello_hdr hello_hdr;
128
+
129
+ if (l == NULL)
130
+ {
131
+ return (-1);
132
+ }
133
+
134
+ n = LIBNET_OSPF_HELLO_H + payload_s;
135
+ h = 0;
136
+
137
+ /*
138
+ * Find the existing protocol block if a ptag is specified, or create
139
+ * a new one.
140
+ */
141
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_HELLO_H);
142
+ if (p == NULL)
143
+ {
144
+ return (-1);
145
+ }
146
+
147
+ memset(&hello_hdr, 0, sizeof(hello_hdr));
148
+ hello_hdr.hello_nmask.s_addr = htonl(netmask); /* Netmask */
149
+ hello_hdr.hello_intrvl = htons(interval); /* # seconds since last packet sent */
150
+ hello_hdr.hello_opts = opts; /* OSPF_* options */
151
+ hello_hdr.hello_rtr_pri = priority; /* If 0, can't be backup */
152
+ hello_hdr.hello_dead_intvl = htonl(dead_int); /* Time til router is deemed down */
153
+ hello_hdr.hello_des_rtr.s_addr = htonl(des_rtr); /* Networks designated router */
154
+ hello_hdr.hello_bkup_rtr.s_addr = htonl(bkup_rtr); /* Networks backup router */
155
+ hello_hdr.hello_nbr.s_addr = htonl(neighbor);
156
+
157
+ n = libnet_pblock_append(l, p, (u_int8_t *)&hello_hdr, LIBNET_OSPF_HELLO_H);
158
+ if (n == -1)
159
+ {
160
+ goto bad;
161
+ }
162
+
163
+ if ((payload && !payload_s) || (!payload && payload_s))
164
+ {
165
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
166
+ "%s(): payload inconsistency\n", __func__);
167
+ goto bad;
168
+ }
169
+
170
+ if (payload && payload_s)
171
+ {
172
+ n = libnet_pblock_append(l, p, payload, payload_s);
173
+ if (n == -1)
174
+ {
175
+ goto bad;
176
+ }
177
+ }
178
+
179
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
180
+ LIBNET_PBLOCK_OSPF_HELLO_H));
181
+ bad:
182
+ libnet_pblock_delete(l, p);
183
+ return (-1);
184
+ }
185
+
186
+
187
+ libnet_ptag_t
188
+ libnet_build_ospfv2_dbd(u_int16_t dgram_len, u_int8_t opts, u_int8_t type,
189
+ u_int32_t seqnum, u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
190
+ libnet_ptag_t ptag)
191
+ {
192
+ u_int32_t n, h;
193
+ libnet_pblock_t *p;
194
+ struct libnet_dbd_hdr dbd_hdr;
195
+
196
+ if (l == NULL)
197
+ {
198
+ return (-1);
199
+ }
200
+
201
+ n = LIBNET_OSPF_DBD_H + payload_s;
202
+ h = 0;
203
+
204
+ /*
205
+ * Find the existing protocol block if a ptag is specified, or create
206
+ * a new one.
207
+ */
208
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_DBD_H);
209
+ if (p == NULL)
210
+ {
211
+ return (-1);
212
+ }
213
+
214
+ memset(&dbd_hdr, 0, sizeof(dbd_hdr));
215
+ dbd_hdr.dbd_mtu_len = htons(dgram_len); /* Max length of IP packet IF can use */
216
+ dbd_hdr.dbd_opts = opts; /* OSPF_* options */
217
+ dbd_hdr.dbd_type = type; /* Type of exchange occuring */
218
+ dbd_hdr.dbd_seq = htonl(seqnum); /* DBD sequence number */
219
+
220
+ n = libnet_pblock_append(l, p, (u_int8_t *)&dbd_hdr, LIBNET_OSPF_DBD_H);
221
+ if (n == -1)
222
+ {
223
+ goto bad;
224
+ }
225
+
226
+ if ((payload && !payload_s) || (!payload && payload_s))
227
+ {
228
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
229
+ "%s(): payload inconsistency\n", __func__);
230
+ goto bad;
231
+ }
232
+
233
+ if (payload && payload_s)
234
+ {
235
+ n = libnet_pblock_append(l, p, payload, payload_s);
236
+ if (n == -1)
237
+ {
238
+ goto bad;
239
+ }
240
+ }
241
+
242
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
243
+ LIBNET_PBLOCK_OSPF_DBD_H));
244
+ bad:
245
+ libnet_pblock_delete(l, p);
246
+ return (-1);
247
+ }
248
+
249
+
250
+ libnet_ptag_t
251
+ libnet_build_ospfv2_lsr(u_int32_t type, u_int lsid, u_int32_t advrtr,
252
+ u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
253
+ {
254
+ u_int32_t n, h;
255
+ libnet_pblock_t *p;
256
+ struct libnet_lsr_hdr lsr_hdr;
257
+
258
+ if (l == NULL)
259
+ {
260
+ return (-1);
261
+ }
262
+
263
+ n = LIBNET_OSPF_LSR_H + payload_s;
264
+ h = 0;
265
+
266
+ /*
267
+ * Find the existing protocol block if a ptag is specified, or create
268
+ * a new one.
269
+ */
270
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSR_H);
271
+ if (p == NULL)
272
+ {
273
+ return (-1);
274
+ }
275
+
276
+ memset(&lsr_hdr, 0, sizeof(lsr_hdr));
277
+ lsr_hdr.lsr_type = htonl(type); /* Type of LS being requested */
278
+ lsr_hdr.lsr_lsid = htonl(lsid); /* Link State ID */
279
+ lsr_hdr.lsr_adrtr.s_addr = htonl(advrtr); /* Advertising router */
280
+
281
+ n = libnet_pblock_append(l, p, (u_int8_t *)&lsr_hdr, LIBNET_OSPF_LSR_H);
282
+ if (n == -1)
283
+ {
284
+ goto bad;
285
+ }
286
+
287
+ if ((payload && !payload_s) || (!payload && payload_s))
288
+ {
289
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
290
+ "%s(): payload inconsistency\n", __func__);
291
+ goto bad;
292
+ }
293
+
294
+ if (payload && payload_s)
295
+ {
296
+ n = libnet_pblock_append(l, p, payload, payload_s);
297
+ if (n == -1)
298
+ {
299
+ goto bad;
300
+ }
301
+ }
302
+
303
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
304
+ LIBNET_PBLOCK_OSPF_LSR_H));
305
+ bad:
306
+ libnet_pblock_delete(l, p);
307
+ return (-1);
308
+ }
309
+
310
+
311
+ libnet_ptag_t
312
+ libnet_build_ospfv2_lsu(u_int32_t num, u_int8_t *payload, u_int32_t payload_s,
313
+ libnet_t *l, libnet_ptag_t ptag)
314
+ {
315
+ u_int32_t n, h;
316
+ libnet_pblock_t *p;
317
+ struct libnet_lsu_hdr lh_hdr;
318
+
319
+ if (l == NULL)
320
+ {
321
+ return (-1);
322
+ }
323
+
324
+ n = LIBNET_OSPF_LSU_H + payload_s;
325
+ h = 0;
326
+
327
+ /*
328
+ * Find the existing protocol block if a ptag is specified, or create
329
+ * a new one.
330
+ */
331
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSU_H);
332
+ if (p == NULL)
333
+ {
334
+ return (-1);
335
+ }
336
+
337
+ memset(&lh_hdr, 0, sizeof(lh_hdr));
338
+ lh_hdr.lsu_num = htonl(num); /* Number of LSAs that will be bcasted */
339
+
340
+ n = libnet_pblock_append(l, p, (u_int8_t *)&lh_hdr, LIBNET_OSPF_LSU_H);
341
+ if (n == -1)
342
+ {
343
+ goto bad;
344
+ }
345
+
346
+ if ((payload && !payload_s) || (!payload && payload_s))
347
+ {
348
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
349
+ "%s(): payload inconsistency\n", __func__);
350
+ goto bad;
351
+ }
352
+
353
+ if (payload && payload_s)
354
+ {
355
+ n = libnet_pblock_append(l, p, payload, payload_s);
356
+ if (n == -1)
357
+ {
358
+ goto bad;
359
+ }
360
+ }
361
+
362
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
363
+ LIBNET_PBLOCK_OSPF_LSU_H));
364
+ bad:
365
+ libnet_pblock_delete(l, p);
366
+ return (-1);
367
+ }
368
+
369
+
370
+ libnet_ptag_t
371
+ libnet_build_ospfv2_lsa(u_int16_t age, u_int8_t opts, u_int8_t type, u_int lsid,
372
+ u_int32_t advrtr, u_int32_t seqnum, u_int16_t sum, u_int16_t len,
373
+ u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
374
+ {
375
+ u_int32_t n, h;
376
+ libnet_pblock_t *p;
377
+ struct libnet_lsa_hdr lsa_hdr;
378
+
379
+ if (l == NULL)
380
+ {
381
+ return (-1);
382
+ }
383
+
384
+ n = LIBNET_OSPF_LSA_H + payload_s;
385
+ h = len + payload_s;
386
+
387
+ /*
388
+ * Find the existing protocol block if a ptag is specified, or create
389
+ * a new one.
390
+ */
391
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSA_H);
392
+ if (p == NULL)
393
+ {
394
+ return (-1);
395
+ }
396
+
397
+ memset(&lsa_hdr, 0, sizeof(lsa_hdr));
398
+ lsa_hdr.lsa_age = htons(age);
399
+ lsa_hdr.lsa_opts = opts;
400
+ lsa_hdr.lsa_type = type;
401
+ lsa_hdr.lsa_id = htonl(lsid);
402
+ lsa_hdr.lsa_adv.s_addr = htonl(advrtr);
403
+ lsa_hdr.lsa_seq = htonl(seqnum);
404
+ lsa_hdr.lsa_sum = (sum ? htons(sum) : 0);
405
+ lsa_hdr.lsa_len = htons(h);
406
+
407
+ n = libnet_pblock_append(l, p, (u_int8_t *)&lsa_hdr, LIBNET_OSPF_LSA_H);
408
+ if (n == -1)
409
+ {
410
+ goto bad;
411
+ }
412
+
413
+ if ((payload && !payload_s) || (!payload && payload_s))
414
+ {
415
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
416
+ "%s(): payload inconsistency\n", __func__);
417
+ goto bad;
418
+ }
419
+
420
+ if (payload && payload_s)
421
+ {
422
+ n = libnet_pblock_append(l, p, payload, payload_s);
423
+ if (n == -1)
424
+ {
425
+ goto bad;
426
+ }
427
+ }
428
+
429
+ if (sum == 0)
430
+ {
431
+ /*
432
+ * If checksum is zero, by default libnet will compute a checksum
433
+ * for the user. The programmer can override this by calling
434
+ * libnet_toggle_checksum(l, ptag, 1);
435
+ */
436
+ libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
437
+ }
438
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
439
+ LIBNET_PBLOCK_OSPF_LSA_H));
440
+ bad:
441
+ libnet_pblock_delete(l, p);
442
+ return (-1);
443
+ }
444
+
445
+
446
+ libnet_ptag_t
447
+ libnet_build_ospfv2_lsa_rtr(u_int16_t flags, u_int16_t num, u_int32_t id,
448
+ u_int32_t data, u_int8_t type, u_int8_t tos, u_int16_t metric,
449
+ u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
450
+ {
451
+ u_int32_t n, h;
452
+ libnet_pblock_t *p;
453
+ struct libnet_rtr_lsa_hdr rtr_lsa_hdr;
454
+
455
+ if (l == NULL)
456
+ {
457
+ return (-1);
458
+ }
459
+
460
+ n = LIBNET_OSPF_LS_RTR_H + payload_s;
461
+ h = 0;
462
+
463
+ /*
464
+ * Find the existing protocol block if a ptag is specified, or create
465
+ * a new one.
466
+ */
467
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_RTR_H);
468
+ if (p == NULL)
469
+ {
470
+ return (-1);
471
+ }
472
+
473
+ memset(&rtr_lsa_hdr, 0, sizeof(rtr_lsa_hdr));
474
+ rtr_lsa_hdr.rtr_flags = htons(flags);
475
+ rtr_lsa_hdr.rtr_num = htons(num);
476
+ rtr_lsa_hdr.rtr_link_id = htonl(id);
477
+ rtr_lsa_hdr.rtr_link_data = htonl(data);
478
+ rtr_lsa_hdr.rtr_type = type;
479
+ rtr_lsa_hdr.rtr_tos_num = tos;
480
+ rtr_lsa_hdr.rtr_metric = htons(metric);
481
+
482
+ n = libnet_pblock_append(l, p, (u_int8_t *)&rtr_lsa_hdr,
483
+ LIBNET_OSPF_LS_RTR_H);
484
+ if (n == -1)
485
+ {
486
+ goto bad;
487
+ }
488
+
489
+ if ((payload && !payload_s) || (!payload && payload_s))
490
+ {
491
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
492
+ "%s(): payload inconsistency\n", __func__);
493
+ goto bad;
494
+ }
495
+
496
+ if (payload && payload_s)
497
+ {
498
+ n = libnet_pblock_append(l, p, payload, payload_s);
499
+ if (n == -1)
500
+ {
501
+ goto bad;
502
+ }
503
+ }
504
+
505
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
506
+ LIBNET_PBLOCK_LS_RTR_H));
507
+ bad:
508
+ libnet_pblock_delete(l, p);
509
+ return (-1);
510
+ }
511
+
512
+
513
+ libnet_ptag_t
514
+ libnet_build_ospfv2_lsa_net(u_int32_t nmask, u_int32_t rtrid,
515
+ u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
516
+ {
517
+ u_int32_t n, h;
518
+ libnet_pblock_t *p;
519
+ struct libnet_net_lsa_hdr net_lsa_hdr;
520
+
521
+ if (l == NULL)
522
+ {
523
+ return (-1);
524
+ }
525
+
526
+ n = LIBNET_OSPF_LS_NET_H + payload_s;
527
+ h = 0;
528
+
529
+ /*
530
+ * Find the existing protocol block if a ptag is specified, or create
531
+ * a new one.
532
+ */
533
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_NET_H);
534
+ if (p == NULL)
535
+ {
536
+ return (-1);
537
+ }
538
+
539
+ memset(&net_lsa_hdr, 0, sizeof(net_lsa_hdr));
540
+ net_lsa_hdr.net_nmask.s_addr = htonl(nmask);
541
+ net_lsa_hdr.net_rtr_id = htonl(rtrid);
542
+
543
+ n = libnet_pblock_append(l, p, (u_int8_t *)&net_lsa_hdr,
544
+ LIBNET_OSPF_LS_NET_H);
545
+ if (n == -1)
546
+ {
547
+ goto bad;
548
+ }
549
+
550
+ if ((payload && !payload_s) || (!payload && payload_s))
551
+ {
552
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
553
+ "%s(): payload inconsistency\n", __func__);
554
+ goto bad;
555
+ }
556
+
557
+ if (payload && payload_s)
558
+ {
559
+ n = libnet_pblock_append(l, p, payload, payload_s);
560
+ if (n == -1)
561
+ {
562
+ goto bad;
563
+ }
564
+ }
565
+
566
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
567
+ LIBNET_PBLOCK_LS_NET_H));
568
+ bad:
569
+ libnet_pblock_delete(l, p);
570
+ return (-1);
571
+ }
572
+
573
+
574
+ libnet_ptag_t
575
+ libnet_build_ospfv2_lsa_sum(u_int32_t nmask, u_int32_t metric, u_int tos,
576
+ u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
577
+ {
578
+ u_int32_t n, h;
579
+ libnet_pblock_t *p;
580
+ struct libnet_sum_lsa_hdr sum_lsa_hdr;
581
+
582
+ if (l == NULL)
583
+ {
584
+ return (-1);
585
+ }
586
+
587
+ n = LIBNET_OSPF_LS_SUM_H + payload_s;
588
+ h = 0;
589
+
590
+ /*
591
+ * Find the existing protocol block if a ptag is specified, or create
592
+ * a new one.
593
+ */
594
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_SUM_H);
595
+ if (p == NULL)
596
+ {
597
+ return (-1);
598
+ }
599
+
600
+ memset(&sum_lsa_hdr, 0, sizeof(sum_lsa_hdr));
601
+ sum_lsa_hdr.sum_nmask.s_addr = htonl(nmask);
602
+ sum_lsa_hdr.sum_metric = htonl(metric);
603
+ sum_lsa_hdr.sum_tos_metric = htonl(tos);
604
+
605
+ n = libnet_pblock_append(l, p, (u_int8_t *)&sum_lsa_hdr,
606
+ LIBNET_OSPF_LS_SUM_H);
607
+ if (n == -1)
608
+ {
609
+ goto bad;
610
+ }
611
+
612
+ if ((payload && !payload_s) || (!payload && payload_s))
613
+ {
614
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
615
+ "%s(): payload inconsistency\n", __func__);
616
+ goto bad;
617
+ }
618
+
619
+ if (payload && payload_s)
620
+ {
621
+ n = libnet_pblock_append(l, p, payload, payload_s);
622
+ if (n == -1)
623
+ {
624
+ goto bad;
625
+ }
626
+ }
627
+
628
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
629
+ LIBNET_PBLOCK_LS_SUM_H));
630
+ bad:
631
+ libnet_pblock_delete(l, p);
632
+ return (-1);
633
+ }
634
+
635
+
636
+ libnet_ptag_t
637
+ libnet_build_ospfv2_lsa_as(u_int32_t nmask, u_int metric, u_int32_t fwdaddr,
638
+ u_int32_t tag, u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
639
+ libnet_ptag_t ptag)
640
+ {
641
+ u_int32_t n, h;
642
+ libnet_pblock_t *p;
643
+ struct libnet_as_lsa_hdr as_lsa_hdr;
644
+
645
+ if (l == NULL)
646
+ {
647
+ return (-1);
648
+ }
649
+
650
+ n = LIBNET_OSPF_LS_AS_EXT_H + payload_s;
651
+ h = 0;
652
+
653
+ /*
654
+ * Find the existing protocol block if a ptag is specified, or create
655
+ * a new one.
656
+ */
657
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_AS_EXT_H);
658
+ if (p == NULL)
659
+ {
660
+ return (-1);
661
+ }
662
+
663
+ memset(&as_lsa_hdr, 0, sizeof(as_lsa_hdr));
664
+ as_lsa_hdr.as_nmask.s_addr = htonl(nmask);
665
+ as_lsa_hdr.as_metric = htonl(metric);
666
+ as_lsa_hdr.as_fwd_addr.s_addr = htonl(fwdaddr);
667
+ as_lsa_hdr.as_rte_tag = htonl(tag);
668
+
669
+ n = libnet_pblock_append(l, p, (u_int8_t *)&as_lsa_hdr,
670
+ LIBNET_OSPF_LS_AS_EXT_H);
671
+ if (n == -1)
672
+ {
673
+ goto bad;
674
+ }
675
+
676
+ if ((payload && !payload_s) || (!payload && payload_s))
677
+ {
678
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
679
+ "%s(): payload inconsistency\n", __func__);
680
+ goto bad;
681
+ }
682
+
683
+ if (payload && payload_s)
684
+ {
685
+ n = libnet_pblock_append(l, p, payload, payload_s);
686
+ if (n == -1)
687
+ {
688
+ goto bad;
689
+ }
690
+ }
691
+
692
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
693
+ LIBNET_PBLOCK_LS_AS_EXT_H));
694
+ bad:
695
+ libnet_pblock_delete(l, p);
696
+ return (-1);
697
+ }
698
+
699
+ /* EOF */