Commit 0f87b1dd authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller

net: fib_rules: decouple address families from real address families

Decouple the address family values used for fib_rules from the real
address families in socket.h. This allows to use fib_rules for
code that is not a real address family without increasing AF_MAX/NPROTO.

Values up to 127 are reserved for real address families and map directly
to the corresponding AF value, values starting from 128 are for other
uses. rtnetlink is changed to invoke the AF_UNSPEC dumpit/doit handlers
for these families.
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 28bb1726
...@@ -15,6 +15,13 @@ ...@@ -15,6 +15,13 @@
/* try to find source address in routing lookups */ /* try to find source address in routing lookups */
#define FIB_RULE_FIND_SADDR 0x00010000 #define FIB_RULE_FIND_SADDR 0x00010000
/* fib_rules families. values up to 127 are reserved for real address
* families, values above 128 may be used arbitrarily.
*/
#define FIB_RULES_IPV4 AF_INET
#define FIB_RULES_IPV6 AF_INET6
#define FIB_RULES_DECNET AF_DECnet
struct fib_rule_hdr { struct fib_rule_hdr {
__u8 family; __u8 family;
__u8 dst_len; __u8 dst_len;
......
...@@ -118,7 +118,11 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) ...@@ -118,7 +118,11 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex)
{ {
struct rtnl_link *tab; struct rtnl_link *tab;
if (protocol < NPROTO)
tab = rtnl_msg_handlers[protocol]; tab = rtnl_msg_handlers[protocol];
else
tab = NULL;
if (tab == NULL || tab[msgindex].doit == NULL) if (tab == NULL || tab[msgindex].doit == NULL)
tab = rtnl_msg_handlers[PF_UNSPEC]; tab = rtnl_msg_handlers[PF_UNSPEC];
...@@ -129,7 +133,11 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) ...@@ -129,7 +133,11 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex)
{ {
struct rtnl_link *tab; struct rtnl_link *tab;
if (protocol < NPROTO)
tab = rtnl_msg_handlers[protocol]; tab = rtnl_msg_handlers[protocol];
else
tab = NULL;
if (tab == NULL || tab[msgindex].dumpit == NULL) if (tab == NULL || tab[msgindex].dumpit == NULL)
tab = rtnl_msg_handlers[PF_UNSPEC]; tab = rtnl_msg_handlers[PF_UNSPEC];
...@@ -1444,9 +1452,6 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) ...@@ -1444,9 +1452,6 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
return 0; return 0;
family = ((struct rtgenmsg *)NLMSG_DATA(nlh))->rtgen_family; family = ((struct rtgenmsg *)NLMSG_DATA(nlh))->rtgen_family;
if (family >= NPROTO)
return -EAFNOSUPPORT;
sz_idx = type>>2; sz_idx = type>>2;
kind = type&3; kind = type&3;
......
...@@ -217,7 +217,7 @@ static void dn_fib_rule_flush_cache(struct fib_rules_ops *ops) ...@@ -217,7 +217,7 @@ static void dn_fib_rule_flush_cache(struct fib_rules_ops *ops)
} }
static struct fib_rules_ops dn_fib_rules_ops_template = { static struct fib_rules_ops dn_fib_rules_ops_template = {
.family = AF_DECnet, .family = FIB_RULES_DECNET,
.rule_size = sizeof(struct dn_fib_rule), .rule_size = sizeof(struct dn_fib_rule),
.addr_size = sizeof(u16), .addr_size = sizeof(u16),
.action = dn_fib_rule_action, .action = dn_fib_rule_action,
......
...@@ -246,7 +246,7 @@ static void fib4_rule_flush_cache(struct fib_rules_ops *ops) ...@@ -246,7 +246,7 @@ static void fib4_rule_flush_cache(struct fib_rules_ops *ops)
} }
static struct fib_rules_ops fib4_rules_ops_template = { static struct fib_rules_ops fib4_rules_ops_template = {
.family = AF_INET, .family = FIB_RULES_IPV4,
.rule_size = sizeof(struct fib4_rule), .rule_size = sizeof(struct fib4_rule),
.addr_size = sizeof(u32), .addr_size = sizeof(u32),
.action = fib4_rule_action, .action = fib4_rule_action,
......
...@@ -238,7 +238,7 @@ static size_t fib6_rule_nlmsg_payload(struct fib_rule *rule) ...@@ -238,7 +238,7 @@ static size_t fib6_rule_nlmsg_payload(struct fib_rule *rule)
} }
static struct fib_rules_ops fib6_rules_ops_template = { static struct fib_rules_ops fib6_rules_ops_template = {
.family = AF_INET6, .family = FIB_RULES_IPV6,
.rule_size = sizeof(struct fib6_rule), .rule_size = sizeof(struct fib6_rule),
.addr_size = sizeof(struct in6_addr), .addr_size = sizeof(struct in6_addr),
.action = fib6_rule_action, .action = fib6_rule_action,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment