|
|
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 { ! 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 */ ! 123: } __attribute__ ((__packed__)) n_eth_hdr_t; ! 124: ! 125: /* LLC header */ ! 126: typedef struct { ! 127: m_uint8_t dsap; ! 128: m_uint8_t ssap; ! 129: m_uint8_t ctrl; ! 130: } __attribute__ ((__packed__)) n_eth_llc_hdr_t; ! 131: ! 132: /* SNAP header */ ! 133: typedef struct { ! 134: m_uint8_t oui[3]; ! 135: m_uint16_t type; ! 136: } __attribute__ ((__packed__)) n_eth_snap_hdr_t; ! 137: ! 138: /* Cisco ISL header */ ! 139: typedef struct { ! 140: m_uint16_t hsa1; /* High bits of source MAC address */ ! 141: m_uint8_t hsa2; /* (in theory: 0x00-00-0c) */ ! 142: m_uint16_t vlan; /* VLAN + BPDU */ ! 143: m_uint16_t index; /* Index port of source */ ! 144: m_uint16_t res; /* Reserved for TokenRing and FDDI */ ! 145: } __attribute__ ((__packed__)) n_eth_isl_hdr_t; ! 146: ! 147: #define N_ISL_HDR_SIZE (sizeof(n_eth_llc_hdr_t) + sizeof(n_eth_isl_hdr_t)) ! 148: ! 149: /* Check for a broadcast/multicast ethernet address */ ! 150: static inline int eth_addr_is_mcast(n_eth_addr_t *addr) ! 151: { ! 152: return(addr->eth_addr_byte[0] & 1); ! 153: } ! 154: ! 155: /* Number of bits in a contiguous netmask */ ! 156: static inline int ip_bits_mask(n_ip_addr_t mask) ! 157: { ! 158: int prefix = 0; ! 159: ! 160: while(mask) { ! 161: prefix++; ! 162: mask = mask & (mask - 1); ! 163: } ! 164: return(prefix); ! 165: } ! 166: ! 167: /* Initialize IPv6 masks */ ! 168: void ipv6_init_masks(void); ! 169: ! 170: /* Convert an IPv4 address into a string */ ! 171: char *ip_ntoa(char *buffer,n_ip_addr_t ip_addr); ! 172: ! 173: /* Convert in IPv6 address into a string */ ! 174: char *ipv6_ntoa(char *buffer,n_ipv6_addr_t *ipv6_addr); ! 175: ! 176: /* Convert a string containing an IP address in binary */ ! 177: int ip_aton(n_ip_addr_t *ip_addr,char *ip_str); ! 178: ! 179: /* Convert an IPv6 address from string into binary */ ! 180: int ipv6_aton(n_ipv6_addr_t *ipv6_addr,char *ip_str); ! 181: ! 182: /* Parse an IPv4 CIDR prefix */ ! 183: int ip_parse_cidr(char *token,n_ip_addr_t *net_addr,n_ip_addr_t *net_mask); ! 184: ! 185: /* Parse an IPv6 CIDR prefix */ ! 186: int ipv6_parse_cidr(char *token,n_ipv6_addr_t *net_addr,u_int *net_mask); ! 187: ! 188: /* Create a new socket to connect to specified host */ ! 189: int udp_connect(int local_port,char *remote_host,int remote_port); ! 190: ! 191: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.