]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/ip/ipv6.h
kernel: dont use atomic increment for Proc.nlocks, maintain Lock.m for lock(), use...
[plan9front.git] / sys / src / 9 / ip / ipv6.h
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 #ifndef MIN
24 #define MIN(a, b) ((a) <= (b)? (a): (b))
25 #endif
26
27 enum {                          /* Header Types */
28         HBH             = 0,    /* hop-by-hop multicast routing protocol */
29         ICMP            = 1,
30         IGMP            = 2,
31         GGP             = 3,
32         IPINIP          = 4,
33         ST              = 5,
34         TCP             = 6,
35         UDP             = 17,
36         ISO_TP4         = 29,
37         RH              = 43,
38         FH              = 44,
39         IDRP            = 45,
40         RSVP            = 46,
41         AH              = 51,
42         ESP             = 52,
43         ICMPv6          = 58,
44         NNH             = 59,
45         DOH             = 60,
46         ISO_IP          = 80,
47         IGRP            = 88,
48         OSPF            = 89,
49
50         Maxhdrtype      = 256,
51 };
52
53 enum {
54         /* multicast flags and scopes */
55
56 //      Well_known_flg  = 0,
57 //      Transient_flg   = 1,
58
59 //      Interface_local_scop = 1,
60         Link_local_scop = 2,
61 //      Site_local_scop = 5,
62 //      Org_local_scop  = 8,
63         Global_scop     = 14,
64
65         /* various prefix lengths */
66         SOLN_PREF_LEN   = 13,
67
68         /* icmpv6 unreachability codes */
69         Icmp6_no_route          = 0,
70         Icmp6_ad_prohib         = 1,
71         Icmp6_out_src_scope     = 2,
72         Icmp6_adr_unreach       = 3,
73         Icmp6_port_unreach      = 4,
74         Icmp6_gress_src_fail    = 5,
75         Icmp6_rej_route         = 6,
76         Icmp6_unknown           = 7,  /* our own invention for internal use */
77
78         /* various flags & constants */
79         v6MINTU         = 1280,
80         HOP_LIMIT       = 255,
81         IP6HDR          = 40,           /* sizeof(Ip6hdr) = 8 + 2*16 */
82
83         /* option types */
84
85         /* neighbour discovery */
86         SRC_LLADDR      = 1,
87         TARGET_LLADDR   = 2,
88         PREFIX_INFO     = 3,
89         REDIR_HEADER    = 4,
90         MTU_OPTION      = 5,
91         /* new since rfc2461; see iana.org/assignments/icmpv6-parameters */
92         V6nd_home       = 8,
93         V6nd_srcaddrs   = 9,            /* rfc3122 */
94         V6nd_ip         = 17,
95         /* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */
96         V6nd_rdns       = 25,
97         /* plan 9 extensions */
98         V6nd_9fs        = 250,
99         V6nd_9auth      = 251,
100
101         SRC_UNSPEC      = 0,
102         SRC_UNI         = 1,
103         TARG_UNI        = 2,
104         TARG_MULTI      = 3,
105
106         Tunitent        = 1,
107         Tuniproxy       = 2,
108         Tunirany        = 3,
109
110         /* Node constants */
111         MAX_MULTICAST_SOLICIT   = 3,
112         RETRANS_TIMER           = 1000,
113 };
114
115 typedef struct Ip6hdr   Ip6hdr;
116 typedef struct Opthdr   Opthdr;
117 typedef struct Routinghdr Routinghdr;
118 typedef struct Fraghdr6 Fraghdr6;
119
120 /* we do this in case there's padding at the end of Ip6hdr */
121 #define IPV6HDR \
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]; \
127         uchar   dst[IPaddrlen]
128
129 struct  Ip6hdr {
130         IPV6HDR;
131         uchar   payload[];
132 };
133
134 struct  Opthdr {                /* unused */
135         uchar   nexthdr;
136         uchar   len;
137 };
138
139 /*
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.
144  */
145 struct  Routinghdr {            /* unused */
146         uchar   nexthdr;
147         uchar   len;
148         uchar   rtetype;
149         uchar   segrem;
150 };
151
152 struct  Fraghdr6 {
153         uchar   nexthdr;
154         uchar   res;
155         uchar   offsetRM[2];    /* Offset, Res, M flag */
156         uchar   id[4];
157 };
158
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];
174
175 extern int v6llpreflen;
176 extern int v6mcpreflen;
177 extern int v6snpreflen;
178 extern int v6aNpreflen;
179 extern int v6aLpreflen;
180
181 extern int ReTransTimer;
182
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);