Annotation of embedaddon/coova-chilli/src/pkt.h, revision 1.1.1.1

1.1       misho       1: /* 
                      2:  * Packet Headers
                      3:  * Copyright (C) 2003, 2004, 2005 Mondru AB.
                      4:  * Copyright (c) 2007 David Bird <david@coova.com>
                      5:  *
                      6:  * The contents of this file may be used under the terms of the GNU
                      7:  * General Public License Version 2, provided that the above copyright
                      8:  * notice and this permission notice is included in all copies or
                      9:  * substantial portions of the software.
                     10:  * 
                     11:  * The initial developer of the original code is
                     12:  * Jens Jakobsen <jj@chillispot.org>
                     13:  *
                     14:  */
                     15: 
                     16: 
                     17: #ifndef _PKT_H
                     18: #define _PKT_H
                     19: 
                     20: #define PKT_ETH_ALEN              6 /* Ethernet Address Length */
                     21: #define PKT_ETH_HLEN             14 /* Ethernet Header Length */
                     22: 
                     23: #define PKT_ETH_PROTO_IP     0x0800
                     24: #define PKT_ETH_PROTO_ARP    0x0806
                     25: #define PKT_ETH_PROTO_EAPOL  0x888e
                     26: 
                     27: #define PKT_IP_PLEN            1500 /* IP Payload Length */
                     28: #define PKT_IP_VER_HLEN        0x45 
                     29: #define PKT_IP_ALEN               4
                     30: #define PKT_IP_HLEN              20
                     31: 
                     32: #define PKT_IP_PROTO_ICMP         1 /* ICMP Protocol number */
                     33: #define PKT_IP_PROTO_TCP          6 /* TCP Protocol number */
                     34: #define PKT_IP_PROTO_UDP         17 /* UDP Protocol number */
                     35: #define PKT_IP_PROTO_GRE         47 /* GRE Protocol number */
                     36: 
                     37: #define PKT_UDP_HLEN              8
                     38: 
                     39: #define PKT_EAP_PLEN           1500 /* Dot1x Payload length */
                     40: 
                     41: #define DHCP_TAG_VLEN           255 /* Tag value always shorter than this */
                     42: #define EAPOL_TAG_VLEN          255 /* Tag value always shorter than this */
                     43: 
                     44: #define DHCP_HTYPE_ETH            1
                     45: #define DHCP_CHADDR_LEN          16 /* Length of client hardware address */
                     46: #define DHCP_SNAME_LEN           64 /* Length of server host name */
                     47: #define DHCP_FILE_LEN           128 /* Length of boot file name*/
                     48: #define DHCP_OPTIONS_LEN        312 /* Length of optional parameters field */
                     49: #define DHCP_MIN_LEN   28+16+64+128 /* Length of packet excluding options */
                     50: #define DHCP_LEN  DHCP_MIN_LEN + DHCP_OPTIONS_LEN
                     51: 
                     52: 
                     53: struct pkt_ethhdr_t {
                     54:   uint8_t  dst[PKT_ETH_ALEN];
                     55:   uint8_t  src[PKT_ETH_ALEN];
                     56:   uint16_t prot;
                     57: } __attribute__((packed));
                     58: 
                     59: 
                     60: struct pkt_iphdr_t {
                     61:   uint8_t  version_ihl;
                     62:   uint8_t  tos;
                     63:   uint16_t tot_len;
                     64:   uint16_t id;
                     65:   uint16_t frag_off;
                     66:   uint8_t  ttl;
                     67:   uint8_t  protocol;
                     68:   uint16_t check;
                     69:   uint32_t saddr;
                     70:   uint32_t daddr;
                     71: } __attribute__((packed));
                     72: 
                     73: 
                     74: struct pkt_ipphdr_t {
                     75:   /* Convenience structure:
                     76:      Same as pkt_iphdr_t, but also
                     77:      with ports (UDP and TCP packets) */
                     78:   uint8_t  version_ihl;
                     79:   uint8_t  tos;
                     80:   uint16_t tot_len;
                     81:   uint16_t id;
                     82:   uint16_t frag_off;
                     83:   uint8_t  ttl;
                     84:   uint8_t  protocol;
                     85:   uint16_t check;
                     86:   uint32_t saddr;
                     87:   uint32_t daddr;
                     88:   uint16_t sport;
                     89:   uint16_t dport;
                     90: } __attribute__((packed));
                     91: 
                     92: 
                     93: struct pkt_ippacket_t {
                     94:   struct pkt_ethhdr_t ethh;
                     95:   struct pkt_iphdr_t  iph;
                     96:   uint8_t payload[PKT_IP_PLEN];
                     97: } __attribute__((packed));
                     98: 
                     99: /*
                    100:   0      7 8     15 16    23 24    31  
                    101:   +--------+--------+--------+--------+ 
                    102:   |     Source      |   Destination   | 
                    103:   |      Port       |      Port       | 
                    104:   +--------+--------+--------+--------+ 
                    105:   |                 |                 | 
                    106:   |     Length      |    Checksum     | 
                    107:   +--------+--------+--------+--------+ 
                    108:   |                                     
                    109:   |          data octets ...            
                    110:   +---------------- ...                 
                    111:   
                    112:   User Datagram Header Format
                    113: */
                    114: 
                    115: struct pkt_udphdr_t {
                    116:   uint16_t src;
                    117:   uint16_t dst;
                    118:   uint16_t len;
                    119:   uint16_t check;
                    120: } __attribute__((packed));
                    121: 
                    122: /*
                    123:   TCP Header Format
                    124: 
                    125:     0                   1                   2                   3   
                    126:     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
                    127:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    128:    |          Source Port          |       Destination Port        |
                    129:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    130:    |                        Sequence Number                        |
                    131:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    132:    |                    Acknowledgment Number                      |
                    133:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    134:    |  Data |           |U|A|P|R|S|F|                               |
                    135:    | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
                    136:    |       |           |G|K|H|T|N|N|                               |
                    137:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    138:    |           Checksum            |         Urgent Pointer        |
                    139:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    140:    |                    Options                    |    Padding    |
                    141:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    142:    |                             data                              |
                    143:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    144: */
                    145: 
                    146: struct pkt_tcphdr_t {
                    147:   uint16_t src;
                    148:   uint16_t dst;
                    149:   uint32_t seq;
                    150:   uint32_t ack;
                    151:   uint16_t flags;
                    152:   uint16_t win;
                    153:   uint16_t check;
                    154:   uint16_t urgent;
                    155:   uint32_t options;
                    156: } __attribute__((packed));
                    157: 
                    158: 
                    159: /*
                    160:   0                   1                   2                   3
                    161:    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
                    162:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    163:    |     op (1)    |   htype (1)   |   hlen (1)    |   hops (1)    |
                    164:    +---------------+---------------+---------------+---------------+
                    165:    |                            xid (4)                            |
                    166:    +-------------------------------+-------------------------------+
                    167:    |           secs (2)            |           flags (2)           |
                    168:    +-------------------------------+-------------------------------+
                    169:    |                          ciaddr  (4)                          |
                    170:    +---------------------------------------------------------------+
                    171:    |                          yiaddr  (4)                          |
                    172:    +---------------------------------------------------------------+
                    173:    |                          siaddr  (4)                          |
                    174:    +---------------------------------------------------------------+
                    175:    |                          giaddr  (4)                          |
                    176:    +---------------------------------------------------------------+
                    177:    |                                                               |
                    178:    |                          chaddr  (16)                         |
                    179:    |                                                               |
                    180:    |                                                               |
                    181:    +---------------------------------------------------------------+
                    182:    |                                                               |
                    183:    |                          sname   (64)                         |
                    184:    +---------------------------------------------------------------+
                    185:    |                                                               |
                    186:    |                          file    (128)                        |
                    187:    +---------------------------------------------------------------+
                    188:    |                                                               |
                    189:    |                          options (variable)                   |
                    190:    +---------------------------------------------------------------+
                    191: */
                    192: 
                    193: struct dhcp_packet_t { /* From RFC 2131 */
                    194:   uint8_t op;       /* 1 Message op code / message type.  1 = BOOTREQUEST, 2 = BOOTREPLY */
                    195:   uint8_t htype;    /* 1 Hardware address type, see ARP section in "Assigned Numbers" RFC */
                    196:   uint8_t hlen;     /* 1 Hardware address length (e.g. '6' for 10mb ethernet).*/
                    197:   uint8_t hops;     /* 1 Client sets to zero, optionally used by relay agents when booting via a relay agent.*/
                    198:   uint32_t xid;     /* 4 Transaction ID, a random number chosen by the client, used by the client and
                    199:                       server to associate messages and responses between a client and a server. */
                    200:   uint16_t secs;    /* 2 Filled in by client, seconds elapsed since client began address acquisition or renewal process.*/
                    201:   uint8_t flags[2]; /* 2  Flags (see figure 2).*/
                    202:   uint32_t ciaddr;  /* 4 Client IP address; only filled in if client is in BOUND, RENEW or REBINDING state
                    203:                       and can respond to ARP requests.*/
                    204:   uint32_t yiaddr;  /* 4 'your' (client) IP address.*/
                    205:   uint32_t siaddr;  /* 4 IP address of next server to use in bootstrap; returned in DHCPOFFER, DHCPACK by server.*/
                    206:   uint32_t giaddr;  /* 4 Relay agent IP address, used in booting via a relay agent.*/
                    207:   uint8_t chaddr[DHCP_CHADDR_LEN];   /* 16 Client hardware address.*/
                    208:   uint8_t sname[DHCP_SNAME_LEN];     /* 64 Optional server host name, null terminated string.*/
                    209:   uint8_t file[DHCP_FILE_LEN];       /* 128 Boot file name, null terminated string; "generic" name or null in
                    210:                                        DHCPDISCOVER, fully qualified directory-path name in DHCPOFFER.*/
                    211:   uint8_t options[DHCP_OPTIONS_LEN]; /* var Optional parameters field.  See the options documents for a list
                    212:                                        of defined options.*/
                    213: } __attribute__((packed));
                    214: 
                    215: 
                    216: struct dhcp_fullpacket_t {
                    217:   struct pkt_ethhdr_t  ethh;
                    218:   struct pkt_iphdr_t   iph;
                    219:   struct pkt_udphdr_t  udph;
                    220:   struct dhcp_packet_t dhcp;
                    221: } __attribute__((packed));
                    222: 
                    223: 
                    224: struct dhcp_tag_t {
                    225:   uint8_t t;
                    226:   uint8_t l;
                    227:   uint8_t v[DHCP_TAG_VLEN];
                    228: } __attribute__((packed));
                    229: 
                    230: 
                    231: struct arp_packet_t { /* From RFC 826 */
                    232:   uint16_t hrd; /* 16.bit: (ar$hrd) Hardware address space (e.g.,
                    233:                    Ethernet, Packet Radio Net.) */
                    234:   uint16_t pro; /* 16.bit: (ar$pro) Protocol address space.  For
                    235:                    Ethernet hardware, this is from the set of type
                    236:                    fields ether_typ$<protocol>. */
                    237:   uint8_t hln;  /* 8.bit: (ar$hln) byte length of each hardware address */
                    238:   uint8_t pln;  /* 8.bit: (ar$pln) byte length of each protocol address */
                    239:   uint16_t op;  /* 16.bit: (ar$op)  opcode (ares_op$REQUEST | ares_op$REPLY) */
                    240:   uint8_t sha[PKT_ETH_ALEN]; /* nbytes: (ar$sha) Hardware address of
                    241:                    sender of this packet, n from the ar$hln field. */
                    242:   uint8_t spa[PKT_IP_ALEN];  /* mbytes: (ar$spa) Protocol address of
                    243:                    sender of this packet, m from the ar$pln field. */
                    244:   uint8_t tha[PKT_ETH_ALEN]; /* nbytes: (ar$tha) Hardware address of
                    245:                  target of this packet (if known). */
                    246:   uint8_t tpa[PKT_IP_ALEN]; /* mbytes: (ar$tpa) Protocol address of
                    247:                                 target.*/
                    248: } __attribute__((packed));
                    249: 
                    250: 
                    251: struct arp_fullpacket_t {
                    252:   struct pkt_ethhdr_t ethh;
                    253:   struct arp_packet_t arp;
                    254: } __attribute__((packed));
                    255: 
                    256: 
                    257: struct dns_packet_t { /* From RFC 1035 */
                    258:   uint16_t id;      /* 16 bit: Generated by requester. Copied in reply */
                    259:   uint16_t flags;   /* 16 bit: Flags */
                    260:   uint16_t qdcount; /* 16 bit: Number of questions */
                    261:   uint16_t ancount; /* 16 bit: Number of answer records */
                    262:   uint16_t nscount; /* 16 bit: Number of name servers */
                    263:   uint16_t arcount; /* 16 bit: Number of additional records */
                    264:   uint8_t  records[PKT_IP_PLEN];
                    265: } __attribute__((packed));
                    266: 
                    267: 
                    268: struct dns_fullpacket_t {
                    269:   struct pkt_ethhdr_t ethh;
                    270:   struct pkt_iphdr_t iph;
                    271:   struct pkt_udphdr_t udph;
                    272:   struct dns_packet_t dns;
                    273: } __attribute__((packed));
                    274: 
                    275: 
                    276: struct pkt_dot1xhdr_t {
                    277:   uint8_t  ver;
                    278:   uint8_t  type;
                    279:   uint16_t len;
                    280: } __attribute__((packed));
                    281: 
                    282: 
                    283: struct eap_packet_t {
                    284:   uint8_t  code;
                    285:   uint8_t  id;
                    286:   uint16_t length;
                    287:   uint8_t  type;
                    288:   uint8_t  payload[PKT_EAP_PLEN];
                    289: } __attribute__((packed));
                    290: 
                    291: 
                    292: struct dot1xpacket_t {
                    293:   struct pkt_ethhdr_t   ethh;
                    294:   struct pkt_dot1xhdr_t dot1x;
                    295:   struct eap_packet_t   eap;
                    296: } __attribute__((packed));
                    297: 
                    298: 
                    299: struct eapol_tag_t {
                    300:   uint8_t t;
                    301:   uint8_t l;
                    302:   uint8_t v[EAPOL_TAG_VLEN];
                    303: } __attribute__((packed));
                    304: 
                    305: int chksum(struct pkt_iphdr_t *iph);
                    306: 
                    307: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>