libnet: libnet-structures.h Source File

Main Page | Data Structures | File List | Data Fields | Globals

# libnet-structures.h

    00001 /*
    00002  *  $Id: libnet-structures.h,v 1.16 2004/02/16 23:13:38 mike Exp $
    00003  *
    00004  *  libnet-structures.h - Network routine library structures header file
    00005  *
    00006  *  Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
    00007  *  All rights reserved.
    00008  *
    00009  * Redistribution and use in source and binary forms, with or without
    00010  * modification, are permitted provided that the following conditions
    00011  * are met:
    00012  * 1. Redistributions of source code must retain the above copyright
    00013  *    notice, this list of conditions and the following disclaimer.
    00014  * 2. Redistributions in binary form must reproduce the above copyright
    00015  *    notice, this list of conditions and the following disclaimer in the
    00016  *    documentation and/or other materials provided with the distribution.
    00017  *
    00018  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
    00019  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    00020  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    00021  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
    00022  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    00023  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    00024  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    00025  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    00026  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    00027  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    00028  * SUCH DAMAGE.
    00029  *
    00030  */
    00031
    00032 #ifndef __LIBNET_STRUCTURES_H
    00033 #define __LIBNET_STRUCTURES_H
    00034
    00035 #if ((__WIN32__) && !(__CYGWIN__))
    00036 #include "Packet32.h"
    00037 #endif
    00038
    00039 /* port list chain structure */
    00040 typedef struct libnet_port_list_chain libnet_plist_t;
    00041 struct libnet_port_list_chain
    00042 {
    00043     u_int16_t node;                     /* node number */
    00044     u_int16_t bport;                    /* beggining port */
    00045     u_int16_t eport;                    /* terminating port */
    00046     u_int8_t  id;                       /* global array offset */
    00047     libnet_plist_t *next;               /* next node in the list */
    00048 };
    00049
    00050
    00051 /* libnet statistics structure */
    00052 struct libnet_stats
    00053 {
    00054 #if (!defined(__WIN32__) || (__CYGWIN__))
    00055     u_int64_t packets_sent;             /* packets sent */
    00056     u_int64_t packet_errors;            /* packets errors */
    00057     u_int64_t bytes_written;            /* bytes written */
    00058 #else
    00059     __int64 packets_sent;               /* packets sent */
    00060     __int64 packet_errors;              /* packets errors */
    00061     __int64 bytes_written;              /* bytes written */
    00062 #endif
    00063 };
    00064
    00065
    00066 /*
    00067  *  Libnet ptags are how we identify specific protocol blocks inside the
    00068  *  list.
    00069  */
    00070 typedef int32_t libnet_ptag_t;
    00071 #define LIBNET_PTAG_INITIALIZER         0
    00072
    00073
    00074 /*
    00075  *  Libnet generic protocol block memory object.  Sort of a poor man's mbuf.
    00076  */
    00077 struct libnet_protocol_block
    00078 {
    00079     u_int8_t *buf;                      /* protocol buffer */
    00080     u_int32_t b_len;                    /* length of buf */
    00081     u_int16_t h_len;                    /* header length (for checksumming) */
    00082     u_int32_t copied;                   /* bytes copied */
    00083     u_int8_t type;                      /* type of pblock */
    00084 /* this needs to be updated every time a new packet builder is added */
    00085 #define LIBNET_PBLOCK_ARP_H             0x01    /* ARP header */
    00086 #define LIBNET_PBLOCK_DHCPV4_H          0x02    /* DHCP v4 header */
    00087 #define LIBNET_PBLOCK_DNSV4_H           0x03    /* DNS v4 header */
    00088 #define LIBNET_PBLOCK_ETH_H             0x04    /* Ethernet header */
    00089 #define LIBNET_PBLOCK_ICMPV4_H          0x05    /* ICMP v4 base header */
    00090 #define LIBNET_PBLOCK_ICMPV4_ECHO_H     0x06    /* ICMP v4 echo header */
    00091 #define LIBNET_PBLOCK_ICMPV4_MASK_H     0x07    /* ICMP v4 mask header */
    00092 #define LIBNET_PBLOCK_ICMPV4_UNREACH_H  0x08    /* ICMP v4 unreach header */
    00093 #define LIBNET_PBLOCK_ICMPV4_TIMXCEED_H 0x09    /* ICMP v4 exceed header */
    00094 #define LIBNET_PBLOCK_ICMPV4_REDIRECT_H 0x0a    /* ICMP v4 redirect header */
    00095 #define LIBNET_PBLOCK_ICMPV4_TS_H       0x0b    /* ICMP v4 timestamp header */
    00096 #define LIBNET_PBLOCK_IGMP_H            0x0c    /* IGMP header */
    00097 #define LIBNET_PBLOCK_IPV4_H            0x0d    /* IP v4 header */
    00098 #define LIBNET_PBLOCK_IPO_H             0x0e    /* IP v4 options */
    00099 #define LIBNET_PBLOCK_IPDATA            0x0f    /* IP data */
    00100 #define LIBNET_PBLOCK_OSPF_H            0x10    /* OSPF base header */
    00101 #define LIBNET_PBLOCK_OSPF_HELLO_H      0x11    /* OSPF hello header */
    00102 #define LIBNET_PBLOCK_OSPF_DBD_H        0x12    /* OSPF dbd header */
    00103 #define LIBNET_PBLOCK_OSPF_LSR_H        0x13    /* OSPF lsr header */
    00104 #define LIBNET_PBLOCK_OSPF_LSU_H        0x14    /* OSPF lsu header */
    00105 #define LIBNET_PBLOCK_OSPF_LSA_H        0x15    /* OSPF lsa header */
    00106 #define LIBNET_PBLOCK_OSPF_AUTH_H       0x16    /* OSPF auth header */
    00107 #define LIBNET_PBLOCK_OSPF_CKSUM        0x17    /* OSPF checksum header */
    00108 #define LIBNET_PBLOCK_LS_RTR_H          0x18    /* linkstate rtr header */
    00109 #define LIBNET_PBLOCK_LS_NET_H          0x19    /* linkstate net header */
    00110 #define LIBNET_PBLOCK_LS_SUM_H          0x1a    /* linkstate as sum header */
    00111 #define LIBNET_PBLOCK_LS_AS_EXT_H       0x1b    /* linkstate as ext header */
    00112 #define LIBNET_PBLOCK_NTP_H             0x1c    /* NTP header */
    00113 #define LIBNET_PBLOCK_RIP_H             0x1d    /* RIP header */
    00114 #define LIBNET_PBLOCK_TCP_H             0x1e    /* TCP header */
    00115 #define LIBNET_PBLOCK_TCPO_H            0x1f    /* TCP options */
    00116 #define LIBNET_PBLOCK_TCPDATA           0x20    /* TCP data */
    00117 #define LIBNET_PBLOCK_UDP_H             0x21    /* UDP header */
    00118 #define LIBNET_PBLOCK_VRRP_H            0x22    /* VRRP header */
    00119 #define LIBNET_PBLOCK_DATA_H            0x23    /* generic data */
    00120 #define LIBNET_PBLOCK_CDP_H             0x24    /* CDP header */
    00121 #define LIBNET_PBLOCK_IPSEC_ESP_HDR_H   0x25    /* IPSEC ESP header */
    00122 #define LIBNET_PBLOCK_IPSEC_ESP_FTR_H   0x26    /* IPSEC ESP footer */
    00123 #define LIBNET_PBLOCK_IPSEC_AH_H        0x27    /* IPSEC AH header */
    00124 #define LIBNET_PBLOCK_802_1Q_H          0x28    /* 802.1q header */
    00125 #define LIBNET_PBLOCK_802_2_H           0x29    /* 802.2 header */
    00126 #define LIBNET_PBLOCK_802_2SNAP_H       0x2a    /* 802.2 SNAP header */
    00127 #define LIBNET_PBLOCK_802_3_H           0x2b    /* 802.3 header */
    00128 #define LIBNET_PBLOCK_STP_CONF_H        0x2c    /* STP configuration header */
    00129 #define LIBNET_PBLOCK_STP_TCN_H         0x2d    /* STP TCN header */
    00130 #define LIBNET_PBLOCK_ISL_H             0x2e    /* ISL header */
    00131 #define LIBNET_PBLOCK_IPV6_H            0x2f    /* IP v6 header */
    00132 #define LIBNET_PBLOCK_802_1X_H          0x30    /* 802.1x header */
    00133 #define LIBNET_PBLOCK_RPC_CALL_H        0x31    /* RPC Call header */
    00134 #define LIBNET_PBLOCK_MPLS_H            0x32    /* MPLS header */
    00135 #define LIBNET_PBLOCK_FDDI_H            0x33    /* FDDI header */
    00136 #define LIBNET_PBLOCK_TOKEN_RING_H      0x34    /* TOKEN RING header */
    00137 #define LIBNET_PBLOCK_BGP4_HEADER_H     0x35    /* BGP4 header */
    00138 #define LIBNET_PBLOCK_BGP4_OPEN_H       0x36    /* BGP4 open header */
    00139 #define LIBNET_PBLOCK_BGP4_UPDATE_H     0x37    /* BGP4 update header */
    00140 #define LIBNET_PBLOCK_BGP4_NOTIFICATION_H 0x38  /* BGP4 notification header */
    00141 #define LIBNET_PBLOCK_GRE_H             0x39    /* GRE header */
    00142 #define LIBNET_PBLOCK_GRE_SRE_H         0x3a    /* GRE SRE header */
    00143 #define LIBNET_PBLOCK_IPV6_FRAG_H       0x3b    /* IPv6 frag header */
    00144 #define LIBNET_PBLOCK_IPV6_ROUTING_H    0x3c    /* IPv6 routing header */
    00145 #define LIBNET_PBLOCK_IPV6_DESTOPTS_H   0x3d    /* IPv6 dest opts header */
    00146 #define LIBNET_PBLOCK_IPV6_HBHOPTS_H    0x3e    /* IPv6 hop/hop opts header */
    00147 #define LIBNET_PBLOCK_SEBEK_H           0x3f    /* Sebek header */
    00148     u_int8_t flags;                             /* control flags */
    00149 #define LIBNET_PBLOCK_DO_CHECKSUM       0x01    /* needs a checksum */
    00150     libnet_ptag_t ptag;                 /* protocol block tag */
    00151     struct libnet_protocol_block *next; /* next pblock */
    00152     struct libnet_protocol_block *prev; /* prev pblock */
    00153 };
    00154 typedef struct libnet_protocol_block libnet_pblock_t;
    00155
    00156
    00157 /*
    00158  *  Libnet context
    00159  *  Opaque structure.  Nothing in here should ever been touched first hand by
    00160  *  the applications programmer.
    00161  */
    00162 struct libnet_context
    00163 {
    00164 #if ((__WIN32__) && !(__CYGWIN__))
    00165     SOCKET fd;
    00166     LPADAPTER  lpAdapter;
    00167 #else
    00168     int fd;                             /* file descriptor of packet device */
    00169 #endif
    00170     int injection_type;                 /* raw (ipv4 or ipv6) or link */
    00171 #define LIBNET_LINK     0x00            /* link-layer interface */
    00172 #define LIBNET_RAW4     0x01            /* raw socket interface (ipv4) */
    00173 #define LIBNET_RAW6     0x02            /* raw socket interface (ipv6) */
    00174 /* the following should actually set a flag in the flags variable above */
    00175 #define LIBNET_LINK_ADV 0x08            /* advanced mode link-layer */
    00176 #define LIBNET_RAW4_ADV 0x09            /* advanced mode raw socket (ipv4) */
    00177 #define LIBNET_RAW6_ADV 0x0a            /* advanced mode raw socket (ipv6) */
    00178 #define LIBNET_ADV_MASK 0x08            /* mask to determine adv mode */
    00179
    00180     libnet_pblock_t *protocol_blocks;   /* protocol headers / data */
    00181     libnet_pblock_t *pblock_end;        /* last node in list */
    00182
    00183     int link_type;                      /* link-layer type */
    00184     int link_offset;                    /* link-layer header size */
    00185     int aligner;                        /* used to align packets */
    00186     char *device;                       /* device name */
    00187
    00188     struct libnet_stats stats;          /* statistics */
    00189     libnet_ptag_t ptag_state;           /* state holder for pblock tag */
    00190     char label[LIBNET_LABEL_SIZE];      /* textual label for cq interface */
    00191
    00192     char err_buf[LIBNET_ERRBUF_SIZE];   /* error buffer */
    00193     u_int32_t total_size;               /* total size */
    00194 };
    00195 typedef struct libnet_context libnet_t;
    00196
    00197 /*
    00198  *  Libnet context queue structure
    00199  *  Opaque structure.  Nothing in here should ever been touched first hand by
    00200  *  the applications programmer.
    00201  */
    00202 typedef struct _libnet_context_queue libnet_cq_t;
    00203 struct _libnet_context_queue
    00204 {
    00205     libnet_t *context;                  /* pointer to libnet context */
    00206     libnet_cq_t *next;                  /* next node in the list */
    00207     libnet_cq_t *prev;                  /* previous node in the list */
    00208 };
    00209
    00210 struct _libnet_context_queue_descriptor
    00211 {
    00212     u_int32_t node;                     /* number of nodes in the list */
    00213     u_int32_t cq_lock;                  /* lock status */
    00214     libnet_cq_t *current;               /* current context */
    00215 };
    00216 typedef struct _libnet_context_queue_descriptor libnet_cqd_t;
    00217
    00218 #endif  /* __LIBNET_STRUCTURES_H */
    00219
    00220 /* EOF */