net: rtnetlink: decouple rtnetlink address families from real address families
authorPatrick McHardy <kaber@trash.net>
Mon, 26 Apr 2010 14:02:05 +0000 (16:02 +0200)
committerPatrick McHardy <kaber@trash.net>
Mon, 26 Apr 2010 14:13:54 +0000 (16:13 +0200)
Decouple rtnetlink address families from real address families in socket.h to
be able to add rtnetlink interfaces to code that is not a real address family
without increasing AF_MAX/NPROTO.

This will be used to add support for multicast route dumping from all tables
as the proc interface can't be extended to support anything but the main table
without breaking compatibility.

This partialy undoes the patch to introduce independant families for routing
rules and converts ipmr routing rules to a new rtnetlink family. Similar to
that patch, values up to 127 are reserved for real address families, values
above that may be used arbitrarily.

Signed-off-by: Patrick McHardy <kaber@trash.net>
include/linux/fib_rules.h
include/linux/rtnetlink.h
net/core/rtnetlink.c
net/decnet/dn_rules.c
net/ipv4/fib_rules.c
net/ipv4/ipmr.c
net/ipv6/fib6_rules.c

index 04a397619ebe158a96fe3032709580ac7e60f602..51da65b68b8501cb2d25fe0064c2c6ff65e3d4e6 100644 (file)
 /* try to find source address in routing lookups */
 #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
-#define FIB_RULES_IPMR         128
-
 struct fib_rule_hdr {
        __u8            family;
        __u8            dst_len;
index d1c7c90e9cd46e8b8ebcc315d190e961368e3f98..5a42c36cb6aaa3e244fbccae2573eb463692e703 100644 (file)
@@ -7,6 +7,12 @@
 #include <linux/if_addr.h>
 #include <linux/neighbour.h>
 
+/* rtnetlink families. Values up to 127 are reserved for real address
+ * families, values above 128 may be used arbitrarily.
+ */
+#define RTNL_FAMILY_IPMR               128
+#define RTNL_FAMILY_MAX                        128
+
 /****
  *             Routing/neighbour discovery messages.
  ****/
index 78c85985cb30a754d58efa293799d3581639e2a3..fd781b62fa7fb468f769ace62dc2f3c6749c76ae 100644 (file)
@@ -98,7 +98,7 @@ int lockdep_rtnl_is_held(void)
 EXPORT_SYMBOL(lockdep_rtnl_is_held);
 #endif /* #ifdef CONFIG_PROVE_LOCKING */
 
-static struct rtnl_link *rtnl_msg_handlers[NPROTO];
+static struct rtnl_link *rtnl_msg_handlers[RTNL_FAMILY_MAX + 1];
 
 static inline int rtm_msgindex(int msgtype)
 {
@@ -118,7 +118,7 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex)
 {
        struct rtnl_link *tab;
 
-       if (protocol < NPROTO)
+       if (protocol <= RTNL_FAMILY_MAX)
                tab = rtnl_msg_handlers[protocol];
        else
                tab = NULL;
@@ -133,7 +133,7 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex)
 {
        struct rtnl_link *tab;
 
-       if (protocol < NPROTO)
+       if (protocol <= RTNL_FAMILY_MAX)
                tab = rtnl_msg_handlers[protocol];
        else
                tab = NULL;
@@ -167,7 +167,7 @@ int __rtnl_register(int protocol, int msgtype,
        struct rtnl_link *tab;
        int msgindex;
 
-       BUG_ON(protocol < 0 || protocol >= NPROTO);
+       BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
        msgindex = rtm_msgindex(msgtype);
 
        tab = rtnl_msg_handlers[protocol];
@@ -219,7 +219,7 @@ int rtnl_unregister(int protocol, int msgtype)
 {
        int msgindex;
 
-       BUG_ON(protocol < 0 || protocol >= NPROTO);
+       BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
        msgindex = rtm_msgindex(msgtype);
 
        if (rtnl_msg_handlers[protocol] == NULL)
@@ -241,7 +241,7 @@ EXPORT_SYMBOL_GPL(rtnl_unregister);
  */
 void rtnl_unregister_all(int protocol)
 {
-       BUG_ON(protocol < 0 || protocol >= NPROTO);
+       BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
 
        kfree(rtnl_msg_handlers[protocol]);
        rtnl_msg_handlers[protocol] = NULL;
@@ -1384,7 +1384,7 @@ static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
 
        if (s_idx == 0)
                s_idx = 1;
-       for (idx = 1; idx < NPROTO; idx++) {
+       for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) {
                int type = cb->nlh->nlmsg_type-RTM_BASE;
                if (idx < s_idx || idx == PF_PACKET)
                        continue;
index 1226bcad776bf77cb49a3ea8dbc1d07e51ae832e..48fdf10be7a1634a78114cd3a4e7d05b0902f585 100644 (file)
@@ -217,7 +217,7 @@ static void dn_fib_rule_flush_cache(struct fib_rules_ops *ops)
 }
 
 static const struct fib_rules_ops __net_initdata dn_fib_rules_ops_template = {
-       .family         = FIB_RULES_DECNET,
+       .family         = AF_DECnet,
        .rule_size      = sizeof(struct dn_fib_rule),
        .addr_size      = sizeof(u16),
        .action         = dn_fib_rule_action,
index 8ab62a56701cbd9c4dd99884535307efb8ab43a8..76daeb5ff5642e656622f0da906f73a32d603643 100644 (file)
@@ -246,7 +246,7 @@ static void fib4_rule_flush_cache(struct fib_rules_ops *ops)
 }
 
 static const struct fib_rules_ops __net_initdata fib4_rules_ops_template = {
-       .family         = FIB_RULES_IPV4,
+       .family         = AF_INET,
        .rule_size      = sizeof(struct fib4_rule),
        .addr_size      = sizeof(u32),
        .action         = fib4_rule_action,
index 7d3e382aed640358a4ddfd611313a74a46e98cdb..41e8fc0ce8b321987897a2af43dbe0ac6aee596a 100644 (file)
@@ -217,7 +217,7 @@ static int ipmr_rule_fill(struct fib_rule *rule, struct sk_buff *skb,
 }
 
 static const struct fib_rules_ops __net_initdata ipmr_rules_ops_template = {
-       .family         = FIB_RULES_IPMR,
+       .family         = RTNL_FAMILY_IPMR,
        .rule_size      = sizeof(struct ipmr_rule),
        .addr_size      = sizeof(u32),
        .action         = ipmr_rule_action,
index 35f6949446f0280054badcd3e9370e9e66ed7b4c..8e44f8f9c18846c8929e44b14e99c8825783916a 100644 (file)
@@ -238,7 +238,7 @@ static size_t fib6_rule_nlmsg_payload(struct fib_rule *rule)
 }
 
 static const struct fib_rules_ops __net_initdata fib6_rules_ops_template = {
-       .family                 = FIB_RULES_IPV6,
+       .family                 = AF_INET6,
        .rule_size              = sizeof(struct fib6_rule),
        .addr_size              = sizeof(struct in6_addr),
        .action                 = fib6_rule_action,