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
- Lines: 271
- Date:
Sun Nov 30 14:12:48 1997
- Orig file:
v2.1.67/linux/include/net/ip_fib.h
- Orig date:
Thu Dec 12 06:54:21 1996
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