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>