Annotation of embedaddon/libnet/doc/PACKET_BUILDING, revision 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>