Annotation of cf/net.h, revision 1.1.1.4

1.1       root        1: /*
                      2:  * Copyright (c) 2006 Christophe Fillot.
                      3:  * E-mail: [email protected]
                      4:  *
                      5:  * net.h: Protocol Headers and Constants Definitions.
                      6:  */
                      7: 
                      8: #ifndef __NET_H__
                      9: #define __NET_H__  1
                     10: 
                     11: #include "utils.h"
                     12: 
                     13: #define N_IP_ADDR_LEN   4 
                     14: #define N_IP_ADDR_BITS  32
                     15: 
                     16: #define N_IPV6_ADDR_LEN   16
                     17: #define N_IPV6_ADDR_BITS  128
                     18: 
                     19: /* IPv4 Address definition */
                     20: typedef m_uint32_t n_ip_addr_t;
                     21: 
                     22: /* IP Network definition */
                     23: typedef struct {
                     24:    n_ip_addr_t net_addr;
                     25:    n_ip_addr_t net_mask;
                     26: }n_ip_network_t;
                     27: 
                     28: /* IPv6 Address definition */
                     29: typedef struct {
                     30:    union {
                     31:       m_uint32_t u6_addr32[4];
                     32:       m_uint16_t u6_addr16[8];
                     33:       m_uint8_t  u6_addr8[16];
                     34:    }ip6;
                     35: }n_ipv6_addr_t;
                     36: 
                     37: /* IPv6 Network definition */
                     38: typedef struct {
                     39:    n_ipv6_addr_t net_addr;
                     40:    u_int net_mask;
                     41: }n_ipv6_network_t;
                     42: 
                     43: /* IP: Common Protocols */
                     44: #define N_IP_PROTO_ICMP    1
                     45: #define N_IP_PROTO_IGMP    2
                     46: #define N_IP_PROTO_TCP     6
                     47: #define N_IP_PROTO_UDP     17
                     48: #define N_IP_PROTO_IPV6    41
                     49: #define N_IP_PROTO_GRE     47
                     50: #define N_IP_PROTO_ESP     50
                     51: #define N_IP_PROTO_AH      51
                     52: #define N_IP_PROTO_ICMPV6  58
                     53: #define N_IP_PROTO_EIGRP   88
                     54: #define N_IP_PROTO_OSPF    89
                     55: #define N_IP_PROTO_PIM     103
                     56: #define N_IP_PROTO_SCTP    132
                     57: #define N_IP_PROTO_MAX     256
                     58: 
                     59: #define N_IP_OFFMASK   0x1fff
                     60: 
                     61: /* Maximum number of ports */
                     62: #define N_IP_PORT_MAX  65536
                     63: 
                     64: /* TCP: Header Flags */
                     65: #define N_TCP_FIN    0x01
                     66: #define N_TCP_SYN    0x02
                     67: #define N_TCP_RST    0x04
                     68: #define N_TCP_PUSH   0x08
                     69: #define N_TCP_ACK    0x10
                     70: #define N_TCP_URG    0x20
                     71: 
                     72: #define N_TCP_FLAGMASK   0x3F
                     73: 
                     74: /* IPv6 Header Codes */
                     75: #define N_IPV6_PROTO_ICMP       58
                     76: #define N_IPV6_OPT_HOP_BY_HOP    0   /* Hop-by-Hop header */
                     77: #define N_IPV6_OPT_DST          60   /* Destination Options Header */
                     78: #define N_IPV6_OPT_ROUTE        43   /* Routing header */
                     79: #define N_IPV6_OPT_FRAG         44   /* Fragment Header */
                     80: #define N_IPV6_OPT_AH           51   /* Authentication Header */
                     81: #define N_IPV6_OPT_ESP          50   /* Encryption Security Payload */
                     82: #define N_IPV6_OPT_COMP        108   /* Payload Compression Protocol */
                     83: #define N_IPV6_OPT_END          59   /* No more headers */
                     84: 
                     85: /* Standard Ethernet MTU */
                     86: #define N_ETH_MTU   1500
                     87: 
                     88: /* Ethernet Constants */
                     89: #define N_ETH_ALEN  6
                     90: #define N_ETH_HLEN  sizeof(n_eth_hdr_t)
                     91: 
                     92: /* Minimum size for ethernet payload */
                     93: #define N_ETH_MIN_DATA_LEN   46
                     94: #define N_ETH_MIN_FRAME_LEN  (N_ETH_MIN_DATA_LEN + N_ETH_HLEN)
                     95: 
                     96: #define N_ETH_PROTO_IP       0x0800
                     97: #define N_ETH_PROTO_IPV6     0x86DD
                     98: #define N_ETH_PROTO_ARP      0x0806
                     99: #define N_ETH_PROTO_DOT1Q    0x8100
                    100: #define N_ETH_PROTO_DOT1Q_2  0x9100
                    101: #define N_ETH_PROTO_DOT1Q_3  0x9200
                    102: #define N_ETH_PROTO_MPLS     0x8847
                    103: #define N_ETH_PROTO_MPLS_MC  0x8848
                    104: #define N_ETH_PROTO_LOOP     0x9000
                    105: 
                    106: /* size needed for a string buffer */
                    107: #define N_ETH_SLEN  (N_ETH_ALEN*3)
                    108: 
                    109: /* ARP opcodes */
                    110: #define N_ARP_REQUEST  0x1
                    111: #define N_ARP_REPLY    0x2
                    112: 
                    113: /* Ethernet Address */
                    114: typedef struct {
                    115:    m_uint8_t eth_addr_byte[N_ETH_ALEN];
                    116: } __attribute__ ((__packed__)) n_eth_addr_t;
                    117: 
                    118: /* Ethernet Header */
                    119: typedef struct {
1.1.1.3   root      120:    n_eth_addr_t daddr;    /* destination eth addr */
                    121:    n_eth_addr_t saddr;    /* source ether addr    */
                    122:    m_uint16_t   type;     /* packet type ID field */
1.1       root      123: } __attribute__ ((__packed__)) n_eth_hdr_t;
                    124: 
1.1.1.3   root      125: /* 802.1Q Ethernet Header */
                    126: typedef struct {
                    127:    n_eth_addr_t daddr;    /* destination eth addr */
                    128:    n_eth_addr_t saddr;    /* source ether addr    */
                    129:    m_uint16_t   type;     /* packet type ID field (0x8100) */
                    130:    m_uint16_t   vlan_id;  /* VLAN id + CoS */
                    131: } __attribute__ ((__packed__)) n_eth_dot1q_hdr_t;
                    132: 
1.1       root      133: /* LLC header */
                    134: typedef struct {
                    135:    m_uint8_t dsap;
                    136:    m_uint8_t ssap;
                    137:    m_uint8_t ctrl;
                    138: } __attribute__ ((__packed__)) n_eth_llc_hdr_t;
                    139: 
                    140: /* SNAP header */
                    141: typedef struct {
                    142:    m_uint8_t oui[3];
                    143:    m_uint16_t type;
                    144: } __attribute__ ((__packed__)) n_eth_snap_hdr_t;
                    145: 
                    146: /* Cisco ISL header */
                    147: typedef struct {
1.1.1.4 ! root      148:    m_uint16_t hsa1;       /* High bits of source MAC address */
        !           149:    m_uint8_t  hsa2;       /* (in theory: 0x00-00-0c) */
        !           150:    m_uint16_t vlan;       /* VLAN + BPDU */
        !           151:    m_uint16_t index;      /* Index port of source */
        !           152:    m_uint16_t res;        /* Reserved for TokenRing and FDDI */
1.1       root      153: } __attribute__ ((__packed__)) n_eth_isl_hdr_t;
                    154: 
                    155: #define N_ISL_HDR_SIZE  (sizeof(n_eth_llc_hdr_t) + sizeof(n_eth_isl_hdr_t))
                    156: 
1.1.1.4 ! root      157: /* Cisco SCP/RBCP header */
        !           158: typedef struct {
        !           159:    m_uint8_t sa;          /* Source Address */
        !           160:    m_uint8_t da;          /* Destination Address */
        !           161:    m_uint16_t len;        /* Data Length */
        !           162:    m_uint8_t dsap;        /* Destination Service Access Point */
        !           163:    m_uint8_t ssap;        /* Source Service Access Point */
        !           164:    m_uint16_t opcode;     /* Opcode */
        !           165:    m_uint16_t seqno;      /* Sequence Number */
        !           166:    m_uint8_t flags;       /* Flags: command/response */
        !           167:    m_uint8_t unk1;        /* Unknown */
        !           168:    m_uint16_t unk2;       /* Unknown */
        !           169:    m_uint16_t unk3;       /* Unknown */
        !           170: } __attribute__ ((__packed__)) n_scp_hdr_t;
        !           171: 
        !           172: /* Check for a broadcast ethernet address */
        !           173: static inline int eth_addr_is_bcast(n_eth_addr_t *addr)
        !           174: {
        !           175:    static const char *bcast_addr = "\xff\xff\xff\xff\xff\xff";
        !           176:    return(!memcmp(addr,bcast_addr,6));
        !           177: 
        !           178: }
        !           179: 
1.1       root      180: /* Check for a broadcast/multicast ethernet address */
                    181: static inline int eth_addr_is_mcast(n_eth_addr_t *addr)
                    182: {
                    183:    return(addr->eth_addr_byte[0] & 1);
                    184: }
                    185: 
1.1.1.3   root      186: /* Check for Cisco ISL destination address */
                    187: static inline int eth_addr_is_cisco_isl(n_eth_addr_t *addr)
                    188: {
                    189:    static const char *isl_addr = "\x01\x00\x0c\x00\x00";
                    190:    return(!memcmp(addr,isl_addr,5));  /* only 40 bits to compare */
                    191: }
                    192: 
                    193: /* Check for a SNAP header */
                    194: static inline int eth_llc_check_snap(n_eth_llc_hdr_t *llc_hdr)
                    195: {
                    196:    return((llc_hdr->dsap == 0xAA) &&
                    197:           (llc_hdr->ssap == 0xAA) &&
                    198:           (llc_hdr->ctrl == 0x03));
                    199: }
                    200: 
1.1       root      201: /* Number of bits in a contiguous netmask */
                    202: static inline int ip_bits_mask(n_ip_addr_t mask)
                    203: {
                    204:    int prefix = 0;
                    205: 
                    206:    while(mask) {
                    207:       prefix++;
                    208:       mask = mask & (mask - 1);
                    209:    }
                    210:    return(prefix);
                    211: }
                    212: 
                    213: /* Initialize IPv6 masks */
                    214: void ipv6_init_masks(void);
                    215: 
                    216: /* Convert an IPv4 address into a string */
1.1.1.2   root      217: char *n_ip_ntoa(char *buffer,n_ip_addr_t ip_addr);
1.1       root      218: 
                    219: /* Convert in IPv6 address into a string */
1.1.1.2   root      220: char *n_ipv6_ntoa(char *buffer,n_ipv6_addr_t *ipv6_addr);
1.1       root      221: 
                    222: /* Convert a string containing an IP address in binary */
1.1.1.2   root      223: int n_ip_aton(n_ip_addr_t *ip_addr,char *ip_str);
1.1       root      224: 
                    225: /* Convert an IPv6 address from string into binary */
1.1.1.2   root      226: int n_ipv6_aton(n_ipv6_addr_t *ipv6_addr,char *ip_str);
1.1       root      227: 
                    228: /* Parse an IPv4 CIDR prefix */
                    229: int ip_parse_cidr(char *token,n_ip_addr_t *net_addr,n_ip_addr_t *net_mask);
                    230: 
                    231: /* Parse an IPv6 CIDR prefix */
                    232: int ipv6_parse_cidr(char *token,n_ipv6_addr_t *net_addr,u_int *net_mask);
                    233: 
1.1.1.3   root      234: /* Parse a MAC address */
                    235: int parse_mac_addr(n_eth_addr_t *addr,char *str);
                    236: 
                    237: /* Convert an Ethernet address into a string */
                    238: char *n_eth_ntoa(char *buffer,n_eth_addr_t *addr,int format);
                    239: 
1.1       root      240: /* Create a new socket to connect to specified host */
                    241: int udp_connect(int local_port,char *remote_host,int remote_port);
                    242: 
1.1.1.3   root      243: /* Listen on the specified port */
1.1.1.4 ! root      244: int ip_listen(char *ip_addr,int port,int sock_type,int max_fd,int fd_array[]);
        !           245: 
        !           246: /* ISL rewrite */
        !           247: void cisco_isl_rewrite(m_uint8_t *pkt,m_uint32_t tot_len);
1.1.1.3   root      248: 
1.1       root      249: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.