Annotation of embedaddon/libnet/doc/MIGRATION, revision 1.1.1.1
1.1 misho 1: ===============================================================================
2: $Id: MIGRATION,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: MIGRATING YOUR CODE AND QUICKSTART
9:
10: Using Libnet 1.1 you will find it MUCH simpler to build and write packets
11: than before. Instead of the previous five steps (initialize memory,
12: initialize network, build packet, do checksums, write packet) there are
13: now only three steps (initialize library, build packet, write packet).
14: In order to port your existing code, you will mainly be REMOVING
15: function calls and variables.
16:
17: 1) Start with code removal:
18:
19: - Remove all calls to libnet_init_packet() / packet malloc()ing and
20: all associated variables.
21: - Remove all calls to libnet_open_raw_sock() / libnet_open_link_layer()
22: and all associated variables.
23: - Remove all calls to libnet_do_checksum() and all associated
24: variables.
25:
26: 2) Continue with code addition and modification:
27:
28: - You will need a single "libnet_t *l" which is your libnet file
29: context and an error buffer:
30:
31: libnet_t *l
32: char errbuf[LIBNET_ERRBUF_SIZE];
33:
34: l = libnet_init(
35: LIBNET_RAW4, /* or LIBNET_LINK or LIBNET_RAW6 */
36: NULL, /* or device if you using LIBNET_LINK */
37: errbuf);
38:
39: - The libnet_build functions are largely unchanged with a few
40: important differences:
41:
42: 1) Packets headers MUST be stacked IN ORDER. This is
43: intuitive and shouldn't be a problem. Due to the way
44: individual packet header memory is allocated and how
45: packet pieces are combined to build a packet they HAVE to
46: be built IN ORDER, from the high end of the protocol stack
47: on down. ie: using the raw interface to build a NTP
48: packet, you would:
49: libnet_build_ntp(...)
50: libnet_build_udp(...)
51: libnet_build_ipv4(...)
52: To build the same packet using the LINK interface on
53: top of ethernet you would:
54: libnet_build_ntp(...)
55: libnet_build_udp(...)
56: libnet_build_ipv4(...)
57: libnet_build_ethernet(...)
58: 1a) There is the option now of using libnet_autobuild_ipv4()
59: and libnet_autobuild_ethernet() which have fewer
60: arguments and smaller stack frames and are a bit more
61: convenient.
62: 2) The libnet_build functions return a libnet_ptag_t datatype
63: on success or -1 on error. This ptag is your
64: "protocol/packet tag" so you can find this header again
65: if you needed to modify it later on. If you don't need
66: to modify the packet header you can throw this value
67: away. You should definitely check for error now on
68: your build functions. Alot's going on down there fellas.
69: 2a) NOTE that after packets are built, they may accessed
70: independently of construction order via the saved ptag.
71: 3) They NO LONGER ACCEPT BUFFER ARGUMENTS. This is ALL
72: done internally. The last TWO arguments are the libnet
73: context you created in your call to libnet_init() and
74: an OPTIONAL ptag argument. The ptag argument, if non-zero,
75: specifes a packet tag to an ALREADY EXISTING packet header
76: that will be OVERWRITTEN with the values specified in
77: this libnet_build function call. This is how you modify
78: existing packet header pieces. If this ptag is 0,
79: a new protocol block is allocated and the packet is
80: pushed down on the "protocol stack".
81: 4) For the functions that build headers that have checksums
82: these are NOW SPECIFIED AS AN ARGUMENT. This adds more
83: flexibility in how checksums are done (you can leave the
84: field 0, put in a random value, precompute it on your own,
85: or let the library do it). By default, when you build
86: a header, a "DO_CHECKSUM" flag will be set. This means
87: the library will compute the checksum for the header
88: and possibly over the data before the packet is written.
89: To clear this flag, there is a special macro you
90: can call on the ptag refering to that header.
91: 5) For the functions that have a length, it now specifies
92: the TOTAL packet length from that protocol unit on down.
93: For IP, that would be the entire packet length. For
94: TCP, that would be TCP and any possible data.
95: 6) Nomenclature support for the eventual support of ipv6
96: has been added.
97:
98: libnet_ptag_t ip_tag;
99: libnet_ptag_t tcp_tag;
100:
101: tcp_tag = libnet_build_tcp(
102: src_prt, /* source TCP port */
103: dst_prt, /* destination TCP port */
104: 0xffff, /* sequence number */
105: 0x53, /* acknowledgement number */
106: TH_SYN, /* control flags */
107: 1024, /* window size */
108: 0xd00d, /* checksum */
109: 0, /* urgent pointer */
110: LIBNET_TCP_H /* TCP packet size */
111: NULL, /* payload (none) */
112: 0, /* payload length */
113: l, /* libnet context */
114: 0); /* ptag */
115:
116: ip_tag = libnet_build_ipv4(
117: LIBNET_TCP_H + LIBNET_IPV4_H,/* total packet len */
118: IPTOS_LOWDELAY, /* tos */
119: ip_id, /* IP ID */
120: 0, /* IP Frag */
121: 64, /* TTL */
122: IPPROTO_TCP, /* protocol */
123: 0, /* checksum */
124: src_ip, /* source ip */
125: dst_ip, /* dest ip */
126: NULL, /* payload (none) */
127: 0, /* payload size */
128: l, /* libnet context */
129: 0); /* ptag */
130:
131: Now, if you wanted to modify one of these headers in a loop
132: somewhere you would:
133:
134: int i;
135: for (ip_tag, tcp_tag = LIBNET_PTAG_INITIALIZER, i = 0; i < 10; i++)
136: {
137: tcp_tag = libnet_build_tcp(++src_prt, ..., l, tcp_tag);
138: ip_tag = libnet_build_ipv4(..., ++ip_id, ..., l, ip_tag);
139: /* do something */
140: }
141: Since we are specifying a ptag for an existing header, the
142: build function will NOT create a new header and append it to
143: the list, it will FIND the one referenced by the ptag and UPDATE
144: it. Since there is nothing new being created, order is NOT
145: important here.
146:
147: Also note that it's perfectly fine to wrap the loop around the
148: initial building of the packets. Since we're initializing the
149: ptags (to be zero), the first call into the builder functions
150: will allocate the memory and create the packet blocks. These
151: calls will return ptag values. The next calls will modify
152: these headers since the ptags will not be NULL.
153:
154: - Finally, we write the packet. Checksums are computed, by default
155: for each protocol header that requires one. If the user specifies
156: a non-zero value, by default, this will be used INSTEAD of a
157: libnet computed checksum. This behavior is overridable with:
158:
159: Turn ON checksums for header referenced by ptag:
160: libnet_toggle_checksum(l, ptag, 1)
161:
162: Turn OFF checksums for header referenced by ptag:
163: libnet_toggle_checksum(l, ptag, 0)
164:
165: Note, the packet header MUST exist before you can toggle this setting.
166:
167: int c;
168: c = libnet_write(l);
169:
170: Boom. You're done. Now go read the sample code.
171:
172: EOF
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>