Annotation of embedaddon/libnet/doc/PACKET_BUILDING, revision 1.1.1.1
1.1 misho 1: ===============================================================================
2: $Id: PACKET_BUILDING,v 1.2 2004/01/03 20:31:00 mike Exp $
3: LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
4: http://www.packetfactory.net/libnet
5: ===============================================================================
6:
7:
8: ADDING A NEW PACKET BUILDER
9:
10: Adding a new packet building module is usually pretty simple. It depends
11: completely on the complexity of the protocol. The following document
12: shows you how to add a packet builder for a simple protocol with a
13: static header size, but these concepts can be extended to a complex
14: protocol also.
15:
16: 1) Start by defining your protocol header format in libnet-headers.h:
17:
18: #define LIBNET_XXX_H 0xSIZE
19:
20: struct XXX_hdr
21: {
22: u_char field1;
23: u_short field2;
24: u_long field3;
25: };
26:
27: 2) Add a pblock definition to libnet-structures.h (appened to the list):
28:
29: #define LIBNET_PBLOCK_XXX_H 0xNUMBER
30:
31: 3) Then work from the following template for libnet_build_XXX.c:
32:
33: #if (HAVE_CONFIG_H)
34: #include "../include/config.h"
35: #endif
36: #include "../include/libnet.h"
37:
38:
39: libnet_ptag_t
40: libnet_build_XXX(u_char arg1, u_short arg2, u_long arg3, u_char *payload,
41: u_long payload_s, libnet_t *l, libnet_ptag_t ptag)
42: {
43: /*
44: * n is the size of the protocol unit. This is usually the header size
45: * plus the payload size. This is also how many bytes are allocated on
46: * the heap to hold this protocol unit.
47: */
48: u_long n;
49:
50: /*
51: * h is used inside the pblock structure to let libnet know how big
52: * much data to checksum. This is different for different protocols.
53: * The IPv4 checksum covers the IP header only, while TCP and UDP
54: * checksums cover header and data.
55: */
56: u_short h;
57:
58: /*
59: * p will be used to refer to the protocol block that will either be
60: * allocated if the function's pt argument is 0, or located if ptag refers
61: * to a previously created protocol unit.
62: */
63: libnet_pblock_t *p;
64:
65: /*
66: * XXX_hdr is the header structure that will be overlaid onto the
67: * allocated memory by way of a memcpy.
68: */
69: struct libnet_XXX_hdr XXX_hdr;
70:
71: /*
72: * Here we sanity check to make sure we have a live l.
73: */
74: if (l == NULL)
75: {
76: return (-1);
77: }
78:
79: n = LIBNET_XXX_H + payload_s;
80: h = 0; /* no checksum by default */
81:
82: /*
83: * Find the existing protocol block if a ptag is specified, or create
84: * a new one.
85: */
86: p = libnet_pblock_probe(l, pt, n, LIBNET_PBLOCK_XXX_H);
87: if (p == NULL)
88: {
89: return (-1);
90: }
91:
92: /*
93: * Build your packet here. Be sure to call appropriate endian conversion
94: * routines.
95: */
96: XXX_hdr.field1 = arg1;
97: XXX_hdr.field2 = htons(arg2);
98: XXX_hdr.field3 = htonl(arg3);
99:
100: /*
101: * Appened the protocol unit to the list.
102: */
103: n = libnet_pblock_append(l, p, (u_char *)&XXX_hdr, LIBNET_XXX_H);
104: if (n == -1)
105: {
106: goto bad;
107: }
108:
109: /*
110: * Sanity check the payload arguments.
111: */
112: if ((payload && !payload_s) || (!payload && payload_s))
113: {
114: sprintf(l->err_buf, "%s(): payload inconsistency\n", __FUNCTION__);
115: goto bad;
116: }
117:
118: /*
119: * Append the payload to the list if it exists.
120: */
121: if (payload && payload_s)
122: {
123: n = libnet_pblock_append(l, p, payload, payload_s);
124: if (n == -1)
125: {
126: goto bad;
127: }
128: }
129:
130: /*
131: * If this packet header has a checksum field, you'll add this
132: * and you'll have to edit libnet_checksum.c to add it to the switch
133: * table. You might have to define the protocol number too.
134: */
135: if (sum == 0 && l->injection_type != LIBNET_RAW4)
136: {
137: /*
138: * If checksum is zero, by default libnet will compute a checksum
139: * for the user. The programmer can override this by calling
140: * libnet_toggle_checksum(l, ptag, 1);
141: */
142: libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
143: }
144:
145: /*
146: * Update the protocol block's meta information and return the protocol
147: * tag id of this pblock. This tag will be used to locate the pblock
148: * in order to modify the protocol header in subsequent calls.
149: */
150: return (pt ? pt : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_XXX_H));
151: bad:
152: libnet_pblock_delete(l, p);
153: return (-1);
154:
155: }
156: 4) Add it to src/Makefile.am and then automake from the TLD.
157: 5) Test the shit out of it.
158: 6) Send it over to mike@infonexus.com.
159:
160:
161: EOF
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>