xref: /plan9/sys/src/9/ip/ipv6.h (revision 3f8719e627c63fd3cbe3e47e2f558b11cf0e6b13)
1 /*
2  * Internet Protocol Version 6
3  *
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.
8  *
9  * global unicast is anything but unspecified (::), loopback (::1),
10  * multicast (ff00::/8), and link-local unicast (fe80::/10).
11  *
12  * site-local (fec0::/10) is now deprecated, originally by rfc3879.
13  *
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.
16  */
17 #define isv6mcast(addr)	  ((addr)[0] == 0xff)
18 #define islinklocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
19 
20 #define optexsts(np)	(nhgets((np)->ploadlen) > 24)
21 #define issmcast(addr)	(memcmp((addr), v6solicitednode, 13) == 0)
22 
23 enum {				/* Header Types */
24 	HBH		= 0,	/* hop-by-hop multicast routing protocol */
25 	ICMP		= 1,
26 	IGMP		= 2,
27 	GGP		= 3,
28 	IPINIP		= 4,
29 	ST		= 5,
30 	TCP		= 6,
31 	UDP		= 17,
32 	ISO_TP4		= 29,
33 	RH		= 43,
34 	FH		= 44,
35 	IDRP		= 45,
36 	RSVP		= 46,
37 	AH		= 51,
38 	ESP		= 52,
39 	ICMPv6		= 58,
40 	NNH		= 59,
41 	DOH		= 60,
42 	ISO_IP		= 80,
43 	IGRP		= 88,
44 	OSPF		= 89,
45 
46 	Maxhdrtype	= 256,
47 };
48 
49 enum {
50 	/* multicast flags and scopes */
51 
52 //	Well_known_flg	= 0,
53 //	Transient_flg	= 1,
54 
55 //	Interface_local_scop = 1,
56 	Link_local_scop	= 2,
57 //	Site_local_scop	= 5,
58 //	Org_local_scop	= 8,
59 	Global_scop	= 14,
60 
61 	/* various prefix lengths */
62 	SOLN_PREF_LEN	= 13,
63 
64 	/* icmpv6 unreachability codes */
65 	Icmp6_no_route		= 0,
66 	Icmp6_ad_prohib		= 1,
67 	Icmp6_out_src_scope	= 2,
68 	Icmp6_adr_unreach	= 3,
69 	Icmp6_port_unreach	= 4,
70 	Icmp6_gress_src_fail	= 5,
71 	Icmp6_rej_route		= 6,
72 	Icmp6_unknown		= 7,  /* our own invention for internal use */
73 
74 	/* various flags & constants */
75 	v6MINTU		= 1280,
76 	HOP_LIMIT	= 255,
77 	IP6HDR		= 40,		/* sizeof(Ip6hdr) = 8 + 2*16 */
78 
79 	/* option types */
80 
81 	/* neighbour discovery */
82 	SRC_LLADDR	= 1,
83 	TARGET_LLADDR	= 2,
84 	PREFIX_INFO	= 3,
85 	REDIR_HEADER	= 4,
86 	MTU_OPTION	= 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 	SRC_UNSPEC	= 0,
98 	SRC_UNI		= 1,
99 	TARG_UNI	= 2,
100 	TARG_MULTI	= 3,
101 
102 	Tunitent	= 1,
103 	Tuniproxy	= 2,
104 	Tunirany	= 3,
105 
106 	/* Node constants */
107 	MAX_MULTICAST_SOLICIT	= 3,
108 	RETRANS_TIMER		= 1000,
109 };
110 
111 typedef struct Ip6hdr	Ip6hdr;
112 typedef struct Opthdr	Opthdr;
113 typedef struct Routinghdr Routinghdr;
114 typedef struct Fraghdr6	Fraghdr6;
115 
116 /* we do this in case there's padding at the end of Ip6hdr */
117 #define IPV6HDR \
118 	uchar	vcf[4];		/* version:4, traffic class:8, flow label:20 */\
119 	uchar	ploadlen[2];	/* payload length: packet length - 40 */ \
120 	uchar	proto;		/* next header type */ \
121 	uchar	ttl;		/* hop limit */ \
122 	uchar	src[IPaddrlen]; \
123 	uchar	dst[IPaddrlen]
124 
125 struct	Ip6hdr {
126 	IPV6HDR;
127 	uchar	payload[];
128 };
129 
130 struct	Opthdr {		/* unused */
131 	uchar	nexthdr;
132 	uchar	len;
133 };
134 
135 /*
136  * Beware routing header type 0 (loose source routing); see
137  * http://www.secdev.org/conf/IPv6_RH_security-csw07.pdf.
138  * Type 1 is unused.  Type 2 is for MIPv6 (mobile IPv6) filtering
139  * against type 0 header.
140  */
141 struct	Routinghdr {		/* unused */
142 	uchar	nexthdr;
143 	uchar	len;
144 	uchar	rtetype;
145 	uchar	segrem;
146 };
147 
148 struct	Fraghdr6 {
149 	uchar	nexthdr;
150 	uchar	res;
151 	uchar	offsetRM[2];	/* Offset, Res, M flag */
152 	uchar	id[4];
153 };
154 
155 extern uchar v6allnodesN[IPaddrlen];
156 extern uchar v6allnodesL[IPaddrlen];
157 extern uchar v6allroutersN[IPaddrlen];
158 extern uchar v6allroutersL[IPaddrlen];
159 extern uchar v6allnodesNmask[IPaddrlen];
160 extern uchar v6allnodesLmask[IPaddrlen];
161 extern uchar v6solicitednode[IPaddrlen];
162 extern uchar v6solicitednodemask[IPaddrlen];
163 extern uchar v6Unspecified[IPaddrlen];
164 extern uchar v6loopback[IPaddrlen];
165 extern uchar v6loopbackmask[IPaddrlen];
166 extern uchar v6linklocal[IPaddrlen];
167 extern uchar v6linklocalmask[IPaddrlen];
168 extern uchar v6multicast[IPaddrlen];
169 extern uchar v6multicastmask[IPaddrlen];
170 
171 extern int v6llpreflen;
172 extern int v6mcpreflen;
173 extern int v6snpreflen;
174 extern int v6aNpreflen;
175 extern int v6aLpreflen;
176 
177 extern int ReTransTimer;
178 
179 void ipv62smcast(uchar *, uchar *);
180 void icmpns(Fs *f, uchar* src, int suni, uchar* targ, int tuni, uchar* mac);
181 void icmpna(Fs *f, uchar* src, uchar* dst, uchar* targ, uchar* mac, uchar flags);
182 void icmpttlexceeded6(Fs *f, Ipifc *ifc, Block *bp);
183 void icmppkttoobig6(Fs *f, Ipifc *ifc, Block *bp);
184 void icmphostunr(Fs *f, Ipifc *ifc, Block *bp, int code, int free);
185