patch-2.1.68 linux/include/net/ip_fib.h

Next file: linux/include/net/ip_masq.h
Previous file: linux/include/net/ip_alias.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.67/linux/include/net/ip_fib.h linux/include/net/ip_fib.h
@@ -16,118 +16,190 @@
 #ifndef _NET_IP_FIB_H
 #define _NET_IP_FIB_H
 
+#include <linux/config.h>
 
-struct fib_node
+struct fib_nh
 {
-	struct fib_node		*fib_next;
-	u32			fib_key;
-	struct fib_info		*fib_info;
-	short			fib_metric;
-	u8			fib_tos;
-	u8			fib_flag;
+	struct device		*nh_dev;
+	unsigned		nh_flags;
+	unsigned char		nh_scope;
+#ifdef CONFIG_IP_ROUTE_MULTIPATH
+	int			nh_weight;
+	int			nh_power;
+#endif
+	int			nh_oif;
+	u32			nh_gw;
 };
 
-#define FIBFLG_DOWN		1	/* Ignore this node	*/
-#define FIBFLG_THROW		2	/* Class lookup failed	*/
-#define FIBFLG_REJECT		4	/* Route lookup failed	*/
-
-#define MAGIC_METRIC		0x7FFF
-
 /*
  * This structure contains data shared by many of routes.
- */	
+ */
 
 struct fib_info
 {
 	struct fib_info		*fib_next;
 	struct fib_info		*fib_prev;
-	u32			fib_gateway;
-	struct device		*fib_dev;
 	int			fib_refcnt;
-	unsigned long		fib_window;
 	unsigned		fib_flags;
-	unsigned short		fib_mtu;
-	unsigned short		fib_irtt;
+	int			fib_protocol;
+	u32			fib_prefsrc;
+	unsigned		fib_mtu;
+	unsigned		fib_rtt;
+	unsigned		fib_window;
+	int			fib_nhs;
+#ifdef CONFIG_IP_ROUTE_MULTIPATH
+	int			fib_power;
+#endif
+	struct fib_nh		fib_nh[0];
+#define fib_dev		fib_nh[0].nh_dev
 };
 
-struct fib_zone
+
+#ifdef CONFIG_IP_MULTIPLE_TABLES
+struct fib_rule;
+#endif
+
+struct fib_result
 {
-	struct fib_zone	*fz_next;
-	struct fib_node	**fz_hash;
-	int		fz_nent;
-	int		fz_divisor;
-	u32		fz_hashmask;
-	int		fz_logmask;
-	u32		fz_mask;
+	u32		*prefix;
+	unsigned char	prefixlen;
+	unsigned char	nh_sel;
+	unsigned char	type;
+	unsigned char	scope;
+	struct fib_info *fi;
+#ifdef CONFIG_IP_MULTIPLE_TABLES
+	struct fib_rule	*r;
+#endif
 };
 
-struct fib_class
+#ifdef CONFIG_IP_ROUTE_MULTIPATH
+
+#define FIB_RES_NH(res)		((res).fi->fib_nh[(res).nh_sel])
+#define FIB_RES_RESET(res)	((res).nh_sel = 0)
+
+#else /* CONFIG_IP_ROUTE_MULTIPATH */
+
+#define FIB_RES_NH(res)		((res).fi->fib_nh[0])
+#define FIB_RES_RESET(res)
+
+#endif /* CONFIG_IP_ROUTE_MULTIPATH */
+
+#define FIB_RES_PREFSRC(res)		((res).fi->fib_prefsrc ? : __fib_res_prefsrc(&res))
+#define FIB_RES_GW(res)			(FIB_RES_NH(res).nh_gw)
+#define FIB_RES_DEV(res)		(FIB_RES_NH(res).nh_dev)
+#define FIB_RES_OIF(res)		(FIB_RES_NH(res).nh_oif)
+
+struct fib_table
 {
-	unsigned char	cl_id;
-	unsigned char	cl_auto;
-	struct fib_zone	*fib_zones[33];
-	struct fib_zone	*fib_zone_list;
-	int		cl_users;
+	unsigned char	tb_id;
+	unsigned	tb_stamp;
+	int		(*tb_lookup)(struct fib_table *tb, const struct rt_key *key, struct fib_result *res);
+	int		(*tb_insert)(struct fib_table *table, struct rtmsg *r,
+				     struct kern_rta *rta, struct nlmsghdr *n,
+				     struct netlink_skb_parms *req);
+	int		(*tb_delete)(struct fib_table *table, struct rtmsg *r,
+				     struct kern_rta *rta, struct nlmsghdr *n,
+				     struct netlink_skb_parms *req);
+	int		(*tb_dump)(struct fib_table *table, struct sk_buff *skb,
+				     struct netlink_callback *cb);
+	int		(*tb_flush)(struct fib_table *table);
+	int		(*tb_get_info)(struct fib_table *table, char *buf,
+				       int first, int count);
+
+	unsigned char	tb_data[0];
 };
 
-struct fib_rule
+#ifndef CONFIG_IP_MULTIPLE_TABLES
+
+extern struct fib_table *local_table;
+extern struct fib_table *main_table;
+
+extern __inline__ struct fib_table *fib_get_table(int id)
 {
-	struct fib_rule *cl_next;
-	struct fib_class *cl_class;
-	u32		cl_src;
-	u32		cl_srcmask;
-	u32		cl_dst;
-	u32		cl_dstmask;
-	u32		cl_srcmap;
-	u8		cl_action;
-	u8		cl_flags;
-	u8		cl_tos;
-	u8		cl_preference;
-	struct device	*cl_dev;
-};
+	if (id != RT_TABLE_LOCAL)
+		return main_table;
+	return local_table;
+}
 
-struct fib_result
+extern __inline__ struct fib_table *fib_new_table(int id)
 {
-	struct fib_node *f;
-	struct fib_rule *fr;
-	int		 fm;
-};
+	return fib_get_table(id);
+}
 
-void ip_fib_init(void);
-unsigned ip_fib_chk_addr(u32 addr);
-int ip_fib_chk_default_gw(u32 addr, struct device*);
-
-int fib_lookup(struct fib_result *, u32 daddr, u32 src, u8 tos, struct device *devin,
-	       struct device *devout);
-
-static __inline__ struct fib_info *
-fib_lookup_info(u32 dst, u32 src, u8 tos, struct device *devin,
-		struct device *devout)
-{
-	struct fib_result res;
-	if (fib_lookup(&res, dst, src, tos, devin, devout) < 0)
-		return NULL;
-	return res.f->fib_info;
+extern __inline__ int fib_lookup(const struct rt_key *key, struct fib_result *res)
+{
+	if (local_table->tb_lookup(local_table, key, res))
+		return main_table->tb_lookup(main_table, key, res);
+	return 0;
 }
 
-static __inline__ struct device * get_gw_dev(u32 gw, struct device *dev)
+#else /* CONFIG_IP_MULTIPLE_TABLES */
+#define local_table (fib_tables[RT_TABLE_LOCAL])
+#define main_table (fib_tables[RT_TABLE_MAIN])
+
+extern struct fib_table * fib_tables[RT_TABLE_MAX+1];
+extern int fib_lookup(const struct rt_key *key, struct fib_result *res);
+extern struct fib_table *__fib_new_table(int id);
+
+extern __inline__ struct fib_table *fib_get_table(int id)
 {
-	struct fib_info * fi;
+	if (id == 0)
+		id = RT_TABLE_MAIN;
 
-	fi = fib_lookup_info(gw, 0, 1, &loopback_dev, dev);
-	if (fi)
-		return fi->fib_dev;
-	return NULL;
+	return fib_tables[id];
 }
 
-extern int		ip_rt_event(int event, struct device *dev);
-extern int		ip_rt_ioctl(unsigned int cmd, void *arg);
-extern void		ip_rt_change_broadcast(struct device *, u32);
-extern void		ip_rt_change_dstaddr(struct device *, u32);
-extern void		ip_rt_change_netmask(struct device *, u32);
-extern void		ip_rt_multicast_event(struct device *dev);
+extern __inline__ struct fib_table *fib_new_table(int id)
+{
+	if (id == 0)
+		id = RT_TABLE_MAIN;
+
+	return fib_tables[id] ? : __fib_new_table(id);
+}
+#endif /* CONFIG_IP_MULTIPLE_TABLES */
 
-extern struct device *	ip_dev_find_tunnel(u32 daddr, u32 saddr);
+/* Exported by fib_frontend.c */
+extern void		ip_fib_init(void);
+extern void		fib_flush(void);
+extern int inet_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
+extern int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
+extern int inet_rtm_getroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
+extern int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb);
+extern int fib_validate_source(u32 src, u32 dst, u8 tos, int oif,
+			       struct device *dev, u32 *spec_dst);
+extern void fib_select_multipath(const struct rt_key *key, struct fib_result *res);
+
+/* Exported by fib_semantics.c */
+extern int 		ip_fib_check_default(u32 gw, struct device *dev);
+extern void		fib_release_info(struct fib_info *);
+extern int		fib_semantic_match(int type, struct fib_info *,
+					   const struct rt_key *, struct fib_result*);
+extern struct fib_info	*fib_create_info(const struct rtmsg *r, struct kern_rta *rta,
+					 const struct nlmsghdr *, int *err);
+extern int fib_nh_match(struct rtmsg *r, struct nlmsghdr *, struct kern_rta *rta, struct fib_info *fi);
+extern int fib_dump_info(struct sk_buff *skb, pid_t pid, u32 seq, int event,
+			 u8 tb_id, u8 type, u8 scope, void *dst, int dst_len, u8 tos,
+			 struct fib_info *fi);
+extern int fib_sync_down(u32 local, struct device *dev);
+extern int fib_sync_up(struct device *dev);
+extern int fib_convert_rtentry(int cmd, struct nlmsghdr *nl, struct rtmsg *rtm,
+			       struct kern_rta *rta, struct rtentry *r);
+extern void fib_node_get_info(int type, int dead, struct fib_info *fi, u32 prefix, u32 mask, char *buffer);
+extern u32  __fib_res_prefsrc(struct fib_result *res);
+
+/* Exported by fib_hash.c */
+extern struct fib_table *fib_hash_init(int id);
+
+#ifdef CONFIG_IP_MULTIPLE_TABLES
+/* Exported by fib_rules.c */
+
+extern int inet_rtm_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
+extern int inet_rtm_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
+extern int inet_dump_rules(struct sk_buff *skb, struct netlink_callback *cb);
+extern u32 fib_rules_map_destination(u32 daddr, struct fib_result *res);
+extern u32 fib_rules_policy(u32 saddr, struct fib_result *res, unsigned *flags);
+extern void fib_rules_init(void);
+#endif
 
 
 #endif  _NET_FIB_H

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov