From a102f845404461bb3dade04fe3cdc754949bd248 Mon Sep 17 00:00:00 2001 From: Nathan Binkert Date: Tue, 17 Mar 2009 12:49:03 -0700 Subject: includes: add ext to the includes path. move dnet to the correct place so that we use this --HG-- rename : ext/dnet/dnet/addr.h => ext/dnet/addr.h rename : ext/dnet/dnet/arp.h => ext/dnet/arp.h rename : ext/dnet/dnet/blob.h => ext/dnet/blob.h rename : ext/dnet/dnet/eth.h => ext/dnet/eth.h rename : ext/dnet/dnet/fw.h => ext/dnet/fw.h rename : ext/dnet/dnet/icmp.h => ext/dnet/icmp.h rename : ext/dnet/dnet/intf.h => ext/dnet/intf.h rename : ext/dnet/dnet/ip.h => ext/dnet/ip.h rename : ext/dnet/dnet/ip6.h => ext/dnet/ip6.h rename : ext/dnet/dnet/os.h => ext/dnet/os.h rename : ext/dnet/dnet/rand.h => ext/dnet/rand.h rename : ext/dnet/dnet/route.h => ext/dnet/route.h rename : ext/dnet/dnet/tcp.h => ext/dnet/tcp.h rename : ext/dnet/dnet/udp.h => ext/dnet/udp.h --- ext/dnet/addr.h | 67 +++++++ ext/dnet/arp.h | 103 +++++++++++ ext/dnet/blob.h | 56 ++++++ ext/dnet/dnet/addr.h | 67 ------- ext/dnet/dnet/arp.h | 103 ----------- ext/dnet/dnet/blob.h | 56 ------ ext/dnet/dnet/eth.h | 77 -------- ext/dnet/dnet/fw.h | 54 ------ ext/dnet/dnet/icmp.h | 265 --------------------------- ext/dnet/dnet/intf.h | 68 ------- ext/dnet/dnet/ip.h | 487 -------------------------------------------------- ext/dnet/dnet/ip6.h | 183 ------------------- ext/dnet/dnet/os.h | 117 ------------ ext/dnet/dnet/rand.h | 33 ---- ext/dnet/dnet/route.h | 35 ---- ext/dnet/dnet/tcp.h | 158 ---------------- ext/dnet/dnet/udp.h | 32 ---- ext/dnet/eth.h | 77 ++++++++ ext/dnet/fw.h | 54 ++++++ ext/dnet/icmp.h | 265 +++++++++++++++++++++++++++ ext/dnet/intf.h | 68 +++++++ ext/dnet/ip.h | 487 ++++++++++++++++++++++++++++++++++++++++++++++++++ ext/dnet/ip6.h | 183 +++++++++++++++++++ ext/dnet/os.h | 117 ++++++++++++ ext/dnet/rand.h | 33 ++++ ext/dnet/route.h | 35 ++++ ext/dnet/tcp.h | 158 ++++++++++++++++ ext/dnet/udp.h | 32 ++++ 28 files changed, 1735 insertions(+), 1735 deletions(-) create mode 100644 ext/dnet/addr.h create mode 100644 ext/dnet/arp.h create mode 100644 ext/dnet/blob.h delete mode 100644 ext/dnet/dnet/addr.h delete mode 100644 ext/dnet/dnet/arp.h delete mode 100644 ext/dnet/dnet/blob.h delete mode 100644 ext/dnet/dnet/eth.h delete mode 100644 ext/dnet/dnet/fw.h delete mode 100644 ext/dnet/dnet/icmp.h delete mode 100644 ext/dnet/dnet/intf.h delete mode 100644 ext/dnet/dnet/ip.h delete mode 100644 ext/dnet/dnet/ip6.h delete mode 100644 ext/dnet/dnet/os.h delete mode 100644 ext/dnet/dnet/rand.h delete mode 100644 ext/dnet/dnet/route.h delete mode 100644 ext/dnet/dnet/tcp.h delete mode 100644 ext/dnet/dnet/udp.h create mode 100644 ext/dnet/eth.h create mode 100644 ext/dnet/fw.h create mode 100644 ext/dnet/icmp.h create mode 100644 ext/dnet/intf.h create mode 100644 ext/dnet/ip.h create mode 100644 ext/dnet/ip6.h create mode 100644 ext/dnet/os.h create mode 100644 ext/dnet/rand.h create mode 100644 ext/dnet/route.h create mode 100644 ext/dnet/tcp.h create mode 100644 ext/dnet/udp.h (limited to 'ext/dnet') diff --git a/ext/dnet/addr.h b/ext/dnet/addr.h new file mode 100644 index 000000000..584e3aba3 --- /dev/null +++ b/ext/dnet/addr.h @@ -0,0 +1,67 @@ +/* + * addr.h + * + * Network address operations. + * + * Copyright (c) 2000 Dug Song + * + * $Id: addr.h,v 1.12 2003/02/27 03:44:55 dugsong Exp $ + */ + +#ifndef DNET_ADDR_H +#define DNET_ADDR_H + +#define ADDR_TYPE_NONE 0 /* No address set */ +#define ADDR_TYPE_ETH 1 /* Ethernet */ +#define ADDR_TYPE_IP 2 /* Internet Protocol v4 */ +#define ADDR_TYPE_IP6 3 /* Internet Protocol v6 */ + +struct addr { + uint16_t addr_type; + uint16_t addr_bits; + union { + eth_addr_t __eth; + ip_addr_t __ip; + ip6_addr_t __ip6; + + uint8_t __data8[16]; + uint16_t __data16[8]; + uint32_t __data32[4]; + } __addr_u; +}; +#define addr_eth __addr_u.__eth +#define addr_ip __addr_u.__ip +#define addr_ip6 __addr_u.__ip6 +#define addr_data8 __addr_u.__data8 +#define addr_data16 __addr_u.__data16 +#define addr_data32 __addr_u.__data32 + +#define addr_pack(addr, type, bits, data, len) do { \ + (addr)->addr_type = type; \ + (addr)->addr_bits = bits; \ + memmove((addr)->addr_data8, (char *)data, len); \ +} while (0) + +__BEGIN_DECLS +int addr_cmp(const struct addr *a, const struct addr *b); + +int addr_bcast(const struct addr *a, struct addr *b); +int addr_net(const struct addr *a, struct addr *b); + +char *addr_ntop(const struct addr *src, char *dst, size_t size); +int addr_pton(const char *src, struct addr *dst); + +char *addr_ntoa(const struct addr *a); +#define addr_aton addr_pton + +int addr_ntos(const struct addr *a, struct sockaddr *sa); +int addr_ston(const struct sockaddr *sa, struct addr *a); + +int addr_btos(uint16_t bits, struct sockaddr *sa); +int addr_stob(const struct sockaddr *sa, uint16_t *bits); + +int addr_btom(uint16_t bits, void *mask, size_t size); +int addr_mtob(const void *mask, size_t size, uint16_t *bits); +__END_DECLS + +#endif /* DNET_ADDR_H */ diff --git a/ext/dnet/arp.h b/ext/dnet/arp.h new file mode 100644 index 000000000..d3c162410 --- /dev/null +++ b/ext/dnet/arp.h @@ -0,0 +1,103 @@ +/* + * arp.h + * + * Address Resolution Protocol. + * RFC 826 + * + * Copyright (c) 2000 Dug Song + * + * $Id: arp.h,v 1.12 2003/03/16 17:39:17 dugsong Exp $ + */ + +#ifndef DNET_ARP_H +#define DNET_ARP_H + +#define ARP_HDR_LEN 8 /* base ARP header length */ +#define ARP_ETHIP_LEN 20 /* base ARP message length */ + +#ifndef __GNUC__ +# define __attribute__(x) +# pragma pack(1) +#endif + +/* + * ARP header + */ +struct arp_hdr { + uint16_t ar_hrd; /* format of hardware address */ + uint16_t ar_pro; /* format of protocol address */ + uint8_t ar_hln; /* length of hardware address (ETH_ADDR_LEN) */ + uint8_t ar_pln; /* length of protocol address (IP_ADDR_LEN) */ + uint16_t ar_op; /* operation */ +}; + +/* + * Hardware address format + */ +#define ARP_HRD_ETH 0x0001 /* ethernet hardware */ +#define ARP_HRD_IEEE802 0x0006 /* IEEE 802 hardware */ + +/* + * Protocol address format + */ +#define ARP_PRO_IP 0x0800 /* IP protocol */ + +/* + * ARP operation + */ +#define ARP_OP_REQUEST 1 /* request to resolve ha given pa */ +#define ARP_OP_REPLY 2 /* response giving hardware address */ +#define ARP_OP_REVREQUEST 3 /* request to resolve pa given ha */ +#define ARP_OP_REVREPLY 4 /* response giving protocol address */ + +/* + * Ethernet/IP ARP message + */ +struct arp_ethip { + uint8_t ar_sha[ETH_ADDR_LEN]; /* sender hardware address */ + uint8_t ar_spa[IP_ADDR_LEN]; /* sender protocol address */ + uint8_t ar_tha[ETH_ADDR_LEN]; /* target hardware address */ + uint8_t ar_tpa[IP_ADDR_LEN]; /* target protocol address */ +}; + +/* + * ARP cache entry + */ +struct arp_entry { + struct addr arp_pa; /* protocol address */ + struct addr arp_ha; /* hardware address */ +}; + +#ifndef __GNUC__ +# pragma pack() +#endif + +#define arp_pack_hdr_ethip(hdr, op, sha, spa, tha, tpa) do { \ + struct arp_hdr *pack_arp_p = (struct arp_hdr *)(hdr); \ + struct arp_ethip *pack_ethip_p = (struct arp_ethip *) \ + ((uint8_t *)(hdr) + ARP_HDR_LEN); \ + pack_arp_p->ar_hrd = htons(ARP_HRD_ETH); \ + pack_arp_p->ar_pro = htons(ARP_PRO_IP); \ + pack_arp_p->ar_hln = ETH_ADDR_LEN; \ + pack_arp_p->ar_pln = IP_ADDR_LEN; \ + pack_arp_p->ar_op = htons(op); \ + memmove(pack_ethip_p->ar_sha, &(sha), ETH_ADDR_LEN); \ + memmove(pack_ethip_p->ar_spa, &(spa), IP_ADDR_LEN); \ + memmove(pack_ethip_p->ar_tha, &(tha), ETH_ADDR_LEN); \ + memmove(pack_ethip_p->ar_tpa, &(tpa), IP_ADDR_LEN); \ +} while (0) + +typedef struct arp_handle arp_t; + +typedef int (*arp_handler)(const struct arp_entry *entry, void *arg); + +__BEGIN_DECLS +arp_t *arp_open(void); +int arp_add(arp_t *arp, const struct arp_entry *entry); +int arp_delete(arp_t *arp, const struct arp_entry *entry); +int arp_get(arp_t *arp, struct arp_entry *entry); +int arp_loop(arp_t *arp, arp_handler callback, void *arg); +arp_t *arp_close(arp_t *arp); +__END_DECLS + +#endif /* DNET_ARP_H */ diff --git a/ext/dnet/blob.h b/ext/dnet/blob.h new file mode 100644 index 000000000..a3be7897d --- /dev/null +++ b/ext/dnet/blob.h @@ -0,0 +1,56 @@ +/* + * blob.h + * + * Binary blob handling. + * + * Copyright (c) 2002 Dug Song + * + * $Id: blob.h,v 1.2 2002/04/05 03:06:44 dugsong Exp $ + */ + +#ifndef DNET_BLOB_H +#define DNET_BLOB_H + +typedef struct blob { + u_char *base; /* start of data */ + int off; /* offset into data */ + int end; /* end of data */ + int size; /* size of allocation */ +} blob_t; + +__BEGIN_DECLS +blob_t *blob_new(void); + +int blob_read(blob_t *b, void *buf, int len); +int blob_write(blob_t *b, const void *buf, int len); + +int blob_seek(blob_t *b, int off, int whence); +#define blob_skip(b, l) blob_seek(b, l, SEEK_CUR) +#define blob_rewind(b) blob_seek(b, 0, SEEK_SET) + +#define blob_offset(b) ((b)->off) +#define blob_left(b) ((b)->end - (b)->off) + +int blob_index(blob_t *b, const void *buf, int len); +int blob_rindex(blob_t *b, const void *buf, int len); + +int blob_pack(blob_t *b, const char *fmt, ...); +int blob_unpack(blob_t *b, const char *fmt, ...); + +int blob_insert(blob_t *b, const void *buf, int len); +int blob_delete(blob_t *b, void *buf, int len); + +int blob_print(blob_t *b, char *style, int len); + +blob_t *blob_free(blob_t *b); + +int blob_register_alloc(size_t size, void *(*bmalloc)(size_t), + void (*bfree)(void *), void *(*brealloc)(void *, size_t)); +#ifdef va_start +typedef int (*blob_fmt_cb)(int pack, int len, blob_t *b, va_list *arg); + +int blob_register_pack(char c, blob_fmt_cb fmt_cb); +#endif +__END_DECLS + +#endif /* DNET_BLOB_H */ diff --git a/ext/dnet/dnet/addr.h b/ext/dnet/dnet/addr.h deleted file mode 100644 index 584e3aba3..000000000 --- a/ext/dnet/dnet/addr.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * addr.h - * - * Network address operations. - * - * Copyright (c) 2000 Dug Song - * - * $Id: addr.h,v 1.12 2003/02/27 03:44:55 dugsong Exp $ - */ - -#ifndef DNET_ADDR_H -#define DNET_ADDR_H - -#define ADDR_TYPE_NONE 0 /* No address set */ -#define ADDR_TYPE_ETH 1 /* Ethernet */ -#define ADDR_TYPE_IP 2 /* Internet Protocol v4 */ -#define ADDR_TYPE_IP6 3 /* Internet Protocol v6 */ - -struct addr { - uint16_t addr_type; - uint16_t addr_bits; - union { - eth_addr_t __eth; - ip_addr_t __ip; - ip6_addr_t __ip6; - - uint8_t __data8[16]; - uint16_t __data16[8]; - uint32_t __data32[4]; - } __addr_u; -}; -#define addr_eth __addr_u.__eth -#define addr_ip __addr_u.__ip -#define addr_ip6 __addr_u.__ip6 -#define addr_data8 __addr_u.__data8 -#define addr_data16 __addr_u.__data16 -#define addr_data32 __addr_u.__data32 - -#define addr_pack(addr, type, bits, data, len) do { \ - (addr)->addr_type = type; \ - (addr)->addr_bits = bits; \ - memmove((addr)->addr_data8, (char *)data, len); \ -} while (0) - -__BEGIN_DECLS -int addr_cmp(const struct addr *a, const struct addr *b); - -int addr_bcast(const struct addr *a, struct addr *b); -int addr_net(const struct addr *a, struct addr *b); - -char *addr_ntop(const struct addr *src, char *dst, size_t size); -int addr_pton(const char *src, struct addr *dst); - -char *addr_ntoa(const struct addr *a); -#define addr_aton addr_pton - -int addr_ntos(const struct addr *a, struct sockaddr *sa); -int addr_ston(const struct sockaddr *sa, struct addr *a); - -int addr_btos(uint16_t bits, struct sockaddr *sa); -int addr_stob(const struct sockaddr *sa, uint16_t *bits); - -int addr_btom(uint16_t bits, void *mask, size_t size); -int addr_mtob(const void *mask, size_t size, uint16_t *bits); -__END_DECLS - -#endif /* DNET_ADDR_H */ diff --git a/ext/dnet/dnet/arp.h b/ext/dnet/dnet/arp.h deleted file mode 100644 index d3c162410..000000000 --- a/ext/dnet/dnet/arp.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * arp.h - * - * Address Resolution Protocol. - * RFC 826 - * - * Copyright (c) 2000 Dug Song - * - * $Id: arp.h,v 1.12 2003/03/16 17:39:17 dugsong Exp $ - */ - -#ifndef DNET_ARP_H -#define DNET_ARP_H - -#define ARP_HDR_LEN 8 /* base ARP header length */ -#define ARP_ETHIP_LEN 20 /* base ARP message length */ - -#ifndef __GNUC__ -# define __attribute__(x) -# pragma pack(1) -#endif - -/* - * ARP header - */ -struct arp_hdr { - uint16_t ar_hrd; /* format of hardware address */ - uint16_t ar_pro; /* format of protocol address */ - uint8_t ar_hln; /* length of hardware address (ETH_ADDR_LEN) */ - uint8_t ar_pln; /* length of protocol address (IP_ADDR_LEN) */ - uint16_t ar_op; /* operation */ -}; - -/* - * Hardware address format - */ -#define ARP_HRD_ETH 0x0001 /* ethernet hardware */ -#define ARP_HRD_IEEE802 0x0006 /* IEEE 802 hardware */ - -/* - * Protocol address format - */ -#define ARP_PRO_IP 0x0800 /* IP protocol */ - -/* - * ARP operation - */ -#define ARP_OP_REQUEST 1 /* request to resolve ha given pa */ -#define ARP_OP_REPLY 2 /* response giving hardware address */ -#define ARP_OP_REVREQUEST 3 /* request to resolve pa given ha */ -#define ARP_OP_REVREPLY 4 /* response giving protocol address */ - -/* - * Ethernet/IP ARP message - */ -struct arp_ethip { - uint8_t ar_sha[ETH_ADDR_LEN]; /* sender hardware address */ - uint8_t ar_spa[IP_ADDR_LEN]; /* sender protocol address */ - uint8_t ar_tha[ETH_ADDR_LEN]; /* target hardware address */ - uint8_t ar_tpa[IP_ADDR_LEN]; /* target protocol address */ -}; - -/* - * ARP cache entry - */ -struct arp_entry { - struct addr arp_pa; /* protocol address */ - struct addr arp_ha; /* hardware address */ -}; - -#ifndef __GNUC__ -# pragma pack() -#endif - -#define arp_pack_hdr_ethip(hdr, op, sha, spa, tha, tpa) do { \ - struct arp_hdr *pack_arp_p = (struct arp_hdr *)(hdr); \ - struct arp_ethip *pack_ethip_p = (struct arp_ethip *) \ - ((uint8_t *)(hdr) + ARP_HDR_LEN); \ - pack_arp_p->ar_hrd = htons(ARP_HRD_ETH); \ - pack_arp_p->ar_pro = htons(ARP_PRO_IP); \ - pack_arp_p->ar_hln = ETH_ADDR_LEN; \ - pack_arp_p->ar_pln = IP_ADDR_LEN; \ - pack_arp_p->ar_op = htons(op); \ - memmove(pack_ethip_p->ar_sha, &(sha), ETH_ADDR_LEN); \ - memmove(pack_ethip_p->ar_spa, &(spa), IP_ADDR_LEN); \ - memmove(pack_ethip_p->ar_tha, &(tha), ETH_ADDR_LEN); \ - memmove(pack_ethip_p->ar_tpa, &(tpa), IP_ADDR_LEN); \ -} while (0) - -typedef struct arp_handle arp_t; - -typedef int (*arp_handler)(const struct arp_entry *entry, void *arg); - -__BEGIN_DECLS -arp_t *arp_open(void); -int arp_add(arp_t *arp, const struct arp_entry *entry); -int arp_delete(arp_t *arp, const struct arp_entry *entry); -int arp_get(arp_t *arp, struct arp_entry *entry); -int arp_loop(arp_t *arp, arp_handler callback, void *arg); -arp_t *arp_close(arp_t *arp); -__END_DECLS - -#endif /* DNET_ARP_H */ diff --git a/ext/dnet/dnet/blob.h b/ext/dnet/dnet/blob.h deleted file mode 100644 index a3be7897d..000000000 --- a/ext/dnet/dnet/blob.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * blob.h - * - * Binary blob handling. - * - * Copyright (c) 2002 Dug Song - * - * $Id: blob.h,v 1.2 2002/04/05 03:06:44 dugsong Exp $ - */ - -#ifndef DNET_BLOB_H -#define DNET_BLOB_H - -typedef struct blob { - u_char *base; /* start of data */ - int off; /* offset into data */ - int end; /* end of data */ - int size; /* size of allocation */ -} blob_t; - -__BEGIN_DECLS -blob_t *blob_new(void); - -int blob_read(blob_t *b, void *buf, int len); -int blob_write(blob_t *b, const void *buf, int len); - -int blob_seek(blob_t *b, int off, int whence); -#define blob_skip(b, l) blob_seek(b, l, SEEK_CUR) -#define blob_rewind(b) blob_seek(b, 0, SEEK_SET) - -#define blob_offset(b) ((b)->off) -#define blob_left(b) ((b)->end - (b)->off) - -int blob_index(blob_t *b, const void *buf, int len); -int blob_rindex(blob_t *b, const void *buf, int len); - -int blob_pack(blob_t *b, const char *fmt, ...); -int blob_unpack(blob_t *b, const char *fmt, ...); - -int blob_insert(blob_t *b, const void *buf, int len); -int blob_delete(blob_t *b, void *buf, int len); - -int blob_print(blob_t *b, char *style, int len); - -blob_t *blob_free(blob_t *b); - -int blob_register_alloc(size_t size, void *(*bmalloc)(size_t), - void (*bfree)(void *), void *(*brealloc)(void *, size_t)); -#ifdef va_start -typedef int (*blob_fmt_cb)(int pack, int len, blob_t *b, va_list *arg); - -int blob_register_pack(char c, blob_fmt_cb fmt_cb); -#endif -__END_DECLS - -#endif /* DNET_BLOB_H */ diff --git a/ext/dnet/dnet/eth.h b/ext/dnet/dnet/eth.h deleted file mode 100644 index da3033066..000000000 --- a/ext/dnet/dnet/eth.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * eth.h - * - * Ethernet. - * - * Copyright (c) 2000 Dug Song - * - * $Id: eth.h,v 1.15 2004/01/03 08:47:23 dugsong Exp $ - */ - -#ifndef DNET_ETH_H -#define DNET_ETH_H - -#define ETH_ADDR_LEN 6 -#define ETH_ADDR_BITS 48 -#define ETH_TYPE_LEN 2 -#define ETH_CRC_LEN 4 -#define ETH_HDR_LEN 14 - -#define ETH_LEN_MIN 64 /* minimum frame length with CRC */ -#define ETH_LEN_MAX 1518 /* maximum frame length with CRC */ - -#define ETH_MTU (ETH_LEN_MAX - ETH_HDR_LEN - ETH_CRC_LEN) -#define ETH_MIN (ETH_LEN_MIN - ETH_HDR_LEN - ETH_CRC_LEN) - -typedef struct eth_addr { - uint8_t data[ETH_ADDR_LEN]; -} eth_addr_t; - -struct eth_hdr { - eth_addr_t eth_dst; /* destination address */ - eth_addr_t eth_src; /* source address */ - uint16_t eth_type; /* payload type */ -}; - -/* - * Ethernet payload types - http://standards.ieee.org/regauth/ethertype - */ -#define ETH_TYPE_PUP 0x0200 /* PUP protocol */ -#define ETH_TYPE_IP 0x0800 /* IP protocol */ -#define ETH_TYPE_ARP 0x0806 /* address resolution protocol */ -#define ETH_TYPE_REVARP 0x8035 /* reverse addr resolution protocol */ -#define ETH_TYPE_8021Q 0x8100 /* IEEE 802.1Q VLAN tagging */ -#define ETH_TYPE_IPV6 0x86DD /* IPv6 protocol */ -#define ETH_TYPE_MPLS 0x8847 /* MPLS */ -#define ETH_TYPE_MPLS_MCAST 0x8848 /* MPLS Multicast */ -#define ETH_TYPE_PPPOEDISC 0x8863 /* PPP Over Ethernet Discovery Stage */ -#define ETH_TYPE_PPPOE 0x8864 /* PPP Over Ethernet Session Stage */ -#define ETH_TYPE_LOOPBACK 0x9000 /* used to test interfaces */ - -#define ETH_IS_MULTICAST(ea) (*(ea) & 0x01) /* is address mcast/bcast? */ - -#define ETH_ADDR_BROADCAST "\xff\xff\xff\xff\xff\xff" - -#define eth_pack_hdr(h, dst, src, type) do { \ - struct eth_hdr *eth_pack_p = (struct eth_hdr *)(h); \ - memmove(ð_pack_p->eth_dst, &(dst), ETH_ADDR_LEN); \ - memmove(ð_pack_p->eth_src, &(src), ETH_ADDR_LEN); \ - eth_pack_p->eth_type = htons(type); \ -} while (0) - -typedef struct eth_handle eth_t; - -__BEGIN_DECLS -eth_t *eth_open(const char *device); -int eth_get(eth_t *e, eth_addr_t *ea); -int eth_set(eth_t *e, const eth_addr_t *ea); -size_t eth_send(eth_t *e, const void *buf, size_t len); -eth_t *eth_close(eth_t *e); - -char *eth_ntop(const eth_addr_t *eth, char *dst, size_t len); -int eth_pton(const char *src, eth_addr_t *dst); -char *eth_ntoa(const eth_addr_t *eth); -#define eth_aton eth_pton -__END_DECLS - -#endif /* DNET_ETH_H */ diff --git a/ext/dnet/dnet/fw.h b/ext/dnet/dnet/fw.h deleted file mode 100644 index ebda8e7eb..000000000 --- a/ext/dnet/dnet/fw.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * fw.h - * - * Network firewalling operations. - * - * Copyright (c) 2001 Dug Song - * - * $Id: fw.h,v 1.13 2002/12/14 04:02:36 dugsong Exp $ - */ - -#ifndef DNET_FW_H -#define DNET_FW_H - -struct fw_rule { - char fw_device[INTF_NAME_LEN]; /* interface name */ - uint8_t fw_op; /* operation */ - uint8_t fw_dir; /* direction */ - uint8_t fw_proto; /* IP protocol */ - struct addr fw_src; /* src address / net */ - struct addr fw_dst; /* dst address / net */ - uint16_t fw_sport[2]; /* range / ICMP type */ - uint16_t fw_dport[2]; /* range / ICMP code */ -}; - -#define FW_OP_ALLOW 1 -#define FW_OP_BLOCK 2 - -#define FW_DIR_IN 1 -#define FW_DIR_OUT 2 - -#define fw_pack_rule(rule, dev, op, dir, p, s, d, sp1, sp2, dp1, dp2) \ -do { \ - strlcpy((rule)->fw_device, dev, sizeof((rule)->fw_device)); \ - (rule)->fw_op = op; (rule)->fw_dir = dir; \ - (rule)->fw_proto = p; \ - memmove(&(rule)->fw_src, &(s), sizeof((rule)->fw_src)); \ - memmove(&(rule)->fw_dst, &(d), sizeof((rule)->fw_dst)); \ - (rule)->fw_sport[0] = sp1; (rule)->fw_sport[1] = sp2; \ - (rule)->fw_dport[0] = dp1; (rule)->fw_dport[1] = dp2; \ -} while (0) - -typedef struct fw_handle fw_t; - -typedef int (*fw_handler)(const struct fw_rule *rule, void *arg); - -__BEGIN_DECLS -fw_t *fw_open(void); -int fw_add(fw_t *f, const struct fw_rule *rule); -int fw_delete(fw_t *f, const struct fw_rule *rule); -int fw_loop(fw_t *f, fw_handler callback, void *arg); -fw_t *fw_close(fw_t *f); -__END_DECLS - -#endif /* DNET_FW_H */ diff --git a/ext/dnet/dnet/icmp.h b/ext/dnet/dnet/icmp.h deleted file mode 100644 index e997d5887..000000000 --- a/ext/dnet/dnet/icmp.h +++ /dev/null @@ -1,265 +0,0 @@ -/* - * icmp.h - * - * Internet Control Message Protocol. - * RFC 792, 950, 1256, 1393, 1475, 2002, 2521 - * - * Copyright (c) 2000 Dug Song - * - * $Id: icmp.h,v 1.14 2003/03/16 17:39:17 dugsong Exp $ - */ - -#ifndef DNET_ICMP_H -#define DNET_ICMP_H - -#define ICMP_HDR_LEN 4 /* base ICMP header length */ -#define ICMP_LEN_MIN 8 /* minimum ICMP message size, with header */ - -#ifndef __GNUC__ -# define __attribute__(x) -# pragma pack(1) -#endif - -/* - * ICMP header - */ -struct icmp_hdr { - uint8_t icmp_type; /* type of message, see below */ - uint8_t icmp_code; /* type sub code */ - uint16_t icmp_cksum; /* ones complement cksum of struct */ -}; - -/* - * Types (icmp_type) and codes (icmp_code) - - * http://www.iana.org/assignments/icmp-parameters - */ -#define ICMP_CODE_NONE 0 /* for types without codes */ -#define ICMP_ECHOREPLY 0 /* echo reply */ -#define ICMP_UNREACH 3 /* dest unreachable, codes: */ -#define ICMP_UNREACH_NET 0 /* bad net */ -#define ICMP_UNREACH_HOST 1 /* bad host */ -#define ICMP_UNREACH_PROTO 2 /* bad protocol */ -#define ICMP_UNREACH_PORT 3 /* bad port */ -#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ -#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ -#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ -#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ -#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ -#define ICMP_UNREACH_NET_PROHIB 9 /* for crypto devs */ -#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ -#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ -#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ -#define ICMP_UNREACH_FILTER_PROHIB 13 /* prohibited access */ -#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* precedence error */ -#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* precedence cutoff */ -#define ICMP_SRCQUENCH 4 /* packet lost, slow down */ -#define ICMP_REDIRECT 5 /* shorter route, codes: */ -#define ICMP_REDIRECT_NET 0 /* for network */ -#define ICMP_REDIRECT_HOST 1 /* for host */ -#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */ -#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */ -#define ICMP_ALTHOSTADDR 6 /* alternate host address */ -#define ICMP_ECHO 8 /* echo service */ -#define ICMP_RTRADVERT 9 /* router advertise, codes: */ -#define ICMP_RTRADVERT_NORMAL 0 /* normal */ -#define ICMP_RTRADVERT_NOROUTE_COMMON 16 /* selective routing */ -#define ICMP_RTRSOLICIT 10 /* router solicitation */ -#define ICMP_TIMEXCEED 11 /* time exceeded, code: */ -#define ICMP_TIMEXCEED_INTRANS 0 /* ttl==0 in transit */ -#define ICMP_TIMEXCEED_REASS 1 /* ttl==0 in reass */ -#define ICMP_PARAMPROB 12 /* ip header bad */ -#define ICMP_PARAMPROB_ERRATPTR 0 /* req. opt. absent */ -#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */ -#define ICMP_PARAMPROB_LENGTH 2 /* bad length */ -#define ICMP_TSTAMP 13 /* timestamp request */ -#define ICMP_TSTAMPREPLY 14 /* timestamp reply */ -#define ICMP_INFO 15 /* information request */ -#define ICMP_INFOREPLY 16 /* information reply */ -#define ICMP_MASK 17 /* address mask request */ -#define ICMP_MASKREPLY 18 /* address mask reply */ -#define ICMP_TRACEROUTE 30 /* traceroute */ -#define ICMP_DATACONVERR 31 /* data conversion error */ -#define ICMP_MOBILE_REDIRECT 32 /* mobile host redirect */ -#define ICMP_IPV6_WHEREAREYOU 33 /* IPv6 where-are-you */ -#define ICMP_IPV6_IAMHERE 34 /* IPv6 i-am-here */ -#define ICMP_MOBILE_REG 35 /* mobile registration req */ -#define ICMP_MOBILE_REGREPLY 36 /* mobile registration reply */ -#define ICMP_DNS 37 /* domain name request */ -#define ICMP_DNSREPLY 38 /* domain name reply */ -#define ICMP_SKIP 39 /* SKIP */ -#define ICMP_PHOTURIS 40 /* Photuris */ -#define ICMP_PHOTURIS_UNKNOWN_INDEX 0 /* unknown sec index */ -#define ICMP_PHOTURIS_AUTH_FAILED 1 /* auth failed */ -#define ICMP_PHOTURIS_DECOMPRESS_FAILED 2 /* decompress failed */ -#define ICMP_PHOTURIS_DECRYPT_FAILED 3 /* decrypt failed */ -#define ICMP_PHOTURIS_NEED_AUTHN 4 /* no authentication */ -#define ICMP_PHOTURIS_NEED_AUTHZ 5 /* no authorization */ -#define ICMP_TYPE_MAX 40 - -#define ICMP_INFOTYPE(type) \ - ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ - (type) == ICMP_RTRADVERT || (type) == ICMP_RTRSOLICIT || \ - (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ - (type) == ICMP_INFO || (type) == ICMP_INFOREPLY || \ - (type) == ICMP_MASK || (type) == ICMP_MASKREPLY) - -/* - * Echo message data - */ -struct icmp_msg_echo { - uint16_t icmp_id; - uint16_t icmp_seq; - uint8_t icmp_data __flexarr; /* optional data */ -}; - -/* - * Fragmentation-needed (unreachable) message data - */ -struct icmp_msg_needfrag { - uint16_t icmp_void; /* must be zero */ - uint16_t icmp_mtu; /* MTU of next-hop network */ - uint8_t icmp_ip __flexarr; /* IP hdr + 8 bytes of pkt */ -}; - -/* - * Unreachable, source quench, redirect, time exceeded, - * parameter problem message data - */ -struct icmp_msg_quote { - uint32_t icmp_void; /* must be zero */ -#define icmp_gwaddr icmp_void /* router IP address to use */ -#define icmp_pptr icmp_void /* ptr to bad octet field */ - uint8_t icmp_ip __flexarr; /* IP hdr + 8 bytes of pkt */ -}; - -/* - * Router advertisement message data, RFC 1256 - */ -struct icmp_msg_rtradvert { - uint8_t icmp_num_addrs; /* # of address / pref pairs */ - uint8_t icmp_wpa; /* words / address == 2 */ - uint16_t icmp_lifetime; /* route lifetime in seconds */ - struct icmp_msg_rtr_data { - uint32_t icmp_void; -#define icmp_gwaddr icmp_void /* router IP address */ - uint32_t icmp_pref; /* router preference (usu 0) */ - } icmp_rtr __flexarr; /* variable # of routers */ -}; -#define ICMP_RTR_PREF_NODEFAULT 0x80000000 /* do not use as default gw */ - -/* - * Timestamp message data - */ -struct icmp_msg_tstamp { - uint32_t icmp_id; /* identifier */ - uint32_t icmp_seq; /* sequence number */ - uint32_t icmp_ts_orig; /* originate timestamp */ - uint32_t icmp_ts_rx; /* receive timestamp */ - uint32_t icmp_ts_tx; /* transmit timestamp */ -}; - -/* - * Address mask message data, RFC 950 - */ -struct icmp_msg_mask { - uint32_t icmp_id; /* identifier */ - uint32_t icmp_seq; /* sequence number */ - uint32_t icmp_mask; /* address mask */ -}; - -/* - * Traceroute message data, RFC 1393, RFC 1812 - */ -struct icmp_msg_traceroute { - uint16_t icmp_id; /* identifier */ - uint16_t icmp_void; /* unused */ - uint16_t icmp_ohc; /* outbound hop count */ - uint16_t icmp_rhc; /* return hop count */ - uint32_t icmp_speed; /* link speed, bytes/sec */ - uint32_t icmp_mtu; /* MTU in bytes */ -}; - -/* - * Domain name reply message data, RFC 1788 - */ -struct icmp_msg_dnsreply { - uint16_t icmp_id; /* identifier */ - uint16_t icmp_seq; /* sequence number */ - uint32_t icmp_ttl; /* time-to-live */ - uint8_t icmp_names __flexarr; /* variable number of names */ -}; - -/* - * Generic identifier, sequence number data - */ -struct icmp_msg_idseq { - uint16_t icmp_id; - uint16_t icmp_seq; -}; - -/* - * ICMP message union - */ -union icmp_msg { - struct icmp_msg_echo echo; /* ICMP_ECHO{REPLY} */ - struct icmp_msg_quote unreach; /* ICMP_UNREACH */ - struct icmp_msg_needfrag needfrag; /* ICMP_UNREACH_NEEDFRAG */ - struct icmp_msg_quote srcquench; /* ICMP_SRCQUENCH */ - struct icmp_msg_quote redirect; /* ICMP_REDIRECT (set to 0) */ - uint32_t rtrsolicit; /* ICMP_RTRSOLICIT */ - struct icmp_msg_rtradvert rtradvert; /* ICMP_RTRADVERT */ - struct icmp_msg_quote timexceed; /* ICMP_TIMEXCEED */ - struct icmp_msg_quote paramprob; /* ICMP_PARAMPROB */ - struct icmp_msg_tstamp tstamp; /* ICMP_TSTAMP{REPLY} */ - struct icmp_msg_idseq info; /* ICMP_INFO{REPLY} */ - struct icmp_msg_mask mask; /* ICMP_MASK{REPLY} */ - struct icmp_msg_traceroute traceroute; /* ICMP_TRACEROUTE */ - struct icmp_msg_idseq dns; /* ICMP_DNS */ - struct icmp_msg_dnsreply dnsreply; /* ICMP_DNSREPLY */ -}; - -#ifndef __GNUC__ -# pragma pack() -#endif - -#define icmp_pack_hdr(hdr, type, code) do { \ - struct icmp_hdr *icmp_pack_p = (struct icmp_hdr *)(hdr); \ - icmp_pack_p->icmp_type = type; icmp_pack_p->icmp_code = code; \ -} while (0) - -#define icmp_pack_hdr_echo(hdr, type, code, id, seq, data, len) do { \ - struct icmp_msg_echo *echo_pack_p = (struct icmp_msg_echo *) \ - ((uint8_t *)(hdr) + ICMP_HDR_LEN); \ - icmp_pack_hdr(hdr, type, code); \ - echo_pack_p->icmp_id = htons(id); \ - echo_pack_p->icmp_seq = htons(seq); \ - memmove(echo_pack_p->icmp_data, data, len); \ -} while (0) - -#define icmp_pack_hdr_quote(hdr, type, code, word, pkt, len) do { \ - struct icmp_msg_quote *quote_pack_p = (struct icmp_msg_quote *) \ - ((uint8_t *)(hdr) + ICMP_HDR_LEN); \ - icmp_pack_hdr(hdr, type, code); \ - quote_pack_p->icmp_void = htonl(word); \ - memmove(quote_pack_p->icmp_ip, pkt, len); \ -} while (0) - -#define icmp_pack_hdr_mask(hdr, type, code, id, seq, mask) do { \ - struct icmp_msg_mask *mask_pack_p = (struct icmp_msg_mask *) \ - ((uint8_t *)(hdr) + ICMP_HDR_LEN); \ - icmp_pack_hdr(hdr, type, code); \ - mask_pack_p->icmp_id = htons(id); \ - mask_pack_p->icmp_seq = htons(seq); \ - mask_pack_p->icmp_mask = htonl(mask); \ -} while (0) - -#define icmp_pack_hdr_needfrag(hdr, type, code, mtu, pkt, len) do { \ - struct icmp_msg_needfrag *frag_pack_p = \ - (struct icmp_msg_needfrag *)((uint8_t *)(hdr) + ICMP_HDR_LEN); \ - icmp_pack_hdr(hdr, type, code); \ - frag_pack_p->icmp_void = 0; \ - frag_pack_p->icmp_mtu = htons(mtu); \ - memmove(frag_pack_p->icmp_ip, pkt, len); \ -} while (0) - -#endif /* DNET_ICMP_H */ diff --git a/ext/dnet/dnet/intf.h b/ext/dnet/dnet/intf.h deleted file mode 100644 index 38acd4356..000000000 --- a/ext/dnet/dnet/intf.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * intf.c - * - * Network interface operations. - * - * Copyright (c) 2000 Dug Song - * - * $Id: intf.h,v 1.16 2004/01/13 07:41:09 dugsong Exp $ - */ - -#ifndef DNET_INTF_H -#define DNET_INTF_H - -/* - * Interface entry - */ -#define INTF_NAME_LEN 16 - -struct intf_entry { - u_int intf_len; /* length of entry */ - char intf_name[INTF_NAME_LEN]; /* interface name */ - u_short intf_type; /* interface type (r/o) */ - u_short intf_flags; /* interface flags */ - u_int intf_mtu; /* interface MTU */ - struct addr intf_addr; /* interface address */ - struct addr intf_dst_addr; /* point-to-point dst */ - struct addr intf_link_addr; /* link-layer address */ - u_int intf_alias_num; /* number of aliases */ - struct addr intf_alias_addrs __flexarr; /* array of aliases */ -}; - -/* - * MIB-II interface types - http://www.iana.org/assignments/ianaiftype-mib - */ -#define INTF_TYPE_OTHER 1 /* other */ -#define INTF_TYPE_ETH 6 /* Ethernet */ -#define INTF_TYPE_TOKENRING 9 /* Token Ring */ -#define INTF_TYPE_FDDI 15 /* FDDI */ -#define INTF_TYPE_PPP 23 /* Point-to-Point Protocol */ -#define INTF_TYPE_LOOPBACK 24 /* software loopback */ -#define INTF_TYPE_SLIP 28 /* Serial Line Interface Protocol */ -#define INTF_TYPE_TUN 53 /* proprietary virtual/internal */ - -/* - * Interface flags - */ -#define INTF_FLAG_UP 0x01 /* enable interface */ -#define INTF_FLAG_LOOPBACK 0x02 /* is a loopback net (r/o) */ -#define INTF_FLAG_POINTOPOINT 0x04 /* point-to-point link (r/o) */ -#define INTF_FLAG_NOARP 0x08 /* disable ARP */ -#define INTF_FLAG_BROADCAST 0x10 /* supports broadcast (r/o) */ -#define INTF_FLAG_MULTICAST 0x20 /* supports multicast (r/o) */ - -typedef struct intf_handle intf_t; - -typedef int (*intf_handler)(const struct intf_entry *entry, void *arg); - -__BEGIN_DECLS -intf_t *intf_open(void); -int intf_get(intf_t *i, struct intf_entry *entry); -int intf_get_src(intf_t *i, struct intf_entry *entry, struct addr *src); -int intf_get_dst(intf_t *i, struct intf_entry *entry, struct addr *dst); -int intf_set(intf_t *i, const struct intf_entry *entry); -int intf_loop(intf_t *i, intf_handler callback, void *arg); -intf_t *intf_close(intf_t *i); -__END_DECLS - -#endif /* DNET_INTF_H */ diff --git a/ext/dnet/dnet/ip.h b/ext/dnet/dnet/ip.h deleted file mode 100644 index 95b7718fb..000000000 --- a/ext/dnet/dnet/ip.h +++ /dev/null @@ -1,487 +0,0 @@ -/* - * ip.h - * - * Internet Protocol (RFC 791). - * - * Copyright (c) 2000 Dug Song - * - * $Id: ip.h,v 1.23 2003/03/16 17:39:17 dugsong Exp $ - */ - -#ifndef DNET_IP_H -#define DNET_IP_H - -#define IP_ADDR_LEN 4 /* IP address length */ -#define IP_ADDR_BITS 32 /* IP address bits */ - -#define IP_HDR_LEN 20 /* base IP header length */ -#define IP_OPT_LEN 2 /* base IP option length */ -#define IP_OPT_LEN_MAX 40 -#define IP_HDR_LEN_MAX (IP_HDR_LEN + IP_OPT_LEN_MAX) - -#define IP_LEN_MAX 65535 -#define IP_LEN_MIN IP_HDR_LEN - -typedef uint32_t ip_addr_t; - -#ifndef __GNUC__ -# define __attribute__(x) -# pragma pack(1) -#endif - -/* - * IP header, without options - */ -struct ip_hdr { -#if DNET_BYTESEX == DNET_BIG_ENDIAN - uint8_t ip_v:4, /* version */ - ip_hl:4; /* header length (incl any options) */ -#elif DNET_BYTESEX == DNET_LIL_ENDIAN - uint8_t ip_hl:4, - ip_v:4; -#else -# error "need to include " -#endif - uint8_t ip_tos; /* type of service */ - uint16_t ip_len; /* total length (incl header) */ - uint16_t ip_id; /* identification */ - uint16_t ip_off; /* fragment offset and flags */ - uint8_t ip_ttl; /* time to live */ - uint8_t ip_p; /* protocol */ - uint16_t ip_sum; /* checksum */ - ip_addr_t ip_src; /* source address */ - ip_addr_t ip_dst; /* destination address */ -}; - -/* - * Type of service (ip_tos), RFC 1349 ("obsoleted by RFC 2474") - */ -#define IP_TOS_DEFAULT 0x00 /* default */ -#define IP_TOS_LOWDELAY 0x10 /* low delay */ -#define IP_TOS_THROUGHPUT 0x08 /* high throughput */ -#define IP_TOS_RELIABILITY 0x04 /* high reliability */ -#define IP_TOS_LOWCOST 0x02 /* low monetary cost - XXX */ -#define IP_TOS_ECT 0x02 /* ECN-capable transport */ -#define IP_TOS_CE 0x01 /* congestion experienced */ - -/* - * IP precedence (high 3 bits of ip_tos), hopefully unused - */ -#define IP_TOS_PREC_ROUTINE 0x00 -#define IP_TOS_PREC_PRIORITY 0x20 -#define IP_TOS_PREC_IMMEDIATE 0x40 -#define IP_TOS_PREC_FLASH 0x60 -#define IP_TOS_PREC_FLASHOVERRIDE 0x80 -#define IP_TOS_PREC_CRITIC_ECP 0xa0 -#define IP_TOS_PREC_INTERNETCONTROL 0xc0 -#define IP_TOS_PREC_NETCONTROL 0xe0 - -/* - * Fragmentation flags (ip_off) - */ -#define IP_RF 0x8000 /* reserved */ -#define IP_DF 0x4000 /* don't fragment */ -#define IP_MF 0x2000 /* more fragments (not last frag) */ -#define IP_OFFMASK 0x1fff /* mask for fragment offset */ - -/* - * Time-to-live (ip_ttl), seconds - */ -#define IP_TTL_DEFAULT 64 /* default ttl, RFC 1122, RFC 1340 */ -#define IP_TTL_MAX 255 /* maximum ttl */ - -/* - * Protocol (ip_p) - http://www.iana.org/assignments/protocol-numbers - */ -#define IP_PROTO_IP 0 /* dummy for IP */ -#define IP_PROTO_HOPOPTS IP_PROTO_IP /* IPv6 hop-by-hop options */ -#define IP_PROTO_ICMP 1 /* ICMP */ -#define IP_PROTO_IGMP 2 /* IGMP */ -#define IP_PROTO_GGP 3 /* gateway-gateway protocol */ -#define IP_PROTO_IPIP 4 /* IP in IP */ -#define IP_PROTO_ST 5 /* ST datagram mode */ -#define IP_PROTO_TCP 6 /* TCP */ -#define IP_PROTO_CBT 7 /* CBT */ -#define IP_PROTO_EGP 8 /* exterior gateway protocol */ -#define IP_PROTO_IGP 9 /* interior gateway protocol */ -#define IP_PROTO_BBNRCC 10 /* BBN RCC monitoring */ -#define IP_PROTO_NVP 11 /* Network Voice Protocol */ -#define IP_PROTO_PUP 12 /* PARC universal packet */ -#define IP_PROTO_ARGUS 13 /* ARGUS */ -#define IP_PROTO_EMCON 14 /* EMCON */ -#define IP_PROTO_XNET 15 /* Cross Net Debugger */ -#define IP_PROTO_CHAOS 16 /* Chaos */ -#define IP_PROTO_UDP 17 /* UDP */ -#define IP_PROTO_MUX 18 /* multiplexing */ -#define IP_PROTO_DCNMEAS 19 /* DCN measurement */ -#define IP_PROTO_HMP 20 /* Host Monitoring Protocol */ -#define IP_PROTO_PRM 21 /* Packet Radio Measurement */ -#define IP_PROTO_IDP 22 /* Xerox NS IDP */ -#define IP_PROTO_TRUNK1 23 /* Trunk-1 */ -#define IP_PROTO_TRUNK2 24 /* Trunk-2 */ -#define IP_PROTO_LEAF1 25 /* Leaf-1 */ -#define IP_PROTO_LEAF2 26 /* Leaf-2 */ -#define IP_PROTO_RDP 27 /* "Reliable Datagram" proto */ -#define IP_PROTO_IRTP 28 /* Inet Reliable Transaction */ -#define IP_PROTO_TP 29 /* ISO TP class 4 */ -#define IP_PROTO_NETBLT 30 /* Bulk Data Transfer */ -#define IP_PROTO_MFPNSP 31 /* MFE Network Services */ -#define IP_PROTO_MERITINP 32 /* Merit Internodal Protocol */ -#define IP_PROTO_SEP 33 /* Sequential Exchange proto */ -#define IP_PROTO_3PC 34 /* Third Party Connect proto */ -#define IP_PROTO_IDPR 35 /* Interdomain Policy Route */ -#define IP_PROTO_XTP 36 /* Xpress Transfer Protocol */ -#define IP_PROTO_DDP 37 /* Datagram Delivery Proto */ -#define IP_PROTO_CMTP 38 /* IDPR Ctrl Message Trans */ -#define IP_PROTO_TPPP 39 /* TP++ Transport Protocol */ -#define IP_PROTO_IL 40 /* IL Transport Protocol */ -#define IP_PROTO_IPV6 41 /* IPv6 */ -#define IP_PROTO_SDRP 42 /* Source Demand Routing */ -#define IP_PROTO_ROUTING 43 /* IPv6 routing header */ -#define IP_PROTO_FRAGMENT 44 /* IPv6 fragmentation header */ -#define IP_PROTO_RSVP 46 /* Reservation protocol */ -#define IP_PROTO_GRE 47 /* General Routing Encap */ -#define IP_PROTO_MHRP 48 /* Mobile Host Routing */ -#define IP_PROTO_ENA 49 /* ENA */ -#define IP_PROTO_ESP 50 /* Encap Security Payload */ -#define IP_PROTO_AH 51 /* Authentication Header */ -#define IP_PROTO_INLSP 52 /* Integated Net Layer Sec */ -#define IP_PROTO_SWIPE 53 /* SWIPE */ -#define IP_PROTO_NARP 54 /* NBMA Address Resolution */ -#define IP_PROTO_MOBILE 55 /* Mobile IP, RFC 2004 */ -#define IP_PROTO_TLSP 56 /* Transport Layer Security */ -#define IP_PROTO_SKIP 57 /* SKIP */ -#define IP_PROTO_ICMPV6 58 /* ICMP for IPv6 */ -#define IP_PROTO_NONE 59 /* IPv6 no next header */ -#define IP_PROTO_DSTOPTS 60 /* IPv6 destination options */ -#define IP_PROTO_ANYHOST 61 /* any host internal proto */ -#define IP_PROTO_CFTP 62 /* CFTP */ -#define IP_PROTO_ANYNET 63 /* any local network */ -#define IP_PROTO_EXPAK 64 /* SATNET and Backroom EXPAK */ -#define IP_PROTO_KRYPTOLAN 65 /* Kryptolan */ -#define IP_PROTO_RVD 66 /* MIT Remote Virtual Disk */ -#define IP_PROTO_IPPC 67 /* Inet Pluribus Packet Core */ -#define IP_PROTO_DISTFS 68 /* any distributed fs */ -#define IP_PROTO_SATMON 69 /* SATNET Monitoring */ -#define IP_PROTO_VISA 70 /* VISA Protocol */ -#define IP_PROTO_IPCV 71 /* Inet Packet Core Utility */ -#define IP_PROTO_CPNX 72 /* Comp Proto Net Executive */ -#define IP_PROTO_CPHB 73 /* Comp Protocol Heart Beat */ -#define IP_PROTO_WSN 74 /* Wang Span Network */ -#define IP_PROTO_PVP 75 /* Packet Video Protocol */ -#define IP_PROTO_BRSATMON 76 /* Backroom SATNET Monitor */ -#define IP_PROTO_SUNND 77 /* SUN ND Protocol */ -#define IP_PROTO_WBMON 78 /* WIDEBAND Monitoring */ -#define IP_PROTO_WBEXPAK 79 /* WIDEBAND EXPAK */ -#define IP_PROTO_EON 80 /* ISO CNLP */ -#define IP_PROTO_VMTP 81 /* Versatile Msg Transport*/ -#define IP_PROTO_SVMTP 82 /* Secure VMTP */ -#define IP_PROTO_VINES 83 /* VINES */ -#define IP_PROTO_TTP 84 /* TTP */ -#define IP_PROTO_NSFIGP 85 /* NSFNET-IGP */ -#define IP_PROTO_DGP 86 /* Dissimilar Gateway Proto */ -#define IP_PROTO_TCF 87 /* TCF */ -#define IP_PROTO_EIGRP 88 /* EIGRP */ -#define IP_PROTO_OSPF 89 /* Open Shortest Path First */ -#define IP_PROTO_SPRITERPC 90 /* Sprite RPC Protocol */ -#define IP_PROTO_LARP 91 /* Locus Address Resolution */ -#define IP_PROTO_MTP 92 /* Multicast Transport Proto */ -#define IP_PROTO_AX25 93 /* AX.25 Frames */ -#define IP_PROTO_IPIPENCAP 94 /* yet-another IP encap */ -#define IP_PROTO_MICP 95 /* Mobile Internet Ctrl */ -#define IP_PROTO_SCCSP 96 /* Semaphore Comm Sec Proto */ -#define IP_PROTO_ETHERIP 97 /* Ethernet in IPv4 */ -#define IP_PROTO_ENCAP 98 /* encapsulation header */ -#define IP_PROTO_ANYENC 99 /* private encryption scheme */ -#define IP_PROTO_GMTP 100 /* GMTP */ -#define IP_PROTO_IFMP 101 /* Ipsilon Flow Mgmt Proto */ -#define IP_PROTO_PNNI 102 /* PNNI over IP */ -#define IP_PROTO_PIM 103 /* Protocol Indep Multicast */ -#define IP_PROTO_ARIS 104 /* ARIS */ -#define IP_PROTO_SCPS 105 /* SCPS */ -#define IP_PROTO_QNX 106 /* QNX */ -#define IP_PROTO_AN 107 /* Active Networks */ -#define IP_PROTO_IPCOMP 108 /* IP Payload Compression */ -#define IP_PROTO_SNP 109 /* Sitara Networks Protocol */ -#define IP_PROTO_COMPAQPEER 110 /* Compaq Peer Protocol */ -#define IP_PROTO_IPXIP 111 /* IPX in IP */ -#define IP_PROTO_VRRP 112 /* Virtual Router Redundancy */ -#define IP_PROTO_PGM 113 /* PGM Reliable Transport */ -#define IP_PROTO_ANY0HOP 114 /* 0-hop protocol */ -#define IP_PROTO_L2TP 115 /* Layer 2 Tunneling Proto */ -#define IP_PROTO_DDX 116 /* D-II Data Exchange (DDX) */ -#define IP_PROTO_IATP 117 /* Interactive Agent Xfer */ -#define IP_PROTO_STP 118 /* Schedule Transfer Proto */ -#define IP_PROTO_SRP 119 /* SpectraLink Radio Proto */ -#define IP_PROTO_UTI 120 /* UTI */ -#define IP_PROTO_SMP 121 /* Simple Message Protocol */ -#define IP_PROTO_SM 122 /* SM */ -#define IP_PROTO_PTP 123 /* Performance Transparency */ -#define IP_PROTO_ISIS 124 /* ISIS over IPv4 */ -#define IP_PROTO_FIRE 125 /* FIRE */ -#define IP_PROTO_CRTP 126 /* Combat Radio Transport */ -#define IP_PROTO_CRUDP 127 /* Combat Radio UDP */ -#define IP_PROTO_SSCOPMCE 128 /* SSCOPMCE */ -#define IP_PROTO_IPLT 129 /* IPLT */ -#define IP_PROTO_SPS 130 /* Secure Packet Shield */ -#define IP_PROTO_PIPE 131 /* Private IP Encap in IP */ -#define IP_PROTO_SCTP 132 /* Stream Ctrl Transmission */ -#define IP_PROTO_FC 133 /* Fibre Channel */ -#define IP_PROTO_RSVPIGN 134 /* RSVP-E2E-IGNORE */ -#define IP_PROTO_RAW 255 /* Raw IP packets */ -#define IP_PROTO_RESERVED IP_PROTO_RAW /* Reserved */ -#define IP_PROTO_MAX 255 - -/* - * Option types (opt_type) - http://www.iana.org/assignments/ip-parameters - */ -#define IP_OPT_CONTROL 0x00 /* control */ -#define IP_OPT_DEBMEAS 0x40 /* debugging & measurement */ -#define IP_OPT_COPY 0x80 /* copy into all fragments */ -#define IP_OPT_RESERVED1 0x20 -#define IP_OPT_RESERVED2 0x60 - -#define IP_OPT_EOL 0 /* end of option list */ -#define IP_OPT_NOP 1 /* no operation */ -#define IP_OPT_SEC (2|IP_OPT_COPY) /* DoD basic security */ -#define IP_OPT_LSRR (3|IP_OPT_COPY) /* loose source route */ -#define IP_OPT_TS (4|IP_OPT_DEBMEAS) /* timestamp */ -#define IP_OPT_ESEC (5|IP_OPT_COPY) /* DoD extended security */ -#define IP_OPT_CIPSO (6|IP_OPT_COPY) /* commercial security */ -#define IP_OPT_RR 7 /* record route */ -#define IP_OPT_SATID (8|IP_OPT_COPY) /* stream ID (obsolete) */ -#define IP_OPT_SSRR (9|IP_OPT_COPY) /* strict source route */ -#define IP_OPT_ZSU 10 /* experimental measurement */ -#define IP_OPT_MTUP 11 /* MTU probe */ -#define IP_OPT_MTUR 12 /* MTU reply */ -#define IP_OPT_FINN (13|IP_OPT_COPY|IP_OPT_DEBMEAS) /* exp flow control */ -#define IP_OPT_VISA (14|IP_OPT_COPY) /* exp access control */ -#define IP_OPT_ENCODE 15 /* ??? */ -#define IP_OPT_IMITD (16|IP_OPT_COPY) /* IMI traffic descriptor */ -#define IP_OPT_EIP (17|IP_OPT_COPY) /* extended IP, RFC 1385 */ -#define IP_OPT_TR (18|IP_OPT_DEBMEAS) /* traceroute */ -#define IP_OPT_ADDEXT (19|IP_OPT_COPY) /* IPv7 ext addr, RFC 1475 */ -#define IP_OPT_RTRALT (20|IP_OPT_COPY) /* router alert, RFC 2113 */ -#define IP_OPT_SDB (21|IP_OPT_COPY) /* directed bcast, RFC 1770 */ -#define IP_OPT_NSAPA (22|IP_OPT_COPY) /* NSAP addresses */ -#define IP_OPT_DPS (23|IP_OPT_COPY) /* dynamic packet state */ -#define IP_OPT_UMP (24|IP_OPT_COPY) /* upstream multicast */ -#define IP_OPT_MAX 25 - -#define IP_OPT_COPIED(o) ((o) & 0x80) -#define IP_OPT_CLASS(o) ((o) & 0x60) -#define IP_OPT_NUMBER(o) ((o) & 0x1f) -#define IP_OPT_TYPEONLY(o) ((o) == IP_OPT_EOL || (o) == IP_OPT_NOP) - -/* - * Security option data - RFC 791, 3.1 - */ -struct ip_opt_data_sec { - uint16_t s; /* security */ - uint16_t c; /* compartments */ - uint16_t h; /* handling restrictions */ - uint8_t tcc[3]; /* transmission control code */ -} __attribute__((__packed__)); - -#define IP_OPT_SEC_UNCLASS 0x0000 /* unclassified */ -#define IP_OPT_SEC_CONFID 0xf135 /* confidential */ -#define IP_OPT_SEC_EFTO 0x789a /* EFTO */ -#define IP_OPT_SEC_MMMM 0xbc4d /* MMMM */ -#define IP_OPT_SEC_PROG 0x5e26 /* PROG */ -#define IP_OPT_SEC_RESTR 0xaf13 /* restricted */ -#define IP_OPT_SEC_SECRET 0xd788 /* secret */ -#define IP_OPT_SEC_TOPSECRET 0x6bc5 /* top secret */ - -/* - * {Loose Source, Record, Strict Source} Route option data - RFC 791, 3.1 - */ -struct ip_opt_data_rr { - uint8_t ptr; /* from start of option, >= 4 */ - uint32_t iplist __flexarr; /* list of IP addresses */ -} __attribute__((__packed__)); - -/* - * Timestamp option data - RFC 791, 3.1 - */ -struct ip_opt_data_ts { - uint8_t ptr; /* from start of option, >= 5 */ -#if DNET_BYTESEX == DNET_BIG_ENDIAN - uint8_t oflw:4, /* number of IPs skipped */ - flg:4; /* address[ / timestamp] flag */ -#elif DNET_BYTESEX == DNET_LIL_ENDIAN - uint8_t flg:4, - oflw:4; -#endif - uint32_t ipts __flexarr; /* IP address [/ timestamp] pairs */ -} __attribute__((__packed__)); - -#define IP_OPT_TS_TSONLY 0 /* timestamps only */ -#define IP_OPT_TS_TSADDR 1 /* IP address / timestamp pairs */ -#define IP_OPT_TS_PRESPEC 3 /* IP address / zero timestamp pairs */ - -/* - * Traceroute option data - RFC 1393, 2.2 - */ -struct ip_opt_data_tr { - uint16_t id; /* ID number */ - uint16_t ohc; /* outbound hop count */ - uint16_t rhc; /* return hop count */ - uint32_t origip; /* originator IP address */ -} __attribute__((__packed__)); - -/* - * IP option (following IP header) - */ -struct ip_opt { - uint8_t opt_type; /* option type */ - uint8_t opt_len; /* option length >= IP_OPT_LEN */ - union ip_opt_data { - struct ip_opt_data_sec sec; /* IP_OPT_SEC */ - struct ip_opt_data_rr rr; /* IP_OPT_{L,S}RR */ - struct ip_opt_data_ts ts; /* IP_OPT_TS */ - uint16_t satid; /* IP_OPT_SATID */ - uint16_t mtu; /* IP_OPT_MTU{P,R} */ - struct ip_opt_data_tr tr; /* IP_OPT_TR */ - uint32_t addext[2]; /* IP_OPT_ADDEXT */ - uint16_t rtralt; /* IP_OPT_RTRALT */ - uint32_t sdb[9]; /* IP_OPT_SDB */ - uint8_t data8[IP_OPT_LEN_MAX - IP_OPT_LEN]; - } opt_data; -} __attribute__((__packed__)); - -#ifndef __GNUC__ -# pragma pack() -#endif - -/* - * Classful addressing - */ -#define IP_CLASSA(i) (((uint32_t)(i) & htonl(0x80000000)) == \ - htonl(0x00000000)) -#define IP_CLASSA_NET (htonl(0xff000000)) -#define IP_CLASSA_NSHIFT 24 -#define IP_CLASSA_HOST (htonl(0x00ffffff)) -#define IP_CLASSA_MAX 128 - -#define IP_CLASSB(i) (((uint32_t)(i) & htonl(0xc0000000)) == \ - htonl(0x80000000)) -#define IP_CLASSB_NET (htonl(0xffff0000)) -#define IP_CLASSB_NSHIFT 16 -#define IP_CLASSB_HOST (htonl(0x0000ffff)) -#define IP_CLASSB_MAX 65536 - -#define IP_CLASSC(i) (((uint32_t)(i) & htonl(0xe0000000)) == \ - htonl(0xc0000000)) -#define IP_CLASSC_NET (htonl(0xffffff00)) -#define IP_CLASSC_NSHIFT 8 -#define IP_CLASSC_HOST (htonl(0x000000ff)) - -#define IP_CLASSD(i) (((uint32_t)(i) & htonl(0xf0000000)) == \ - htonl(0xe0000000)) -/* These ones aren't really net and host fields, but routing needn't know. */ -#define IP_CLASSD_NET (htonl(0xf0000000)) -#define IP_CLASSD_NSHIFT 28 -#define IP_CLASSD_HOST (htonl(0x0fffffff)) -#define IP_MULTICAST(i) IP_CLASSD(i) - -#define IP_EXPERIMENTAL(i) (((uint32_t)(i) & htonl(0xf0000000)) == \ - htonl(0xf0000000)) -#define IP_BADCLASS(i) (((uint32_t)(i) & htonl(0xf0000000)) == \ - htonl(0xf0000000)) -#define IP_LOCAL_GROUP(i) (((uint32_t)(i) & htonl(0xffffff00)) == \ - htonl(0xe0000000)) -/* - * Reserved addresses - */ -#define IP_ADDR_ANY (htonl(0x00000000)) /* 0.0.0.0 */ -#define IP_ADDR_BROADCAST (htonl(0xffffffff)) /* 255.255.255.255 */ -#define IP_ADDR_LOOPBACK (htonl(0x7f000001)) /* 127.0.0.1 */ -#define IP_ADDR_MCAST_ALL (htonl(0xe0000001)) /* 224.0.0.1 */ -#define IP_ADDR_MCAST_LOCAL (htonl(0xe00000ff)) /* 224.0.0.225 */ - -#define ip_pack_hdr(hdr, tos, len, id, off, ttl, p, src, dst) do { \ - struct ip_hdr *ip_pack_p = (struct ip_hdr *)(hdr); \ - ip_pack_p->ip_v = 4; ip_pack_p->ip_hl = 5; \ - ip_pack_p->ip_tos = tos; ip_pack_p->ip_len = htons(len); \ - ip_pack_p->ip_id = htons(id); ip_pack_p->ip_off = htons(off); \ - ip_pack_p->ip_ttl = ttl; ip_pack_p->ip_p = p; \ - ip_pack_p->ip_src = src; ip_pack_p->ip_dst = dst; \ -} while (0) - -typedef struct ip_handle ip_t; - -__BEGIN_DECLS -ip_t *ip_open(void); -size_t ip_send(ip_t *i, const void *buf, size_t len); -ip_t *ip_close(ip_t *i); - -char *ip_ntop(const ip_addr_t *ip, char *dst, size_t len); -int ip_pton(const char *src, ip_addr_t *dst); -char *ip_ntoa(const ip_addr_t *ip); -#define ip_aton ip_pton - -size_t ip_add_option(void *buf, size_t len, - int proto, const void *optbuf, size_t optlen); -void ip_checksum(void *buf, size_t len); - -inline int -ip_cksum_add(const void *buf, size_t len, int cksum) -{ - uint16_t *sp = (uint16_t *)buf; - int n, sn; - - sn = len / 2; - n = (sn + 15) / 16; - - /* XXX - unroll loop using Duff's device. */ - switch (sn % 16) { - case 0: do { - cksum += *sp++; - case 15: - cksum += *sp++; - case 14: - cksum += *sp++; - case 13: - cksum += *sp++; - case 12: - cksum += *sp++; - case 11: - cksum += *sp++; - case 10: - cksum += *sp++; - case 9: - cksum += *sp++; - case 8: - cksum += *sp++; - case 7: - cksum += *sp++; - case 6: - cksum += *sp++; - case 5: - cksum += *sp++; - case 4: - cksum += *sp++; - case 3: - cksum += *sp++; - case 2: - cksum += *sp++; - case 1: - cksum += *sp++; - } while (--n > 0); - } - if (len & 1) - cksum += htons(*(u_char *)sp << 8); - - return (cksum); -} - -inline uint16_t -ip_cksum_carry(int x) -{ - x = (x >> 16) + (x & 0xffff); - return ~(x + (x >> 16)) & 0xffff; -} - -__END_DECLS - -#endif /* DNET_IP_H */ diff --git a/ext/dnet/dnet/ip6.h b/ext/dnet/dnet/ip6.h deleted file mode 100644 index 7fae29b47..000000000 --- a/ext/dnet/dnet/ip6.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - * ip6.h - * - * Internet Protocol, Version 6 (RFC 2460). - * - * Copyright (c) 2002 Dug Song - * - * $Id: ip6.h,v 1.6 2004/02/23 10:01:15 dugsong Exp $ - */ - -#ifndef DNET_IP6_H -#define DNET_IP6_H - -#define IP6_ADDR_LEN 16 -#define IP6_ADDR_BITS 128 - -#define IP6_HDR_LEN 40 /* IPv6 header length */ -#define IP6_LEN_MIN IP6_HDR_LEN -#define IP6_LEN_MAX 65535 /* non-jumbo payload */ - -#define IP6_MTU_MIN 1280 /* minimum MTU (1024 + 256) */ - -typedef struct ip6_addr { - uint8_t data[IP6_ADDR_LEN]; -} ip6_addr_t; - -#ifndef __GNUC__ -# define __attribute__(x) -# pragma pack(1) -#endif - -/* - * IPv6 header - */ -struct ip6_hdr { - union { - struct ip6_hdr_ctl { - uint32_t ip6_un1_flow; /* 20 bits of flow ID */ - uint16_t ip6_un1_plen; /* payload length */ - uint8_t ip6_un1_nxt; /* next header */ - uint8_t ip6_un1_hlim; /* hop limit */ - } ip6_un1; - uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */ - } ip6_ctlun; - ip6_addr_t ip6_src; - ip6_addr_t ip6_dst; -} __attribute__((__packed__)); - -#define ip6_vfc ip6_ctlun.ip6_un2_vfc -#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow -#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen -#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt /* IP_PROTO_* */ -#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim - -#define IP6_VERSION 0x60 -#define IP6_VERSION_MASK 0xf0 /* ip6_vfc version */ - -#if DNET_BYTESEX == DNET_BIG_ENDIAN -#define IP6_FLOWINFO_MASK 0x0fffffff /* ip6_flow info (28 bits) */ -#define IP6_FLOWLABEL_MASK 0x000fffff /* ip6_flow label (20 bits) */ -#elif DNET_BYTESEX == DNET_LIL_ENDIAN -#define IP6_FLOWINFO_MASK 0xffffff0f /* ip6_flow info (28 bits) */ -#define IP6_FLOWLABEL_MASK 0xffff0f00 /* ip6_flow label (20 bits) */ -#endif - -/* - * Hop limit (ip6_hlim) - */ -#define IP6_HLIM_DEFAULT 64 -#define IP6_HLIM_MAX 255 - -/* - * Preferred extension header order from RFC 2460, 4.1: - * - * IP_PROTO_IPV6, IP_PROTO_HOPOPTS, IP_PROTO_DSTOPTS, IP_PROTO_ROUTING, - * IP_PROTO_FRAGMENT, IP_PROTO_AH, IP_PROTO_ESP, IP_PROTO_DSTOPTS, IP_PROTO_* - */ - -/* - * Routing header data (IP_PROTO_ROUTING) - */ -struct ip6_ext_data_routing { - uint8_t type; /* routing type */ - uint8_t segleft; /* segments left */ - /* followed by routing type specific data */ -} __attribute__((__packed__)); - -struct ip6_ext_data_routing0 { - uint8_t type; /* always zero */ - uint8_t segleft; /* segments left */ - uint8_t reserved; /* reserved field */ - uint8_t slmap[3]; /* strict/loose bit map */ - ip6_addr_t addr[1]; /* up to 23 addresses */ -} __attribute__((__packed__)); - -/* - * Fragment header data (IP_PROTO_FRAGMENT) - */ -struct ip6_ext_data_fragment { - uint16_t offlg; /* offset, reserved, and flag */ - uint32_t ident; /* identification */ -} __attribute__((__packed__)); - -/* - * Fragmentation offset, reserved, and flags (offlg) - */ -#if DNET_BYTESEX == DNET_BIG_ENDIAN -#define IP6_OFF_MASK 0xfff8 /* mask out offset from offlg */ -#define IP6_RESERVED_MASK 0x0006 /* reserved bits in offlg */ -#define IP6_MORE_FRAG 0x0001 /* more-fragments flag */ -#elif DNET_BYTESEX == DNET_LIL_ENDIAN -#define IP6_OFF_MASK 0xf8ff /* mask out offset from offlg */ -#define IP6_RESERVED_MASK 0x0600 /* reserved bits in offlg */ -#define IP6_MORE_FRAG 0x0100 /* more-fragments flag */ -#endif - -/* - * Option types, for IP_PROTO_HOPOPTS, IP_PROTO_DSTOPTS headers - */ -#define IP6_OPT_PAD1 0x00 /* 00 0 00000 */ -#define IP6_OPT_PADN 0x01 /* 00 0 00001 */ -#define IP6_OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */ -#define IP6_OPT_JUMBO_LEN 6 -#define IP6_OPT_RTALERT 0x05 /* 00 0 00101 */ -#define IP6_OPT_RTALERT_LEN 4 -#define IP6_OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */ -#define IP6_OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */ -#define IP6_OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */ -#define IP6_OPT_LEN_MIN 2 - -#define IP6_OPT_TYPE(o) ((o) & 0xC0) /* high 2 bits of opt_type */ -#define IP6_OPT_TYPE_SKIP 0x00 /* continue processing on failure */ -#define IP6_OPT_TYPE_DISCARD 0x40 /* discard packet on failure */ -#define IP6_OPT_TYPE_FORCEICMP 0x80 /* discard and send ICMP on failure */ -#define IP6_OPT_TYPE_ICMP 0xC0 /* ...only if non-multicast dst */ - -#define IP6_OPT_MUTABLE 0x20 /* option data may change en route */ - -/* - * Extension header (chained via {ip6,ext}_nxt, following IPv6 header) - */ -struct ip6_ext_hdr { - uint8_t ext_nxt; /* next header */ - uint8_t ext_len; /* following length in units of 8 octets */ - union { - struct ip6_ext_data_routing routing; - struct ip6_ext_data_fragment fragment; - } ext_data; -} __attribute__((__packed__)); - -#ifndef __GNUC__ -# pragma pack() -#endif - -/* - * Reserved addresses - */ -#define IP6_ADDR_UNSPEC \ - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" -#define IP6_ADDR_LOOPBACK \ - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" - -#define ip6_pack_hdr(hdr, fc, fl, plen, nxt, hlim, src, dst) do { \ - struct ip6_hdr *ip6 = (struct ip6_hdr *)(hdr); \ - ip6->ip6_flow = htonl(((uint32_t)(fc) << 28) & \ - (IP6_FLOWLABEL_MASK | (fl))); \ - ip6->ip6_vfc = (IP6_VERSION | ((fc) >> 4)); \ - ip6->ip6_plen = htons((plen)); \ - ip6->ip6_nxt = (nxt); ip6->ip6_hlim = (hlim); \ - memmove(&ip6->ip6_src, &(src), IP6_ADDR_LEN); \ - memmove(&ip6->ip6_dst, &(dst), IP6_ADDR_LEN); \ -} while (0); - -__BEGIN_DECLS -char *ip6_ntop(const ip6_addr_t *ip6, char *dst, size_t size); -int ip6_pton(const char *src, ip6_addr_t *dst); -char *ip6_ntoa(const ip6_addr_t *ip6); -#define ip6_aton ip6_pton - -void ip6_checksum(void *buf, size_t len); -__END_DECLS - -#endif /* DNET_IP6_H */ diff --git a/ext/dnet/dnet/os.h b/ext/dnet/dnet/os.h deleted file mode 100644 index cae244781..000000000 --- a/ext/dnet/dnet/os.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * os.h - * - * Sleazy OS-specific defines. - * - * Copyright (c) 2000 Dug Song - * - * $Id: os.h,v 1.10 2004/05/04 03:19:42 dugsong Exp $ - */ - -#ifndef DNET_OS_H -#define DNET_OS_H - -#ifdef _WIN32 -# include -# include -# include -/* XXX */ -# undef IP_OPT_LSRR -# undef IP_OPT_TS -# undef IP_OPT_RR -# undef IP_OPT_SSRR -#else -# include -# include -# include -# include -# include -# include -# ifdef __bsdi__ -# include - typedef u_int8_t uint8_t; - typedef u_int16_t uint16_t; - typedef u_int32_t uint32_t; - typedef u_int64_t uint64_t; -# else -# include -# endif -#endif - -#define DNET_LIL_ENDIAN 1234 -#define DNET_BIG_ENDIAN 4321 - -/* BSD and IRIX */ -#ifdef BYTE_ORDER -#if BYTE_ORDER == LITTLE_ENDIAN -# define DNET_BYTESEX DNET_LIL_ENDIAN -#elif BYTE_ORDER == BIG_ENDIAN -# define DNET_BYTESEX DNET_BIG_ENDIAN -#endif -#endif - -/* Linux */ -#ifdef __BYTE_ORDER -#if __BYTE_ORDER == __LITTLE_ENDIAN -# define DNET_BYTESEX DNET_LIL_ENDIAN -#elif __BYTE_ORDER == __BIG_ENDIAN -# define DNET_BYTESEX DNET_BIG_ENDIAN -#endif -#endif - -/* Solaris */ -#if defined(_BIT_FIELDS_LTOH) -# define DNET_BYTESEX DNET_LIL_ENDIAN -#elif defined (_BIT_FIELDS_HTOL) -# define DNET_BYTESEX DNET_BIG_ENDIAN -#endif - -/* Nastiness from old BIND code. */ -#ifndef DNET_BYTESEX -# if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \ - defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \ - defined(__alpha__) || defined(__alpha) -# define DNET_BYTESEX DNET_LIL_ENDIAN -# elif defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \ - defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \ - defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\ - defined(apollo) || defined(__convex__) || defined(_CRAY) || \ - defined(__hppa) || defined(__hp9000) || \ - defined(__hp9000s300) || defined(__hp9000s700) || defined(__ia64) || \ - defined (BIT_ZERO_ON_LEFT) || defined(m68k) -# define DNET_BYTESEX DNET_BIG_ENDIAN -# else -# error "bytesex unknown" -# endif -#endif - -/* C++ support. */ -#undef __BEGIN_DECLS -#undef __END_DECLS -#ifdef __cplusplus -# define __BEGIN_DECLS extern "C" { -# define __END_DECLS } /* extern "C" */ -#else -# define __BEGIN_DECLS -# define __END_DECLS -#endif - -/* Support for flexible arrays. */ -#undef __flexarr -#if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)) -/* GCC 2.97 supports C99 flexible array members. */ -# define __flexarr [] -#else -# ifdef __GNUC__ -# define __flexarr [0] -# else -# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L -# define __flexarr [] -# else -/* Some other non-C99 compiler. Approximate with [1]. */ -# define __flexarr [1] -# endif -# endif -#endif - -#endif /* DNET_OS_H */ diff --git a/ext/dnet/dnet/rand.h b/ext/dnet/dnet/rand.h deleted file mode 100644 index 49121930c..000000000 --- a/ext/dnet/dnet/rand.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * rand.h - * - * Pseudo-random number generation, based on OpenBSD arc4random(). - * - * Copyright (c) 2000 Dug Song - * Copyright (c) 1996 David Mazieres - * - * $Id: rand.h,v 1.4 2002/04/07 19:01:25 dugsong Exp $ - */ - -#ifndef DNET_RAND_H -#define DNET_RAND_H - -typedef struct rand_handle rand_t; - -__BEGIN_DECLS -rand_t *rand_open(void); - -int rand_get(rand_t *r, void *buf, size_t len); -int rand_set(rand_t *r, const void *seed, size_t len); -int rand_add(rand_t *r, const void *buf, size_t len); - -uint8_t rand_uint8(rand_t *r); -uint16_t rand_uint16(rand_t *r); -uint32_t rand_uint32(rand_t *r); - -int rand_shuffle(rand_t *r, void *base, size_t nmemb, size_t size); - -rand_t *rand_close(rand_t *r); -__END_DECLS - -#endif /* DNET_RAND_H */ diff --git a/ext/dnet/dnet/route.h b/ext/dnet/dnet/route.h deleted file mode 100644 index 74c21419c..000000000 --- a/ext/dnet/dnet/route.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * route.c - * - * Kernel route table operations. - * - * Copyright (c) 2000 Dug Song - * - * $Id: route.h,v 1.6 2002/02/04 04:02:22 dugsong Exp $ - */ - -#ifndef DNET_ROUTE_H -#define DNET_ROUTE_H - -/* - * Routing table entry - */ -struct route_entry { - struct addr route_dst; /* destination address */ - struct addr route_gw; /* gateway address */ -}; - -typedef struct route_handle route_t; - -typedef int (*route_handler)(const struct route_entry *entry, void *arg); - -__BEGIN_DECLS -route_t *route_open(void); -int route_add(route_t *r, const struct route_entry *entry); -int route_delete(route_t *r, const struct route_entry *entry); -int route_get(route_t *r, struct route_entry *entry); -int route_loop(route_t *r, route_handler callback, void *arg); -route_t *route_close(route_t *r); -__END_DECLS - -#endif /* DNET_ROUTE_H */ diff --git a/ext/dnet/dnet/tcp.h b/ext/dnet/dnet/tcp.h deleted file mode 100644 index 008946384..000000000 --- a/ext/dnet/dnet/tcp.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * tcp.h - * - * Transmission Control Protocol (RFC 793). - * - * Copyright (c) 2000 Dug Song - * - * $Id: tcp.h,v 1.17 2004/02/23 10:02:11 dugsong Exp $ - */ - -#ifndef DNET_TCP_H -#define DNET_TCP_H - -#define TCP_HDR_LEN 20 /* base TCP header length */ -#define TCP_OPT_LEN 2 /* base TCP option length */ -#define TCP_OPT_LEN_MAX 40 -#define TCP_HDR_LEN_MAX (TCP_HDR_LEN + TCP_OPT_LEN_MAX) - -#ifndef __GNUC__ -# define __attribute__(x) -# pragma pack(1) -#endif - -/* - * TCP header, without options - */ -struct tcp_hdr { - uint16_t th_sport; /* source port */ - uint16_t th_dport; /* destination port */ - uint32_t th_seq; /* sequence number */ - uint32_t th_ack; /* acknowledgment number */ -#if DNET_BYTESEX == DNET_BIG_ENDIAN - uint8_t th_off:4, /* data offset */ - th_x2:4; /* (unused) */ -#elif DNET_BYTESEX == DNET_LIL_ENDIAN - uint8_t th_x2:4, - th_off:4; -#else -# error "need to include " -#endif - uint8_t th_flags; /* control flags */ - uint16_t th_win; /* window */ - uint16_t th_sum; /* checksum */ - uint16_t th_urp; /* urgent pointer */ -}; - -/* - * TCP control flags (th_flags) - */ -#define TH_FIN 0x01 /* end of data */ -#define TH_SYN 0x02 /* synchronize sequence numbers */ -#define TH_RST 0x04 /* reset connection */ -#define TH_PUSH 0x08 /* push */ -#define TH_ACK 0x10 /* acknowledgment number set */ -#define TH_URG 0x20 /* urgent pointer set */ -#define TH_ECE 0x40 /* ECN echo, RFC 3168 */ -#define TH_CWR 0x80 /* congestion window reduced */ - -#define TCP_PORT_MAX 65535 /* maximum port */ -#define TCP_WIN_MAX 65535 /* maximum (unscaled) window */ - -/* - * Sequence number comparison macros - */ -#define TCP_SEQ_LT(a,b) ((int)((a)-(b)) < 0) -#define TCP_SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0) -#define TCP_SEQ_GT(a,b) ((int)((a)-(b)) > 0) -#define TCP_SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0) - -/* - * TCP FSM states - */ -#define TCP_STATE_CLOSED 0 /* closed */ -#define TCP_STATE_LISTEN 1 /* listening from connection */ -#define TCP_STATE_SYN_SENT 2 /* active, have sent SYN */ -#define TCP_STATE_SYN_RECEIVED 3 /* have sent and received SYN */ - -#define TCP_STATE_ESTABLISHED 4 /* established */ -#define TCP_STATE_CLOSE_WAIT 5 /* rcvd FIN, waiting for close */ - -#define TCP_STATE_FIN_WAIT_1 6 /* have closed, sent FIN */ -#define TCP_STATE_CLOSING 7 /* closed xchd FIN, await FIN-ACK */ -#define TCP_STATE_LAST_ACK 8 /* had FIN and close, await FIN-ACK */ - -#define TCP_STATE_FIN_WAIT_2 9 /* have closed, FIN is acked */ -#define TCP_STATE_TIME_WAIT 10 /* in 2*MSL quiet wait after close */ -#define TCP_STATE_MAX 11 - -/* - * Options (opt_type) - http://www.iana.org/assignments/tcp-parameters - */ -#define TCP_OPT_EOL 0 /* end of option list */ -#define TCP_OPT_NOP 1 /* no operation */ -#define TCP_OPT_MSS 2 /* maximum segment size */ -#define TCP_OPT_WSCALE 3 /* window scale factor, RFC 1072 */ -#define TCP_OPT_SACKOK 4 /* SACK permitted, RFC 2018 */ -#define TCP_OPT_SACK 5 /* SACK, RFC 2018 */ -#define TCP_OPT_ECHO 6 /* echo (obsolete), RFC 1072 */ -#define TCP_OPT_ECHOREPLY 7 /* echo reply (obsolete), RFC 1072 */ -#define TCP_OPT_TIMESTAMP 8 /* timestamp, RFC 1323 */ -#define TCP_OPT_POCONN 9 /* partial order conn, RFC 1693 */ -#define TCP_OPT_POSVC 10 /* partial order service, RFC 1693 */ -#define TCP_OPT_CC 11 /* connection count, RFC 1644 */ -#define TCP_OPT_CCNEW 12 /* CC.NEW, RFC 1644 */ -#define TCP_OPT_CCECHO 13 /* CC.ECHO, RFC 1644 */ -#define TCP_OPT_ALTSUM 14 /* alt checksum request, RFC 1146 */ -#define TCP_OPT_ALTSUMDATA 15 /* alt checksum data, RFC 1146 */ -#define TCP_OPT_SKEETER 16 /* Skeeter */ -#define TCP_OPT_BUBBA 17 /* Bubba */ -#define TCP_OPT_TRAILSUM 18 /* trailer checksum */ -#define TCP_OPT_MD5 19 /* MD5 signature, RFC 2385 */ -#define TCP_OPT_SCPS 20 /* SCPS capabilities */ -#define TCP_OPT_SNACK 21 /* selective negative acks */ -#define TCP_OPT_REC 22 /* record boundaries */ -#define TCP_OPT_CORRUPT 23 /* corruption experienced */ -#define TCP_OPT_SNAP 24 /* SNAP */ -#define TCP_OPT_TCPCOMP 26 /* TCP compression filter */ -#define TCP_OPT_MAX 27 - -#define TCP_OPT_TYPEONLY(type) \ - ((type) == TCP_OPT_EOL || (type) == TCP_OPT_NOP) - -/* - * TCP option (following TCP header) - */ -struct tcp_opt { - uint8_t opt_type; /* option type */ - uint8_t opt_len; /* option length >= TCP_OPT_LEN */ - union tcp_opt_data { - uint16_t mss; /* TCP_OPT_MSS */ - uint8_t wscale; /* TCP_OPT_WSCALE */ - uint16_t sack[19]; /* TCP_OPT_SACK */ - uint32_t echo; /* TCP_OPT_ECHO{REPLY} */ - uint32_t timestamp[2]; /* TCP_OPT_TIMESTAMP */ - uint32_t cc; /* TCP_OPT_CC{NEW,ECHO} */ - uint8_t cksum; /* TCP_OPT_ALTSUM */ - uint8_t md5[16]; /* TCP_OPT_MD5 */ - uint8_t data8[TCP_OPT_LEN_MAX - TCP_OPT_LEN]; - } opt_data; -} __attribute__((__packed__)); - -#ifndef __GNUC__ -# pragma pack() -#endif - -#define tcp_pack_hdr(hdr, sport, dport, seq, ack, flags, win, urp) do { \ - struct tcp_hdr *tcp_pack_p = (struct tcp_hdr *)(hdr); \ - tcp_pack_p->th_sport = htons(sport); \ - tcp_pack_p->th_dport = htons(dport); \ - tcp_pack_p->th_seq = htonl(seq); \ - tcp_pack_p->th_ack = htonl(ack); \ - tcp_pack_p->th_x2 = 0; tcp_pack_p->th_off = 5; \ - tcp_pack_p->th_flags = flags; \ - tcp_pack_p->th_win = htons(win); \ - tcp_pack_p->th_urp = htons(urp); \ -} while (0) - -#endif /* DNET_TCP_H */ diff --git a/ext/dnet/dnet/udp.h b/ext/dnet/dnet/udp.h deleted file mode 100644 index 73839a92a..000000000 --- a/ext/dnet/dnet/udp.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * udp.h - * - * User Datagram Protocol (RFC 768). - * - * Copyright (c) 2000 Dug Song - * - * $Id: udp.h,v 1.8 2002/04/02 05:05:39 dugsong Exp $ - */ - -#ifndef DNET_UDP_H -#define DNET_UDP_H - -#define UDP_HDR_LEN 8 - -struct udp_hdr { - uint16_t uh_sport; /* source port */ - uint16_t uh_dport; /* destination port */ - uint16_t uh_ulen; /* udp length (including header) */ - uint16_t uh_sum; /* udp checksum */ -}; - -#define UDP_PORT_MAX 65535 - -#define udp_pack_hdr(hdr, sport, dport, ulen) do { \ - struct udp_hdr *udp_pack_p = (struct udp_hdr *)(hdr); \ - udp_pack_p->uh_sport = htons(sport); \ - udp_pack_p->uh_dport = htons(dport); \ - udp_pack_p->uh_ulen = htons(ulen); \ -} while (0) - -#endif /* DNET_UDP_H */ diff --git a/ext/dnet/eth.h b/ext/dnet/eth.h new file mode 100644 index 000000000..da3033066 --- /dev/null +++ b/ext/dnet/eth.h @@ -0,0 +1,77 @@ +/* + * eth.h + * + * Ethernet. + * + * Copyright (c) 2000 Dug Song + * + * $Id: eth.h,v 1.15 2004/01/03 08:47:23 dugsong Exp $ + */ + +#ifndef DNET_ETH_H +#define DNET_ETH_H + +#define ETH_ADDR_LEN 6 +#define ETH_ADDR_BITS 48 +#define ETH_TYPE_LEN 2 +#define ETH_CRC_LEN 4 +#define ETH_HDR_LEN 14 + +#define ETH_LEN_MIN 64 /* minimum frame length with CRC */ +#define ETH_LEN_MAX 1518 /* maximum frame length with CRC */ + +#define ETH_MTU (ETH_LEN_MAX - ETH_HDR_LEN - ETH_CRC_LEN) +#define ETH_MIN (ETH_LEN_MIN - ETH_HDR_LEN - ETH_CRC_LEN) + +typedef struct eth_addr { + uint8_t data[ETH_ADDR_LEN]; +} eth_addr_t; + +struct eth_hdr { + eth_addr_t eth_dst; /* destination address */ + eth_addr_t eth_src; /* source address */ + uint16_t eth_type; /* payload type */ +}; + +/* + * Ethernet payload types - http://standards.ieee.org/regauth/ethertype + */ +#define ETH_TYPE_PUP 0x0200 /* PUP protocol */ +#define ETH_TYPE_IP 0x0800 /* IP protocol */ +#define ETH_TYPE_ARP 0x0806 /* address resolution protocol */ +#define ETH_TYPE_REVARP 0x8035 /* reverse addr resolution protocol */ +#define ETH_TYPE_8021Q 0x8100 /* IEEE 802.1Q VLAN tagging */ +#define ETH_TYPE_IPV6 0x86DD /* IPv6 protocol */ +#define ETH_TYPE_MPLS 0x8847 /* MPLS */ +#define ETH_TYPE_MPLS_MCAST 0x8848 /* MPLS Multicast */ +#define ETH_TYPE_PPPOEDISC 0x8863 /* PPP Over Ethernet Discovery Stage */ +#define ETH_TYPE_PPPOE 0x8864 /* PPP Over Ethernet Session Stage */ +#define ETH_TYPE_LOOPBACK 0x9000 /* used to test interfaces */ + +#define ETH_IS_MULTICAST(ea) (*(ea) & 0x01) /* is address mcast/bcast? */ + +#define ETH_ADDR_BROADCAST "\xff\xff\xff\xff\xff\xff" + +#define eth_pack_hdr(h, dst, src, type) do { \ + struct eth_hdr *eth_pack_p = (struct eth_hdr *)(h); \ + memmove(ð_pack_p->eth_dst, &(dst), ETH_ADDR_LEN); \ + memmove(ð_pack_p->eth_src, &(src), ETH_ADDR_LEN); \ + eth_pack_p->eth_type = htons(type); \ +} while (0) + +typedef struct eth_handle eth_t; + +__BEGIN_DECLS +eth_t *eth_open(const char *device); +int eth_get(eth_t *e, eth_addr_t *ea); +int eth_set(eth_t *e, const eth_addr_t *ea); +size_t eth_send(eth_t *e, const void *buf, size_t len); +eth_t *eth_close(eth_t *e); + +char *eth_ntop(const eth_addr_t *eth, char *dst, size_t len); +int eth_pton(const char *src, eth_addr_t *dst); +char *eth_ntoa(const eth_addr_t *eth); +#define eth_aton eth_pton +__END_DECLS + +#endif /* DNET_ETH_H */ diff --git a/ext/dnet/fw.h b/ext/dnet/fw.h new file mode 100644 index 000000000..ebda8e7eb --- /dev/null +++ b/ext/dnet/fw.h @@ -0,0 +1,54 @@ +/* + * fw.h + * + * Network firewalling operations. + * + * Copyright (c) 2001 Dug Song + * + * $Id: fw.h,v 1.13 2002/12/14 04:02:36 dugsong Exp $ + */ + +#ifndef DNET_FW_H +#define DNET_FW_H + +struct fw_rule { + char fw_device[INTF_NAME_LEN]; /* interface name */ + uint8_t fw_op; /* operation */ + uint8_t fw_dir; /* direction */ + uint8_t fw_proto; /* IP protocol */ + struct addr fw_src; /* src address / net */ + struct addr fw_dst; /* dst address / net */ + uint16_t fw_sport[2]; /* range / ICMP type */ + uint16_t fw_dport[2]; /* range / ICMP code */ +}; + +#define FW_OP_ALLOW 1 +#define FW_OP_BLOCK 2 + +#define FW_DIR_IN 1 +#define FW_DIR_OUT 2 + +#define fw_pack_rule(rule, dev, op, dir, p, s, d, sp1, sp2, dp1, dp2) \ +do { \ + strlcpy((rule)->fw_device, dev, sizeof((rule)->fw_device)); \ + (rule)->fw_op = op; (rule)->fw_dir = dir; \ + (rule)->fw_proto = p; \ + memmove(&(rule)->fw_src, &(s), sizeof((rule)->fw_src)); \ + memmove(&(rule)->fw_dst, &(d), sizeof((rule)->fw_dst)); \ + (rule)->fw_sport[0] = sp1; (rule)->fw_sport[1] = sp2; \ + (rule)->fw_dport[0] = dp1; (rule)->fw_dport[1] = dp2; \ +} while (0) + +typedef struct fw_handle fw_t; + +typedef int (*fw_handler)(const struct fw_rule *rule, void *arg); + +__BEGIN_DECLS +fw_t *fw_open(void); +int fw_add(fw_t *f, const struct fw_rule *rule); +int fw_delete(fw_t *f, const struct fw_rule *rule); +int fw_loop(fw_t *f, fw_handler callback, void *arg); +fw_t *fw_close(fw_t *f); +__END_DECLS + +#endif /* DNET_FW_H */ diff --git a/ext/dnet/icmp.h b/ext/dnet/icmp.h new file mode 100644 index 000000000..e997d5887 --- /dev/null +++ b/ext/dnet/icmp.h @@ -0,0 +1,265 @@ +/* + * icmp.h + * + * Internet Control Message Protocol. + * RFC 792, 950, 1256, 1393, 1475, 2002, 2521 + * + * Copyright (c) 2000 Dug Song + * + * $Id: icmp.h,v 1.14 2003/03/16 17:39:17 dugsong Exp $ + */ + +#ifndef DNET_ICMP_H +#define DNET_ICMP_H + +#define ICMP_HDR_LEN 4 /* base ICMP header length */ +#define ICMP_LEN_MIN 8 /* minimum ICMP message size, with header */ + +#ifndef __GNUC__ +# define __attribute__(x) +# pragma pack(1) +#endif + +/* + * ICMP header + */ +struct icmp_hdr { + uint8_t icmp_type; /* type of message, see below */ + uint8_t icmp_code; /* type sub code */ + uint16_t icmp_cksum; /* ones complement cksum of struct */ +}; + +/* + * Types (icmp_type) and codes (icmp_code) - + * http://www.iana.org/assignments/icmp-parameters + */ +#define ICMP_CODE_NONE 0 /* for types without codes */ +#define ICMP_ECHOREPLY 0 /* echo reply */ +#define ICMP_UNREACH 3 /* dest unreachable, codes: */ +#define ICMP_UNREACH_NET 0 /* bad net */ +#define ICMP_UNREACH_HOST 1 /* bad host */ +#define ICMP_UNREACH_PROTO 2 /* bad protocol */ +#define ICMP_UNREACH_PORT 3 /* bad port */ +#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ +#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ +#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ +#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ +#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ +#define ICMP_UNREACH_NET_PROHIB 9 /* for crypto devs */ +#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ +#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ +#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ +#define ICMP_UNREACH_FILTER_PROHIB 13 /* prohibited access */ +#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* precedence error */ +#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* precedence cutoff */ +#define ICMP_SRCQUENCH 4 /* packet lost, slow down */ +#define ICMP_REDIRECT 5 /* shorter route, codes: */ +#define ICMP_REDIRECT_NET 0 /* for network */ +#define ICMP_REDIRECT_HOST 1 /* for host */ +#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */ +#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */ +#define ICMP_ALTHOSTADDR 6 /* alternate host address */ +#define ICMP_ECHO 8 /* echo service */ +#define ICMP_RTRADVERT 9 /* router advertise, codes: */ +#define ICMP_RTRADVERT_NORMAL 0 /* normal */ +#define ICMP_RTRADVERT_NOROUTE_COMMON 16 /* selective routing */ +#define ICMP_RTRSOLICIT 10 /* router solicitation */ +#define ICMP_TIMEXCEED 11 /* time exceeded, code: */ +#define ICMP_TIMEXCEED_INTRANS 0 /* ttl==0 in transit */ +#define ICMP_TIMEXCEED_REASS 1 /* ttl==0 in reass */ +#define ICMP_PARAMPROB 12 /* ip header bad */ +#define ICMP_PARAMPROB_ERRATPTR 0 /* req. opt. absent */ +#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */ +#define ICMP_PARAMPROB_LENGTH 2 /* bad length */ +#define ICMP_TSTAMP 13 /* timestamp request */ +#define ICMP_TSTAMPREPLY 14 /* timestamp reply */ +#define ICMP_INFO 15 /* information request */ +#define ICMP_INFOREPLY 16 /* information reply */ +#define ICMP_MASK 17 /* address mask request */ +#define ICMP_MASKREPLY 18 /* address mask reply */ +#define ICMP_TRACEROUTE 30 /* traceroute */ +#define ICMP_DATACONVERR 31 /* data conversion error */ +#define ICMP_MOBILE_REDIRECT 32 /* mobile host redirect */ +#define ICMP_IPV6_WHEREAREYOU 33 /* IPv6 where-are-you */ +#define ICMP_IPV6_IAMHERE 34 /* IPv6 i-am-here */ +#define ICMP_MOBILE_REG 35 /* mobile registration req */ +#define ICMP_MOBILE_REGREPLY 36 /* mobile registration reply */ +#define ICMP_DNS 37 /* domain name request */ +#define ICMP_DNSREPLY 38 /* domain name reply */ +#define ICMP_SKIP 39 /* SKIP */ +#define ICMP_PHOTURIS 40 /* Photuris */ +#define ICMP_PHOTURIS_UNKNOWN_INDEX 0 /* unknown sec index */ +#define ICMP_PHOTURIS_AUTH_FAILED 1 /* auth failed */ +#define ICMP_PHOTURIS_DECOMPRESS_FAILED 2 /* decompress failed */ +#define ICMP_PHOTURIS_DECRYPT_FAILED 3 /* decrypt failed */ +#define ICMP_PHOTURIS_NEED_AUTHN 4 /* no authentication */ +#define ICMP_PHOTURIS_NEED_AUTHZ 5 /* no authorization */ +#define ICMP_TYPE_MAX 40 + +#define ICMP_INFOTYPE(type) \ + ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ + (type) == ICMP_RTRADVERT || (type) == ICMP_RTRSOLICIT || \ + (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ + (type) == ICMP_INFO || (type) == ICMP_INFOREPLY || \ + (type) == ICMP_MASK || (type) == ICMP_MASKREPLY) + +/* + * Echo message data + */ +struct icmp_msg_echo { + uint16_t icmp_id; + uint16_t icmp_seq; + uint8_t icmp_data __flexarr; /* optional data */ +}; + +/* + * Fragmentation-needed (unreachable) message data + */ +struct icmp_msg_needfrag { + uint16_t icmp_void; /* must be zero */ + uint16_t icmp_mtu; /* MTU of next-hop network */ + uint8_t icmp_ip __flexarr; /* IP hdr + 8 bytes of pkt */ +}; + +/* + * Unreachable, source quench, redirect, time exceeded, + * parameter problem message data + */ +struct icmp_msg_quote { + uint32_t icmp_void; /* must be zero */ +#define icmp_gwaddr icmp_void /* router IP address to use */ +#define icmp_pptr icmp_void /* ptr to bad octet field */ + uint8_t icmp_ip __flexarr; /* IP hdr + 8 bytes of pkt */ +}; + +/* + * Router advertisement message data, RFC 1256 + */ +struct icmp_msg_rtradvert { + uint8_t icmp_num_addrs; /* # of address / pref pairs */ + uint8_t icmp_wpa; /* words / address == 2 */ + uint16_t icmp_lifetime; /* route lifetime in seconds */ + struct icmp_msg_rtr_data { + uint32_t icmp_void; +#define icmp_gwaddr icmp_void /* router IP address */ + uint32_t icmp_pref; /* router preference (usu 0) */ + } icmp_rtr __flexarr; /* variable # of routers */ +}; +#define ICMP_RTR_PREF_NODEFAULT 0x80000000 /* do not use as default gw */ + +/* + * Timestamp message data + */ +struct icmp_msg_tstamp { + uint32_t icmp_id; /* identifier */ + uint32_t icmp_seq; /* sequence number */ + uint32_t icmp_ts_orig; /* originate timestamp */ + uint32_t icmp_ts_rx; /* receive timestamp */ + uint32_t icmp_ts_tx; /* transmit timestamp */ +}; + +/* + * Address mask message data, RFC 950 + */ +struct icmp_msg_mask { + uint32_t icmp_id; /* identifier */ + uint32_t icmp_seq; /* sequence number */ + uint32_t icmp_mask; /* address mask */ +}; + +/* + * Traceroute message data, RFC 1393, RFC 1812 + */ +struct icmp_msg_traceroute { + uint16_t icmp_id; /* identifier */ + uint16_t icmp_void; /* unused */ + uint16_t icmp_ohc; /* outbound hop count */ + uint16_t icmp_rhc; /* return hop count */ + uint32_t icmp_speed; /* link speed, bytes/sec */ + uint32_t icmp_mtu; /* MTU in bytes */ +}; + +/* + * Domain name reply message data, RFC 1788 + */ +struct icmp_msg_dnsreply { + uint16_t icmp_id; /* identifier */ + uint16_t icmp_seq; /* sequence number */ + uint32_t icmp_ttl; /* time-to-live */ + uint8_t icmp_names __flexarr; /* variable number of names */ +}; + +/* + * Generic identifier, sequence number data + */ +struct icmp_msg_idseq { + uint16_t icmp_id; + uint16_t icmp_seq; +}; + +/* + * ICMP message union + */ +union icmp_msg { + struct icmp_msg_echo echo; /* ICMP_ECHO{REPLY} */ + struct icmp_msg_quote unreach; /* ICMP_UNREACH */ + struct icmp_msg_needfrag needfrag; /* ICMP_UNREACH_NEEDFRAG */ + struct icmp_msg_quote srcquench; /* ICMP_SRCQUENCH */ + struct icmp_msg_quote redirect; /* ICMP_REDIRECT (set to 0) */ + uint32_t rtrsolicit; /* ICMP_RTRSOLICIT */ + struct icmp_msg_rtradvert rtradvert; /* ICMP_RTRADVERT */ + struct icmp_msg_quote timexceed; /* ICMP_TIMEXCEED */ + struct icmp_msg_quote paramprob; /* ICMP_PARAMPROB */ + struct icmp_msg_tstamp tstamp; /* ICMP_TSTAMP{REPLY} */ + struct icmp_msg_idseq info; /* ICMP_INFO{REPLY} */ + struct icmp_msg_mask mask; /* ICMP_MASK{REPLY} */ + struct icmp_msg_traceroute traceroute; /* ICMP_TRACEROUTE */ + struct icmp_msg_idseq dns; /* ICMP_DNS */ + struct icmp_msg_dnsreply dnsreply; /* ICMP_DNSREPLY */ +}; + +#ifndef __GNUC__ +# pragma pack() +#endif + +#define icmp_pack_hdr(hdr, type, code) do { \ + struct icmp_hdr *icmp_pack_p = (struct icmp_hdr *)(hdr); \ + icmp_pack_p->icmp_type = type; icmp_pack_p->icmp_code = code; \ +} while (0) + +#define icmp_pack_hdr_echo(hdr, type, code, id, seq, data, len) do { \ + struct icmp_msg_echo *echo_pack_p = (struct icmp_msg_echo *) \ + ((uint8_t *)(hdr) + ICMP_HDR_LEN); \ + icmp_pack_hdr(hdr, type, code); \ + echo_pack_p->icmp_id = htons(id); \ + echo_pack_p->icmp_seq = htons(seq); \ + memmove(echo_pack_p->icmp_data, data, len); \ +} while (0) + +#define icmp_pack_hdr_quote(hdr, type, code, word, pkt, len) do { \ + struct icmp_msg_quote *quote_pack_p = (struct icmp_msg_quote *) \ + ((uint8_t *)(hdr) + ICMP_HDR_LEN); \ + icmp_pack_hdr(hdr, type, code); \ + quote_pack_p->icmp_void = htonl(word); \ + memmove(quote_pack_p->icmp_ip, pkt, len); \ +} while (0) + +#define icmp_pack_hdr_mask(hdr, type, code, id, seq, mask) do { \ + struct icmp_msg_mask *mask_pack_p = (struct icmp_msg_mask *) \ + ((uint8_t *)(hdr) + ICMP_HDR_LEN); \ + icmp_pack_hdr(hdr, type, code); \ + mask_pack_p->icmp_id = htons(id); \ + mask_pack_p->icmp_seq = htons(seq); \ + mask_pack_p->icmp_mask = htonl(mask); \ +} while (0) + +#define icmp_pack_hdr_needfrag(hdr, type, code, mtu, pkt, len) do { \ + struct icmp_msg_needfrag *frag_pack_p = \ + (struct icmp_msg_needfrag *)((uint8_t *)(hdr) + ICMP_HDR_LEN); \ + icmp_pack_hdr(hdr, type, code); \ + frag_pack_p->icmp_void = 0; \ + frag_pack_p->icmp_mtu = htons(mtu); \ + memmove(frag_pack_p->icmp_ip, pkt, len); \ +} while (0) + +#endif /* DNET_ICMP_H */ diff --git a/ext/dnet/intf.h b/ext/dnet/intf.h new file mode 100644 index 000000000..38acd4356 --- /dev/null +++ b/ext/dnet/intf.h @@ -0,0 +1,68 @@ +/* + * intf.c + * + * Network interface operations. + * + * Copyright (c) 2000 Dug Song + * + * $Id: intf.h,v 1.16 2004/01/13 07:41:09 dugsong Exp $ + */ + +#ifndef DNET_INTF_H +#define DNET_INTF_H + +/* + * Interface entry + */ +#define INTF_NAME_LEN 16 + +struct intf_entry { + u_int intf_len; /* length of entry */ + char intf_name[INTF_NAME_LEN]; /* interface name */ + u_short intf_type; /* interface type (r/o) */ + u_short intf_flags; /* interface flags */ + u_int intf_mtu; /* interface MTU */ + struct addr intf_addr; /* interface address */ + struct addr intf_dst_addr; /* point-to-point dst */ + struct addr intf_link_addr; /* link-layer address */ + u_int intf_alias_num; /* number of aliases */ + struct addr intf_alias_addrs __flexarr; /* array of aliases */ +}; + +/* + * MIB-II interface types - http://www.iana.org/assignments/ianaiftype-mib + */ +#define INTF_TYPE_OTHER 1 /* other */ +#define INTF_TYPE_ETH 6 /* Ethernet */ +#define INTF_TYPE_TOKENRING 9 /* Token Ring */ +#define INTF_TYPE_FDDI 15 /* FDDI */ +#define INTF_TYPE_PPP 23 /* Point-to-Point Protocol */ +#define INTF_TYPE_LOOPBACK 24 /* software loopback */ +#define INTF_TYPE_SLIP 28 /* Serial Line Interface Protocol */ +#define INTF_TYPE_TUN 53 /* proprietary virtual/internal */ + +/* + * Interface flags + */ +#define INTF_FLAG_UP 0x01 /* enable interface */ +#define INTF_FLAG_LOOPBACK 0x02 /* is a loopback net (r/o) */ +#define INTF_FLAG_POINTOPOINT 0x04 /* point-to-point link (r/o) */ +#define INTF_FLAG_NOARP 0x08 /* disable ARP */ +#define INTF_FLAG_BROADCAST 0x10 /* supports broadcast (r/o) */ +#define INTF_FLAG_MULTICAST 0x20 /* supports multicast (r/o) */ + +typedef struct intf_handle intf_t; + +typedef int (*intf_handler)(const struct intf_entry *entry, void *arg); + +__BEGIN_DECLS +intf_t *intf_open(void); +int intf_get(intf_t *i, struct intf_entry *entry); +int intf_get_src(intf_t *i, struct intf_entry *entry, struct addr *src); +int intf_get_dst(intf_t *i, struct intf_entry *entry, struct addr *dst); +int intf_set(intf_t *i, const struct intf_entry *entry); +int intf_loop(intf_t *i, intf_handler callback, void *arg); +intf_t *intf_close(intf_t *i); +__END_DECLS + +#endif /* DNET_INTF_H */ diff --git a/ext/dnet/ip.h b/ext/dnet/ip.h new file mode 100644 index 000000000..95b7718fb --- /dev/null +++ b/ext/dnet/ip.h @@ -0,0 +1,487 @@ +/* + * ip.h + * + * Internet Protocol (RFC 791). + * + * Copyright (c) 2000 Dug Song + * + * $Id: ip.h,v 1.23 2003/03/16 17:39:17 dugsong Exp $ + */ + +#ifndef DNET_IP_H +#define DNET_IP_H + +#define IP_ADDR_LEN 4 /* IP address length */ +#define IP_ADDR_BITS 32 /* IP address bits */ + +#define IP_HDR_LEN 20 /* base IP header length */ +#define IP_OPT_LEN 2 /* base IP option length */ +#define IP_OPT_LEN_MAX 40 +#define IP_HDR_LEN_MAX (IP_HDR_LEN + IP_OPT_LEN_MAX) + +#define IP_LEN_MAX 65535 +#define IP_LEN_MIN IP_HDR_LEN + +typedef uint32_t ip_addr_t; + +#ifndef __GNUC__ +# define __attribute__(x) +# pragma pack(1) +#endif + +/* + * IP header, without options + */ +struct ip_hdr { +#if DNET_BYTESEX == DNET_BIG_ENDIAN + uint8_t ip_v:4, /* version */ + ip_hl:4; /* header length (incl any options) */ +#elif DNET_BYTESEX == DNET_LIL_ENDIAN + uint8_t ip_hl:4, + ip_v:4; +#else +# error "need to include " +#endif + uint8_t ip_tos; /* type of service */ + uint16_t ip_len; /* total length (incl header) */ + uint16_t ip_id; /* identification */ + uint16_t ip_off; /* fragment offset and flags */ + uint8_t ip_ttl; /* time to live */ + uint8_t ip_p; /* protocol */ + uint16_t ip_sum; /* checksum */ + ip_addr_t ip_src; /* source address */ + ip_addr_t ip_dst; /* destination address */ +}; + +/* + * Type of service (ip_tos), RFC 1349 ("obsoleted by RFC 2474") + */ +#define IP_TOS_DEFAULT 0x00 /* default */ +#define IP_TOS_LOWDELAY 0x10 /* low delay */ +#define IP_TOS_THROUGHPUT 0x08 /* high throughput */ +#define IP_TOS_RELIABILITY 0x04 /* high reliability */ +#define IP_TOS_LOWCOST 0x02 /* low monetary cost - XXX */ +#define IP_TOS_ECT 0x02 /* ECN-capable transport */ +#define IP_TOS_CE 0x01 /* congestion experienced */ + +/* + * IP precedence (high 3 bits of ip_tos), hopefully unused + */ +#define IP_TOS_PREC_ROUTINE 0x00 +#define IP_TOS_PREC_PRIORITY 0x20 +#define IP_TOS_PREC_IMMEDIATE 0x40 +#define IP_TOS_PREC_FLASH 0x60 +#define IP_TOS_PREC_FLASHOVERRIDE 0x80 +#define IP_TOS_PREC_CRITIC_ECP 0xa0 +#define IP_TOS_PREC_INTERNETCONTROL 0xc0 +#define IP_TOS_PREC_NETCONTROL 0xe0 + +/* + * Fragmentation flags (ip_off) + */ +#define IP_RF 0x8000 /* reserved */ +#define IP_DF 0x4000 /* don't fragment */ +#define IP_MF 0x2000 /* more fragments (not last frag) */ +#define IP_OFFMASK 0x1fff /* mask for fragment offset */ + +/* + * Time-to-live (ip_ttl), seconds + */ +#define IP_TTL_DEFAULT 64 /* default ttl, RFC 1122, RFC 1340 */ +#define IP_TTL_MAX 255 /* maximum ttl */ + +/* + * Protocol (ip_p) - http://www.iana.org/assignments/protocol-numbers + */ +#define IP_PROTO_IP 0 /* dummy for IP */ +#define IP_PROTO_HOPOPTS IP_PROTO_IP /* IPv6 hop-by-hop options */ +#define IP_PROTO_ICMP 1 /* ICMP */ +#define IP_PROTO_IGMP 2 /* IGMP */ +#define IP_PROTO_GGP 3 /* gateway-gateway protocol */ +#define IP_PROTO_IPIP 4 /* IP in IP */ +#define IP_PROTO_ST 5 /* ST datagram mode */ +#define IP_PROTO_TCP 6 /* TCP */ +#define IP_PROTO_CBT 7 /* CBT */ +#define IP_PROTO_EGP 8 /* exterior gateway protocol */ +#define IP_PROTO_IGP 9 /* interior gateway protocol */ +#define IP_PROTO_BBNRCC 10 /* BBN RCC monitoring */ +#define IP_PROTO_NVP 11 /* Network Voice Protocol */ +#define IP_PROTO_PUP 12 /* PARC universal packet */ +#define IP_PROTO_ARGUS 13 /* ARGUS */ +#define IP_PROTO_EMCON 14 /* EMCON */ +#define IP_PROTO_XNET 15 /* Cross Net Debugger */ +#define IP_PROTO_CHAOS 16 /* Chaos */ +#define IP_PROTO_UDP 17 /* UDP */ +#define IP_PROTO_MUX 18 /* multiplexing */ +#define IP_PROTO_DCNMEAS 19 /* DCN measurement */ +#define IP_PROTO_HMP 20 /* Host Monitoring Protocol */ +#define IP_PROTO_PRM 21 /* Packet Radio Measurement */ +#define IP_PROTO_IDP 22 /* Xerox NS IDP */ +#define IP_PROTO_TRUNK1 23 /* Trunk-1 */ +#define IP_PROTO_TRUNK2 24 /* Trunk-2 */ +#define IP_PROTO_LEAF1 25 /* Leaf-1 */ +#define IP_PROTO_LEAF2 26 /* Leaf-2 */ +#define IP_PROTO_RDP 27 /* "Reliable Datagram" proto */ +#define IP_PROTO_IRTP 28 /* Inet Reliable Transaction */ +#define IP_PROTO_TP 29 /* ISO TP class 4 */ +#define IP_PROTO_NETBLT 30 /* Bulk Data Transfer */ +#define IP_PROTO_MFPNSP 31 /* MFE Network Services */ +#define IP_PROTO_MERITINP 32 /* Merit Internodal Protocol */ +#define IP_PROTO_SEP 33 /* Sequential Exchange proto */ +#define IP_PROTO_3PC 34 /* Third Party Connect proto */ +#define IP_PROTO_IDPR 35 /* Interdomain Policy Route */ +#define IP_PROTO_XTP 36 /* Xpress Transfer Protocol */ +#define IP_PROTO_DDP 37 /* Datagram Delivery Proto */ +#define IP_PROTO_CMTP 38 /* IDPR Ctrl Message Trans */ +#define IP_PROTO_TPPP 39 /* TP++ Transport Protocol */ +#define IP_PROTO_IL 40 /* IL Transport Protocol */ +#define IP_PROTO_IPV6 41 /* IPv6 */ +#define IP_PROTO_SDRP 42 /* Source Demand Routing */ +#define IP_PROTO_ROUTING 43 /* IPv6 routing header */ +#define IP_PROTO_FRAGMENT 44 /* IPv6 fragmentation header */ +#define IP_PROTO_RSVP 46 /* Reservation protocol */ +#define IP_PROTO_GRE 47 /* General Routing Encap */ +#define IP_PROTO_MHRP 48 /* Mobile Host Routing */ +#define IP_PROTO_ENA 49 /* ENA */ +#define IP_PROTO_ESP 50 /* Encap Security Payload */ +#define IP_PROTO_AH 51 /* Authentication Header */ +#define IP_PROTO_INLSP 52 /* Integated Net Layer Sec */ +#define IP_PROTO_SWIPE 53 /* SWIPE */ +#define IP_PROTO_NARP 54 /* NBMA Address Resolution */ +#define IP_PROTO_MOBILE 55 /* Mobile IP, RFC 2004 */ +#define IP_PROTO_TLSP 56 /* Transport Layer Security */ +#define IP_PROTO_SKIP 57 /* SKIP */ +#define IP_PROTO_ICMPV6 58 /* ICMP for IPv6 */ +#define IP_PROTO_NONE 59 /* IPv6 no next header */ +#define IP_PROTO_DSTOPTS 60 /* IPv6 destination options */ +#define IP_PROTO_ANYHOST 61 /* any host internal proto */ +#define IP_PROTO_CFTP 62 /* CFTP */ +#define IP_PROTO_ANYNET 63 /* any local network */ +#define IP_PROTO_EXPAK 64 /* SATNET and Backroom EXPAK */ +#define IP_PROTO_KRYPTOLAN 65 /* Kryptolan */ +#define IP_PROTO_RVD 66 /* MIT Remote Virtual Disk */ +#define IP_PROTO_IPPC 67 /* Inet Pluribus Packet Core */ +#define IP_PROTO_DISTFS 68 /* any distributed fs */ +#define IP_PROTO_SATMON 69 /* SATNET Monitoring */ +#define IP_PROTO_VISA 70 /* VISA Protocol */ +#define IP_PROTO_IPCV 71 /* Inet Packet Core Utility */ +#define IP_PROTO_CPNX 72 /* Comp Proto Net Executive */ +#define IP_PROTO_CPHB 73 /* Comp Protocol Heart Beat */ +#define IP_PROTO_WSN 74 /* Wang Span Network */ +#define IP_PROTO_PVP 75 /* Packet Video Protocol */ +#define IP_PROTO_BRSATMON 76 /* Backroom SATNET Monitor */ +#define IP_PROTO_SUNND 77 /* SUN ND Protocol */ +#define IP_PROTO_WBMON 78 /* WIDEBAND Monitoring */ +#define IP_PROTO_WBEXPAK 79 /* WIDEBAND EXPAK */ +#define IP_PROTO_EON 80 /* ISO CNLP */ +#define IP_PROTO_VMTP 81 /* Versatile Msg Transport*/ +#define IP_PROTO_SVMTP 82 /* Secure VMTP */ +#define IP_PROTO_VINES 83 /* VINES */ +#define IP_PROTO_TTP 84 /* TTP */ +#define IP_PROTO_NSFIGP 85 /* NSFNET-IGP */ +#define IP_PROTO_DGP 86 /* Dissimilar Gateway Proto */ +#define IP_PROTO_TCF 87 /* TCF */ +#define IP_PROTO_EIGRP 88 /* EIGRP */ +#define IP_PROTO_OSPF 89 /* Open Shortest Path First */ +#define IP_PROTO_SPRITERPC 90 /* Sprite RPC Protocol */ +#define IP_PROTO_LARP 91 /* Locus Address Resolution */ +#define IP_PROTO_MTP 92 /* Multicast Transport Proto */ +#define IP_PROTO_AX25 93 /* AX.25 Frames */ +#define IP_PROTO_IPIPENCAP 94 /* yet-another IP encap */ +#define IP_PROTO_MICP 95 /* Mobile Internet Ctrl */ +#define IP_PROTO_SCCSP 96 /* Semaphore Comm Sec Proto */ +#define IP_PROTO_ETHERIP 97 /* Ethernet in IPv4 */ +#define IP_PROTO_ENCAP 98 /* encapsulation header */ +#define IP_PROTO_ANYENC 99 /* private encryption scheme */ +#define IP_PROTO_GMTP 100 /* GMTP */ +#define IP_PROTO_IFMP 101 /* Ipsilon Flow Mgmt Proto */ +#define IP_PROTO_PNNI 102 /* PNNI over IP */ +#define IP_PROTO_PIM 103 /* Protocol Indep Multicast */ +#define IP_PROTO_ARIS 104 /* ARIS */ +#define IP_PROTO_SCPS 105 /* SCPS */ +#define IP_PROTO_QNX 106 /* QNX */ +#define IP_PROTO_AN 107 /* Active Networks */ +#define IP_PROTO_IPCOMP 108 /* IP Payload Compression */ +#define IP_PROTO_SNP 109 /* Sitara Networks Protocol */ +#define IP_PROTO_COMPAQPEER 110 /* Compaq Peer Protocol */ +#define IP_PROTO_IPXIP 111 /* IPX in IP */ +#define IP_PROTO_VRRP 112 /* Virtual Router Redundancy */ +#define IP_PROTO_PGM 113 /* PGM Reliable Transport */ +#define IP_PROTO_ANY0HOP 114 /* 0-hop protocol */ +#define IP_PROTO_L2TP 115 /* Layer 2 Tunneling Proto */ +#define IP_PROTO_DDX 116 /* D-II Data Exchange (DDX) */ +#define IP_PROTO_IATP 117 /* Interactive Agent Xfer */ +#define IP_PROTO_STP 118 /* Schedule Transfer Proto */ +#define IP_PROTO_SRP 119 /* SpectraLink Radio Proto */ +#define IP_PROTO_UTI 120 /* UTI */ +#define IP_PROTO_SMP 121 /* Simple Message Protocol */ +#define IP_PROTO_SM 122 /* SM */ +#define IP_PROTO_PTP 123 /* Performance Transparency */ +#define IP_PROTO_ISIS 124 /* ISIS over IPv4 */ +#define IP_PROTO_FIRE 125 /* FIRE */ +#define IP_PROTO_CRTP 126 /* Combat Radio Transport */ +#define IP_PROTO_CRUDP 127 /* Combat Radio UDP */ +#define IP_PROTO_SSCOPMCE 128 /* SSCOPMCE */ +#define IP_PROTO_IPLT 129 /* IPLT */ +#define IP_PROTO_SPS 130 /* Secure Packet Shield */ +#define IP_PROTO_PIPE 131 /* Private IP Encap in IP */ +#define IP_PROTO_SCTP 132 /* Stream Ctrl Transmission */ +#define IP_PROTO_FC 133 /* Fibre Channel */ +#define IP_PROTO_RSVPIGN 134 /* RSVP-E2E-IGNORE */ +#define IP_PROTO_RAW 255 /* Raw IP packets */ +#define IP_PROTO_RESERVED IP_PROTO_RAW /* Reserved */ +#define IP_PROTO_MAX 255 + +/* + * Option types (opt_type) - http://www.iana.org/assignments/ip-parameters + */ +#define IP_OPT_CONTROL 0x00 /* control */ +#define IP_OPT_DEBMEAS 0x40 /* debugging & measurement */ +#define IP_OPT_COPY 0x80 /* copy into all fragments */ +#define IP_OPT_RESERVED1 0x20 +#define IP_OPT_RESERVED2 0x60 + +#define IP_OPT_EOL 0 /* end of option list */ +#define IP_OPT_NOP 1 /* no operation */ +#define IP_OPT_SEC (2|IP_OPT_COPY) /* DoD basic security */ +#define IP_OPT_LSRR (3|IP_OPT_COPY) /* loose source route */ +#define IP_OPT_TS (4|IP_OPT_DEBMEAS) /* timestamp */ +#define IP_OPT_ESEC (5|IP_OPT_COPY) /* DoD extended security */ +#define IP_OPT_CIPSO (6|IP_OPT_COPY) /* commercial security */ +#define IP_OPT_RR 7 /* record route */ +#define IP_OPT_SATID (8|IP_OPT_COPY) /* stream ID (obsolete) */ +#define IP_OPT_SSRR (9|IP_OPT_COPY) /* strict source route */ +#define IP_OPT_ZSU 10 /* experimental measurement */ +#define IP_OPT_MTUP 11 /* MTU probe */ +#define IP_OPT_MTUR 12 /* MTU reply */ +#define IP_OPT_FINN (13|IP_OPT_COPY|IP_OPT_DEBMEAS) /* exp flow control */ +#define IP_OPT_VISA (14|IP_OPT_COPY) /* exp access control */ +#define IP_OPT_ENCODE 15 /* ??? */ +#define IP_OPT_IMITD (16|IP_OPT_COPY) /* IMI traffic descriptor */ +#define IP_OPT_EIP (17|IP_OPT_COPY) /* extended IP, RFC 1385 */ +#define IP_OPT_TR (18|IP_OPT_DEBMEAS) /* traceroute */ +#define IP_OPT_ADDEXT (19|IP_OPT_COPY) /* IPv7 ext addr, RFC 1475 */ +#define IP_OPT_RTRALT (20|IP_OPT_COPY) /* router alert, RFC 2113 */ +#define IP_OPT_SDB (21|IP_OPT_COPY) /* directed bcast, RFC 1770 */ +#define IP_OPT_NSAPA (22|IP_OPT_COPY) /* NSAP addresses */ +#define IP_OPT_DPS (23|IP_OPT_COPY) /* dynamic packet state */ +#define IP_OPT_UMP (24|IP_OPT_COPY) /* upstream multicast */ +#define IP_OPT_MAX 25 + +#define IP_OPT_COPIED(o) ((o) & 0x80) +#define IP_OPT_CLASS(o) ((o) & 0x60) +#define IP_OPT_NUMBER(o) ((o) & 0x1f) +#define IP_OPT_TYPEONLY(o) ((o) == IP_OPT_EOL || (o) == IP_OPT_NOP) + +/* + * Security option data - RFC 791, 3.1 + */ +struct ip_opt_data_sec { + uint16_t s; /* security */ + uint16_t c; /* compartments */ + uint16_t h; /* handling restrictions */ + uint8_t tcc[3]; /* transmission control code */ +} __attribute__((__packed__)); + +#define IP_OPT_SEC_UNCLASS 0x0000 /* unclassified */ +#define IP_OPT_SEC_CONFID 0xf135 /* confidential */ +#define IP_OPT_SEC_EFTO 0x789a /* EFTO */ +#define IP_OPT_SEC_MMMM 0xbc4d /* MMMM */ +#define IP_OPT_SEC_PROG 0x5e26 /* PROG */ +#define IP_OPT_SEC_RESTR 0xaf13 /* restricted */ +#define IP_OPT_SEC_SECRET 0xd788 /* secret */ +#define IP_OPT_SEC_TOPSECRET 0x6bc5 /* top secret */ + +/* + * {Loose Source, Record, Strict Source} Route option data - RFC 791, 3.1 + */ +struct ip_opt_data_rr { + uint8_t ptr; /* from start of option, >= 4 */ + uint32_t iplist __flexarr; /* list of IP addresses */ +} __attribute__((__packed__)); + +/* + * Timestamp option data - RFC 791, 3.1 + */ +struct ip_opt_data_ts { + uint8_t ptr; /* from start of option, >= 5 */ +#if DNET_BYTESEX == DNET_BIG_ENDIAN + uint8_t oflw:4, /* number of IPs skipped */ + flg:4; /* address[ / timestamp] flag */ +#elif DNET_BYTESEX == DNET_LIL_ENDIAN + uint8_t flg:4, + oflw:4; +#endif + uint32_t ipts __flexarr; /* IP address [/ timestamp] pairs */ +} __attribute__((__packed__)); + +#define IP_OPT_TS_TSONLY 0 /* timestamps only */ +#define IP_OPT_TS_TSADDR 1 /* IP address / timestamp pairs */ +#define IP_OPT_TS_PRESPEC 3 /* IP address / zero timestamp pairs */ + +/* + * Traceroute option data - RFC 1393, 2.2 + */ +struct ip_opt_data_tr { + uint16_t id; /* ID number */ + uint16_t ohc; /* outbound hop count */ + uint16_t rhc; /* return hop count */ + uint32_t origip; /* originator IP address */ +} __attribute__((__packed__)); + +/* + * IP option (following IP header) + */ +struct ip_opt { + uint8_t opt_type; /* option type */ + uint8_t opt_len; /* option length >= IP_OPT_LEN */ + union ip_opt_data { + struct ip_opt_data_sec sec; /* IP_OPT_SEC */ + struct ip_opt_data_rr rr; /* IP_OPT_{L,S}RR */ + struct ip_opt_data_ts ts; /* IP_OPT_TS */ + uint16_t satid; /* IP_OPT_SATID */ + uint16_t mtu; /* IP_OPT_MTU{P,R} */ + struct ip_opt_data_tr tr; /* IP_OPT_TR */ + uint32_t addext[2]; /* IP_OPT_ADDEXT */ + uint16_t rtralt; /* IP_OPT_RTRALT */ + uint32_t sdb[9]; /* IP_OPT_SDB */ + uint8_t data8[IP_OPT_LEN_MAX - IP_OPT_LEN]; + } opt_data; +} __attribute__((__packed__)); + +#ifndef __GNUC__ +# pragma pack() +#endif + +/* + * Classful addressing + */ +#define IP_CLASSA(i) (((uint32_t)(i) & htonl(0x80000000)) == \ + htonl(0x00000000)) +#define IP_CLASSA_NET (htonl(0xff000000)) +#define IP_CLASSA_NSHIFT 24 +#define IP_CLASSA_HOST (htonl(0x00ffffff)) +#define IP_CLASSA_MAX 128 + +#define IP_CLASSB(i) (((uint32_t)(i) & htonl(0xc0000000)) == \ + htonl(0x80000000)) +#define IP_CLASSB_NET (htonl(0xffff0000)) +#define IP_CLASSB_NSHIFT 16 +#define IP_CLASSB_HOST (htonl(0x0000ffff)) +#define IP_CLASSB_MAX 65536 + +#define IP_CLASSC(i) (((uint32_t)(i) & htonl(0xe0000000)) == \ + htonl(0xc0000000)) +#define IP_CLASSC_NET (htonl(0xffffff00)) +#define IP_CLASSC_NSHIFT 8 +#define IP_CLASSC_HOST (htonl(0x000000ff)) + +#define IP_CLASSD(i) (((uint32_t)(i) & htonl(0xf0000000)) == \ + htonl(0xe0000000)) +/* These ones aren't really net and host fields, but routing needn't know. */ +#define IP_CLASSD_NET (htonl(0xf0000000)) +#define IP_CLASSD_NSHIFT 28 +#define IP_CLASSD_HOST (htonl(0x0fffffff)) +#define IP_MULTICAST(i) IP_CLASSD(i) + +#define IP_EXPERIMENTAL(i) (((uint32_t)(i) & htonl(0xf0000000)) == \ + htonl(0xf0000000)) +#define IP_BADCLASS(i) (((uint32_t)(i) & htonl(0xf0000000)) == \ + htonl(0xf0000000)) +#define IP_LOCAL_GROUP(i) (((uint32_t)(i) & htonl(0xffffff00)) == \ + htonl(0xe0000000)) +/* + * Reserved addresses + */ +#define IP_ADDR_ANY (htonl(0x00000000)) /* 0.0.0.0 */ +#define IP_ADDR_BROADCAST (htonl(0xffffffff)) /* 255.255.255.255 */ +#define IP_ADDR_LOOPBACK (htonl(0x7f000001)) /* 127.0.0.1 */ +#define IP_ADDR_MCAST_ALL (htonl(0xe0000001)) /* 224.0.0.1 */ +#define IP_ADDR_MCAST_LOCAL (htonl(0xe00000ff)) /* 224.0.0.225 */ + +#define ip_pack_hdr(hdr, tos, len, id, off, ttl, p, src, dst) do { \ + struct ip_hdr *ip_pack_p = (struct ip_hdr *)(hdr); \ + ip_pack_p->ip_v = 4; ip_pack_p->ip_hl = 5; \ + ip_pack_p->ip_tos = tos; ip_pack_p->ip_len = htons(len); \ + ip_pack_p->ip_id = htons(id); ip_pack_p->ip_off = htons(off); \ + ip_pack_p->ip_ttl = ttl; ip_pack_p->ip_p = p; \ + ip_pack_p->ip_src = src; ip_pack_p->ip_dst = dst; \ +} while (0) + +typedef struct ip_handle ip_t; + +__BEGIN_DECLS +ip_t *ip_open(void); +size_t ip_send(ip_t *i, const void *buf, size_t len); +ip_t *ip_close(ip_t *i); + +char *ip_ntop(const ip_addr_t *ip, char *dst, size_t len); +int ip_pton(const char *src, ip_addr_t *dst); +char *ip_ntoa(const ip_addr_t *ip); +#define ip_aton ip_pton + +size_t ip_add_option(void *buf, size_t len, + int proto, const void *optbuf, size_t optlen); +void ip_checksum(void *buf, size_t len); + +inline int +ip_cksum_add(const void *buf, size_t len, int cksum) +{ + uint16_t *sp = (uint16_t *)buf; + int n, sn; + + sn = len / 2; + n = (sn + 15) / 16; + + /* XXX - unroll loop using Duff's device. */ + switch (sn % 16) { + case 0: do { + cksum += *sp++; + case 15: + cksum += *sp++; + case 14: + cksum += *sp++; + case 13: + cksum += *sp++; + case 12: + cksum += *sp++; + case 11: + cksum += *sp++; + case 10: + cksum += *sp++; + case 9: + cksum += *sp++; + case 8: + cksum += *sp++; + case 7: + cksum += *sp++; + case 6: + cksum += *sp++; + case 5: + cksum += *sp++; + case 4: + cksum += *sp++; + case 3: + cksum += *sp++; + case 2: + cksum += *sp++; + case 1: + cksum += *sp++; + } while (--n > 0); + } + if (len & 1) + cksum += htons(*(u_char *)sp << 8); + + return (cksum); +} + +inline uint16_t +ip_cksum_carry(int x) +{ + x = (x >> 16) + (x & 0xffff); + return ~(x + (x >> 16)) & 0xffff; +} + +__END_DECLS + +#endif /* DNET_IP_H */ diff --git a/ext/dnet/ip6.h b/ext/dnet/ip6.h new file mode 100644 index 000000000..7fae29b47 --- /dev/null +++ b/ext/dnet/ip6.h @@ -0,0 +1,183 @@ +/* + * ip6.h + * + * Internet Protocol, Version 6 (RFC 2460). + * + * Copyright (c) 2002 Dug Song + * + * $Id: ip6.h,v 1.6 2004/02/23 10:01:15 dugsong Exp $ + */ + +#ifndef DNET_IP6_H +#define DNET_IP6_H + +#define IP6_ADDR_LEN 16 +#define IP6_ADDR_BITS 128 + +#define IP6_HDR_LEN 40 /* IPv6 header length */ +#define IP6_LEN_MIN IP6_HDR_LEN +#define IP6_LEN_MAX 65535 /* non-jumbo payload */ + +#define IP6_MTU_MIN 1280 /* minimum MTU (1024 + 256) */ + +typedef struct ip6_addr { + uint8_t data[IP6_ADDR_LEN]; +} ip6_addr_t; + +#ifndef __GNUC__ +# define __attribute__(x) +# pragma pack(1) +#endif + +/* + * IPv6 header + */ +struct ip6_hdr { + union { + struct ip6_hdr_ctl { + uint32_t ip6_un1_flow; /* 20 bits of flow ID */ + uint16_t ip6_un1_plen; /* payload length */ + uint8_t ip6_un1_nxt; /* next header */ + uint8_t ip6_un1_hlim; /* hop limit */ + } ip6_un1; + uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */ + } ip6_ctlun; + ip6_addr_t ip6_src; + ip6_addr_t ip6_dst; +} __attribute__((__packed__)); + +#define ip6_vfc ip6_ctlun.ip6_un2_vfc +#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow +#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen +#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt /* IP_PROTO_* */ +#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim + +#define IP6_VERSION 0x60 +#define IP6_VERSION_MASK 0xf0 /* ip6_vfc version */ + +#if DNET_BYTESEX == DNET_BIG_ENDIAN +#define IP6_FLOWINFO_MASK 0x0fffffff /* ip6_flow info (28 bits) */ +#define IP6_FLOWLABEL_MASK 0x000fffff /* ip6_flow label (20 bits) */ +#elif DNET_BYTESEX == DNET_LIL_ENDIAN +#define IP6_FLOWINFO_MASK 0xffffff0f /* ip6_flow info (28 bits) */ +#define IP6_FLOWLABEL_MASK 0xffff0f00 /* ip6_flow label (20 bits) */ +#endif + +/* + * Hop limit (ip6_hlim) + */ +#define IP6_HLIM_DEFAULT 64 +#define IP6_HLIM_MAX 255 + +/* + * Preferred extension header order from RFC 2460, 4.1: + * + * IP_PROTO_IPV6, IP_PROTO_HOPOPTS, IP_PROTO_DSTOPTS, IP_PROTO_ROUTING, + * IP_PROTO_FRAGMENT, IP_PROTO_AH, IP_PROTO_ESP, IP_PROTO_DSTOPTS, IP_PROTO_* + */ + +/* + * Routing header data (IP_PROTO_ROUTING) + */ +struct ip6_ext_data_routing { + uint8_t type; /* routing type */ + uint8_t segleft; /* segments left */ + /* followed by routing type specific data */ +} __attribute__((__packed__)); + +struct ip6_ext_data_routing0 { + uint8_t type; /* always zero */ + uint8_t segleft; /* segments left */ + uint8_t reserved; /* reserved field */ + uint8_t slmap[3]; /* strict/loose bit map */ + ip6_addr_t addr[1]; /* up to 23 addresses */ +} __attribute__((__packed__)); + +/* + * Fragment header data (IP_PROTO_FRAGMENT) + */ +struct ip6_ext_data_fragment { + uint16_t offlg; /* offset, reserved, and flag */ + uint32_t ident; /* identification */ +} __attribute__((__packed__)); + +/* + * Fragmentation offset, reserved, and flags (offlg) + */ +#if DNET_BYTESEX == DNET_BIG_ENDIAN +#define IP6_OFF_MASK 0xfff8 /* mask out offset from offlg */ +#define IP6_RESERVED_MASK 0x0006 /* reserved bits in offlg */ +#define IP6_MORE_FRAG 0x0001 /* more-fragments flag */ +#elif DNET_BYTESEX == DNET_LIL_ENDIAN +#define IP6_OFF_MASK 0xf8ff /* mask out offset from offlg */ +#define IP6_RESERVED_MASK 0x0600 /* reserved bits in offlg */ +#define IP6_MORE_FRAG 0x0100 /* more-fragments flag */ +#endif + +/* + * Option types, for IP_PROTO_HOPOPTS, IP_PROTO_DSTOPTS headers + */ +#define IP6_OPT_PAD1 0x00 /* 00 0 00000 */ +#define IP6_OPT_PADN 0x01 /* 00 0 00001 */ +#define IP6_OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */ +#define IP6_OPT_JUMBO_LEN 6 +#define IP6_OPT_RTALERT 0x05 /* 00 0 00101 */ +#define IP6_OPT_RTALERT_LEN 4 +#define IP6_OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */ +#define IP6_OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */ +#define IP6_OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */ +#define IP6_OPT_LEN_MIN 2 + +#define IP6_OPT_TYPE(o) ((o) & 0xC0) /* high 2 bits of opt_type */ +#define IP6_OPT_TYPE_SKIP 0x00 /* continue processing on failure */ +#define IP6_OPT_TYPE_DISCARD 0x40 /* discard packet on failure */ +#define IP6_OPT_TYPE_FORCEICMP 0x80 /* discard and send ICMP on failure */ +#define IP6_OPT_TYPE_ICMP 0xC0 /* ...only if non-multicast dst */ + +#define IP6_OPT_MUTABLE 0x20 /* option data may change en route */ + +/* + * Extension header (chained via {ip6,ext}_nxt, following IPv6 header) + */ +struct ip6_ext_hdr { + uint8_t ext_nxt; /* next header */ + uint8_t ext_len; /* following length in units of 8 octets */ + union { + struct ip6_ext_data_routing routing; + struct ip6_ext_data_fragment fragment; + } ext_data; +} __attribute__((__packed__)); + +#ifndef __GNUC__ +# pragma pack() +#endif + +/* + * Reserved addresses + */ +#define IP6_ADDR_UNSPEC \ + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +#define IP6_ADDR_LOOPBACK \ + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + +#define ip6_pack_hdr(hdr, fc, fl, plen, nxt, hlim, src, dst) do { \ + struct ip6_hdr *ip6 = (struct ip6_hdr *)(hdr); \ + ip6->ip6_flow = htonl(((uint32_t)(fc) << 28) & \ + (IP6_FLOWLABEL_MASK | (fl))); \ + ip6->ip6_vfc = (IP6_VERSION | ((fc) >> 4)); \ + ip6->ip6_plen = htons((plen)); \ + ip6->ip6_nxt = (nxt); ip6->ip6_hlim = (hlim); \ + memmove(&ip6->ip6_src, &(src), IP6_ADDR_LEN); \ + memmove(&ip6->ip6_dst, &(dst), IP6_ADDR_LEN); \ +} while (0); + +__BEGIN_DECLS +char *ip6_ntop(const ip6_addr_t *ip6, char *dst, size_t size); +int ip6_pton(const char *src, ip6_addr_t *dst); +char *ip6_ntoa(const ip6_addr_t *ip6); +#define ip6_aton ip6_pton + +void ip6_checksum(void *buf, size_t len); +__END_DECLS + +#endif /* DNET_IP6_H */ diff --git a/ext/dnet/os.h b/ext/dnet/os.h new file mode 100644 index 000000000..cae244781 --- /dev/null +++ b/ext/dnet/os.h @@ -0,0 +1,117 @@ +/* + * os.h + * + * Sleazy OS-specific defines. + * + * Copyright (c) 2000 Dug Song + * + * $Id: os.h,v 1.10 2004/05/04 03:19:42 dugsong Exp $ + */ + +#ifndef DNET_OS_H +#define DNET_OS_H + +#ifdef _WIN32 +# include +# include +# include +/* XXX */ +# undef IP_OPT_LSRR +# undef IP_OPT_TS +# undef IP_OPT_RR +# undef IP_OPT_SSRR +#else +# include +# include +# include +# include +# include +# include +# ifdef __bsdi__ +# include + typedef u_int8_t uint8_t; + typedef u_int16_t uint16_t; + typedef u_int32_t uint32_t; + typedef u_int64_t uint64_t; +# else +# include +# endif +#endif + +#define DNET_LIL_ENDIAN 1234 +#define DNET_BIG_ENDIAN 4321 + +/* BSD and IRIX */ +#ifdef BYTE_ORDER +#if BYTE_ORDER == LITTLE_ENDIAN +# define DNET_BYTESEX DNET_LIL_ENDIAN +#elif BYTE_ORDER == BIG_ENDIAN +# define DNET_BYTESEX DNET_BIG_ENDIAN +#endif +#endif + +/* Linux */ +#ifdef __BYTE_ORDER +#if __BYTE_ORDER == __LITTLE_ENDIAN +# define DNET_BYTESEX DNET_LIL_ENDIAN +#elif __BYTE_ORDER == __BIG_ENDIAN +# define DNET_BYTESEX DNET_BIG_ENDIAN +#endif +#endif + +/* Solaris */ +#if defined(_BIT_FIELDS_LTOH) +# define DNET_BYTESEX DNET_LIL_ENDIAN +#elif defined (_BIT_FIELDS_HTOL) +# define DNET_BYTESEX DNET_BIG_ENDIAN +#endif + +/* Nastiness from old BIND code. */ +#ifndef DNET_BYTESEX +# if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \ + defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \ + defined(__alpha__) || defined(__alpha) +# define DNET_BYTESEX DNET_LIL_ENDIAN +# elif defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \ + defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \ + defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\ + defined(apollo) || defined(__convex__) || defined(_CRAY) || \ + defined(__hppa) || defined(__hp9000) || \ + defined(__hp9000s300) || defined(__hp9000s700) || defined(__ia64) || \ + defined (BIT_ZERO_ON_LEFT) || defined(m68k) +# define DNET_BYTESEX DNET_BIG_ENDIAN +# else +# error "bytesex unknown" +# endif +#endif + +/* C++ support. */ +#undef __BEGIN_DECLS +#undef __END_DECLS +#ifdef __cplusplus +# define __BEGIN_DECLS extern "C" { +# define __END_DECLS } /* extern "C" */ +#else +# define __BEGIN_DECLS +# define __END_DECLS +#endif + +/* Support for flexible arrays. */ +#undef __flexarr +#if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)) +/* GCC 2.97 supports C99 flexible array members. */ +# define __flexarr [] +#else +# ifdef __GNUC__ +# define __flexarr [0] +# else +# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +# define __flexarr [] +# else +/* Some other non-C99 compiler. Approximate with [1]. */ +# define __flexarr [1] +# endif +# endif +#endif + +#endif /* DNET_OS_H */ diff --git a/ext/dnet/rand.h b/ext/dnet/rand.h new file mode 100644 index 000000000..49121930c --- /dev/null +++ b/ext/dnet/rand.h @@ -0,0 +1,33 @@ +/* + * rand.h + * + * Pseudo-random number generation, based on OpenBSD arc4random(). + * + * Copyright (c) 2000 Dug Song + * Copyright (c) 1996 David Mazieres + * + * $Id: rand.h,v 1.4 2002/04/07 19:01:25 dugsong Exp $ + */ + +#ifndef DNET_RAND_H +#define DNET_RAND_H + +typedef struct rand_handle rand_t; + +__BEGIN_DECLS +rand_t *rand_open(void); + +int rand_get(rand_t *r, void *buf, size_t len); +int rand_set(rand_t *r, const void *seed, size_t len); +int rand_add(rand_t *r, const void *buf, size_t len); + +uint8_t rand_uint8(rand_t *r); +uint16_t rand_uint16(rand_t *r); +uint32_t rand_uint32(rand_t *r); + +int rand_shuffle(rand_t *r, void *base, size_t nmemb, size_t size); + +rand_t *rand_close(rand_t *r); +__END_DECLS + +#endif /* DNET_RAND_H */ diff --git a/ext/dnet/route.h b/ext/dnet/route.h new file mode 100644 index 000000000..74c21419c --- /dev/null +++ b/ext/dnet/route.h @@ -0,0 +1,35 @@ +/* + * route.c + * + * Kernel route table operations. + * + * Copyright (c) 2000 Dug Song + * + * $Id: route.h,v 1.6 2002/02/04 04:02:22 dugsong Exp $ + */ + +#ifndef DNET_ROUTE_H +#define DNET_ROUTE_H + +/* + * Routing table entry + */ +struct route_entry { + struct addr route_dst; /* destination address */ + struct addr route_gw; /* gateway address */ +}; + +typedef struct route_handle route_t; + +typedef int (*route_handler)(const struct route_entry *entry, void *arg); + +__BEGIN_DECLS +route_t *route_open(void); +int route_add(route_t *r, const struct route_entry *entry); +int route_delete(route_t *r, const struct route_entry *entry); +int route_get(route_t *r, struct route_entry *entry); +int route_loop(route_t *r, route_handler callback, void *arg); +route_t *route_close(route_t *r); +__END_DECLS + +#endif /* DNET_ROUTE_H */ diff --git a/ext/dnet/tcp.h b/ext/dnet/tcp.h new file mode 100644 index 000000000..008946384 --- /dev/null +++ b/ext/dnet/tcp.h @@ -0,0 +1,158 @@ +/* + * tcp.h + * + * Transmission Control Protocol (RFC 793). + * + * Copyright (c) 2000 Dug Song + * + * $Id: tcp.h,v 1.17 2004/02/23 10:02:11 dugsong Exp $ + */ + +#ifndef DNET_TCP_H +#define DNET_TCP_H + +#define TCP_HDR_LEN 20 /* base TCP header length */ +#define TCP_OPT_LEN 2 /* base TCP option length */ +#define TCP_OPT_LEN_MAX 40 +#define TCP_HDR_LEN_MAX (TCP_HDR_LEN + TCP_OPT_LEN_MAX) + +#ifndef __GNUC__ +# define __attribute__(x) +# pragma pack(1) +#endif + +/* + * TCP header, without options + */ +struct tcp_hdr { + uint16_t th_sport; /* source port */ + uint16_t th_dport; /* destination port */ + uint32_t th_seq; /* sequence number */ + uint32_t th_ack; /* acknowledgment number */ +#if DNET_BYTESEX == DNET_BIG_ENDIAN + uint8_t th_off:4, /* data offset */ + th_x2:4; /* (unused) */ +#elif DNET_BYTESEX == DNET_LIL_ENDIAN + uint8_t th_x2:4, + th_off:4; +#else +# error "need to include " +#endif + uint8_t th_flags; /* control flags */ + uint16_t th_win; /* window */ + uint16_t th_sum; /* checksum */ + uint16_t th_urp; /* urgent pointer */ +}; + +/* + * TCP control flags (th_flags) + */ +#define TH_FIN 0x01 /* end of data */ +#define TH_SYN 0x02 /* synchronize sequence numbers */ +#define TH_RST 0x04 /* reset connection */ +#define TH_PUSH 0x08 /* push */ +#define TH_ACK 0x10 /* acknowledgment number set */ +#define TH_URG 0x20 /* urgent pointer set */ +#define TH_ECE 0x40 /* ECN echo, RFC 3168 */ +#define TH_CWR 0x80 /* congestion window reduced */ + +#define TCP_PORT_MAX 65535 /* maximum port */ +#define TCP_WIN_MAX 65535 /* maximum (unscaled) window */ + +/* + * Sequence number comparison macros + */ +#define TCP_SEQ_LT(a,b) ((int)((a)-(b)) < 0) +#define TCP_SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0) +#define TCP_SEQ_GT(a,b) ((int)((a)-(b)) > 0) +#define TCP_SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0) + +/* + * TCP FSM states + */ +#define TCP_STATE_CLOSED 0 /* closed */ +#define TCP_STATE_LISTEN 1 /* listening from connection */ +#define TCP_STATE_SYN_SENT 2 /* active, have sent SYN */ +#define TCP_STATE_SYN_RECEIVED 3 /* have sent and received SYN */ + +#define TCP_STATE_ESTABLISHED 4 /* established */ +#define TCP_STATE_CLOSE_WAIT 5 /* rcvd FIN, waiting for close */ + +#define TCP_STATE_FIN_WAIT_1 6 /* have closed, sent FIN */ +#define TCP_STATE_CLOSING 7 /* closed xchd FIN, await FIN-ACK */ +#define TCP_STATE_LAST_ACK 8 /* had FIN and close, await FIN-ACK */ + +#define TCP_STATE_FIN_WAIT_2 9 /* have closed, FIN is acked */ +#define TCP_STATE_TIME_WAIT 10 /* in 2*MSL quiet wait after close */ +#define TCP_STATE_MAX 11 + +/* + * Options (opt_type) - http://www.iana.org/assignments/tcp-parameters + */ +#define TCP_OPT_EOL 0 /* end of option list */ +#define TCP_OPT_NOP 1 /* no operation */ +#define TCP_OPT_MSS 2 /* maximum segment size */ +#define TCP_OPT_WSCALE 3 /* window scale factor, RFC 1072 */ +#define TCP_OPT_SACKOK 4 /* SACK permitted, RFC 2018 */ +#define TCP_OPT_SACK 5 /* SACK, RFC 2018 */ +#define TCP_OPT_ECHO 6 /* echo (obsolete), RFC 1072 */ +#define TCP_OPT_ECHOREPLY 7 /* echo reply (obsolete), RFC 1072 */ +#define TCP_OPT_TIMESTAMP 8 /* timestamp, RFC 1323 */ +#define TCP_OPT_POCONN 9 /* partial order conn, RFC 1693 */ +#define TCP_OPT_POSVC 10 /* partial order service, RFC 1693 */ +#define TCP_OPT_CC 11 /* connection count, RFC 1644 */ +#define TCP_OPT_CCNEW 12 /* CC.NEW, RFC 1644 */ +#define TCP_OPT_CCECHO 13 /* CC.ECHO, RFC 1644 */ +#define TCP_OPT_ALTSUM 14 /* alt checksum request, RFC 1146 */ +#define TCP_OPT_ALTSUMDATA 15 /* alt checksum data, RFC 1146 */ +#define TCP_OPT_SKEETER 16 /* Skeeter */ +#define TCP_OPT_BUBBA 17 /* Bubba */ +#define TCP_OPT_TRAILSUM 18 /* trailer checksum */ +#define TCP_OPT_MD5 19 /* MD5 signature, RFC 2385 */ +#define TCP_OPT_SCPS 20 /* SCPS capabilities */ +#define TCP_OPT_SNACK 21 /* selective negative acks */ +#define TCP_OPT_REC 22 /* record boundaries */ +#define TCP_OPT_CORRUPT 23 /* corruption experienced */ +#define TCP_OPT_SNAP 24 /* SNAP */ +#define TCP_OPT_TCPCOMP 26 /* TCP compression filter */ +#define TCP_OPT_MAX 27 + +#define TCP_OPT_TYPEONLY(type) \ + ((type) == TCP_OPT_EOL || (type) == TCP_OPT_NOP) + +/* + * TCP option (following TCP header) + */ +struct tcp_opt { + uint8_t opt_type; /* option type */ + uint8_t opt_len; /* option length >= TCP_OPT_LEN */ + union tcp_opt_data { + uint16_t mss; /* TCP_OPT_MSS */ + uint8_t wscale; /* TCP_OPT_WSCALE */ + uint16_t sack[19]; /* TCP_OPT_SACK */ + uint32_t echo; /* TCP_OPT_ECHO{REPLY} */ + uint32_t timestamp[2]; /* TCP_OPT_TIMESTAMP */ + uint32_t cc; /* TCP_OPT_CC{NEW,ECHO} */ + uint8_t cksum; /* TCP_OPT_ALTSUM */ + uint8_t md5[16]; /* TCP_OPT_MD5 */ + uint8_t data8[TCP_OPT_LEN_MAX - TCP_OPT_LEN]; + } opt_data; +} __attribute__((__packed__)); + +#ifndef __GNUC__ +# pragma pack() +#endif + +#define tcp_pack_hdr(hdr, sport, dport, seq, ack, flags, win, urp) do { \ + struct tcp_hdr *tcp_pack_p = (struct tcp_hdr *)(hdr); \ + tcp_pack_p->th_sport = htons(sport); \ + tcp_pack_p->th_dport = htons(dport); \ + tcp_pack_p->th_seq = htonl(seq); \ + tcp_pack_p->th_ack = htonl(ack); \ + tcp_pack_p->th_x2 = 0; tcp_pack_p->th_off = 5; \ + tcp_pack_p->th_flags = flags; \ + tcp_pack_p->th_win = htons(win); \ + tcp_pack_p->th_urp = htons(urp); \ +} while (0) + +#endif /* DNET_TCP_H */ diff --git a/ext/dnet/udp.h b/ext/dnet/udp.h new file mode 100644 index 000000000..73839a92a --- /dev/null +++ b/ext/dnet/udp.h @@ -0,0 +1,32 @@ +/* + * udp.h + * + * User Datagram Protocol (RFC 768). + * + * Copyright (c) 2000 Dug Song + * + * $Id: udp.h,v 1.8 2002/04/02 05:05:39 dugsong Exp $ + */ + +#ifndef DNET_UDP_H +#define DNET_UDP_H + +#define UDP_HDR_LEN 8 + +struct udp_hdr { + uint16_t uh_sport; /* source port */ + uint16_t uh_dport; /* destination port */ + uint16_t uh_ulen; /* udp length (including header) */ + uint16_t uh_sum; /* udp checksum */ +}; + +#define UDP_PORT_MAX 65535 + +#define udp_pack_hdr(hdr, sport, dport, ulen) do { \ + struct udp_hdr *udp_pack_p = (struct udp_hdr *)(hdr); \ + udp_pack_p->uh_sport = htons(sport); \ + udp_pack_p->uh_dport = htons(dport); \ + udp_pack_p->uh_ulen = htons(ulen); \ +} while (0) + +#endif /* DNET_UDP_H */ -- cgit v1.2.3