1 /* 2 * Linux INET6 implementation 3 * 4 * Authors: 5 * Pedro Roque <roque@di.fc.ul.pt> 6 * 7 * $Id: ipv6.h,v 1.1 2002/05/20 15:13:07 jgrimm Exp $ 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License 11 * as published by the Free Software Foundation; either version 12 * 2 of the License, or (at your option) any later version. 13 */ 14 15 #ifndef _NET_IPV6_H 16 #define _NET_IPV6_H 17 18 #include <linux/ipv6.h> 19 #include <linux/hardirq.h> 20 #include <net/ndisc.h> 21 #include <net/flow.h> 22 #include <net/snmp.h> 23 24 #define SIN6_LEN_RFC2133 24 25 26 #define IPV6_MAXPLEN 65535 27 28 /* 29 * NextHeader field of IPv6 header 30 */ 31 32 #define NEXTHDR_HOP 0 /* Hop-by-hop option header. */ 33 #define NEXTHDR_TCP 6 /* TCP segment. */ 34 #define NEXTHDR_UDP 17 /* UDP message. */ 35 #define NEXTHDR_IPV6 41 /* IPv6 in IPv6 */ 36 #define NEXTHDR_ROUTING 43 /* Routing header. */ 37 #define NEXTHDR_FRAGMENT 44 /* Fragmentation/reassembly header. */ 38 #define NEXTHDR_ESP 50 /* Encapsulating security payload. */ 39 #define NEXTHDR_AUTH 51 /* Authentication header. */ 40 #define NEXTHDR_ICMP 58 /* ICMP for IPv6. */ 41 #define NEXTHDR_NONE 59 /* No next header */ 42 #define NEXTHDR_DEST 60 /* Destination options header. */ 43 44 #define NEXTHDR_MAX 255 45 46 47 48 #define IPV6_DEFAULT_HOPLIMIT 64 49 #define IPV6_DEFAULT_MCASTHOPS 1 50 51 /* 52 * Addr type 53 * 54 * type - unicast | multicast 55 * scope - local | site | global 56 * v4 - compat 57 * v4mapped 58 * any 59 * loopback 60 */ 61 62 #define IPV6_ADDR_ANY 0x0000U 63 64 #define IPV6_ADDR_UNICAST 0x0001U 65 #define IPV6_ADDR_MULTICAST 0x0002U 66 67 #define IPV6_ADDR_LOOPBACK 0x0010U 68 #define IPV6_ADDR_LINKLOCAL 0x0020U 69 #define IPV6_ADDR_SITELOCAL 0x0040U 70 71 #define IPV6_ADDR_COMPATv4 0x0080U 72 73 #define IPV6_ADDR_SCOPE_MASK 0x00f0U 74 75 #define IPV6_ADDR_MAPPED 0x1000U 76 #define IPV6_ADDR_RESERVED 0x2000U /* reserved address space */ 77 78 /* 79 * Addr scopes 80 */ 81 #ifdef __KERNEL__ 82 #define IPV6_ADDR_MC_SCOPE(a) \ 83 ((a)->s6_addr[1] & 0x0f) /* nonstandard */ 84 #define __IPV6_ADDR_SCOPE_INVALID -1 85 #endif 86 #define IPV6_ADDR_SCOPE_NODELOCAL 0x01 87 #define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 88 #define IPV6_ADDR_SCOPE_SITELOCAL 0x05 89 #define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 90 #define IPV6_ADDR_SCOPE_GLOBAL 0x0e 91 92 /* 93 * fragmentation header 94 */ 95 96 struct frag_hdr { 97 unsigned char nexthdr; 98 unsigned char reserved; 99 unsigned short frag_off; 100 __u32 identification; 101 }; 102 103 #define IP6_MF 0x0001 104 105 #ifdef __KERNEL__ 106 107 #include <net/sock.h> 108 109 /* sysctls */ 110 extern int sysctl_ipv6_bindv6only; 111 extern int sysctl_mld_max_msf; 112 113 /* MIBs */ 114 DECLARE_SNMP_STAT(struct ipstats_mib, ipv6_statistics); 115 #define IP6_INC_STATS(field) SNMP_INC_STATS(ipv6_statistics, field) 116 #define IP6_INC_STATS_BH(field) SNMP_INC_STATS_BH(ipv6_statistics, field) 117 #define IP6_INC_STATS_USER(field) SNMP_INC_STATS_USER(ipv6_statistics, field) 118 DECLARE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics); 119 #define ICMP6_INC_STATS(idev, field) ({ \ 120 struct inet6_dev *_idev = (idev); \ 121 if (likely(_idev != NULL)) \ 122 SNMP_INC_STATS(idev->stats.icmpv6, field); \ 123 SNMP_INC_STATS(icmpv6_statistics, field); \ 124 }) 125 #define ICMP6_INC_STATS_BH(idev, field) ({ \ 126 struct inet6_dev *_idev = (idev); \ 127 if (likely(_idev != NULL)) \ 128 SNMP_INC_STATS_BH((_idev)->stats.icmpv6, field); \ 129 SNMP_INC_STATS_BH(icmpv6_statistics, field); \ 130 }) 131 #define ICMP6_INC_STATS_USER(idev, field) ({ \ 132 struct inet6_dev *_idev = (idev); \ 133 if (likely(_idev != NULL)) \ 134 SNMP_INC_STATS_USER(_idev->stats.icmpv6, field); \ 135 SNMP_INC_STATS_USER(icmpv6_statistics, field); \ 136 }) 137 #define ICMP6_INC_STATS_OFFSET_BH(idev, field, offset) ({ \ 138 struct inet6_dev *_idev = idev; \ 139 __typeof__(offset) _offset = (offset); \ 140 if (likely(_idev != NULL)) \ 141 SNMP_INC_STATS_OFFSET_BH(_idev->stats.icmpv6, field, _offset); \ 142 SNMP_INC_STATS_OFFSET_BH(icmpv6_statistics, field, _offset); \ 143 }) 144 DECLARE_SNMP_STAT(struct udp_mib, udp_stats_in6); 145 #define UDP6_INC_STATS(field) SNMP_INC_STATS(udp_stats_in6, field) 146 #define UDP6_INC_STATS_BH(field) SNMP_INC_STATS_BH(udp_stats_in6, field) 147 #define UDP6_INC_STATS_USER(field) SNMP_INC_STATS_USER(udp_stats_in6, field) 148 149 int snmp6_register_dev(struct inet6_dev *idev); 150 int snmp6_unregister_dev(struct inet6_dev *idev); 151 int snmp6_alloc_dev(struct inet6_dev *idev); 152 int snmp6_free_dev(struct inet6_dev *idev); 153 int snmp6_mib_init(void *ptr[2], size_t mibsize, size_t mibalign); 154 void snmp6_mib_free(void *ptr[2]); 155 156 struct ip6_ra_chain 157 { 158 struct ip6_ra_chain *next; 159 struct sock *sk; 160 int sel; 161 void (*destructor)(struct sock *); 162 }; 163 164 extern struct ip6_ra_chain *ip6_ra_chain; 165 extern rwlock_t ip6_ra_lock; 166 167 /* 168 This structure is prepared by protocol, when parsing 169 ancillary data and passed to IPv6. 170 */ 171 172 struct ipv6_txoptions 173 { 174 /* Length of this structure */ 175 int tot_len; 176 177 /* length of extension headers */ 178 179 __u16 opt_flen; /* after fragment hdr */ 180 __u16 opt_nflen; /* before fragment hdr */ 181 182 struct ipv6_opt_hdr *hopopt; 183 struct ipv6_opt_hdr *dst0opt; 184 struct ipv6_rt_hdr *srcrt; /* Routing Header */ 185 struct ipv6_opt_hdr *dst1opt; 186 187 /* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */ 188 }; 189 190 struct ip6_flowlabel 191 { 192 struct ip6_flowlabel *next; 193 u32 label; 194 struct in6_addr dst; 195 struct ipv6_txoptions *opt; 196 atomic_t users; 197 unsigned long linger; 198 u8 share; 199 u32 owner; 200 unsigned long lastuse; 201 unsigned long expires; 202 }; 203 204 #define IPV6_FLOWINFO_MASK __constant_htonl(0x0FFFFFFF) 205 #define IPV6_FLOWLABEL_MASK __constant_htonl(0x000FFFFF) 206 207 struct ipv6_fl_socklist 208 { 209 struct ipv6_fl_socklist *next; 210 struct ip6_flowlabel *fl; 211 }; 212 213 extern struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk, u32 label); 214 extern struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_space, 215 struct ip6_flowlabel * fl, 216 struct ipv6_txoptions * fopt); 217 extern void fl6_free_socklist(struct sock *sk); 218 extern int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen); 219 extern void ip6_flowlabel_init(void); 220 extern void ip6_flowlabel_cleanup(void); 221 222 static inline void fl6_sock_release(struct ip6_flowlabel *fl) 223 { 224 if (fl) 225 atomic_dec(&fl->users); 226 } 227 228 extern int ip6_ra_control(struct sock *sk, int sel, 229 void (*destructor)(struct sock *)); 230 231 232 extern int ipv6_parse_hopopts(struct sk_buff *skb); 233 234 extern struct ipv6_txoptions * ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt); 235 extern struct ipv6_txoptions * ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, 236 int newtype, 237 struct ipv6_opt_hdr __user *newopt, 238 int newoptlen); 239 struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space, 240 struct ipv6_txoptions *opt); 241 242 extern int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb); 243 244 extern int ip6_frag_nqueues; 245 extern atomic_t ip6_frag_mem; 246 247 #define IPV6_FRAG_TIMEOUT (60*HZ) /* 60 seconds */ 248 249 /* 250 * Function prototype for build_xmit 251 */ 252 253 typedef int (*inet_getfrag_t) (const void *data, 254 struct in6_addr *addr, 255 char *, 256 unsigned int, unsigned int); 257 258 extern int __ipv6_addr_type(const struct in6_addr *addr); 259 static inline int ipv6_addr_type(const struct in6_addr *addr) 260 { 261 return __ipv6_addr_type(addr) & 0xffff; 262 } 263 264 static inline int ipv6_addr_scope(const struct in6_addr *addr) 265 { 266 return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK; 267 } 268 269 static inline int __ipv6_addr_src_scope(int type) 270 { 271 return (type == IPV6_ADDR_ANY ? __IPV6_ADDR_SCOPE_INVALID : (type >> 16)); 272 } 273 274 static inline int ipv6_addr_src_scope(const struct in6_addr *addr) 275 { 276 return __ipv6_addr_src_scope(__ipv6_addr_type(addr)); 277 } 278 279 static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2) 280 { 281 return memcmp((const void *) a1, (const void *) a2, sizeof(struct in6_addr)); 282 } 283 284 static inline int 285 ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m, 286 const struct in6_addr *a2) 287 { 288 unsigned int i; 289 290 for (i = 0; i < 4; i++) 291 if ((a1->s6_addr32[i] ^ a2->s6_addr32[i]) & m->s6_addr32[i]) 292 return 1; 293 return 0; 294 } 295 296 static inline void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2) 297 { 298 memcpy((void *) a1, (const void *) a2, sizeof(struct in6_addr)); 299 } 300 301 static inline void ipv6_addr_prefix(struct in6_addr *pfx, 302 const struct in6_addr *addr, 303 int plen) 304 { 305 /* caller must guarantee 0 <= plen <= 128 */ 306 int o = plen >> 3, 307 b = plen & 0x7; 308 309 memcpy(pfx->s6_addr, addr, o); 310 if (b != 0) { 311 pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b); 312 o++; 313 } 314 if (o < 16) 315 memset(pfx->s6_addr + o, 0, 16 - o); 316 } 317 318 #ifndef __HAVE_ARCH_ADDR_SET 319 static inline void ipv6_addr_set(struct in6_addr *addr, 320 __u32 w1, __u32 w2, 321 __u32 w3, __u32 w4) 322 { 323 addr->s6_addr32[0] = w1; 324 addr->s6_addr32[1] = w2; 325 addr->s6_addr32[2] = w3; 326 addr->s6_addr32[3] = w4; 327 } 328 #endif 329 330 static inline int ipv6_addr_equal(const struct in6_addr *a1, 331 const struct in6_addr *a2) 332 { 333 return (a1->s6_addr32[0] == a2->s6_addr32[0] && 334 a1->s6_addr32[1] == a2->s6_addr32[1] && 335 a1->s6_addr32[2] == a2->s6_addr32[2] && 336 a1->s6_addr32[3] == a2->s6_addr32[3]); 337 } 338 339 static inline int __ipv6_prefix_equal(const u32 *a1, const u32 *a2, 340 unsigned int prefixlen) 341 { 342 unsigned pdw, pbi; 343 344 /* check complete u32 in prefix */ 345 pdw = prefixlen >> 5; 346 if (pdw && memcmp(a1, a2, pdw << 2)) 347 return 0; 348 349 /* check incomplete u32 in prefix */ 350 pbi = prefixlen & 0x1f; 351 if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi)))) 352 return 0; 353 354 return 1; 355 } 356 357 static inline int ipv6_prefix_equal(const struct in6_addr *a1, 358 const struct in6_addr *a2, 359 unsigned int prefixlen) 360 { 361 return __ipv6_prefix_equal(a1->s6_addr32, a2->s6_addr32, 362 prefixlen); 363 } 364 365 static inline int ipv6_addr_any(const struct in6_addr *a) 366 { 367 return ((a->s6_addr32[0] | a->s6_addr32[1] | 368 a->s6_addr32[2] | a->s6_addr32[3] ) == 0); 369 } 370 371 /* 372 * find the first different bit between two addresses 373 * length of address must be a multiple of 32bits 374 */ 375 static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen) 376 { 377 const __u32 *a1 = token1, *a2 = token2; 378 int i; 379 380 addrlen >>= 2; 381 382 for (i = 0; i < addrlen; i++) { 383 __u32 xb = a1[i] ^ a2[i]; 384 if (xb) { 385 int j = 31; 386 387 xb = ntohl(xb); 388 while ((xb & (1 << j)) == 0) 389 j--; 390 391 return (i * 32 + 31 - j); 392 } 393 } 394 395 /* 396 * we should *never* get to this point since that 397 * would mean the addrs are equal 398 * 399 * However, we do get to it 8) And exacly, when 400 * addresses are equal 8) 401 * 402 * ip route add 1111::/128 via ... 403 * ip route add 1111::/64 via ... 404 * and we are here. 405 * 406 * Ideally, this function should stop comparison 407 * at prefix length. It does not, but it is still OK, 408 * if returned value is greater than prefix length. 409 * --ANK (980803) 410 */ 411 return (addrlen << 5); 412 } 413 414 static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2) 415 { 416 return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); 417 } 418 419 /* 420 * Prototypes exported by ipv6 421 */ 422 423 /* 424 * rcv function (called from netdevice level) 425 */ 426 427 extern int ipv6_rcv(struct sk_buff *skb, 428 struct net_device *dev, 429 struct packet_type *pt, 430 struct net_device *orig_dev); 431 432 extern int ip6_rcv_finish(struct sk_buff *skb); 433 434 /* 435 * upper-layer output functions 436 */ 437 extern int ip6_xmit(struct sock *sk, 438 struct sk_buff *skb, 439 struct flowi *fl, 440 struct ipv6_txoptions *opt, 441 int ipfragok); 442 443 extern int ip6_nd_hdr(struct sock *sk, 444 struct sk_buff *skb, 445 struct net_device *dev, 446 struct in6_addr *saddr, 447 struct in6_addr *daddr, 448 int proto, int len); 449 450 extern int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr); 451 452 extern int ip6_append_data(struct sock *sk, 453 int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb), 454 void *from, 455 int length, 456 int transhdrlen, 457 int hlimit, 458 int tclass, 459 struct ipv6_txoptions *opt, 460 struct flowi *fl, 461 struct rt6_info *rt, 462 unsigned int flags); 463 464 extern int ip6_push_pending_frames(struct sock *sk); 465 466 extern void ip6_flush_pending_frames(struct sock *sk); 467 468 extern int ip6_dst_lookup(struct sock *sk, 469 struct dst_entry **dst, 470 struct flowi *fl); 471 472 /* 473 * skb processing functions 474 */ 475 476 extern int ip6_output(struct sk_buff *skb); 477 extern int ip6_forward(struct sk_buff *skb); 478 extern int ip6_input(struct sk_buff *skb); 479 extern int ip6_mc_input(struct sk_buff *skb); 480 481 /* 482 * Extension header (options) processing 483 */ 484 485 extern u8 * ipv6_build_nfrag_opts(struct sk_buff *skb, 486 u8 *prev_hdr, 487 struct ipv6_txoptions *opt, 488 struct in6_addr *daddr, 489 u32 jumbolen); 490 extern u8 * ipv6_build_frag_opts(struct sk_buff *skb, 491 u8 *prev_hdr, 492 struct ipv6_txoptions *opt); 493 extern void ipv6_push_nfrag_opts(struct sk_buff *skb, 494 struct ipv6_txoptions *opt, 495 u8 *proto, 496 struct in6_addr **daddr_p); 497 extern void ipv6_push_frag_opts(struct sk_buff *skb, 498 struct ipv6_txoptions *opt, 499 u8 *proto); 500 501 extern int ipv6_skip_exthdr(const struct sk_buff *, int start, 502 u8 *nexthdrp); 503 504 extern int ipv6_ext_hdr(u8 nexthdr); 505 506 extern struct ipv6_txoptions * ipv6_invert_rthdr(struct sock *sk, 507 struct ipv6_rt_hdr *hdr); 508 509 510 /* 511 * socket options (ipv6_sockglue.c) 512 */ 513 514 extern int ipv6_setsockopt(struct sock *sk, int level, 515 int optname, 516 char __user *optval, 517 int optlen); 518 extern int ipv6_getsockopt(struct sock *sk, int level, 519 int optname, 520 char __user *optval, 521 int __user *optlen); 522 extern int compat_ipv6_setsockopt(struct sock *sk, 523 int level, 524 int optname, 525 char __user *optval, 526 int optlen); 527 extern int compat_ipv6_getsockopt(struct sock *sk, 528 int level, 529 int optname, 530 char __user *optval, 531 int __user *optlen); 532 533 extern void ipv6_packet_init(void); 534 535 extern void ipv6_packet_cleanup(void); 536 537 extern int ip6_datagram_connect(struct sock *sk, 538 struct sockaddr *addr, int addr_len); 539 540 extern int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len); 541 extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, u16 port, 542 u32 info, u8 *payload); 543 extern void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info); 544 545 extern int inet6_release(struct socket *sock); 546 extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr, 547 int addr_len); 548 extern int inet6_getname(struct socket *sock, struct sockaddr *uaddr, 549 int *uaddr_len, int peer); 550 extern int inet6_ioctl(struct socket *sock, unsigned int cmd, 551 unsigned long arg); 552 553 extern int inet6_hash_connect(struct inet_timewait_death_row *death_row, 554 struct sock *sk); 555 556 /* 557 * reassembly.c 558 */ 559 extern int sysctl_ip6frag_high_thresh; 560 extern int sysctl_ip6frag_low_thresh; 561 extern int sysctl_ip6frag_time; 562 extern int sysctl_ip6frag_secret_interval; 563 564 extern const struct proto_ops inet6_stream_ops; 565 extern const struct proto_ops inet6_dgram_ops; 566 567 struct group_source_req; 568 struct group_filter; 569 570 extern int ip6_mc_source(int add, int omode, struct sock *sk, 571 struct group_source_req *pgsr); 572 extern int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf); 573 extern int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf, 574 struct group_filter __user *optval, 575 int __user *optlen); 576 577 #ifdef CONFIG_PROC_FS 578 extern int ac6_proc_init(void); 579 extern void ac6_proc_exit(void); 580 extern int raw6_proc_init(void); 581 extern void raw6_proc_exit(void); 582 extern int tcp6_proc_init(void); 583 extern void tcp6_proc_exit(void); 584 extern int udp6_proc_init(void); 585 extern void udp6_proc_exit(void); 586 extern int ipv6_misc_proc_init(void); 587 extern void ipv6_misc_proc_exit(void); 588 589 extern struct rt6_statistics rt6_stats; 590 #endif 591 592 #ifdef CONFIG_SYSCTL 593 extern ctl_table ipv6_route_table[]; 594 extern ctl_table ipv6_icmp_table[]; 595 596 extern void ipv6_sysctl_register(void); 597 extern void ipv6_sysctl_unregister(void); 598 #endif 599 600 #endif /* __KERNEL__ */ 601 #endif /* _NET_IPV6_H */ 602