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,232 @@
1
+ /*
2
+ * $Id: libnet_build_ipsec.c,v 1.11 2004/01/21 19:01:29 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_build_ipsec.c - IP packet assembler
6
+ *
7
+ * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
8
+ * Copyright (c) 2002 Jose Nazario <jose@crimelabs.net>
9
+ * All rights reserved.
10
+ *
11
+ * Redistribution and use in source and binary forms, with or without
12
+ * modification, are permitted provided that the following conditions
13
+ * are met:
14
+ * 1. Redistributions of source code must retain the above copyright
15
+ * notice, this list of conditions and the following disclaimer.
16
+ * 2. Redistributions in binary form must reproduce the above copyright
17
+ * notice, this list of conditions and the following disclaimer in the
18
+ * documentation and/or other materials provided with the distribution.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
+ * SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #if (HAVE_CONFIG_H)
35
+ #include "../include/config.h"
36
+ #endif
37
+ #if (!(_WIN32) || (__CYGWIN__))
38
+ #include "../include/libnet.h"
39
+ #else
40
+ #include "../include/win32/libnet.h"
41
+ #endif
42
+
43
+
44
+ libnet_ptag_t
45
+ libnet_build_ipsec_esp_hdr(u_int32_t spi, u_int32_t seq, u_int32_t iv,
46
+ u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
47
+ {
48
+ u_int32_t n, h;
49
+ libnet_pblock_t *p;
50
+ struct libnet_esp_hdr esp_hdr;
51
+
52
+ if (l == NULL)
53
+ {
54
+ return (-1);
55
+ }
56
+
57
+ n = LIBNET_IPSEC_ESP_HDR_H + payload_s;/* size of memory block */
58
+ h = 0;
59
+
60
+ memset(&esp_hdr, 0, sizeof(esp_hdr));
61
+ esp_hdr.esp_spi = htonl(spi); /* SPI */
62
+ esp_hdr.esp_seq = htonl(seq); /* ESP sequence number */
63
+ esp_hdr.esp_iv = htonl(iv); /* initialization vector */
64
+
65
+ /*
66
+ * Find the existing protocol block if a ptag is specified, or create
67
+ * a new one.
68
+ */
69
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_IPSEC_ESP_HDR_H);
70
+ if (p == NULL)
71
+ {
72
+ return (-1);
73
+ }
74
+
75
+ n = libnet_pblock_append(l, p, (u_int8_t *)&esp_hdr, LIBNET_IPSEC_ESP_HDR_H);
76
+ if (n == -1)
77
+ {
78
+ goto bad;
79
+ }
80
+
81
+ if ((payload && !payload_s) || (!payload && payload_s))
82
+ {
83
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
84
+ "%s(): payload inconsistency\n", __func__);
85
+ goto bad;
86
+ }
87
+
88
+ if (payload && payload_s)
89
+ {
90
+ n = libnet_pblock_append(l, p, payload, payload_s);
91
+ if (n == -1)
92
+ {
93
+ goto bad;
94
+ }
95
+ }
96
+
97
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
98
+ LIBNET_PBLOCK_IPSEC_ESP_HDR_H));
99
+ bad:
100
+ libnet_pblock_delete(l, p);
101
+ return (-1);
102
+ }
103
+
104
+
105
+ libnet_ptag_t
106
+ libnet_build_ipsec_esp_ftr(u_int8_t len, u_int8_t nh, int8_t *auth,
107
+ u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
108
+ libnet_ptag_t ptag)
109
+ {
110
+ /* XXX we need to know the size of auth */
111
+ u_int32_t n, h;
112
+ libnet_pblock_t *p;
113
+ struct libnet_esp_ftr esp_ftr;
114
+
115
+ if (l == NULL)
116
+ {
117
+ return (-1);
118
+ }
119
+
120
+ n = LIBNET_IPSEC_ESP_FTR_H + payload_s;/* size of memory block */
121
+ h = 0;
122
+
123
+ memset(&esp_ftr, 0, sizeof(esp_ftr));
124
+ esp_ftr.esp_pad_len = len; /* pad length */
125
+ esp_ftr.esp_nh = nh; /* next header pointer */
126
+ esp_ftr.esp_auth = auth; /* authentication data */
127
+
128
+ /*
129
+ * Find the existing protocol block if a ptag is specified, or create
130
+ * a new one.
131
+ */
132
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_IPSEC_ESP_FTR_H);
133
+ if (p == NULL)
134
+ {
135
+ return (-1);
136
+ }
137
+
138
+ n = libnet_pblock_append(l, p, (u_int8_t *)&esp_ftr, LIBNET_IPSEC_ESP_FTR_H);
139
+ if (n == -1)
140
+ {
141
+ goto bad;
142
+ }
143
+
144
+ if ((payload && !payload_s) || (!payload && payload_s))
145
+ {
146
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
147
+ "%s(): payload inconsistency\n", __func__);
148
+ goto bad;
149
+ }
150
+
151
+ if (payload && payload_s)
152
+ {
153
+ n = libnet_pblock_append(l, p, payload, payload_s);
154
+ if (n == -1)
155
+ {
156
+ goto bad;
157
+ }
158
+ }
159
+
160
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
161
+ LIBNET_PBLOCK_IPSEC_ESP_FTR_H));
162
+ bad:
163
+ libnet_pblock_delete(l, p);
164
+ return (-1);
165
+ }
166
+
167
+
168
+ libnet_ptag_t
169
+ libnet_build_ipsec_ah(u_int8_t nh, u_int8_t len, u_int16_t res,
170
+ u_int32_t spi, u_int32_t seq, u_int32_t auth, u_int8_t *payload,
171
+ u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
172
+ {
173
+ u_int32_t n, h;
174
+ libnet_pblock_t *p;
175
+ struct libnet_ah_hdr ah_hdr;
176
+
177
+ if (l == NULL)
178
+ {
179
+ return (-1);
180
+ }
181
+
182
+ n = LIBNET_IPSEC_AH_H + payload_s;/* size of memory block */
183
+ h = 0;
184
+
185
+ /*
186
+ * Find the existing protocol block if a ptag is specified, or create
187
+ * a new one.
188
+ */
189
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_IPSEC_AH_H);
190
+ if (p == NULL)
191
+ {
192
+ return (-1);
193
+ }
194
+
195
+ memset(&ah_hdr, 0, sizeof(ah_hdr));
196
+ ah_hdr.ah_nh = nh; /* next header */
197
+ ah_hdr.ah_len = len; /* length */
198
+ ah_hdr.ah_res = (res ? htons(res) : 0);
199
+ ah_hdr.ah_spi = htonl(spi); /* SPI */
200
+ ah_hdr.ah_seq = htonl(seq); /* AH sequence number */
201
+ ah_hdr.ah_auth = htonl(auth); /* authentication data */
202
+
203
+ n = libnet_pblock_append(l, p, (u_int8_t *)&ah_hdr, LIBNET_IPSEC_AH_H);
204
+ if (n == -1)
205
+ {
206
+ goto bad;
207
+ }
208
+
209
+ if ((payload && !payload_s) || (!payload && payload_s))
210
+ {
211
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
212
+ "%s(): payload inconsistency\n", __func__);
213
+ goto bad;
214
+ }
215
+
216
+ if (payload && payload_s)
217
+ {
218
+ n = libnet_pblock_append(l, p, payload, payload_s);
219
+ if (n == -1)
220
+ {
221
+ goto bad;
222
+ }
223
+ }
224
+
225
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
226
+ LIBNET_PBLOCK_IPSEC_AH_H));
227
+ bad:
228
+ libnet_pblock_delete(l, p);
229
+ return (-1);
230
+ }
231
+
232
+ /* EOF */
@@ -0,0 +1,113 @@
1
+ /*
2
+ * $Id: libnet_build_isl.c,v 1.9 2004/01/03 20:31:01 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_build_isl.c - cisco's inter-switch link assembler
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 the following conditions
12
+ * are met:
13
+ * 1. Redistributions of source code must retain the above copyright
14
+ * notice, this list of conditions and the following disclaimer.
15
+ * 2. Redistributions in binary form must reproduce the above copyright
16
+ * notice, this list of conditions and the following disclaimer in the
17
+ * documentation and/or other materials provided with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
+ * SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #if (HAVE_CONFIG_H)
34
+ #include "../include/config.h"
35
+ #endif
36
+ #if (!(_WIN32) || (__CYGWIN__))
37
+ #include "../include/libnet.h"
38
+ #else
39
+ #include "../include/win32/libnet.h"
40
+ #endif
41
+
42
+ libnet_ptag_t
43
+ libnet_build_isl(u_int8_t *dhost, u_int8_t type, u_int8_t user, u_int8_t *shost,
44
+ u_int16_t len, u_int8_t *snap, u_int16_t vid, u_int16_t index,
45
+ u_int16_t reserved, u_int8_t *payload, u_int32_t payload_s,
46
+ libnet_t *l, libnet_ptag_t ptag)
47
+ {
48
+ u_int32_t n, h;
49
+ libnet_pblock_t *p;
50
+ struct libnet_isl_hdr isl_hdr;
51
+
52
+ if (l == NULL)
53
+ {
54
+ return (-1);
55
+ }
56
+
57
+ n = LIBNET_ISL_H + payload_s; /* size of memory block */
58
+ h = 0;
59
+
60
+ /*
61
+ * Find the existing protocol block if a ptag is specified, or create
62
+ * a new one.
63
+ */
64
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_ISL_H);
65
+ if (p == NULL)
66
+ {
67
+ return (-1);
68
+ }
69
+
70
+ memset(&isl_hdr, 0, sizeof(isl_hdr));
71
+ memcpy(&isl_hdr.isl_dhost, dhost, 5);
72
+ isl_hdr.isl_type = type;
73
+ isl_hdr.isl_user = user;
74
+ memcpy(&isl_hdr.isl_shost, shost, 6);
75
+ isl_hdr.isl_len = htons(len);
76
+ memcpy(&isl_hdr.isl_dhost, snap, 6);
77
+ isl_hdr.isl_vid = htons(vid);
78
+ isl_hdr.isl_index = htons(index);
79
+ isl_hdr.isl_reserved= htons(reserved);
80
+
81
+ n = libnet_pblock_append(l, p, (u_int8_t *)&isl_hdr, LIBNET_ISL_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
+ /* we need to compute the CRC for the ethernet frame and the ISL frame */
104
+ libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
105
+ return (ptag ? ptag : libnet_pblock_update(l, p, LIBNET_ISL_H,
106
+ LIBNET_PBLOCK_ISL_H));
107
+ bad:
108
+ libnet_pblock_delete(l, p);
109
+ return (-1);
110
+ }
111
+
112
+
113
+ /* EOF */
@@ -0,0 +1,90 @@
1
+ /*
2
+ * $Id: libnet_build_link.c,v 1.9 2004/03/04 20:50:20 kkuehl Exp $
3
+ *
4
+ * libnet
5
+ * libnet_build_link.c - link-layer packet assembler
6
+ *
7
+ * Copyright (c) 2003 Roberto Larcher <roberto.larcher@libero.it>
8
+ * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
9
+ * All rights reserved.
10
+ *
11
+ * Redistribution and use in source and binary forms, with or without
12
+ * modification, are permitted provided that the following conditions
13
+ * are met:
14
+ * 1. Redistributions of source code must retain the above copyright
15
+ * notice, this list of conditions and the following disclaimer.
16
+ * 2. Redistributions in binary form must reproduce the above copyright
17
+ * notice, this list of conditions and the following disclaimer in the
18
+ * documentation and/or other materials provided with the distribution.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
+ * SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #if (HAVE_CONFIG_H)
35
+ #include "../include/config.h"
36
+ #endif
37
+ #if (!(_WIN32) || (__CYGWIN__))
38
+ #include "../include/libnet.h"
39
+ #else
40
+ #include "../include/win32/libnet.h"
41
+ #endif
42
+
43
+ libnet_ptag_t
44
+ libnet_build_link(u_int8_t *dst, u_int8_t *src, u_int8_t *oui, u_int16_t type,
45
+ u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
46
+
47
+ {
48
+ u_int8_t org[3] = {0x00, 0x00, 0x00};
49
+ switch (l->link_type)
50
+ {
51
+ /* add FDDI */
52
+ case DLT_EN10MB:
53
+ return (libnet_build_ethernet(dst, src, type, payload, payload_s, l,
54
+ ptag));
55
+ case DLT_IEEE802:
56
+ return (libnet_build_token_ring(LIBNET_TOKEN_RING_FRAME,
57
+ LIBNET_TOKEN_RING_LLC_FRAME, dst, src, LIBNET_SAP_SNAP,
58
+ LIBNET_SAP_SNAP, 0x03, org, type, payload, payload_s,
59
+ l, ptag));
60
+ default:
61
+ break;
62
+ }
63
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
64
+ "%s(): linktype %d not supported\n", __func__, l->link_type);
65
+ return (-1);
66
+ }
67
+
68
+ libnet_ptag_t
69
+ libnet_autobuild_link(u_int8_t *dst, u_int8_t *oui, u_int16_t type, libnet_t *l)
70
+ {
71
+ u_int8_t org[3] = {0x00, 0x00, 0x00};
72
+ switch (l->link_type)
73
+ {
74
+ /* add FDDI */
75
+ case DLT_EN10MB:
76
+ return (libnet_autobuild_ethernet(dst, type, l));
77
+ case DLT_IEEE802:
78
+ return (libnet_autobuild_token_ring(LIBNET_TOKEN_RING_FRAME,
79
+ LIBNET_TOKEN_RING_LLC_FRAME, dst, LIBNET_SAP_SNAP,
80
+ LIBNET_SAP_SNAP, 0x03, org, TOKEN_RING_TYPE_IP, l));
81
+ default:
82
+ break;
83
+ }
84
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
85
+ "%s(): linktype %d not supported\n", __func__, l->link_type);
86
+ return (-1);
87
+ }
88
+
89
+ /* EOF */
90
+
@@ -0,0 +1,112 @@
1
+ /*
2
+ * $Id: libnet_build_mpls.c,v 1.9 2004/03/01 20:26:12 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_build_mpls.c - MPLS packet assembler
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 the following conditions
12
+ * are met:
13
+ * 1. Redistributions of source code must retain the above copyright
14
+ * notice, this list of conditions and the following disclaimer.
15
+ * 2. Redistributions in binary form must reproduce the above copyright
16
+ * notice, this list of conditions and the following disclaimer in the
17
+ * documentation and/or other materials provided with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
+ * SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #if (HAVE_CONFIG_H)
34
+ #include "../include/config.h"
35
+ #endif
36
+ #if (!(_WIN32) || (__CYGWIN__))
37
+ #include "../include/libnet.h"
38
+ #else
39
+ #include "../include/win32/libnet.h"
40
+ #endif
41
+
42
+ libnet_ptag_t
43
+ libnet_build_mpls(u_int32_t label, u_int8_t experimental, u_int8_t bos,
44
+ u_int8_t ttl, u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
45
+ libnet_ptag_t ptag)
46
+ {
47
+ u_int32_t n, h;
48
+ libnet_pblock_t *p;
49
+ struct libnet_mpls_hdr mpls_hdr;
50
+
51
+ if (l == NULL)
52
+ {
53
+ return (-1);
54
+ }
55
+
56
+ n = LIBNET_MPLS_H + payload_s;
57
+ h = 0;
58
+
59
+ /*
60
+ * Find the existing protocol block if a ptag is specified, or create
61
+ * a new one.
62
+ */
63
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_MPLS_H);
64
+ if (p == NULL)
65
+ {
66
+ return (-1);
67
+ }
68
+
69
+ memset(&mpls_hdr, 0, sizeof(mpls_hdr));
70
+ mpls_hdr.mpls_les = htonl((((label & 0x000fffff) << 12) |
71
+ ((experimental & 0x07) << 9) |
72
+ ((bos & 0x01) << 8) |
73
+ ((ttl & 0xff))));
74
+
75
+ n = libnet_pblock_append(l, p, (u_int8_t *)&mpls_hdr, LIBNET_MPLS_H);
76
+ if (n == -1)
77
+ {
78
+ goto bad;
79
+ }
80
+
81
+ if ((payload && !payload_s) || (!payload && payload_s))
82
+ {
83
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
84
+ "%s(): payload inconsistency\n", __func__);
85
+ goto bad;
86
+ }
87
+
88
+ if (payload && payload_s)
89
+ {
90
+ n = libnet_pblock_append(l, p, payload, payload_s);
91
+ if (n == -1)
92
+ {
93
+ goto bad;
94
+ }
95
+ }
96
+
97
+ /*
98
+ * The link offset is actually 4 bytes further into the header than
99
+ * before (the MPLS header adds this 4 bytes). We need to update the
100
+ * link offset pointer. XXX - should we set this here?
101
+ * Probably not. We should make pblock_coalesce check the pblock type
102
+ * and adjust accordingly.
103
+ */
104
+ l->link_offset += 4;
105
+
106
+ return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_MPLS_H));
107
+ bad:
108
+ libnet_pblock_delete(l, p);
109
+ return (-1);
110
+ }
111
+
112
+ /* EOF */
@@ -0,0 +1,121 @@
1
+ /*
2
+ * $Id: libnet_build_ntp.c,v 1.9 2004/03/01 20:26:12 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_build_ntp.c - NTP packet assembler
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 the following conditions
12
+ * are met:
13
+ * 1. Redistributions of source code must retain the above copyright
14
+ * notice, this list of conditions and the following disclaimer.
15
+ * 2. Redistributions in binary form must reproduce the above copyright
16
+ * notice, this list of conditions and the following disclaimer in the
17
+ * documentation and/or other materials provided with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
+ * SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #if (HAVE_CONFIG_H)
34
+ #include "../include/config.h"
35
+ #endif
36
+ #if (!(_WIN32) || (__CYGWIN__))
37
+ #include "../include/libnet.h"
38
+ #else
39
+ #include "../include/win32/libnet.h"
40
+ #endif
41
+
42
+ libnet_ptag_t
43
+ libnet_build_ntp(u_int8_t leap_indicator, u_int8_t version, u_int8_t mode,
44
+ u_int8_t stratum, u_int8_t poll, u_int8_t precision, u_int16_t delay_int,
45
+ u_int16_t delay_frac, u_int16_t dispersion_int, u_int16_t dispersion_frac,
46
+ u_int32_t reference_id, u_int32_t ref_ts_int, u_int32_t ref_ts_frac,
47
+ u_int32_t orig_ts_int, u_int32_t orig_ts_frac, u_int32_t rec_ts_int,
48
+ u_int32_t rec_ts_frac, u_int32_t xmt_ts_int, u_int32_t xmt_ts_frac,
49
+ u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
50
+ {
51
+ u_int32_t n, h;
52
+ libnet_pblock_t *p;
53
+ struct libnet_ntp_hdr ntp_hdr;
54
+
55
+ if (l == NULL)
56
+ {
57
+ return (-1);
58
+ }
59
+
60
+ n = LIBNET_NTP_H + payload_s;
61
+ h = 0;
62
+
63
+ /*
64
+ * Find the existing protocol block if a ptag is specified, or create
65
+ * a new one.
66
+ */
67
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_NTP_H);
68
+ if (p == NULL)
69
+ {
70
+ return (-1);
71
+ }
72
+
73
+ memset(&ntp_hdr, 0, sizeof(ntp_hdr));
74
+ ntp_hdr.ntp_li_vn_mode = LIBNET_NTP_DO_LI_VN_MODE(
75
+ leap_indicator, version, mode);
76
+ ntp_hdr.ntp_stratum = stratum;
77
+ ntp_hdr.ntp_poll = poll;
78
+ ntp_hdr.ntp_precision = precision;
79
+ ntp_hdr.ntp_delay.integer = htons(delay_int);
80
+ ntp_hdr.ntp_delay.fraction = htons(delay_frac);
81
+ ntp_hdr.ntp_dispersion.integer = htons(dispersion_int);
82
+ ntp_hdr.ntp_dispersion.fraction = htons(dispersion_frac);
83
+ ntp_hdr.ntp_reference_id = htonl(reference_id);
84
+ ntp_hdr.ntp_ref_ts.integer = htonl(ref_ts_int);
85
+ ntp_hdr.ntp_ref_ts.fraction = htonl(ref_ts_frac);
86
+ ntp_hdr.ntp_orig_ts.integer = htonl(orig_ts_int);
87
+ ntp_hdr.ntp_orig_ts.fraction = htonl(orig_ts_frac);
88
+ ntp_hdr.ntp_rec_ts.integer = htonl(orig_ts_int);
89
+ ntp_hdr.ntp_rec_ts.fraction = htonl(orig_ts_frac);
90
+ ntp_hdr.ntp_xmt_ts.integer = htonl(xmt_ts_int);
91
+ ntp_hdr.ntp_xmt_ts.fraction = htonl(xmt_ts_frac);
92
+
93
+ n = libnet_pblock_append(l, p, (u_int8_t *)&ntp_hdr, LIBNET_NTP_H);
94
+ if (n == -1)
95
+ {
96
+ goto bad;
97
+ }
98
+
99
+ if ((payload && !payload_s) || (!payload && payload_s))
100
+ {
101
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
102
+ "%s(): payload inconsistency\n", __func__);
103
+ goto bad;
104
+ }
105
+
106
+ if (payload && payload_s)
107
+ {
108
+ n = libnet_pblock_append(l, p, payload, payload_s);
109
+ if (n == -1)
110
+ {
111
+ goto bad;
112
+ }
113
+ }
114
+
115
+ return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_NTP_H));
116
+ bad:
117
+ libnet_pblock_delete(l, p);
118
+ return (-1);
119
+ }
120
+
121
+ /* EOF */