summaryrefslogtreecommitdiff
path: root/libnet/doc/MIGRATION
diff options
context:
space:
mode:
Diffstat (limited to 'libnet/doc/MIGRATION')
-rw-r--r--libnet/doc/MIGRATION172
1 files changed, 172 insertions, 0 deletions
diff --git a/libnet/doc/MIGRATION b/libnet/doc/MIGRATION
new file mode 100644
index 0000000..b257241
--- /dev/null
+++ b/libnet/doc/MIGRATION
@@ -0,0 +1,172 @@
+===============================================================================
+ $Id: MIGRATION,v 1.2 2004/01/03 20:31:00 mike Exp $
+ LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
+ http://www.packetfactory.net/libnet
+===============================================================================
+
+
+ MIGRATING YOUR CODE AND QUICKSTART
+
+ Using Libnet 1.1 you will find it MUCH simpler to build and write packets
+ than before. Instead of the previous five steps (initialize memory,
+ initialize network, build packet, do checksums, write packet) there are
+ now only three steps (initialize library, build packet, write packet).
+ In order to port your existing code, you will mainly be REMOVING
+ function calls and variables.
+
+ 1) Start with code removal:
+
+ - Remove all calls to libnet_init_packet() / packet malloc()ing and
+ all associated variables.
+ - Remove all calls to libnet_open_raw_sock() / libnet_open_link_layer()
+ and all associated variables.
+ - Remove all calls to libnet_do_checksum() and all associated
+ variables.
+
+ 2) Continue with code addition and modification:
+
+ - You will need a single "libnet_t *l" which is your libnet file
+ context and an error buffer:
+
+ libnet_t *l
+ char errbuf[LIBNET_ERRBUF_SIZE];
+
+ l = libnet_init(
+ LIBNET_RAW4, /* or LIBNET_LINK or LIBNET_RAW6 */
+ NULL, /* or device if you using LIBNET_LINK */
+ errbuf);
+
+ - The libnet_build functions are largely unchanged with a few
+ important differences:
+
+ 1) Packets headers MUST be stacked IN ORDER. This is
+ intuitive and shouldn't be a problem. Due to the way
+ individual packet header memory is allocated and how
+ packet pieces are combined to build a packet they HAVE to
+ be built IN ORDER, from the high end of the protocol stack
+ on down. ie: using the raw interface to build a NTP
+ packet, you would:
+ libnet_build_ntp(...)
+ libnet_build_udp(...)
+ libnet_build_ipv4(...)
+ To build the same packet using the LINK interface on
+ top of ethernet you would:
+ libnet_build_ntp(...)
+ libnet_build_udp(...)
+ libnet_build_ipv4(...)
+ libnet_build_ethernet(...)
+ 1a) There is the option now of using libnet_autobuild_ipv4()
+ and libnet_autobuild_ethernet() which have fewer
+ arguments and smaller stack frames and are a bit more
+ convenient.
+ 2) The libnet_build functions return a libnet_ptag_t datatype
+ on success or -1 on error. This ptag is your
+ "protocol/packet tag" so you can find this header again
+ if you needed to modify it later on. If you don't need
+ to modify the packet header you can throw this value
+ away. You should definitely check for error now on
+ your build functions. Alot's going on down there fellas.
+ 2a) NOTE that after packets are built, they may accessed
+ independently of construction order via the saved ptag.
+ 3) They NO LONGER ACCEPT BUFFER ARGUMENTS. This is ALL
+ done internally. The last TWO arguments are the libnet
+ context you created in your call to libnet_init() and
+ an OPTIONAL ptag argument. The ptag argument, if non-zero,
+ specifes a packet tag to an ALREADY EXISTING packet header
+ that will be OVERWRITTEN with the values specified in
+ this libnet_build function call. This is how you modify
+ existing packet header pieces. If this ptag is 0,
+ a new protocol block is allocated and the packet is
+ pushed down on the "protocol stack".
+ 4) For the functions that build headers that have checksums
+ these are NOW SPECIFIED AS AN ARGUMENT. This adds more
+ flexibility in how checksums are done (you can leave the
+ field 0, put in a random value, precompute it on your own,
+ or let the library do it). By default, when you build
+ a header, a "DO_CHECKSUM" flag will be set. This means
+ the library will compute the checksum for the header
+ and possibly over the data before the packet is written.
+ To clear this flag, there is a special macro you
+ can call on the ptag refering to that header.
+ 5) For the functions that have a length, it now specifies
+ the TOTAL packet length from that protocol unit on down.
+ For IP, that would be the entire packet length. For
+ TCP, that would be TCP and any possible data.
+ 6) Nomenclature support for the eventual support of ipv6
+ has been added.
+
+ libnet_ptag_t ip_tag;
+ libnet_ptag_t tcp_tag;
+
+ tcp_tag = libnet_build_tcp(
+ src_prt, /* source TCP port */
+ dst_prt, /* destination TCP port */
+ 0xffff, /* sequence number */
+ 0x53, /* acknowledgement number */
+ TH_SYN, /* control flags */
+ 1024, /* window size */
+ 0xd00d, /* checksum */
+ 0, /* urgent pointer */
+ LIBNET_TCP_H /* TCP packet size */
+ NULL, /* payload (none) */
+ 0, /* payload length */
+ l, /* libnet context */
+ 0); /* ptag */
+
+ ip_tag = libnet_build_ipv4(
+ LIBNET_TCP_H + LIBNET_IPV4_H,/* total packet len */
+ IPTOS_LOWDELAY, /* tos */
+ ip_id, /* IP ID */
+ 0, /* IP Frag */
+ 64, /* TTL */
+ IPPROTO_TCP, /* protocol */
+ 0, /* checksum */
+ src_ip, /* source ip */
+ dst_ip, /* dest ip */
+ NULL, /* payload (none) */
+ 0, /* payload size */
+ l, /* libnet context */
+ 0); /* ptag */
+
+ Now, if you wanted to modify one of these headers in a loop
+ somewhere you would:
+
+ int i;
+ for (ip_tag, tcp_tag = LIBNET_PTAG_INITIALIZER, i = 0; i < 10; i++)
+ {
+ tcp_tag = libnet_build_tcp(++src_prt, ..., l, tcp_tag);
+ ip_tag = libnet_build_ipv4(..., ++ip_id, ..., l, ip_tag);
+ /* do something */
+ }
+ Since we are specifying a ptag for an existing header, the
+ build function will NOT create a new header and append it to
+ the list, it will FIND the one referenced by the ptag and UPDATE
+ it. Since there is nothing new being created, order is NOT
+ important here.
+
+ Also note that it's perfectly fine to wrap the loop around the
+ initial building of the packets. Since we're initializing the
+ ptags (to be zero), the first call into the builder functions
+ will allocate the memory and create the packet blocks. These
+ calls will return ptag values. The next calls will modify
+ these headers since the ptags will not be NULL.
+
+ - Finally, we write the packet. Checksums are computed, by default
+ for each protocol header that requires one. If the user specifies
+ a non-zero value, by default, this will be used INSTEAD of a
+ libnet computed checksum. This behavior is overridable with:
+
+ Turn ON checksums for header referenced by ptag:
+ libnet_toggle_checksum(l, ptag, 1)
+
+ Turn OFF checksums for header referenced by ptag:
+ libnet_toggle_checksum(l, ptag, 0)
+
+ Note, the packet header MUST exist before you can toggle this setting.
+
+ int c;
+ c = libnet_write(l);
+
+ Boom. You're done. Now go read the sample code.
+
+EOF