home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / net / ipv6.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  15.7 KB  |  602 lines

  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.