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,156 @@
1
+ /*
2
+ * $Id: libnet_build_dhcp.c,v 1.10 2004/03/01 20:26:12 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_build_dhcp.c - DHCP/BOOTP 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_dhcpv4(u_int8_t opcode, u_int8_t htype, u_int8_t hlen,
44
+ u_int8_t hopcount, u_int32_t xid, u_int16_t secs, u_int16_t flags,
45
+ u_int32_t cip, u_int32_t yip, u_int32_t sip, u_int32_t gip, u_int8_t *chaddr,
46
+ u_int8_t *sname, u_int8_t *file, u_int8_t *payload, u_int32_t payload_s,
47
+ libnet_t *l, libnet_ptag_t ptag)
48
+ {
49
+ u_int32_t n, h;
50
+ libnet_pblock_t *p;
51
+ struct libnet_dhcpv4_hdr dhcp_hdr;
52
+
53
+ if (l == NULL)
54
+ {
55
+ return (-1);
56
+ }
57
+
58
+ n = LIBNET_DHCPV4_H + payload_s;
59
+ h = 0; /* no checksum */
60
+
61
+ /*
62
+ * Find the existing protocol block if a ptag is specified, or create
63
+ * a new one.
64
+ */
65
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_DHCPV4_H);
66
+ if (p == NULL)
67
+ {
68
+ return (-1);
69
+ }
70
+
71
+ memset(&dhcp_hdr, 0, sizeof(dhcp_hdr));
72
+ dhcp_hdr.dhcp_opcode = opcode;
73
+ dhcp_hdr.dhcp_htype = htype;
74
+ dhcp_hdr.dhcp_hlen = hlen;
75
+ dhcp_hdr.dhcp_hopcount = hopcount;
76
+ dhcp_hdr.dhcp_xid = htonl(xid);
77
+ dhcp_hdr.dhcp_secs = htons(secs);
78
+ dhcp_hdr.dhcp_flags = htons(flags);
79
+ dhcp_hdr.dhcp_cip = htonl(cip);
80
+ dhcp_hdr.dhcp_yip = htonl(yip);
81
+ dhcp_hdr.dhcp_sip = htonl(sip);
82
+ dhcp_hdr.dhcp_gip = htonl(gip);
83
+
84
+ if (chaddr)
85
+ {
86
+ memcpy(dhcp_hdr.dhcp_chaddr, chaddr, sizeof (dhcp_hdr.dhcp_chaddr));
87
+ dhcp_hdr.dhcp_chaddr[sizeof(dhcp_hdr.dhcp_chaddr) - 1] = 0;
88
+ }
89
+ else
90
+ {
91
+ memset(dhcp_hdr.dhcp_chaddr, 0, sizeof (dhcp_hdr.dhcp_chaddr));
92
+ }
93
+
94
+ if (sname)
95
+ {
96
+ memcpy(dhcp_hdr.dhcp_sname, sname, sizeof (dhcp_hdr.dhcp_sname));
97
+ dhcp_hdr.dhcp_sname[sizeof(dhcp_hdr.dhcp_sname) - 1] = 0;
98
+ }
99
+ else
100
+ {
101
+ memset(dhcp_hdr.dhcp_sname, 0, sizeof (dhcp_hdr.dhcp_sname));
102
+ }
103
+
104
+ if (file)
105
+ {
106
+ memcpy(dhcp_hdr.dhcp_file, file, sizeof (dhcp_hdr.dhcp_file));
107
+ dhcp_hdr.dhcp_file[sizeof(dhcp_hdr.dhcp_file) - 1] = 0;
108
+ }
109
+ else
110
+ {
111
+ memset(dhcp_hdr.dhcp_file, 0, sizeof(dhcp_hdr.dhcp_file));
112
+ }
113
+ dhcp_hdr.dhcp_magic = htonl(DHCP_MAGIC); /* should this be tunable? */
114
+
115
+ n = libnet_pblock_append(l, p, (u_int8_t *)&dhcp_hdr, LIBNET_DHCPV4_H);
116
+ if (n == -1)
117
+ {
118
+ goto bad;
119
+ }
120
+
121
+ if ((payload && !payload_s) || (!payload && payload_s))
122
+ {
123
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
124
+ "%s(): payload inconsistency\n", __func__);
125
+ goto bad;
126
+ }
127
+
128
+ if (payload && payload_s)
129
+ {
130
+ n = libnet_pblock_append(l, p, payload, payload_s);
131
+ if (n == -1)
132
+ {
133
+ goto bad;
134
+ }
135
+ }
136
+
137
+ return (ptag ? ptag : libnet_pblock_update(l, p, h,
138
+ LIBNET_PBLOCK_DHCPV4_H));
139
+ bad:
140
+ libnet_pblock_delete(l, p);
141
+ return (-1);
142
+ }
143
+
144
+ libnet_ptag_t
145
+ libnet_build_bootpv4(u_int8_t opcode, u_int8_t htype, u_int8_t hlen,
146
+ u_int8_t hopcount, u_int32_t xid, u_int16_t secs, u_int16_t flags,
147
+ u_int32_t cip, u_int32_t yip, u_int32_t sip, u_int32_t gip, u_int8_t *chaddr,
148
+ u_int8_t *sname, u_int8_t *file, u_int8_t *payload, u_int32_t payload_s,
149
+ libnet_t *l, libnet_ptag_t ptag)
150
+ {
151
+ return (libnet_build_dhcpv4(opcode, htype, hlen, hopcount, xid, secs,
152
+ flags, cip, yip, sip, gip, chaddr, sname, file, payload, payload_s,
153
+ l, ptag));
154
+ }
155
+
156
+ /* EOF */
@@ -0,0 +1,129 @@
1
+ /*
2
+ * $Id: libnet_build_dns.c,v 1.9 2004/01/03 20:31:01 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_build_dns.c - DNS 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
+
43
+ libnet_ptag_t
44
+ libnet_build_dnsv4(u_int16_t h_len, u_int16_t id, u_int16_t flags,
45
+ u_int16_t num_q, u_int16_t num_anws_rr, u_int16_t num_auth_rr,
46
+ u_int16_t num_addi_rr, u_int8_t *payload, u_int32_t payload_s,
47
+ libnet_t *l, libnet_ptag_t ptag)
48
+ {
49
+
50
+ u_int32_t n, h;
51
+ u_int offset;
52
+ libnet_pblock_t *p;
53
+ struct libnet_dnsv4_hdr dns_hdr;
54
+
55
+ if (l == NULL)
56
+ {
57
+ return (-1);
58
+ }
59
+
60
+ if (h_len != LIBNET_UDP_DNSV4_H && h_len != LIBNET_TCP_DNSV4_H)
61
+ {
62
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
63
+ "%s(): invalid header length: %d", __func__, h_len);
64
+ return (-1);
65
+ }
66
+ offset = (h_len == LIBNET_UDP_DNSV4_H ? sizeof(dns_hdr.h_len) : 0);
67
+ n = h_len + payload_s;
68
+ h = 0; /* no checksum */
69
+
70
+ /*
71
+ * Find the existing protocol block if a ptag is specified, or create
72
+ * a new one.
73
+ */
74
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_DNSV4_H);
75
+ if (p == NULL)
76
+ {
77
+ return (-1);
78
+ }
79
+ /*
80
+ * The sizeof(dns_hdr.h_len) is not counted is the packet size
81
+ * for TCP packet.
82
+ * And since this will be ignored for udp packets, let's compute it
83
+ * anyway.
84
+ */
85
+
86
+ memset(&dns_hdr, 0, sizeof(dns_hdr));
87
+ dns_hdr.h_len = htons(n - sizeof (dns_hdr.h_len));
88
+ dns_hdr.id = htons(id);
89
+ dns_hdr.flags = htons(flags);
90
+ dns_hdr.num_q = htons(num_q);
91
+ dns_hdr.num_answ_rr = htons(num_anws_rr);
92
+ dns_hdr.num_auth_rr = htons(num_auth_rr);
93
+ dns_hdr.num_addi_rr = htons(num_addi_rr);
94
+
95
+ /*
96
+ * A dirty trick: DNS can be either TCP or UDP based, and depending on
97
+ * that, the header changes. A 'length' field is present in TCP packets,
98
+ * but not in UDP packets. As they are the first 2 bytes of the header,
99
+ * they are skipped if the packet is UDP...
100
+ */
101
+ n = libnet_pblock_append(l, p, ((u_int8_t *)&dns_hdr)+ offset, h_len);
102
+ if (n == -1)
103
+ {
104
+ goto bad;
105
+ }
106
+
107
+ if ((payload && !payload_s) || (!payload && payload_s))
108
+ {
109
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
110
+ "%s(): payload inconsistency\n", __func__);
111
+ goto bad;
112
+ }
113
+
114
+ if (payload && payload_s)
115
+ {
116
+ n = libnet_pblock_append(l, p, payload, payload_s);
117
+ if (n == -1)
118
+ {
119
+ goto bad;
120
+ }
121
+ }
122
+
123
+ return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_DNSV4_H));
124
+ bad:
125
+ libnet_pblock_delete(l, p);
126
+ return (-1);
127
+ }
128
+
129
+ /* EOF */
@@ -0,0 +1,173 @@
1
+ /*
2
+ * $Id: libnet_build_ethernet.c,v 1.8 2004/01/03 20:31:01 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_build_ethernet.c - ethernet 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_ethernet(u_int8_t *dst, u_int8_t *src, u_int16_t type, u_int8_t *payload,
44
+ u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
45
+ {
46
+ u_int32_t n, h;
47
+ libnet_pblock_t *p;
48
+ struct libnet_ethernet_hdr eth_hdr;
49
+
50
+ if (l == NULL)
51
+ {
52
+ return (-1);
53
+ }
54
+
55
+ /* sanity check injection type if we're not in advanced mode */
56
+ if (l->injection_type != LIBNET_LINK &&
57
+ !(((l->injection_type) & LIBNET_ADV_MASK)))
58
+ {
59
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
60
+ "%s(): called with non-link layer wire injection primitive",
61
+ __func__);
62
+ p = NULL;
63
+ goto bad;
64
+ }
65
+
66
+ n = LIBNET_ETH_H + payload_s;
67
+ h = 0;
68
+
69
+ /*
70
+ * Find the existing protocol block if a ptag is specified, or create
71
+ * a new one.
72
+ */
73
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_ETH_H);
74
+ if (p == NULL)
75
+ {
76
+ return (-1);
77
+ }
78
+
79
+ memset(&eth_hdr, 0, sizeof(eth_hdr));
80
+ memcpy(eth_hdr.ether_dhost, dst, ETHER_ADDR_LEN); /* destination address */
81
+ memcpy(eth_hdr.ether_shost, src, ETHER_ADDR_LEN); /* source address */
82
+ eth_hdr.ether_type = htons(type); /* packet type */
83
+
84
+ n = libnet_pblock_append(l, p, (u_int8_t *)&eth_hdr, LIBNET_ETH_H);
85
+ if (n == -1)
86
+ {
87
+ goto bad;
88
+ }
89
+
90
+ if ((payload && !payload_s) || (!payload && payload_s))
91
+ {
92
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
93
+ "%s(): payload inconsistency\n", __func__);
94
+ goto bad;
95
+ }
96
+
97
+ if (payload && payload_s)
98
+ {
99
+ n = libnet_pblock_append(l, p, payload, payload_s);
100
+ if (n == -1)
101
+ {
102
+ goto bad;
103
+ }
104
+ }
105
+
106
+ return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_ETH_H));
107
+ bad:
108
+ libnet_pblock_delete(l, p);
109
+ return (-1);
110
+ }
111
+
112
+
113
+ libnet_ptag_t
114
+ libnet_autobuild_ethernet(u_int8_t *dst, u_int16_t type, libnet_t *l)
115
+ {
116
+ u_int32_t n, h;
117
+ struct libnet_ether_addr *src;
118
+ libnet_pblock_t *p;
119
+ libnet_ptag_t ptag;
120
+ struct libnet_ethernet_hdr eth_hdr;
121
+
122
+ if (l == NULL)
123
+ {
124
+ return (-1);
125
+ }
126
+
127
+ /* sanity check injection type if we're not in advanced mode */
128
+ if (l->injection_type != LIBNET_LINK &&
129
+ !(((l->injection_type) & LIBNET_ADV_MASK)))
130
+ {
131
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
132
+ "libnet_autobuild_ethernet() called with non-link layer wire"
133
+ " injection primitive");
134
+ p = NULL;
135
+ goto bad;
136
+ }
137
+
138
+ n = LIBNET_ETH_H;
139
+ h = 0;
140
+ ptag = LIBNET_PTAG_INITIALIZER;
141
+ src = libnet_get_hwaddr(l);
142
+ if (src == NULL)
143
+ {
144
+ /* err msg set in libnet_get_hwaddr() */
145
+ return (-1);
146
+ }
147
+
148
+ /*
149
+ * Create a new pblock.
150
+ */
151
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_ETH_H);
152
+ if (p == NULL)
153
+ {
154
+ return (-1);
155
+ }
156
+
157
+ memset(&eth_hdr, 0, sizeof(eth_hdr));
158
+ memcpy(eth_hdr.ether_dhost, dst, ETHER_ADDR_LEN); /* destination address */
159
+ memcpy(eth_hdr.ether_shost, src, ETHER_ADDR_LEN); /* source address */
160
+ eth_hdr.ether_type = htons(type); /* packet type */
161
+
162
+ n = libnet_pblock_append(l, p, (u_int8_t *)&eth_hdr, LIBNET_ETH_H);
163
+ if (n == -1)
164
+ {
165
+ goto bad;
166
+ }
167
+
168
+ return (libnet_pblock_update(l, p, h, LIBNET_PBLOCK_ETH_H));
169
+ bad:
170
+ libnet_pblock_delete(l, p);
171
+ return (-1);
172
+ }
173
+ /* EOF */
@@ -0,0 +1,191 @@
1
+ /*
2
+ * libnet
3
+ * libnet_build_fddi.c - Fiber Distributed Data Interface packet assembler
4
+ *
5
+ * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
6
+ * Jason Damron <jsdamron@hushmail.com>
7
+ * All rights reserved.
8
+ *
9
+ * Redistribution and use in source and binary forms, with or without
10
+ * modification, are permitted provided that the following conditions
11
+ * are met:
12
+ * 1. Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ * 2. Redistributions in binary form must reproduce the above copyright
15
+ * notice, this list of conditions and the following disclaimer in the
16
+ * documentation and/or other materials provided with the distribution.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28
+ * SUCH DAMAGE.
29
+ *
30
+ */
31
+
32
+ #if (HAVE_CONFIG_H)
33
+ #include "../include/config.h"
34
+ #endif
35
+ #if (!(_WIN32) || (__CYGWIN__))
36
+ #include "../include/libnet.h"
37
+ #else
38
+ #include "../include/win32/libnet.h"
39
+ #endif
40
+
41
+ libnet_ptag_t
42
+ libnet_build_fddi(u_int8_t fc, u_int8_t *dst, u_int8_t *src, u_int8_t dsap,
43
+ u_int8_t ssap, u_int8_t cf, u_int8_t *org, u_int16_t type, u_int8_t *payload,
44
+ u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
45
+ {
46
+ u_int32_t n, h;
47
+ u_int16_t protocol_type;
48
+ libnet_pblock_t *p;
49
+ struct libnet_fddi_hdr fddi_hdr;
50
+
51
+ if (l == NULL)
52
+ {
53
+ return (-1);
54
+ }
55
+
56
+ /* sanity check injection type if we're not in advanced mode */
57
+ if (l->injection_type != LIBNET_LINK &&
58
+ !(((l->injection_type) & LIBNET_ADV_MASK)))
59
+ {
60
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
61
+ "%s(): called with non-link layer wire injection primitive",
62
+ __func__);
63
+ p = NULL;
64
+ goto bad;
65
+ }
66
+
67
+ n = LIBNET_FDDI_H + payload_s;
68
+ h = 0;
69
+
70
+ /*
71
+ * Find the existing protocol block if a ptag is specified, or create
72
+ * a new one.
73
+ */
74
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_FDDI_H);
75
+ if (p == NULL)
76
+ {
77
+ return (-1);
78
+ }
79
+
80
+ memset(&fddi_hdr, 0, sizeof(fddi_hdr));
81
+ fddi_hdr.fddi_frame_control = fc; /* Class/Format/Priority */
82
+ memcpy(fddi_hdr.fddi_dhost, dst, FDDI_ADDR_LEN); /* dst fddi address */
83
+ memcpy(fddi_hdr.fddi_shost, src, FDDI_ADDR_LEN); /* source fddi address */
84
+ fddi_hdr.fddi_llc_dsap = dsap; /* */
85
+ fddi_hdr.fddi_llc_ssap = ssap; /* */
86
+ fddi_hdr.fddi_llc_control_field = cf; /* Class/Format/Priority */
87
+ memcpy(&fddi_hdr.fddi_llc_org_code, org, LIBNET_ORG_CODE_SIZE);
88
+
89
+ /* Deal with unaligned int16_t for type */
90
+ protocol_type = htons(type);
91
+ memcpy(&fddi_hdr.fddi_type, &protocol_type, sizeof(int16_t)); /* Protocol Type */
92
+
93
+ n = libnet_pblock_append(l, p, (u_int8_t *)&fddi_hdr, LIBNET_FDDI_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_FDDI_H));
116
+ bad:
117
+ libnet_pblock_delete(l, p);
118
+ return (-1);
119
+ }
120
+
121
+
122
+ libnet_ptag_t
123
+ libnet_autobuild_fddi(u_int8_t fc, u_int8_t *dst, u_int8_t dsap, u_int8_t ssap,
124
+ u_int8_t cf, u_int8_t *org, u_int16_t type, libnet_t *l)
125
+ {
126
+ u_int32_t n, h;
127
+ u_int16_t protocol_type;
128
+ struct libnet_fddi_addr *src;
129
+ libnet_pblock_t *p;
130
+ libnet_ptag_t ptag;
131
+ struct libnet_fddi_hdr fddi_hdr;
132
+
133
+ if (l == NULL)
134
+ {
135
+ return (-1);
136
+ }
137
+
138
+ /* sanity check injection type if we're not in advanced mode */
139
+ if (l->injection_type != LIBNET_LINK &&
140
+ !(((l->injection_type) & LIBNET_ADV_MASK)))
141
+ {
142
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
143
+ "%s(): called with non-link layer wire injection primitive",
144
+ __func__);
145
+ p = NULL;
146
+ goto bad;
147
+ }
148
+
149
+ n = LIBNET_FDDI_H;
150
+ h = 0;
151
+ ptag = LIBNET_PTAG_INITIALIZER;
152
+
153
+ /* FDDI and Ethernet have the same address size - so just typecast */
154
+ src = (struct libnet_fddi_addr *) libnet_get_hwaddr(l);
155
+ if (src == NULL)
156
+ {
157
+ /* err msg set in libnet_get_hwaddr() */
158
+ return (-1);
159
+ }
160
+
161
+ p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_FDDI_H);
162
+ if (p == NULL)
163
+ {
164
+ return (-1);
165
+ }
166
+
167
+ memset(&fddi_hdr, 0, sizeof(fddi_hdr));
168
+ fddi_hdr.fddi_frame_control = fc; /* Class/Format/Priority */
169
+ memcpy(fddi_hdr.fddi_dhost, dst, FDDI_ADDR_LEN); /* destination fddi address */
170
+ memcpy(fddi_hdr.fddi_shost, src, FDDI_ADDR_LEN); /* source fddi address */
171
+ fddi_hdr.fddi_llc_dsap = dsap; /* */
172
+ fddi_hdr.fddi_llc_ssap = ssap; /* */
173
+ fddi_hdr.fddi_llc_control_field = cf; /* Class/Format/Priority */
174
+ memcpy(&fddi_hdr.fddi_llc_org_code, org, LIBNET_ORG_CODE_SIZE);
175
+
176
+ /* Deal with unaligned int16_t for type */
177
+ protocol_type = htons(type);
178
+ memcpy(&fddi_hdr.fddi_type, &protocol_type, sizeof(int16_t)); /* Protocol Type */
179
+
180
+ n = libnet_pblock_append(l, p, (u_int8_t *)&fddi_hdr, LIBNET_FDDI_H);
181
+ if (n == -1)
182
+ {
183
+ goto bad;
184
+ }
185
+
186
+ return (libnet_pblock_update(l, p, h, LIBNET_PBLOCK_FDDI_H));
187
+ bad:
188
+ libnet_pblock_delete(l, p);
189
+ return (-1);
190
+ }
191
+ /* EOF */