1219b2ee8SDavid du Colombier #pragma src "/sys/src/libip" 23e12c5d1SDavid du Colombier #pragma lib "libip.a" 33e12c5d1SDavid du Colombier 47dd7cddfSDavid du Colombier enum 57dd7cddfSDavid du Colombier { 67dd7cddfSDavid du Colombier IPaddrlen= 16, 77dd7cddfSDavid du Colombier IPv4addrlen= 4, 87dd7cddfSDavid du Colombier IPv4off= 12, 97dd7cddfSDavid du Colombier IPllen= 4, 105e1edbcaSDavid du Colombier IPV4HDR_LEN= 20, 110774058cSDavid du Colombier 120774058cSDavid du Colombier /* vihl & vcf[0] values */ 130774058cSDavid du Colombier IP_VER4= 0x40, 140774058cSDavid du Colombier IP_VER6= 0x60, 157dd7cddfSDavid du Colombier }; 16219b2ee8SDavid du Colombier 17219b2ee8SDavid du Colombier /* 187dd7cddfSDavid du Colombier * for reading /net/ipifc 197dd7cddfSDavid du Colombier */ 207dd7cddfSDavid du Colombier typedef struct Ipifc Ipifc; 219a747e4fSDavid du Colombier typedef struct Iplifc Iplifc; 229a747e4fSDavid du Colombier typedef struct Ipv6rp Ipv6rp; 237dd7cddfSDavid du Colombier 249a747e4fSDavid du Colombier /* local address */ 259a747e4fSDavid du Colombier struct Iplifc 267dd7cddfSDavid du Colombier { 279a747e4fSDavid du Colombier Iplifc *next; 289a747e4fSDavid du Colombier 299a747e4fSDavid du Colombier /* per address on the ip interface */ 307dd7cddfSDavid du Colombier uchar ip[IPaddrlen]; 317dd7cddfSDavid du Colombier uchar mask[IPaddrlen]; 327dd7cddfSDavid du Colombier uchar net[IPaddrlen]; /* ip & mask */ 339a747e4fSDavid du Colombier ulong preflt; /* preferred lifetime */ 349a747e4fSDavid du Colombier ulong validlt; /* valid lifetime */ 359a747e4fSDavid du Colombier }; 369a747e4fSDavid du Colombier 379a747e4fSDavid du Colombier /* default values, one per stack */ 389a747e4fSDavid du Colombier struct Ipv6rp 399a747e4fSDavid du Colombier { 409a747e4fSDavid du Colombier int mflag; 419a747e4fSDavid du Colombier int oflag; 429a747e4fSDavid du Colombier int maxraint; 439a747e4fSDavid du Colombier int minraint; 449a747e4fSDavid du Colombier int linkmtu; 459a747e4fSDavid du Colombier int reachtime; 469a747e4fSDavid du Colombier int rxmitra; 479a747e4fSDavid du Colombier int ttl; 489a747e4fSDavid du Colombier int routerlt; 499a747e4fSDavid du Colombier }; 509a747e4fSDavid du Colombier 519a747e4fSDavid du Colombier /* actual interface */ 529a747e4fSDavid du Colombier struct Ipifc 539a747e4fSDavid du Colombier { 547dd7cddfSDavid du Colombier Ipifc *next; 559a747e4fSDavid du Colombier Iplifc *lifc; 569a747e4fSDavid du Colombier 579a747e4fSDavid du Colombier /* per ip interface */ 589a747e4fSDavid du Colombier int index; /* number of interface in ipifc dir */ 599a747e4fSDavid du Colombier char dev[64]; 609a747e4fSDavid du Colombier uchar sendra6; /* on == send router adv */ 619a747e4fSDavid du Colombier uchar recvra6; /* on == rcv router adv */ 629a747e4fSDavid du Colombier int mtu; 639a747e4fSDavid du Colombier ulong pktin; 649a747e4fSDavid du Colombier ulong pktout; 659a747e4fSDavid du Colombier ulong errin; 669a747e4fSDavid du Colombier ulong errout; 679a747e4fSDavid du Colombier Ipv6rp rp; 687dd7cddfSDavid du Colombier }; 697dd7cddfSDavid du Colombier 705e1edbcaSDavid du Colombier #define ISIPV6MCAST(addr) ((addr)[0] == 0xff) 715e1edbcaSDavid du Colombier #define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80) 725e1edbcaSDavid du Colombier 735e1edbcaSDavid du Colombier /* 745e1edbcaSDavid du Colombier * ipv6 constants 755e1edbcaSDavid du Colombier * `ra' is `router advertisement', `rs' is `router solicitation'. 765e1edbcaSDavid du Colombier * `na' is `neighbour advertisement'. 775e1edbcaSDavid du Colombier */ 785e1edbcaSDavid du Colombier enum { 795e1edbcaSDavid du Colombier IPV6HDR_LEN = 40, 805e1edbcaSDavid du Colombier 818c6ab946SDavid du Colombier /* neighbour discovery option types */ 828c6ab946SDavid du Colombier V6nd_srclladdr = 1, 838c6ab946SDavid du Colombier V6nd_targlladdr = 2, 848c6ab946SDavid du Colombier V6nd_pfxinfo = 3, 858c6ab946SDavid du Colombier V6nd_redirhdr = 4, 868c6ab946SDavid du Colombier V6nd_mtu = 5, 878c6ab946SDavid du Colombier /* new since rfc2461; see iana.org/assignments/icmpv6-parameters */ 888c6ab946SDavid du Colombier V6nd_home = 8, 898c6ab946SDavid du Colombier V6nd_srcaddrs = 9, /* rfc3122 */ 908c6ab946SDavid du Colombier V6nd_ip = 17, 918c6ab946SDavid du Colombier /* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */ 928c6ab946SDavid du Colombier V6nd_rdns = 25, 938c6ab946SDavid du Colombier /* plan 9 extensions */ 948c6ab946SDavid du Colombier V6nd_9fs = 250, 958c6ab946SDavid du Colombier V6nd_9auth = 251, 965e1edbcaSDavid du Colombier 975e1edbcaSDavid du Colombier /* Router constants (all times in ms.) */ 985e1edbcaSDavid du Colombier Maxv6initraintvl= 16000, 995e1edbcaSDavid du Colombier Maxv6initras = 3, 1005e1edbcaSDavid du Colombier Maxv6finalras = 3, 1015e1edbcaSDavid du Colombier Minv6interradelay= 3000, 1025e1edbcaSDavid du Colombier Maxv6radelay = 500, 1035e1edbcaSDavid du Colombier 1045e1edbcaSDavid du Colombier /* Host constants */ 1055e1edbcaSDavid du Colombier Maxv6rsdelay = 1000, 1065e1edbcaSDavid du Colombier V6rsintvl = 4000, 1075e1edbcaSDavid du Colombier Maxv6rss = 3, 1085e1edbcaSDavid du Colombier 1095e1edbcaSDavid du Colombier /* Node constants */ 1105e1edbcaSDavid du Colombier Maxv6mcastrss = 3, 1115e1edbcaSDavid du Colombier Maxv6unicastrss = 3, 1125e1edbcaSDavid du Colombier Maxv6anycastdelay= 1000, 1135e1edbcaSDavid du Colombier Maxv6na = 3, 1145e1edbcaSDavid du Colombier V6reachabletime = 30000, 1155e1edbcaSDavid du Colombier V6retranstimer = 1000, 1165e1edbcaSDavid du Colombier V6initprobedelay= 5000, 1175e1edbcaSDavid du Colombier }; 1185e1edbcaSDavid du Colombier 1195e1edbcaSDavid du Colombier /* V6 header on the wire */ 1205e1edbcaSDavid du Colombier typedef struct Ip6hdr Ip6hdr; 1215e1edbcaSDavid du Colombier struct Ip6hdr { 1225e1edbcaSDavid du Colombier uchar vcf[4]; /* version:4, traffic class:8, flow label:20 */ 1235e1edbcaSDavid du Colombier uchar ploadlen[2]; /* payload length: packet length - 40 */ 1245e1edbcaSDavid du Colombier uchar proto; /* next header type */ 1255e1edbcaSDavid du Colombier uchar ttl; /* hop limit */ 1265e1edbcaSDavid du Colombier uchar src[IPaddrlen]; /* source address */ 1275e1edbcaSDavid du Colombier uchar dst[IPaddrlen]; /* destination address */ 12894aa1c4cSDavid du Colombier uchar payload[]; 1295e1edbcaSDavid du Colombier }; 1305e1edbcaSDavid du Colombier 1315e1edbcaSDavid du Colombier /* 1325e1edbcaSDavid du Colombier * user-level icmpv6 with control message "headers" 1335e1edbcaSDavid du Colombier */ 1345e1edbcaSDavid du Colombier typedef struct Icmp6hdr Icmp6hdr; 1355e1edbcaSDavid du Colombier struct Icmp6hdr { 1360774058cSDavid du Colombier uchar _0_[8]; 1375e1edbcaSDavid du Colombier uchar laddr[IPaddrlen]; /* local address */ 1385e1edbcaSDavid du Colombier uchar raddr[IPaddrlen]; /* remote address */ 1395e1edbcaSDavid du Colombier }; 1405e1edbcaSDavid du Colombier 1417dd7cddfSDavid du Colombier /* 142223a0358SDavid du Colombier * user level udp headers with control message "headers" 143d9dc5dd1SDavid du Colombier */ 144d9dc5dd1SDavid du Colombier enum 145d9dc5dd1SDavid du Colombier { 146d9dc5dd1SDavid du Colombier Udphdrsize= 52, /* size of a Udphdr */ 147d9dc5dd1SDavid du Colombier }; 148d9dc5dd1SDavid du Colombier 149d9dc5dd1SDavid du Colombier typedef struct Udphdr Udphdr; 150d9dc5dd1SDavid du Colombier struct Udphdr 151d9dc5dd1SDavid du Colombier { 152223a0358SDavid du Colombier uchar raddr[IPaddrlen]; /* V6 remote address */ 153223a0358SDavid du Colombier uchar laddr[IPaddrlen]; /* V6 local address */ 154223a0358SDavid du Colombier uchar ifcaddr[IPaddrlen]; /* V6 ifc addr msg was received on */ 155223a0358SDavid du Colombier uchar rport[2]; /* remote port */ 156d9dc5dd1SDavid du Colombier uchar lport[2]; /* local port */ 157d9dc5dd1SDavid du Colombier }; 158d9dc5dd1SDavid du Colombier 1597dd7cddfSDavid du Colombier uchar* defmask(uchar*); 1607dd7cddfSDavid du Colombier void maskip(uchar*, uchar*, uchar*); 1619a747e4fSDavid du Colombier int eipfmt(Fmt*); 1627dd7cddfSDavid du Colombier int isv4(uchar*); 163*ea58ad6fSDavid du Colombier vlong parseip(uchar*, char*); 164*ea58ad6fSDavid du Colombier vlong parseipmask(uchar*, char*); 1657dd7cddfSDavid du Colombier char* v4parseip(uchar*, char*); 1667dd7cddfSDavid du Colombier char* v4parsecidr(uchar*, uchar*, char*); 1677dd7cddfSDavid du Colombier int parseether(uchar*, char*); 1687dd7cddfSDavid du Colombier int myipaddr(uchar*, char*); 1697dd7cddfSDavid du Colombier int myetheraddr(uchar*, char*); 1706d0d1481SDavid du Colombier int equivip4(uchar*, uchar*); 1716d0d1481SDavid du Colombier int equivip6(uchar*, uchar*); 1727dd7cddfSDavid du Colombier 1739a747e4fSDavid du Colombier Ipifc* readipifc(char*, Ipifc*, int); 1747dd7cddfSDavid du Colombier 175375daca8SDavid du Colombier void hnputv(void*, uvlong); 1767dd7cddfSDavid du Colombier void hnputl(void*, uint); 1777dd7cddfSDavid du Colombier void hnputs(void*, ushort); 178375daca8SDavid du Colombier uvlong nhgetv(void*); 1797dd7cddfSDavid du Colombier uint nhgetl(void*); 1807dd7cddfSDavid du Colombier ushort nhgets(void*); 1819a747e4fSDavid du Colombier ushort ptclbsum(uchar*, int); 1827dd7cddfSDavid du Colombier 1837dd7cddfSDavid du Colombier int v6tov4(uchar*, uchar*); 1847dd7cddfSDavid du Colombier void v4tov6(uchar*, uchar*); 1857dd7cddfSDavid du Colombier 1867dd7cddfSDavid du Colombier #define ipcmp(x, y) memcmp(x, y, IPaddrlen) 1877dd7cddfSDavid du Colombier #define ipmove(x, y) memmove(x, y, IPaddrlen) 1887dd7cddfSDavid du Colombier 1897dd7cddfSDavid du Colombier extern uchar IPv4bcast[IPaddrlen]; 1907dd7cddfSDavid du Colombier extern uchar IPv4bcastobs[IPaddrlen]; 1917dd7cddfSDavid du Colombier extern uchar IPv4allsys[IPaddrlen]; 1927dd7cddfSDavid du Colombier extern uchar IPv4allrouter[IPaddrlen]; 1937dd7cddfSDavid du Colombier extern uchar IPnoaddr[IPaddrlen]; 1947dd7cddfSDavid du Colombier extern uchar v4prefix[IPaddrlen]; 1957dd7cddfSDavid du Colombier extern uchar IPallbits[IPaddrlen]; 1967dd7cddfSDavid du Colombier 1977dd7cddfSDavid du Colombier #define CLASS(p) ((*(uchar*)(p))>>6) 1987dd7cddfSDavid du Colombier 1997dd7cddfSDavid du Colombier #pragma varargck type "I" uchar* 2007dd7cddfSDavid du Colombier #pragma varargck type "V" uchar* 2017dd7cddfSDavid du Colombier #pragma varargck type "E" uchar* 2027dd7cddfSDavid du Colombier #pragma varargck type "M" uchar* 203