| /* |
| * This file is part of the UCB release of Plan 9. It is subject to the license |
| * terms in the LICENSE file found in the top-level directory of this |
| * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No |
| * part of the UCB release of Plan 9, including this file, may be copied, |
| * modified, propagated, or distributed except according to the terms contained |
| * in the LICENSE file. |
| */ |
| #pragma once |
| |
| #include <parlib/common.h> |
| |
| __BEGIN_DECLS |
| |
| enum |
| { |
| ETH_HDR_LEN = 14, |
| ETH_OFF_DST = 0, |
| ETH_OFF_SRC = 6, |
| ETH_OFF_ETYPE = 12, |
| |
| ETH_ADDR_LEN = 6, |
| ETH_TYPE_IPV4 = 0x0800, |
| ETH_TYPE_ARP = 0x0806, |
| ETH_TYPE_IPV6 = 0x86dd, |
| ETH_HTYPE_ETH = 1, |
| |
| IPV4_HDR_LEN = 20, |
| IPV4_OFF_LEN = 2, |
| IPV4_OFF_ID = 4, |
| IPV4_OFF_TTL = 8, |
| IPV4_OFF_PROTO = 9, |
| IPV4_OFF_XSUM = 10, |
| IPV4_OFF_SRC = 12, |
| IPV4_OFF_DST = 16, |
| |
| IPV4_ADDR_LEN = 4, |
| IP_ICMPPROTO = 1, |
| IP_IGMPPROTO = 2, |
| IP_TCPPROTO = 6, |
| IP_UDPPROTO = 17, |
| IP_ILPROTO = 40, |
| |
| UDP_HDR_LEN = 8, |
| UDP_OFF_SRC_PORT = 0, |
| UDP_OFF_DST_PORT = 2, |
| UDP_OFF_LEN = 4, |
| UDP_OFF_XSUM = 6, |
| |
| TCP_HDR_LEN = 20, |
| TCP_OFF_SRC_PORT = 0, |
| TCP_OFF_DST_PORT = 2, |
| TCP_OFF_SEQ = 4, |
| TCP_OFF_ACK = 8, |
| TCP_OFF_DATA = 12, |
| TCP_OFF_FL = 12, |
| TCP_OFF_WIN = 14, |
| TCP_OFF_XSUM = 16, |
| |
| ARP_PKT_LEN = 28, |
| ARP_OFF_HTYPE = 0, |
| ARP_OFF_PTYPE = 2, |
| ARP_OFF_HLEN = 4, |
| ARP_OFF_PLEN = 5, |
| ARP_OFF_OP = 6, |
| ARP_OFF_SHA = 8, |
| ARP_OFF_SPA = 14, |
| ARP_OFF_THA = 18, |
| ARP_OFF_TPA = 24, |
| |
| ARP_OP_REQ = 1, |
| ARP_OP_RSP = 2, |
| |
| IPaddrlen= 16, |
| IPv4addrlen= 4, |
| IPv4off= 12, |
| IPllen= 4, |
| IPV4HDR_LEN= 20, |
| |
| /* vihl & vcf[0] values */ |
| IP_VER4= 0x40, |
| IP_VER6= 0x60, |
| NETPATHLEN= 40, |
| }; |
| |
| /* |
| * for reading /net/ipifc |
| */ |
| |
| /* local address */ |
| struct iplifc |
| { |
| struct iplifc *next; |
| |
| /* per address on the ip interface */ |
| uint8_t ip[IPaddrlen]; |
| uint8_t mask[IPaddrlen]; |
| uint8_t net[IPaddrlen]; /* ip & mask */ |
| uint32_t preflt; /* preferred lifetime */ |
| uint32_t validlt; /* valid lifetime */ |
| }; |
| |
| /* default values, one per stack */ |
| struct ipv6rp |
| { |
| int mflag; |
| int oflag; |
| int maxraint; |
| int minraint; |
| int linkmtu; |
| int reachtime; |
| int rxmitra; |
| int ttl; |
| int routerlt; |
| }; |
| |
| /* actual interface */ |
| struct ipifc |
| { |
| struct ipifc *next; |
| struct iplifc *lifc; |
| |
| /* per ip interface */ |
| int index; /* number of interface in ipifc dir */ |
| char dev[64]; |
| uint8_t sendra6; /* on == send router adv */ |
| uint8_t recvra6; /* on == rcv router adv */ |
| int mtu; |
| uint32_t pktin; |
| uint32_t pktout; |
| uint32_t errin; |
| uint32_t errout; |
| struct ipv6rp rp; |
| }; |
| |
| #define ISIPV6MCAST(addr) ((addr)[0] == 0xff) |
| #define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80) |
| |
| /* |
| * ipv6 constants |
| * `ra' is `router advertisement', `rs' is `router solicitation'. |
| * `na' is `neighbour advertisement'. |
| */ |
| enum { |
| IPV6HDR_LEN = 40, |
| |
| /* neighbour discovery option types */ |
| V6nd_srclladdr = 1, |
| V6nd_targlladdr = 2, |
| V6nd_pfxinfo = 3, |
| V6nd_redirhdr = 4, |
| V6nd_mtu = 5, |
| /* new since rfc2461; see iana.org/assignments/icmpv6-parameters */ |
| V6nd_home = 8, |
| V6nd_srcaddrs = 9, /* rfc3122 */ |
| V6nd_ip = 17, |
| /* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */ |
| V6nd_rdns = 25, |
| /* plan 9 extensions */ |
| V6nd_9fs = 250, |
| V6nd_9auth = 251, |
| |
| /* Router constants (all times in ms.) */ |
| Maxv6initraintvl= 16000, |
| Maxv6initras = 3, |
| Maxv6finalras = 3, |
| Minv6interradelay= 3000, |
| Maxv6radelay = 500, |
| |
| /* Host constants */ |
| Maxv6rsdelay = 1000, |
| V6rsintvl = 4000, |
| Maxv6rss = 3, |
| |
| /* Node constants */ |
| Maxv6mcastrss = 3, |
| Maxv6unicastrss = 3, |
| Maxv6anycastdelay= 1000, |
| Maxv6na = 3, |
| V6reachabletime = 30000, |
| V6retranstimer = 1000, |
| V6initprobedelay= 5000, |
| }; |
| |
| # if 0 |
| /* in icmp.h? */ |
| struct ip4hdr |
| { |
| uint8_t vihl; /* Version and header length */ |
| uint8_t tos; /* Type of service */ |
| uint8_t length[2]; /* packet length */ |
| uint8_t id[2]; /* ip->identification */ |
| uint8_t frag[2]; /* Fragment information */ |
| uint8_t ttl; /* Time to live */ |
| uint8_t proto; /* Protocol */ |
| uint8_t cksum[2]; /* Header checksum */ |
| uint8_t src[4]; /* IP source */ |
| uint8_t dst[4]; /* IP destination */ |
| }; |
| #endif |
| |
| /* V6 header on the wire */ |
| |
| struct ip6hdr { |
| uint8_t vcf[4]; /* version:4, traffic class:8, flow label:20 */ |
| uint8_t ploadlen[2]; /* payload length: packet length - 40 */ |
| uint8_t proto; /* next header type */ |
| uint8_t ttl; /* hop limit */ |
| uint8_t src[IPaddrlen]; /* source address */ |
| uint8_t dst[IPaddrlen]; /* destination address */ |
| uint8_t payload[]; |
| }; |
| |
| /* |
| * user-level icmpv6 with control message "headers" |
| */ |
| |
| struct icmp6hdr { |
| uint8_t _0_[8]; |
| uint8_t laddr[IPaddrlen]; /* local address */ |
| uint8_t raddr[IPaddrlen]; /* remote address */ |
| }; |
| |
| /* |
| * user level udp headers with control message "headers" |
| */ |
| enum |
| { |
| Udphdrsize= 52, /* size of a Udphdr */ |
| }; |
| |
| struct udphdr |
| { |
| uint8_t raddr[IPaddrlen]; /* V6 remote address */ |
| uint8_t laddr[IPaddrlen]; /* V6 local address */ |
| uint8_t ifcaddr[IPaddrlen]; /* V6 ifc addr msg was received on */ |
| uint8_t rport[2]; /* remote port */ |
| uint8_t lport[2]; /* local port */ |
| }; |
| |
| uint8_t *defmask(uint8_t*); |
| void maskip(uint8_t*, uint8_t*, uint8_t*); |
| //int eipfmt(Fmt*); |
| int isv4(uint8_t*); |
| int64_t parseip(uint8_t*, char*); |
| int64_t parseipmask(uint8_t*, char*); |
| char *v4parseip(uint8_t*, char*); |
| char *v4parsecidr(uint8_t*, uint8_t*, char*); |
| int parseether(uint8_t*, char*); |
| int myipaddr(uint8_t*, char*); |
| int my_router_addr(uint8_t *addr, char *net); |
| int myetheraddr(uint8_t*, char*); |
| int equivip4(uint8_t*, uint8_t*); |
| int equivip6(uint8_t*, uint8_t*); |
| |
| struct ipifc *readipifc(char *net, struct ipifc *to_free, int index); |
| struct iplifc *get_first_noloop_iplifc(char *net, struct ipifc **ifc); |
| void free_ipifc(struct ipifc *ifc); |
| |
| void hnputv(void*, uint64_t); |
| void hnputl(void*, unsigned int); |
| void hnputs(void*, uint16_t); |
| uint64_t nhgetv(void*); |
| unsigned int nhgetl(void*); |
| uint16_t nhgets(void*); |
| uint16_t ptclbsum(uint8_t*, int); |
| uint16_t ip_calc_xsum(uint8_t *addr, size_t len); |
| |
| int v6tov4(uint8_t*, uint8_t*); |
| void v4tov6(uint8_t*, uint8_t*); |
| |
| #define ipcmp(x, y) memcmp(x, y, IPaddrlen) |
| #define ipmove(x, y) memmove(x, y, IPaddrlen) |
| |
| extern uint8_t IPv4bcast[IPaddrlen]; |
| extern uint8_t IPv4bcastobs[IPaddrlen]; |
| extern uint8_t IPv4allsys[IPaddrlen]; |
| extern uint8_t IPv4allrouter[IPaddrlen]; |
| extern uint8_t IPnoaddr[IPaddrlen]; |
| extern uint8_t v4prefix[IPaddrlen]; |
| extern uint8_t IPallbits[IPaddrlen]; |
| |
| #define CLASS(p) ((*(uint8_t*)(p))>>6) |
| |
| int tokenize(char *s, char **args, int maxargs); |
| int getfields(char *str, char **args, int max, int mflag, char *unused_set); |
| char *netmkaddr(char *linear, char *defnet, char *defsrv, char *buf, |
| size_t buf_sz); |
| int dial9(char *dest, char *local, char *dir, int *cfdp, int flags); |
| int clone9(char *addr, char *dir, int flags); |
| int announce9(char *addr, char *dir, int flags); |
| int bypass9(char *addr, char *conv_dir, int flags); |
| int listen9(char *dir, char *newdir, int flags); |
| int accept9(int ctl, char *dir); |
| int reject9(int ctl, char *dir, char *cause); |
| int open_data_fd9(char *conv_dir, int flags); |
| bool get_port9(char *conv_dir, char *which, uint16_t *port); |
| int gettokens(char *s, char **args, int maxargs, char *sep); |
| |
| __END_DECLS |