1 #pragma src "/sys/src/libip" 2 #pragma lib "libip.a" 3 4 enum 5 { 6 IPaddrlen= 16, 7 IPv4addrlen= 4, 8 IPv4off= 12, 9 IPllen= 4, 10 IPV4HDR_LEN= 20, 11 12 /* vihl & vcf[0] values */ 13 IP_VER4= 0x40, 14 IP_VER6= 0x60, 15 }; 16 17 /* 18 * for reading /net/ipifc 19 */ 20 typedef struct Ipifc Ipifc; 21 typedef struct Iplifc Iplifc; 22 typedef struct Ipv6rp Ipv6rp; 23 24 /* local address */ 25 struct Iplifc 26 { 27 Iplifc *next; 28 29 /* per address on the ip interface */ 30 uchar ip[IPaddrlen]; 31 uchar mask[IPaddrlen]; 32 uchar net[IPaddrlen]; /* ip & mask */ 33 ulong preflt; /* preferred lifetime */ 34 ulong validlt; /* valid lifetime */ 35 }; 36 37 /* default values, one per stack */ 38 struct Ipv6rp 39 { 40 int mflag; 41 int oflag; 42 int maxraint; 43 int minraint; 44 int linkmtu; 45 int reachtime; 46 int rxmitra; 47 int ttl; 48 int routerlt; 49 }; 50 51 /* actual interface */ 52 struct Ipifc 53 { 54 Ipifc *next; 55 Iplifc *lifc; 56 57 /* per ip interface */ 58 int index; /* number of interface in ipifc dir */ 59 char dev[64]; 60 uchar sendra6; /* on == send router adv */ 61 uchar recvra6; /* on == rcv router adv */ 62 int mtu; 63 ulong pktin; 64 ulong pktout; 65 ulong errin; 66 ulong errout; 67 Ipv6rp rp; 68 }; 69 70 #define ISIPV6MCAST(addr) ((addr)[0] == 0xff) 71 #define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80) 72 73 /* 74 * ipv6 constants 75 * `ra' is `router advertisement', `rs' is `router solicitation'. 76 * `na' is `neighbour advertisement'. 77 */ 78 enum { 79 IPV6HDR_LEN = 40, 80 81 /* neighbour discovery option types */ 82 V6nd_srclladdr = 1, 83 V6nd_targlladdr = 2, 84 V6nd_pfxinfo = 3, 85 V6nd_redirhdr = 4, 86 V6nd_mtu = 5, 87 /* new since rfc2461; see iana.org/assignments/icmpv6-parameters */ 88 V6nd_home = 8, 89 V6nd_srcaddrs = 9, /* rfc3122 */ 90 V6nd_ip = 17, 91 /* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */ 92 V6nd_rdns = 25, 93 /* plan 9 extensions */ 94 V6nd_9fs = 250, 95 V6nd_9auth = 251, 96 97 /* Router constants (all times in ms.) */ 98 Maxv6initraintvl= 16000, 99 Maxv6initras = 3, 100 Maxv6finalras = 3, 101 Minv6interradelay= 3000, 102 Maxv6radelay = 500, 103 104 /* Host constants */ 105 Maxv6rsdelay = 1000, 106 V6rsintvl = 4000, 107 Maxv6rss = 3, 108 109 /* Node constants */ 110 Maxv6mcastrss = 3, 111 Maxv6unicastrss = 3, 112 Maxv6anycastdelay= 1000, 113 Maxv6na = 3, 114 V6reachabletime = 30000, 115 V6retranstimer = 1000, 116 V6initprobedelay= 5000, 117 }; 118 119 /* V6 header on the wire */ 120 typedef struct Ip6hdr Ip6hdr; 121 struct Ip6hdr { 122 uchar vcf[4]; /* version:4, traffic class:8, flow label:20 */ 123 uchar ploadlen[2]; /* payload length: packet length - 40 */ 124 uchar proto; /* next header type */ 125 uchar ttl; /* hop limit */ 126 uchar src[IPaddrlen]; /* source address */ 127 uchar dst[IPaddrlen]; /* destination address */ 128 uchar payload[]; 129 }; 130 131 /* 132 * user-level icmpv6 with control message "headers" 133 */ 134 typedef struct Icmp6hdr Icmp6hdr; 135 struct Icmp6hdr { 136 uchar _0_[8]; 137 uchar laddr[IPaddrlen]; /* local address */ 138 uchar raddr[IPaddrlen]; /* remote address */ 139 }; 140 141 /* 142 * user level udp headers with control message "headers" 143 */ 144 enum 145 { 146 Udphdrsize= 52, /* size of a Udphdr */ 147 }; 148 149 typedef struct Udphdr Udphdr; 150 struct Udphdr 151 { 152 uchar raddr[IPaddrlen]; /* V6 remote address */ 153 uchar laddr[IPaddrlen]; /* V6 local address */ 154 uchar ifcaddr[IPaddrlen]; /* V6 ifc addr msg was received on */ 155 uchar rport[2]; /* remote port */ 156 uchar lport[2]; /* local port */ 157 }; 158 159 uchar* defmask(uchar*); 160 void maskip(uchar*, uchar*, uchar*); 161 int eipfmt(Fmt*); 162 int isv4(uchar*); 163 vlong parseip(uchar*, char*); 164 vlong parseipmask(uchar*, char*); 165 char* v4parseip(uchar*, char*); 166 char* v4parsecidr(uchar*, uchar*, char*); 167 int parseether(uchar*, char*); 168 int myipaddr(uchar*, char*); 169 int myetheraddr(uchar*, char*); 170 int equivip4(uchar*, uchar*); 171 int equivip6(uchar*, uchar*); 172 173 Ipifc* readipifc(char*, Ipifc*, int); 174 175 void hnputv(void*, uvlong); 176 void hnputl(void*, uint); 177 void hnputs(void*, ushort); 178 uvlong nhgetv(void*); 179 uint nhgetl(void*); 180 ushort nhgets(void*); 181 ushort ptclbsum(uchar*, int); 182 183 int v6tov4(uchar*, uchar*); 184 void v4tov6(uchar*, uchar*); 185 186 #define ipcmp(x, y) memcmp(x, y, IPaddrlen) 187 #define ipmove(x, y) memmove(x, y, IPaddrlen) 188 189 extern uchar IPv4bcast[IPaddrlen]; 190 extern uchar IPv4bcastobs[IPaddrlen]; 191 extern uchar IPv4allsys[IPaddrlen]; 192 extern uchar IPv4allrouter[IPaddrlen]; 193 extern uchar IPnoaddr[IPaddrlen]; 194 extern uchar v4prefix[IPaddrlen]; 195 extern uchar IPallbits[IPaddrlen]; 196 197 #define CLASS(p) ((*(uchar*)(p))>>6) 198 199 #pragma varargck type "I" uchar* 200 #pragma varargck type "V" uchar* 201 #pragma varargck type "E" uchar* 202 #pragma varargck type "M" uchar* 203