Annotation of embedaddon/coova-chilli/src/pkt.h, revision 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>