1 #pragma src "/sys/src/libip"
12 /* vihl & vcf[0] values */
18 * for reading /net/ipifc
20 typedef struct Ipifc Ipifc;
21 typedef struct Iplifc Iplifc;
22 typedef struct Ipv6rp Ipv6rp;
29 /* per address on the ip interface */
31 uchar mask[IPaddrlen];
32 uchar net[IPaddrlen]; /* ip & mask */
33 ulong preflt; /* preferred lifetime */
34 ulong validlt; /* valid lifetime */
37 /* default values, one per stack */
51 /* actual interface */
57 /* per ip interface */
58 int index; /* number of interface in ipifc dir */
60 uchar sendra6; /* on == send router adv */
61 uchar recvra6; /* on == rcv router adv */
70 #define ISIPV6MCAST(addr) ((addr)[0] == 0xff)
71 #define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
75 * `ra' is `router advertisement', `rs' is `router solicitation'.
76 * `na' is `neighbour advertisement'.
81 /* neighbour discovery option types */
87 /* new since rfc2461; see iana.org/assignments/icmpv6-parameters */
89 V6nd_srcaddrs = 9, /* rfc3122 */
91 /* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */
93 /* plan 9 extensions */
97 /* Router constants (all times in ms.) */
98 Maxv6initraintvl= 16000,
101 Minv6interradelay= 3000,
112 Maxv6anycastdelay= 1000,
114 V6reachabletime = 30000,
115 V6retranstimer = 1000,
116 V6initprobedelay= 5000,
119 /* V6 header on the wire */
120 typedef struct Ip6hdr 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 */
132 * user-level icmpv6 with control message "headers"
134 typedef struct Icmp6hdr Icmp6hdr;
137 uchar laddr[IPaddrlen]; /* local address */
138 uchar raddr[IPaddrlen]; /* remote address */
142 * user level udp headers with control message "headers"
146 Udphdrsize= 52, /* size of a Udphdr */
149 typedef struct Udphdr Udphdr;
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 */
159 uchar* defmask(uchar*);
160 void maskip(uchar*, uchar*, 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*);
173 Ipifc* readipifc(char*, Ipifc*, int);
175 void hnputv(void*, uvlong);
176 void hnputl(void*, uint);
177 void hnputs(void*, ushort);
178 uvlong nhgetv(void*);
180 ushort nhgets(void*);
181 ushort ptclbsum(uchar*, int);
183 int v6tov4(uchar*, uchar*);
184 void v4tov6(uchar*, uchar*);
186 #define ipcmp(x, y) memcmp(x, y, IPaddrlen)
187 #define ipmove(x, y) memmove(x, y, IPaddrlen)
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];
197 #define CLASS(p) ((*(uchar*)(p))>>6)
199 #pragma varargck type "I" uchar*
200 #pragma varargck type "V" uchar*
201 #pragma varargck type "E" uchar*
202 #pragma varargck type "M" uchar*