2 * Internet Protocol Version 6
4 * rfc2460 defines the protocol, rfc2461 neighbour discovery, and
5 * rfc2462 address autoconfiguration. rfc4443 defines ICMP; was rfc2463.
6 * rfc4291 defines the address architecture (including prefices), was rfc3513.
7 * rfc4007 defines the scoped address architecture.
9 * global unicast is anything but unspecified (::), loopback (::1),
10 * multicast (ff00::/8), and link-local unicast (fe80::/10).
12 * site-local (fec0::/10) is now deprecated, originally by rfc3879.
14 * Unique Local IPv6 Unicast Addresses are defined by rfc4193.
15 * prefix is fc00::/7, scope is global, routing is limited to roughly a site.
17 #define isv6mcast(addr) ((addr)[0] == 0xff)
18 #define islinklocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
20 #define optexsts(np) (nhgets((np)->ploadlen) > 24)
21 #define issmcast(addr) (memcmp((addr), v6solicitednode, 13) == 0)
24 #define MIN(a, b) ((a) <= (b)? (a): (b))
27 enum { /* Header Types */
28 HBH = 0, /* hop-by-hop multicast routing protocol */
54 /* multicast flags and scopes */
56 // Well_known_flg = 0,
59 // Interface_local_scop = 1,
61 // Site_local_scop = 5,
62 // Org_local_scop = 8,
65 /* various prefix lengths */
68 /* icmpv6 unreachability codes */
71 Icmp6_out_src_scope = 2,
72 Icmp6_adr_unreach = 3,
73 Icmp6_port_unreach = 4,
74 Icmp6_gress_src_fail = 5,
76 Icmp6_unknown = 7, /* our own invention for internal use */
78 /* various flags & constants */
81 IP6HDR = 40, /* sizeof(Ip6hdr) = 8 + 2*16 */
85 /* neighbour discovery */
91 /* new since rfc2461; see iana.org/assignments/icmpv6-parameters */
93 V6nd_srcaddrs = 9, /* rfc3122 */
95 /* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */
97 /* plan 9 extensions */
111 MAX_MULTICAST_SOLICIT = 3,
112 RETRANS_TIMER = 1000,
115 typedef struct Ip6hdr Ip6hdr;
116 typedef struct Opthdr Opthdr;
117 typedef struct Routinghdr Routinghdr;
118 typedef struct Fraghdr6 Fraghdr6;
120 /* we do this in case there's padding at the end of 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]; \
134 struct Opthdr { /* unused */
140 * Beware routing header type 0 (loose source routing); see
141 * http://www.secdev.org/conf/IPv6_RH_security-csw07.pdf.
142 * Type 1 is unused. Type 2 is for MIPv6 (mobile IPv6) filtering
143 * against type 0 header.
145 struct Routinghdr { /* unused */
155 uchar offsetRM[2]; /* Offset, Res, M flag */
159 extern uchar v6allnodesN[IPaddrlen];
160 extern uchar v6allnodesL[IPaddrlen];
161 extern uchar v6allroutersN[IPaddrlen];
162 extern uchar v6allroutersL[IPaddrlen];
163 extern uchar v6allnodesNmask[IPaddrlen];
164 extern uchar v6allnodesLmask[IPaddrlen];
165 extern uchar v6solicitednode[IPaddrlen];
166 extern uchar v6solicitednodemask[IPaddrlen];
167 extern uchar v6Unspecified[IPaddrlen];
168 extern uchar v6loopback[IPaddrlen];
169 extern uchar v6loopbackmask[IPaddrlen];
170 extern uchar v6linklocal[IPaddrlen];
171 extern uchar v6linklocalmask[IPaddrlen];
172 extern uchar v6multicast[IPaddrlen];
173 extern uchar v6multicastmask[IPaddrlen];
175 extern int v6llpreflen;
176 extern int v6mcpreflen;
177 extern int v6snpreflen;
178 extern int v6aNpreflen;
179 extern int v6aLpreflen;
181 extern int ReTransTimer;
183 void ipv62smcast(uchar *, uchar *);
184 void icmpns(Fs *f, uchar* src, int suni, uchar* targ, int tuni, uchar* mac);
185 void icmpna(Fs *f, uchar* src, uchar* dst, uchar* targ, uchar* mac, uchar flags);
186 void icmpttlexceeded6(Fs *f, Ipifc *ifc, Block *bp);
187 void icmppkttoobig6(Fs *f, Ipifc *ifc, Block *bp);
188 void icmphostunr(Fs *f, Ipifc *ifc, Block *bp, int code, int free);