11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _NET_DN_FIB_H
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _NET_DN_FIB_H
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* WARNING: The ordering of these elements must match ordering
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *          of RTA_* rtnetlink attribute numbers.
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
7fd2c3ef761fbc5e6c27fa7d40b30cda06bfcd7d8Eric Dumazetstruct dn_kern_rta {
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        void            *rta_dst;
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        void            *rta_src;
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        int             *rta_iif;
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        int             *rta_oif;
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        void            *rta_gw;
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u32             *rta_priority;
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        void            *rta_prefsrc;
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        struct rtattr   *rta_mx;
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        struct rtattr   *rta_mp;
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned char   *rta_protoinfo;
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u32             *rta_flow;
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        struct rta_cacheinfo *rta_ci;
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct rta_session *rta_sess;
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct dn_fib_res {
24a8731cbf61c8768ea129780b70dc7dfc6795aad4Steven Whitehouse	struct fib_rule *r;
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct dn_fib_info *fi;
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char prefixlen;
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char nh_sel;
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char type;
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char scope;
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct dn_fib_nh {
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct net_device	*nh_dev;
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned		nh_flags;
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char		nh_scope;
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			nh_weight;
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			nh_power;
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			nh_oif;
39c4ea94ab3710eb2434abe2eab1a479c2dc01f8acSteven Whitehouse	__le16			nh_gw;
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct dn_fib_info {
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct dn_fib_info	*fib_next;
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct dn_fib_info	*fib_prev;
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int 			fib_treeref;
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atomic_t		fib_clntref;
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			fib_dead;
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned		fib_flags;
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			fib_protocol;
50c4ea94ab3710eb2434abe2eab1a479c2dc01f8acSteven Whitehouse	__le16			fib_prefsrc;
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u32			fib_priority;
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u32			fib_metrics[RTAX_MAX];
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			fib_nhs;
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			fib_power;
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct dn_fib_nh	fib_nh[0];
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define dn_fib_dev		fib_nh[0].nh_dev
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DN_FIB_RES_RESET(res)	((res).nh_sel = 0)
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DN_FIB_RES_NH(res)	((res).fi->fib_nh[(res).nh_sel])
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DN_FIB_RES_PREFSRC(res)	((res).fi->fib_prefsrc ? : __dn_fib_res_prefsrc(&res))
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DN_FIB_RES_GW(res)	(DN_FIB_RES_NH(res).nh_gw)
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DN_FIB_RES_DEV(res)	(DN_FIB_RES_NH(res).nh_dev)
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DN_FIB_RES_OIF(res)	(DN_FIB_RES_NH(res).nh_oif)
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
69c4ea94ab3710eb2434abe2eab1a479c2dc01f8acSteven Whitehouse	__le16	datum;
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} dn_fib_key_t;
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
73c4ea94ab3710eb2434abe2eab1a479c2dc01f8acSteven Whitehouse	__le16	datum;
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} dn_fib_hash_t;
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
77c4ea94ab3710eb2434abe2eab1a479c2dc01f8acSteven Whitehouse	__u16	datum;
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} dn_fib_idx_t;
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct dn_fib_node {
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct dn_fib_node *fn_next;
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct dn_fib_info *fn_info;
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DN_FIB_INFO(f) ((f)->fn_info)
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dn_fib_key_t	fn_key;
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		fn_type;
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		fn_scope;
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		fn_state;
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct dn_fib_table {
92abcab268303c22d24fc89fedd35d82271d20f5daPatrick McHardy	struct hlist_node hlist;
932dfe55b47e3d66ded5a84caf71e0da5710edf48bPatrick McHardy	u32 n;
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int (*insert)(struct dn_fib_table *t, struct rtmsg *r,
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			struct dn_kern_rta *rta, struct nlmsghdr *n,
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			struct netlink_skb_parms *req);
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int (*delete)(struct dn_fib_table *t, struct rtmsg *r,
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			struct dn_kern_rta *rta, struct nlmsghdr *n,
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			struct netlink_skb_parms *req);
101bef55aebd560c5a6f8883c421abccee39978c58cDavid S. Miller	int (*lookup)(struct dn_fib_table *t, const struct flowidn *fld,
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			struct dn_fib_res *res);
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int (*flush)(struct dn_fib_table *t);
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int (*dump)(struct dn_fib_table *t, struct sk_buff *skb, struct netlink_callback *cb);
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char data[0];
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_DECNET_ROUTER
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * dn_fib.c
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void dn_fib_init(void);
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void dn_fib_cleanup(void);
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int dn_fib_ioctl(struct socket *sock, unsigned int cmd,
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			unsigned long arg);
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct dn_fib_info *dn_fib_create_info(const struct rtmsg *r,
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				struct dn_kern_rta *rta,
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				const struct nlmsghdr *nlh, int *errp);
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int dn_fib_semantic_match(int type, struct dn_fib_info *fi,
122bef55aebd560c5a6f8883c421abccee39978c58cDavid S. Miller			const struct flowidn *fld,
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			struct dn_fib_res *res);
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void dn_fib_release_info(struct dn_fib_info *fi);
125c4ea94ab3710eb2434abe2eab1a479c2dc01f8acSteven Whitehouseextern __le16 dn_fib_get_attr16(struct rtattr *attr, int attrlen, int type);
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void dn_fib_flush(void);
127bef55aebd560c5a6f8883c421abccee39978c58cDavid S. Millerextern void dn_fib_select_multipath(const struct flowidn *fld,
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					struct dn_fib_res *res);
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * dn_tables.c
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1332dfe55b47e3d66ded5a84caf71e0da5710edf48bPatrick McHardyextern struct dn_fib_table *dn_fib_get_table(u32 n, int creat);
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct dn_fib_table *dn_fib_empty_table(void);
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void dn_fib_table_init(void);
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void dn_fib_table_cleanup(void);
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * dn_rules.c
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void dn_fib_rules_init(void);
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void dn_fib_rules_cleanup(void);
143c4ea94ab3710eb2434abe2eab1a479c2dc01f8acSteven Whitehouseextern unsigned dnet_addr_type(__le16 addr);
144bef55aebd560c5a6f8883c421abccee39978c58cDavid S. Millerextern int dn_fib_lookup(struct flowidn *fld, struct dn_fib_res *res);
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb);
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void dn_fib_free_info(struct dn_fib_info *fi);
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void dn_fib_info_put(struct dn_fib_info *fi)
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (atomic_dec_and_test(&fi->fib_clntref))
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dn_fib_free_info(fi);
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void dn_fib_res_put(struct dn_fib_res *res)
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (res->fi)
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dn_fib_info_put(res->fi);
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (res->r)
161a8731cbf61c8768ea129780b70dc7dfc6795aad4Steven Whitehouse		fib_rule_put(res->r);
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else /* Endnode */
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define dn_fib_init()  do { } while(0)
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define dn_fib_cleanup() do { } while(0)
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define dn_fib_lookup(fl, res) (-ESRCH)
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define dn_fib_info_put(fi) do { } while(0)
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define dn_fib_select_multipath(fl, res) do { } while(0)
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define dn_fib_rules_policy(saddr,res,flags) (0)
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define dn_fib_res_put(res) do { } while(0)
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* CONFIG_DECNET_ROUTER */
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
177c4ea94ab3710eb2434abe2eab1a479c2dc01f8acSteven Whitehousestatic inline __le16 dnet_make_mask(int n)
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
179c4106aa88a440430d387e022f2ad6dc1e0d52e98Harvey Harrison	if (n)
180c4106aa88a440430d387e022f2ad6dc1e0d52e98Harvey Harrison		return cpu_to_le16(~((1 << (16 - n)) - 1));
181c4106aa88a440430d387e022f2ad6dc1e0d52e98Harvey Harrison	return cpu_to_le16(0);
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* _NET_DN_FIB_H */
185