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