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.
- data/CHANGELOG +15 -0
- data/LICENSE +28 -0
- data/README +187 -0
- data/Rakefile +110 -0
- data/ext/extconf.rb +60 -0
- data/ext/libnet.c +705 -0
- data/ext/libnet_arp.c +152 -0
- data/ext/libnet_ethernet.c +115 -0
- data/ext/libnet_ipv4.c +140 -0
- data/ext/libnet_ipv6.c +138 -0
- data/ext/libnet_udp.c +112 -0
- data/ext/libnet_vlan.c +131 -0
- data/lib/libnet4r/header.rb +609 -0
- data/lib/libnet4r/helpers.rb +19 -0
- data/lib/libnet4r/libnet.rb +39 -0
- data/libnet/CVS/Entries +24 -0
- data/libnet/CVS/Repository +1 -0
- data/libnet/CVS/Root +1 -0
- data/libnet/Makefile.am +15 -0
- data/libnet/Makefile.am.common +10 -0
- data/libnet/Makefile.in +443 -0
- data/libnet/README +21 -0
- data/libnet/VERSION +1 -0
- data/libnet/acconfig.h +36 -0
- data/libnet/acinclude.m4 +463 -0
- data/libnet/aclocal.m4 +1337 -0
- data/libnet/autom4te.cache/CVS/Entries +1 -0
- data/libnet/autom4te.cache/CVS/Repository +1 -0
- data/libnet/autom4te.cache/CVS/Root +1 -0
- data/libnet/autom4te.cache/output.0 +6225 -0
- data/libnet/autom4te.cache/requests +111 -0
- data/libnet/autom4te.cache/traces.0 +272 -0
- data/libnet/config.guess +1314 -0
- data/libnet/config.sub +1410 -0
- data/libnet/configure +6225 -0
- data/libnet/configure.in +235 -0
- data/libnet/doc/BUGS +19 -0
- data/libnet/doc/CHANGELOG +527 -0
- data/libnet/doc/CONTRIB +53 -0
- data/libnet/doc/COPYING +31 -0
- data/libnet/doc/CVS/Entries +12 -0
- data/libnet/doc/CVS/Repository +1 -0
- data/libnet/doc/CVS/Root +1 -0
- data/libnet/doc/DESIGN_NOTES +134 -0
- data/libnet/doc/MIGRATION +172 -0
- data/libnet/doc/PACKET_BUILDING +161 -0
- data/libnet/doc/PORTED +45 -0
- data/libnet/doc/RAWSOCKET_NON_SEQUITUR +41 -0
- data/libnet/doc/TODO +96 -0
- data/libnet/doc/html/acconfig_8h-source.html +49 -0
- data/libnet/doc/html/annotated.html +17 -0
- data/libnet/doc/html/bpf_8h-source.html +277 -0
- data/libnet/doc/html/config_8h-source.html +125 -0
- data/libnet/doc/html/doxygen.css +169 -0
- data/libnet/doc/html/doxygen.png +0 -0
- data/libnet/doc/html/files.html +29 -0
- data/libnet/doc/html/functions.html +26 -0
- data/libnet/doc/html/functions_vars.html +26 -0
- data/libnet/doc/html/getopt_8h-source.html +97 -0
- data/libnet/doc/html/globals.html +219 -0
- data/libnet/doc/html/globals_defs.html +104 -0
- data/libnet/doc/html/globals_func.html +136 -0
- data/libnet/doc/html/gnuc_8h-source.html +56 -0
- data/libnet/doc/html/graph_legend.dot +22 -0
- data/libnet/doc/html/graph_legend.html +75 -0
- data/libnet/doc/html/ifaddrlist_8h-source.html +65 -0
- data/libnet/doc/html/in__systm_8h-source.html +90 -0
- data/libnet/doc/html/index.html +17 -0
- data/libnet/doc/html/libnet-asn1_8h-source.html +268 -0
- data/libnet/doc/html/libnet-functions_8h-source.html +742 -0
- data/libnet/doc/html/libnet-functions_8h.html +8844 -0
- data/libnet/doc/html/libnet-headers_8h-source.html +1655 -0
- data/libnet/doc/html/libnet-headers_8h.html +3053 -0
- data/libnet/doc/html/libnet-macros_8h-source.html +161 -0
- data/libnet/doc/html/libnet-macros_8h.html +358 -0
- data/libnet/doc/html/libnet-structures_8h-source.html +233 -0
- data/libnet/doc/html/libnet-types_8h-source.html +58 -0
- data/libnet/doc/html/libnet_8h-source.html +119 -0
- data/libnet/doc/html/libnet_8h.html +24 -0
- data/libnet/doc/html/structlibnet__802__1q__hdr.html +145 -0
- data/libnet/doc/html/structlibnet__802__1x__hdr.html +97 -0
- data/libnet/doc/libnet.doxygen.conf +1102 -0
- data/libnet/doc/man/CVS/Entries +1 -0
- data/libnet/doc/man/CVS/Repository +1 -0
- data/libnet/doc/man/CVS/Root +1 -0
- data/libnet/doc/man/man3/libnet-functions.h.3 +3136 -0
- data/libnet/doc/man/man3/libnet-headers.h.3 +1872 -0
- data/libnet/doc/man/man3/libnet-macros.h.3 +172 -0
- data/libnet/doc/man/man3/libnet.h.3 +17 -0
- data/libnet/doc/man/man3/libnet_802_1q_hdr.3 +53 -0
- data/libnet/doc/man/man3/libnet_802_1x_hdr.3 +41 -0
- data/libnet/include/CVS/Entries +10 -0
- data/libnet/include/CVS/Repository +1 -0
- data/libnet/include/CVS/Root +1 -0
- data/libnet/include/Makefile.am +7 -0
- data/libnet/include/Makefile.in +395 -0
- data/libnet/include/bpf.h +264 -0
- data/libnet/include/config.h.in +118 -0
- data/libnet/include/gnuc.h +43 -0
- data/libnet/include/ifaddrlist.h +52 -0
- data/libnet/include/libnet/CVS/Entries +9 -0
- data/libnet/include/libnet/CVS/Repository +1 -0
- data/libnet/include/libnet/CVS/Root +1 -0
- data/libnet/include/libnet/Makefile.am +12 -0
- data/libnet/include/libnet/Makefile.in +294 -0
- data/libnet/include/libnet/libnet-asn1.h +255 -0
- data/libnet/include/libnet/libnet-functions.h +2157 -0
- data/libnet/include/libnet/libnet-headers.h +1662 -0
- data/libnet/include/libnet/libnet-macros.h +186 -0
- data/libnet/include/libnet/libnet-structures.h +222 -0
- data/libnet/include/libnet/libnet-types.h +45 -0
- data/libnet/include/libnet.h.in +132 -0
- data/libnet/include/stamp-h.in +1 -0
- data/libnet/include/win32/CVS/Entries +5 -0
- data/libnet/include/win32/CVS/Repository +1 -0
- data/libnet/include/win32/CVS/Root +1 -0
- data/libnet/include/win32/config.h +112 -0
- data/libnet/include/win32/getopt.h +84 -0
- data/libnet/include/win32/in_systm.h +77 -0
- data/libnet/include/win32/libnet.h +106 -0
- data/libnet/install-sh +250 -0
- data/libnet/libnet-config.in +62 -0
- data/libnet/libnet.doxygen.conf +1102 -0
- data/libnet/man/CVS/Entries +1 -0
- data/libnet/man/CVS/Repository +1 -0
- data/libnet/man/CVS/Root +1 -0
- data/libnet/missing +283 -0
- data/libnet/mkinstalldirs +40 -0
- data/libnet/sample/CVS/Entries +47 -0
- data/libnet/sample/CVS/Repository +1 -0
- data/libnet/sample/CVS/Root +1 -0
- data/libnet/sample/Makefile.am +63 -0
- data/libnet/sample/Makefile.in +729 -0
- data/libnet/sample/arp-new.c +144 -0
- data/libnet/sample/arp.c +151 -0
- data/libnet/sample/bgp4_hdr.c +225 -0
- data/libnet/sample/bgp4_notification.c +242 -0
- data/libnet/sample/bgp4_open.c +266 -0
- data/libnet/sample/bgp4_update.c +337 -0
- data/libnet/sample/cdp.c +187 -0
- data/libnet/sample/dhcp_discover.c +257 -0
- data/libnet/sample/dns.c +260 -0
- data/libnet/sample/dot1x.c +113 -0
- data/libnet/sample/fddi_tcp1.c +213 -0
- data/libnet/sample/fddi_tcp2.c +209 -0
- data/libnet/sample/get_addr.c +112 -0
- data/libnet/sample/gre.c +410 -0
- data/libnet/sample/icmp6_echoreq.c +184 -0
- data/libnet/sample/icmp_echo_cq.c +201 -0
- data/libnet/sample/icmp_redirect.c +200 -0
- data/libnet/sample/icmp_timeexceed.c +190 -0
- data/libnet/sample/icmp_timestamp.c +157 -0
- data/libnet/sample/icmp_unreach.c +204 -0
- data/libnet/sample/ieee.c +177 -0
- data/libnet/sample/ip_link.c +201 -0
- data/libnet/sample/ip_raw.c +180 -0
- data/libnet/sample/isl.c +167 -0
- data/libnet/sample/libnet_test.h +60 -0
- data/libnet/sample/mpls.c +251 -0
- data/libnet/sample/ntp.c +193 -0
- data/libnet/sample/ospf_hello.c +179 -0
- data/libnet/sample/ospf_lsa.c +190 -0
- data/libnet/sample/ping_of_death.c +171 -0
- data/libnet/sample/rpc_tcp.c +214 -0
- data/libnet/sample/rpc_udp.c +213 -0
- data/libnet/sample/sebek.c +299 -0
- data/libnet/sample/smurf.c +194 -0
- data/libnet/sample/stp.c +227 -0
- data/libnet/sample/synflood.c +200 -0
- data/libnet/sample/synflood6.c +209 -0
- data/libnet/sample/synflood6_frag.c +234 -0
- data/libnet/sample/tcp1.c +227 -0
- data/libnet/sample/tcp2.c +192 -0
- data/libnet/sample/tftp.c +207 -0
- data/libnet/sample/tring_tcp1.c +214 -0
- data/libnet/sample/tring_tcp2.c +210 -0
- data/libnet/sample/udp1.c +223 -0
- data/libnet/sample/udp2.c +232 -0
- data/libnet/sample/win32/CVS/Entries +9 -0
- data/libnet/sample/win32/CVS/Repository +1 -0
- data/libnet/sample/win32/CVS/Root +1 -0
- data/libnet/sample/win32/arp/CVS/Entries +2 -0
- data/libnet/sample/win32/arp/CVS/Repository +1 -0
- data/libnet/sample/win32/arp/CVS/Root +1 -0
- data/libnet/sample/win32/arp/arp.vcproj +136 -0
- data/libnet/sample/win32/cdp/CVS/Entries +2 -0
- data/libnet/sample/win32/cdp/CVS/Repository +1 -0
- data/libnet/sample/win32/cdp/CVS/Root +1 -0
- data/libnet/sample/win32/cdp/cdp.vcproj +136 -0
- data/libnet/sample/win32/dhcp_discover/CVS/Entries +2 -0
- data/libnet/sample/win32/dhcp_discover/CVS/Repository +1 -0
- data/libnet/sample/win32/dhcp_discover/CVS/Root +1 -0
- data/libnet/sample/win32/dhcp_discover/dhcp_discover.vcproj +139 -0
- data/libnet/sample/win32/dns/CVS/Entries +2 -0
- data/libnet/sample/win32/dns/CVS/Repository +1 -0
- data/libnet/sample/win32/dns/CVS/Root +1 -0
- data/libnet/sample/win32/dns/dns.vcproj +139 -0
- data/libnet/sample/win32/get_addr/CVS/Entries +2 -0
- data/libnet/sample/win32/get_addr/CVS/Repository +1 -0
- data/libnet/sample/win32/get_addr/CVS/Root +1 -0
- data/libnet/sample/win32/get_addr/get_addr.vcproj +139 -0
- data/libnet/sample/win32/getopt.c +121 -0
- data/libnet/sample/win32/icmp_echo_cq/CVS/Entries +2 -0
- data/libnet/sample/win32/icmp_echo_cq/CVS/Repository +1 -0
- data/libnet/sample/win32/icmp_echo_cq/CVS/Root +1 -0
- data/libnet/sample/win32/icmp_echo_cq/icmp_echo_cq.vcproj +139 -0
- data/libnet/sample/win32/tcp1/CVS/Entries +2 -0
- data/libnet/sample/win32/tcp1/CVS/Repository +1 -0
- data/libnet/sample/win32/tcp1/CVS/Root +1 -0
- data/libnet/sample/win32/tcp1/tcp1.vcproj +142 -0
- data/libnet/sample/win32/udp1/CVS/Entries +3 -0
- data/libnet/sample/win32/udp1/CVS/Repository +1 -0
- data/libnet/sample/win32/udp1/CVS/Root +1 -0
- data/libnet/sample/win32/udp1/dns.vcproj +125 -0
- data/libnet/sample/win32/udp1/udp1.vcproj +139 -0
- data/libnet/src/CVS/Entries +60 -0
- data/libnet/src/CVS/Repository +1 -0
- data/libnet/src/CVS/Root +1 -0
- data/libnet/src/Makefile.am +71 -0
- data/libnet/src/Makefile.in +428 -0
- data/libnet/src/libnet_advanced.c +136 -0
- data/libnet/src/libnet_asn1.c +436 -0
- data/libnet/src/libnet_build_802.1q.c +115 -0
- data/libnet/src/libnet_build_802.1x.c +103 -0
- data/libnet/src/libnet_build_802.2.c +167 -0
- data/libnet/src/libnet_build_802.3.c +101 -0
- data/libnet/src/libnet_build_arp.c +169 -0
- data/libnet/src/libnet_build_bgp.c +350 -0
- data/libnet/src/libnet_build_cdp.c +191 -0
- data/libnet/src/libnet_build_data.c +90 -0
- data/libnet/src/libnet_build_dhcp.c +156 -0
- data/libnet/src/libnet_build_dns.c +129 -0
- data/libnet/src/libnet_build_ethernet.c +173 -0
- data/libnet/src/libnet_build_fddi.c +191 -0
- data/libnet/src/libnet_build_gre.c +427 -0
- data/libnet/src/libnet_build_icmp.c +437 -0
- data/libnet/src/libnet_build_igmp.c +112 -0
- data/libnet/src/libnet_build_ip.c +892 -0
- data/libnet/src/libnet_build_ipsec.c +232 -0
- data/libnet/src/libnet_build_isl.c +113 -0
- data/libnet/src/libnet_build_link.c +90 -0
- data/libnet/src/libnet_build_mpls.c +112 -0
- data/libnet/src/libnet_build_ntp.c +121 -0
- data/libnet/src/libnet_build_ospf.c +699 -0
- data/libnet/src/libnet_build_rip.c +108 -0
- data/libnet/src/libnet_build_rpc.c +138 -0
- data/libnet/src/libnet_build_sebek.c +108 -0
- data/libnet/src/libnet_build_snmp.c +52 -0
- data/libnet/src/libnet_build_stp.c +222 -0
- data/libnet/src/libnet_build_tcp.c +365 -0
- data/libnet/src/libnet_build_token_ring.c +193 -0
- data/libnet/src/libnet_build_udp.c +111 -0
- data/libnet/src/libnet_build_vrrp.c +117 -0
- data/libnet/src/libnet_checksum.c +376 -0
- data/libnet/src/libnet_cq.c +395 -0
- data/libnet/src/libnet_crc.c +113 -0
- data/libnet/src/libnet_dll.c +47 -0
- data/libnet/src/libnet_error.c +55 -0
- data/libnet/src/libnet_if_addr.c +415 -0
- data/libnet/src/libnet_init.c +234 -0
- data/libnet/src/libnet_internal.c +310 -0
- data/libnet/src/libnet_link_bpf.c +348 -0
- data/libnet/src/libnet_link_dlpi.c +785 -0
- data/libnet/src/libnet_link_linux.c +310 -0
- data/libnet/src/libnet_link_nit.c +125 -0
- data/libnet/src/libnet_link_none.c +66 -0
- data/libnet/src/libnet_link_pf.c +179 -0
- data/libnet/src/libnet_link_snit.c +149 -0
- data/libnet/src/libnet_link_snoop.c +166 -0
- data/libnet/src/libnet_link_win32.c +346 -0
- data/libnet/src/libnet_pblock.c +511 -0
- data/libnet/src/libnet_port_list.c +295 -0
- data/libnet/src/libnet_prand.c +106 -0
- data/libnet/src/libnet_raw.c +257 -0
- data/libnet/src/libnet_resolve.c +414 -0
- data/libnet/src/libnet_version.c +54 -0
- data/libnet/src/libnet_write.c +502 -0
- data/libnet/version.h.in +6 -0
- data/libnet/win32/CVS/Entries +15 -0
- data/libnet/win32/CVS/Repository +1 -0
- data/libnet/win32/CVS/Root +1 -0
- data/libnet/win32/Libnet-1.1.1-2002.sln +77 -0
- data/libnet/win32/Libnet-1.1.1-2003.ncb +0 -0
- data/libnet/win32/Libnet-1.1.1-2003.sln +84 -0
- data/libnet/win32/Libnet-1.1.1-2003.suo +0 -0
- data/libnet/win32/Libnet-1.1.1.vcproj +311 -0
- data/libnet/win32/Libnet-latest.ncb +0 -0
- data/libnet/win32/Libnet-latest.opt +0 -0
- data/libnet/win32/Libnet-latest.sln +77 -0
- data/libnet/win32/Libnet-latest.suo +0 -0
- data/libnet/win32/Libnet-latest.vcproj +311 -0
- data/libnet/win32/Libnet.dsp +337 -0
- data/libnet/win32/Libnet.dsw +32 -0
- data/libnet/win32/README.txt +57 -0
- data/libnet/win32/libnet_dll.def +164 -0
- data/test/tc_arp.rb +169 -0
- data/test/tc_class.rb +219 -0
- data/test/tc_ethernet.rb +97 -0
- data/test/tc_header.rb +163 -0
- data/test/tc_init.rb +25 -0
- data/test/tc_ipv4.rb +219 -0
- data/test/tc_ipv6.rb +235 -0
- data/test/tc_udp.rb +229 -0
- data/test/tc_vlan.rb +118 -0
- data/test/ts_all.rb +15 -0
- 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(ð_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 *)ð_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(ð_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 *)ð_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 */
|