linux/include/net/ip6_route.h
<<
>>
Prefs
   1#ifndef _NET_IP6_ROUTE_H
   2#define _NET_IP6_ROUTE_H
   3
   4#define IP6_RT_PRIO_USER        1024
   5#define IP6_RT_PRIO_ADDRCONF    256
   6#define IP6_RT_PRIO_KERN        512
   7
   8struct route_info {
   9        __u8                    type;
  10        __u8                    length;
  11        __u8                    prefix_len;
  12#if defined(__BIG_ENDIAN_BITFIELD)
  13        __u8                    reserved_h:3,
  14                                route_pref:2,
  15                                reserved_l:3;
  16#elif defined(__LITTLE_ENDIAN_BITFIELD)
  17        __u8                    reserved_l:3,
  18                                route_pref:2,
  19                                reserved_h:3;
  20#endif
  21        __be32                  lifetime;
  22        __u8                    prefix[0];      /* 0,8 or 16 */
  23};
  24
  25#ifdef __KERNEL__
  26
  27#include <net/flow.h>
  28#include <net/ip6_fib.h>
  29#include <net/sock.h>
  30#include <linux/ip.h>
  31#include <linux/ipv6.h>
  32
  33#define RT6_LOOKUP_F_IFACE              0x00000001
  34#define RT6_LOOKUP_F_REACHABLE          0x00000002
  35#define RT6_LOOKUP_F_HAS_SADDR          0x00000004
  36#define RT6_LOOKUP_F_SRCPREF_TMP        0x00000008
  37#define RT6_LOOKUP_F_SRCPREF_PUBLIC     0x00000010
  38#define RT6_LOOKUP_F_SRCPREF_COA        0x00000020
  39
  40
  41extern void                     ip6_route_input(struct sk_buff *skb);
  42
  43extern struct dst_entry *       ip6_route_output(struct net *net,
  44                                                 struct sock *sk,
  45                                                 struct flowi *fl);
  46
  47extern int                      ip6_route_init(void);
  48extern void                     ip6_route_cleanup(void);
  49
  50extern int                      ipv6_route_ioctl(struct net *net,
  51                                                 unsigned int cmd,
  52                                                 void __user *arg);
  53
  54extern int                      ip6_route_add(struct fib6_config *cfg);
  55extern int                      ip6_ins_rt(struct rt6_info *);
  56extern int                      ip6_del_rt(struct rt6_info *);
  57
  58extern struct rt6_info          *rt6_lookup(struct net *net,
  59                                            const struct in6_addr *daddr,
  60                                            const struct in6_addr *saddr,
  61                                            int oif, int flags);
  62
  63extern struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
  64                                         struct neighbour *neigh,
  65                                         const struct in6_addr *addr);
  66extern int icmp6_dst_gc(void);
  67
  68extern void fib6_force_start_gc(struct net *net);
  69
  70extern struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
  71                                           const struct in6_addr *addr,
  72                                           int anycast);
  73
  74extern int                      ip6_dst_hoplimit(struct dst_entry *dst);
  75
  76/*
  77 *      support functions for ND
  78 *
  79 */
  80extern struct rt6_info *        rt6_get_dflt_router(struct in6_addr *addr,
  81                                                    struct net_device *dev);
  82extern struct rt6_info *        rt6_add_dflt_router(struct in6_addr *gwaddr,
  83                                                    struct net_device *dev,
  84                                                    unsigned int pref);
  85
  86extern void                     rt6_purge_dflt_routers(struct net *net);
  87
  88extern int                      rt6_route_rcv(struct net_device *dev,
  89                                              u8 *opt, int len,
  90                                              struct in6_addr *gwaddr);
  91
  92extern void                     rt6_redirect(struct in6_addr *dest,
  93                                             struct in6_addr *src,
  94                                             struct in6_addr *saddr,
  95                                             struct neighbour *neigh,
  96                                             u8 *lladdr,
  97                                             int on_link);
  98
  99extern void                     rt6_pmtu_discovery(struct in6_addr *daddr,
 100                                                   struct in6_addr *saddr,
 101                                                   struct net_device *dev,
 102                                                   u32 pmtu);
 103
 104struct netlink_callback;
 105
 106struct rt6_rtnl_dump_arg
 107{
 108        struct sk_buff *skb;
 109        struct netlink_callback *cb;
 110        struct net *net;
 111};
 112
 113extern int rt6_dump_route(struct rt6_info *rt, void *p_arg);
 114extern void rt6_ifdown(struct net *net, struct net_device *dev);
 115extern void rt6_mtu_change(struct net_device *dev, unsigned mtu);
 116
 117
 118/*
 119 *      Store a destination cache entry in a socket
 120 */
 121static inline void __ip6_dst_store(struct sock *sk, struct dst_entry *dst,
 122                                   struct in6_addr *daddr, struct in6_addr *saddr)
 123{
 124        struct ipv6_pinfo *np = inet6_sk(sk);
 125        struct rt6_info *rt = (struct rt6_info *) dst;
 126
 127        sk_setup_caps(sk, dst);
 128        np->daddr_cache = daddr;
 129#ifdef CONFIG_IPV6_SUBTREES
 130        np->saddr_cache = saddr;
 131#endif
 132        np->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0;
 133}
 134
 135static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst,
 136                                 struct in6_addr *daddr, struct in6_addr *saddr)
 137{
 138        write_lock(&sk->sk_dst_lock);
 139        __ip6_dst_store(sk, dst, daddr, saddr);
 140        write_unlock(&sk->sk_dst_lock);
 141}
 142
 143static inline int ipv6_unicast_destination(struct sk_buff *skb)
 144{
 145        struct rt6_info *rt = (struct rt6_info *) skb_dst(skb);
 146
 147        return rt->rt6i_flags & RTF_LOCAL;
 148}
 149
 150#endif
 151#endif
 152