ip6_route.h 4.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7
#ifndef _NET_IP6_ROUTE_H
#define _NET_IP6_ROUTE_H

#define IP6_RT_PRIO_USER	1024
#define IP6_RT_PRIO_ADDRCONF	256
#define IP6_RT_PRIO_KERN	512

8 9 10 11 12 13 14 15 16 17 18 19 20
struct route_info {
	__u8			type;
	__u8			length;
	__u8			prefix_len;
#if defined(__BIG_ENDIAN_BITFIELD)
	__u8			reserved_h:3,
				route_pref:2,
				reserved_l:3;
#elif defined(__LITTLE_ENDIAN_BITFIELD)
	__u8			reserved_l:3,
				route_pref:2,
				reserved_h:3;
#endif
A
Al Viro 已提交
21
	__be32			lifetime;
22 23 24
	__u8			prefix[0];	/* 0,8 or 16 */
};

L
Linus Torvalds 已提交
25 26 27 28 29 30 31 32
#ifdef __KERNEL__

#include <net/flow.h>
#include <net/ip6_fib.h>
#include <net/sock.h>
#include <linux/ip.h>
#include <linux/ipv6.h>

33 34 35 36
#define RT6_LOOKUP_F_IFACE	0x1
#define RT6_LOOKUP_F_REACHABLE	0x2
#define RT6_LOOKUP_F_HAS_SADDR	0x4

L
Linus Torvalds 已提交
37 38
extern struct rt6_info	ip6_null_entry;

T
Thomas Graf 已提交
39 40 41 42 43
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
extern struct rt6_info	ip6_prohibit_entry;
extern struct rt6_info	ip6_blk_hole_entry;
#endif

L
Linus Torvalds 已提交
44 45 46 47 48
extern void			ip6_route_input(struct sk_buff *skb);

extern struct dst_entry *	ip6_route_output(struct sock *sk,
						 struct flowi *fl);

49
extern int			ip6_route_init(void);
L
Linus Torvalds 已提交
50 51 52 53
extern void			ip6_route_cleanup(void);

extern int			ipv6_route_ioctl(unsigned int cmd, void __user *arg);

54
extern int			ip6_route_add(struct fib6_config *cfg);
55
extern int			ip6_ins_rt(struct rt6_info *);
56
extern int			ip6_del_rt(struct rt6_info *);
L
Linus Torvalds 已提交
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

extern int			ip6_rt_addr_add(struct in6_addr *addr,
						struct net_device *dev,
						int anycast);

extern int			ip6_rt_addr_del(struct in6_addr *addr,
						struct net_device *dev);

extern void			rt6_sndmsg(int type, struct in6_addr *dst,
					   struct in6_addr *src,
					   struct in6_addr *gw,
					   struct net_device *dev, 
					   int dstlen, int srclen,
					   int metric, __u32 flags);

extern struct rt6_info		*rt6_lookup(struct in6_addr *daddr,
					    struct in6_addr *saddr,
					    int oif, int flags);

extern struct dst_entry *ndisc_dst_alloc(struct net_device *dev,
					 struct neighbour *neigh,
					 struct in6_addr *addr,
					 int (*output)(struct sk_buff *));
extern int ndisc_dst_gc(int *more);
extern void fib6_force_start_gc(void);

extern struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
					   const struct in6_addr *addr,
					   int anycast);

/*
 *	support functions for ND
 *
 */
extern struct rt6_info *	rt6_get_dflt_router(struct in6_addr *addr,
						    struct net_device *dev);
extern struct rt6_info *	rt6_add_dflt_router(struct in6_addr *gwaddr,
94 95
						    struct net_device *dev,
						    unsigned int pref);
L
Linus Torvalds 已提交
96 97 98

extern void			rt6_purge_dflt_routers(void);

99 100 101 102
extern int			rt6_route_rcv(struct net_device *dev,
					      u8 *opt, int len,
					      struct in6_addr *gwaddr);

L
Linus Torvalds 已提交
103
extern void			rt6_redirect(struct in6_addr *dest,
104
					     struct in6_addr *src,
L
Linus Torvalds 已提交
105 106 107 108 109 110 111 112 113 114 115 116
					     struct in6_addr *saddr,
					     struct neighbour *neigh,
					     u8 *lladdr,
					     int on_link);

extern void			rt6_pmtu_discovery(struct in6_addr *daddr,
						   struct in6_addr *saddr,
						   struct net_device *dev,
						   u32 pmtu);

struct netlink_callback;

117 118 119 120 121 122 123
struct rt6_rtnl_dump_arg
{
	struct sk_buff *skb;
	struct netlink_callback *cb;
};

extern int rt6_dump_route(struct rt6_info *rt, void *p_arg);
L
Linus Torvalds 已提交
124 125 126 127 128 129 130 131
extern void rt6_ifdown(struct net_device *dev);
extern void rt6_mtu_change(struct net_device *dev, unsigned mtu);

extern rwlock_t rt6_lock;

/*
 *	Store a destination cache entry in a socket
 */
132
static inline void __ip6_dst_store(struct sock *sk, struct dst_entry *dst,
133
				   struct in6_addr *daddr, struct in6_addr *saddr)
L
Linus Torvalds 已提交
134 135 136 137
{
	struct ipv6_pinfo *np = inet6_sk(sk);
	struct rt6_info *rt = (struct rt6_info *) dst;

H
Herbert Xu 已提交
138
	sk_setup_caps(sk, dst);
L
Linus Torvalds 已提交
139
	np->daddr_cache = daddr;
140 141 142
#ifdef CONFIG_IPV6_SUBTREES
	np->saddr_cache = saddr;
#endif
L
Linus Torvalds 已提交
143
	np->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0;
144 145 146
}

static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst,
147
				 struct in6_addr *daddr, struct in6_addr *saddr)
148 149
{
	write_lock(&sk->sk_dst_lock);
150
	__ip6_dst_store(sk, dst, daddr, saddr);
L
Linus Torvalds 已提交
151 152 153 154 155 156 157 158 159 160 161 162
	write_unlock(&sk->sk_dst_lock);
}

static inline int ipv6_unicast_destination(struct sk_buff *skb)
{
	struct rt6_info *rt = (struct rt6_info *) skb->dst;

	return rt->rt6i_flags & RTF_LOCAL;
}

#endif
#endif