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>