linux/include/net/ip6_route.h
<<
>>
Prefs
   1#ifndef _NET_IP6_ROUTE_H
   2#define _NET_IP6_ROUTE_H
   3
   4struct route_info {
   5        __u8                    type;
   6        __u8                    length;
   7        __u8                    prefix_len;
   8#if defined(__BIG_ENDIAN_BITFIELD)
   9        __u8                    reserved_h:3,
  10                                route_pref:2,
  11                                reserved_l:3;
  12#elif defined(__LITTLE_ENDIAN_BITFIELD)
  13        __u8                    reserved_l:3,
  14                                route_pref:2,
  15                                reserved_h:3;
  16#endif
  17        __be32                  lifetime;
  18        __u8                    prefix[0];      /* 0,8 or 16 */
  19};
  20
  21#include <net/flow.h>
  22#include <net/ip6_fib.h>
  23#include <net/sock.h>
  24#include <linux/ip.h>
  25#include <linux/ipv6.h>
  26#include <linux/route.h>
  27
  28#define RT6_LOOKUP_F_IFACE              0x00000001
  29#define RT6_LOOKUP_F_REACHABLE          0x00000002
  30#define RT6_LOOKUP_F_HAS_SADDR          0x00000004
  31#define RT6_LOOKUP_F_SRCPREF_TMP        0x00000008
  32#define RT6_LOOKUP_F_SRCPREF_PUBLIC     0x00000010
  33#define RT6_LOOKUP_F_SRCPREF_COA        0x00000020
  34
  35/*
  36 * rt6_srcprefs2flags() and rt6_flags2srcprefs() translate
  37 * between IPV6_ADDR_PREFERENCES socket option values
  38 *      IPV6_PREFER_SRC_TMP    = 0x1
  39 *      IPV6_PREFER_SRC_PUBLIC = 0x2
  40 *      IPV6_PREFER_SRC_COA    = 0x4
  41 * and above RT6_LOOKUP_F_SRCPREF_xxx flags.
  42 */
  43static inline int rt6_srcprefs2flags(unsigned int srcprefs)
  44{
  45        /* No need to bitmask because srcprefs have only 3 bits. */
  46        return srcprefs << 3;
  47}
  48
  49static inline unsigned int rt6_flags2srcprefs(int flags)
  50{
  51        return (flags >> 3) & 7;
  52}
  53
  54extern void rt6_bind_peer(struct rt6_info *rt, int create);
  55
  56static inline struct inet_peer *__rt6_get_peer(struct rt6_info *rt, int create)
  57{
  58        if (rt6_has_peer(rt))
  59                return rt6_peer_ptr(rt);
  60
  61        rt6_bind_peer(rt, create);
  62        return (rt6_has_peer(rt) ? rt6_peer_ptr(rt) : NULL);
  63}
  64
  65static inline struct inet_peer *rt6_get_peer(struct rt6_info *rt)
  66{
  67        return __rt6_get_peer(rt, 0);
  68}
  69
  70static inline struct inet_peer *rt6_get_peer_create(struct rt6_info *rt)
  71{
  72        return __rt6_get_peer(rt, 1);
  73}
  74
  75extern void                     ip6_route_input(struct sk_buff *skb);
  76
  77extern struct dst_entry *       ip6_route_output(struct net *net,
  78                                                 const struct sock *sk,
  79                                                 struct flowi6 *fl6);
  80extern struct dst_entry *       ip6_route_lookup(struct net *net,
  81                                                 struct flowi6 *fl6, int flags);
  82
  83extern int                      ip6_route_init(void);
  84extern void                     ip6_route_cleanup(void);
  85
  86extern int                      ipv6_route_ioctl(struct net *net,
  87                                                 unsigned int cmd,
  88                                                 void __user *arg);
  89
  90extern int                      ip6_route_add(struct fib6_config *cfg);
  91extern int                      ip6_ins_rt(struct rt6_info *);
  92extern int                      ip6_del_rt(struct rt6_info *);
  93
  94extern int                      ip6_route_get_saddr(struct net *net,
  95                                                    struct rt6_info *rt,
  96                                                    const struct in6_addr *daddr,
  97                                                    unsigned int prefs,
  98                                                    struct in6_addr *saddr);
  99
 100extern struct rt6_info          *rt6_lookup(struct net *net,
 101                                            const struct in6_addr *daddr,
 102                                            const struct in6_addr *saddr,
 103                                            int oif, int flags);
 104
 105extern struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
 106                                         struct flowi6 *fl6);
 107extern int icmp6_dst_gc(void);
 108
 109extern void fib6_force_start_gc(struct net *net);
 110
 111extern struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
 112                                           const struct in6_addr *addr,
 113                                           bool anycast);
 114
 115extern int                      ip6_dst_hoplimit(struct dst_entry *dst);
 116
 117/*
 118 *      support functions for ND
 119 *
 120 */
 121extern struct rt6_info *        rt6_get_dflt_router(const struct in6_addr *addr,
 122                                                    struct net_device *dev);
 123extern struct rt6_info *        rt6_add_dflt_router(const struct in6_addr *gwaddr,
 124                                                    struct net_device *dev,
 125                                                    unsigned int pref);
 126
 127extern void                     rt6_purge_dflt_routers(struct net *net);
 128
 129extern int                      rt6_route_rcv(struct net_device *dev,
 130                                              u8 *opt, int len,
 131                                              const struct in6_addr *gwaddr);
 132
 133extern void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu,
 134                            int oif, u32 mark);
 135extern void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk,
 136                               __be32 mtu);
 137extern void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark);
 138extern void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk);
 139
 140struct netlink_callback;
 141
 142struct rt6_rtnl_dump_arg {
 143        struct sk_buff *skb;
 144        struct netlink_callback *cb;
 145        struct net *net;
 146};
 147
 148extern int rt6_dump_route(struct rt6_info *rt, void *p_arg);
 149extern void rt6_ifdown(struct net *net, struct net_device *dev);
 150extern void rt6_mtu_change(struct net_device *dev, unsigned int mtu);
 151extern void rt6_remove_prefsrc(struct inet6_ifaddr *ifp);
 152
 153
 154/*
 155 *      Store a destination cache entry in a socket
 156 */
 157static inline void __ip6_dst_store(struct sock *sk, struct dst_entry *dst,
 158                                   const struct in6_addr *daddr,
 159                                   const struct in6_addr *saddr)
 160{
 161        struct ipv6_pinfo *np = inet6_sk(sk);
 162        struct rt6_info *rt = (struct rt6_info *) dst;
 163
 164        sk_setup_caps(sk, dst);
 165        np->daddr_cache = daddr;
 166#ifdef CONFIG_IPV6_SUBTREES
 167        np->saddr_cache = saddr;
 168#endif
 169        np->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0;
 170}
 171
 172static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst,
 173                                 struct in6_addr *daddr, struct in6_addr *saddr)
 174{
 175        spin_lock(&sk->sk_dst_lock);
 176        __ip6_dst_store(sk, dst, daddr, saddr);
 177        spin_unlock(&sk->sk_dst_lock);
 178}
 179
 180static inline bool ipv6_unicast_destination(const struct sk_buff *skb)
 181{
 182        struct rt6_info *rt = (struct rt6_info *) skb_dst(skb);
 183
 184        return rt->rt6i_flags & RTF_LOCAL;
 185}
 186
 187int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *));
 188
 189static inline int ip6_skb_dst_mtu(struct sk_buff *skb)
 190{
 191        struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL;
 192
 193        return (np && np->pmtudisc == IPV6_PMTUDISC_PROBE) ?
 194               skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb));
 195}
 196
 197static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt, struct in6_addr *dest)
 198{
 199        if (rt->rt6i_flags & RTF_GATEWAY)
 200                return &rt->rt6i_gateway;
 201        return dest;
 202}
 203
 204#endif
 205