linux-bk/include/net/ipv6.h
<<
>>
Prefs
   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
  96struct 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 */
 110extern int sysctl_ipv6_bindv6only;
 111extern int sysctl_mld_max_msf;
 112
 113/* MIBs */
 114DECLARE_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)
 118DECLARE_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})
 144DECLARE_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)
 148extern atomic_t                 inet6_sock_nr;
 149
 150int snmp6_register_dev(struct inet6_dev *idev);
 151int snmp6_unregister_dev(struct inet6_dev *idev);
 152int snmp6_mib_init(void *ptr[2], size_t mibsize, size_t mibalign);
 153void snmp6_mib_free(void *ptr[2]);
 154
 155struct ip6_ra_chain
 156{
 157        struct ip6_ra_chain     *next;
 158        struct sock             *sk;
 159        int                     sel;
 160        void                    (*destructor)(struct sock *);
 161};
 162
 163extern struct ip6_ra_chain      *ip6_ra_chain;
 164extern rwlock_t ip6_ra_lock;
 165
 166/*
 167   This structure is prepared by protocol, when parsing
 168   ancillary data and passed to IPv6.
 169 */
 170
 171struct ipv6_txoptions
 172{
 173        /* Length of this structure */
 174        int                     tot_len;
 175
 176        /* length of extension headers   */
 177
 178        __u16                   opt_flen;       /* after fragment hdr */
 179        __u16                   opt_nflen;      /* before fragment hdr */
 180
 181        struct ipv6_opt_hdr     *hopopt;
 182        struct ipv6_opt_hdr     *dst0opt;
 183        struct ipv6_rt_hdr      *srcrt; /* Routing Header */
 184        struct ipv6_opt_hdr     *auth;
 185        struct ipv6_opt_hdr     *dst1opt;
 186
 187        /* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */
 188};
 189
 190struct 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
 207struct ipv6_fl_socklist
 208{
 209        struct ipv6_fl_socklist *next;
 210        struct ip6_flowlabel    *fl;
 211};
 212
 213extern struct ip6_flowlabel     *fl6_sock_lookup(struct sock *sk, u32 label);
 214extern struct ipv6_txoptions    *fl6_merge_options(struct ipv6_txoptions * opt_space,
 215                                                   struct ip6_flowlabel * fl,
 216                                                   struct ipv6_txoptions * fopt);
 217extern void                     fl6_free_socklist(struct sock *sk);
 218extern int                      ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen);
 219extern void                     ip6_flowlabel_init(void);
 220extern void                     ip6_flowlabel_cleanup(void);
 221
 222static inline void fl6_sock_release(struct ip6_flowlabel *fl)
 223{
 224        if (fl)
 225                atomic_dec(&fl->users);
 226}
 227
 228extern int                      ip6_ra_control(struct sock *sk, int sel,
 229                                               void (*destructor)(struct sock *));
 230
 231
 232extern int                      ip6_call_ra_chain(struct sk_buff *skb, int sel);
 233
 234extern int                      ipv6_parse_hopopts(struct sk_buff *skb, int);
 235
 236extern struct ipv6_txoptions *  ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt);
 237
 238extern int ip6_frag_nqueues;
 239extern atomic_t ip6_frag_mem;
 240
 241#define IPV6_FRAG_TIMEOUT       (60*HZ)         /* 60 seconds */
 242
 243/*
 244 *      Function prototype for build_xmit
 245 */
 246
 247typedef int             (*inet_getfrag_t) (const void *data,
 248                                           struct in6_addr *addr,
 249                                           char *,
 250                                           unsigned int, unsigned int);
 251
 252
 253extern int              ipv6_addr_type(const struct in6_addr *addr);
 254
 255static inline int ipv6_addr_scope(const struct in6_addr *addr)
 256{
 257        return ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK;
 258}
 259
 260static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2)
 261{
 262        return memcmp((const void *) a1, (const void *) a2, sizeof(struct in6_addr));
 263}
 264
 265static inline void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2)
 266{
 267        memcpy((void *) a1, (const void *) a2, sizeof(struct in6_addr));
 268}
 269
 270static inline void ipv6_addr_prefix(struct in6_addr *pfx, 
 271                                    const struct in6_addr *addr,
 272                                    int plen)
 273{
 274        /* caller must guarantee 0 <= plen <= 128 */
 275        int o = plen >> 3,
 276            b = plen & 0x7;
 277
 278        memcpy(pfx->s6_addr, addr, o);
 279        if (b != 0) {
 280                pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b);
 281                o++;
 282        }
 283        if (o < 16)
 284                memset(pfx->s6_addr + o, 0, 16 - o);
 285}
 286
 287#ifndef __HAVE_ARCH_ADDR_SET
 288static inline void ipv6_addr_set(struct in6_addr *addr, 
 289                                     __u32 w1, __u32 w2,
 290                                     __u32 w3, __u32 w4)
 291{
 292        addr->s6_addr32[0] = w1;
 293        addr->s6_addr32[1] = w2;
 294        addr->s6_addr32[2] = w3;
 295        addr->s6_addr32[3] = w4;
 296}
 297#endif
 298
 299static inline int ipv6_addr_any(const struct in6_addr *a)
 300{
 301        return ((a->s6_addr32[0] | a->s6_addr32[1] | 
 302                 a->s6_addr32[2] | a->s6_addr32[3] ) == 0); 
 303}
 304
 305/*
 306 *      Prototypes exported by ipv6
 307 */
 308
 309/*
 310 *      rcv function (called from netdevice level)
 311 */
 312
 313extern int                      ipv6_rcv(struct sk_buff *skb, 
 314                                         struct net_device *dev, 
 315                                         struct packet_type *pt);
 316
 317/*
 318 *      upper-layer output functions
 319 */
 320extern int                      ip6_xmit(struct sock *sk,
 321                                         struct sk_buff *skb,
 322                                         struct flowi *fl,
 323                                         struct ipv6_txoptions *opt,
 324                                         int ipfragok);
 325
 326extern int                      ip6_nd_hdr(struct sock *sk,
 327                                           struct sk_buff *skb,
 328                                           struct net_device *dev,
 329                                           struct in6_addr *saddr,
 330                                           struct in6_addr *daddr,
 331                                           int proto, int len);
 332
 333extern int                      ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr);
 334
 335extern int                      ip6_append_data(struct sock *sk,
 336                                                int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb),
 337                                                void *from,
 338                                                int length,
 339                                                int transhdrlen,
 340                                                int hlimit,
 341                                                struct ipv6_txoptions *opt,
 342                                                struct flowi *fl,
 343                                                struct rt6_info *rt,
 344                                                unsigned int flags);
 345
 346extern int                      ip6_push_pending_frames(struct sock *sk);
 347
 348extern void                     ip6_flush_pending_frames(struct sock *sk);
 349
 350extern int                      ip6_dst_lookup(struct sock *sk,
 351                                               struct dst_entry **dst,
 352                                               struct flowi *fl);
 353
 354/*
 355 *      skb processing functions
 356 */
 357
 358extern int                      ip6_output(struct sk_buff **pskb);
 359extern int                      ip6_forward(struct sk_buff *skb);
 360extern int                      ip6_input(struct sk_buff *skb);
 361extern int                      ip6_mc_input(struct sk_buff *skb);
 362
 363/*
 364 *      Extension header (options) processing
 365 */
 366
 367extern u8 *                     ipv6_build_nfrag_opts(struct sk_buff *skb,
 368                                                      u8 *prev_hdr,
 369                                                      struct ipv6_txoptions *opt,
 370                                                      struct in6_addr *daddr,
 371                                                      u32 jumbolen);
 372extern u8 *                     ipv6_build_frag_opts(struct sk_buff *skb,
 373                                                     u8 *prev_hdr,
 374                                                     struct ipv6_txoptions *opt);
 375extern void                     ipv6_push_nfrag_opts(struct sk_buff *skb,
 376                                                     struct ipv6_txoptions *opt,
 377                                                     u8 *proto,
 378                                                     struct in6_addr **daddr_p);
 379extern void                     ipv6_push_frag_opts(struct sk_buff *skb,
 380                                                    struct ipv6_txoptions *opt,
 381                                                    u8 *proto);
 382
 383extern int                      ipv6_skip_exthdr(const struct sk_buff *, int start,
 384                                                 u8 *nexthdrp, int len);
 385
 386extern int                      ipv6_ext_hdr(u8 nexthdr);
 387
 388extern struct ipv6_txoptions *  ipv6_invert_rthdr(struct sock *sk,
 389                                                  struct ipv6_rt_hdr *hdr);
 390
 391
 392/*
 393 *      socket options (ipv6_sockglue.c)
 394 */
 395
 396extern int                      ipv6_setsockopt(struct sock *sk, int level, 
 397                                                int optname,
 398                                                char __user *optval, 
 399                                                int optlen);
 400extern int                      ipv6_getsockopt(struct sock *sk, int level, 
 401                                                int optname,
 402                                                char __user *optval, 
 403                                                int __user *optlen);
 404
 405extern void                     ipv6_packet_init(void);
 406
 407extern void                     ipv6_packet_cleanup(void);
 408
 409extern int                      ip6_datagram_connect(struct sock *sk, 
 410                                                     struct sockaddr *addr, int addr_len);
 411
 412extern int                      ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len);
 413extern void                     ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, u16 port,
 414                                                u32 info, u8 *payload);
 415extern void                     ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info);
 416
 417extern int inet6_release(struct socket *sock);
 418extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr, 
 419                      int addr_len);
 420extern int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
 421                         int *uaddr_len, int peer);
 422extern int inet6_ioctl(struct socket *sock, unsigned int cmd, 
 423                       unsigned long arg);
 424
 425/*
 426 * reassembly.c
 427 */
 428extern int sysctl_ip6frag_high_thresh;
 429extern int sysctl_ip6frag_low_thresh;
 430extern int sysctl_ip6frag_time;
 431extern int sysctl_ip6frag_secret_interval;
 432
 433#endif /* __KERNEL__ */
 434#endif /* _NET_IPV6_H */
 435
 436
 437
 438
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.