: Increase number of possible routing tables
Subsystems (3)
cover : Increase number of possible routing tables
These are the updated patches (against net-2.6.19) to increase the number of possible routing tables to 2^32. They basically consist of four parts:
- Use u32 for routing table IDs everywhere inside the kernel
- Introduce new netlink attributes to carry extended table IDs and add compatibility functions to use either rtm_table or the new attributes if given.
- Prepare IPv4/IPv6/DecNET for increasing RT_TABLE_MAX to 2^32 by using hash tables instead of a fixed size array of pointers (IPv4 and DecNET, IPv6 already contains that part) and replacing iterations over all possible table IDs by hash walking.
- Finally, increase RT_TABLE_MAX to 2^32
IPv4 and IPv6 are tested with and without CONFIG_MULTIPLE_TABLES, DecNET is only compile tested.
include/linux/fib_rules.h | 4 + include/linux/rtnetlink.h | 12 ++- include/net/dn_fib.h | 7 - include/net/fib_rules.h | 7 + include/net/ip6_route.h | 7 + include/net/ip_fib.h | 39 +++------- net/core/fib_rules.c | 5 - net/decnet/dn_fib.c | 62 +--------------- net/decnet/dn_route.c | 1 net/decnet/dn_rules.c | 2 net/decnet/dn_table.c | 136 ++++++++++++++++++++++++++---------- net/ipv4/fib_frontend.c | 117 ++++++++++++++++++++----------- net/ipv4/fib_hash.c | 30 ++++---- net/ipv4/fib_lookup.h | 4 - net/ipv4/fib_rules.c | 7 + net/ipv4/fib_semantics.c | 5 - net/ipv4/fib_trie.c | 32 ++++---- net/ipv4/route.c | 1 net/ipv6/fib6_rules.c | 1 net/ipv6/ip6_fib.c | 171 ++++++++++++++++++++++++++++++++++++++++------ net/ipv6/route.c | 141 ++----------------------------------- 21 files changed, 430 insertions(+), 361 deletions(-)
Patrick McHardy:
[NET]: Use u32 for routing table IDs
[NET]: Introduce RTA_TABLE/FRA_TABLE attributes [IPV4]: Increase number of possible routing tables to 2^32 [IPV6]: Increase number of possible routing tables to 2^32 [DECNET]: Increase number of possible routing tables to 2^32 [NET]: Increate RT_TABLE_MAX to 2^32
PATCH 1/6 : Use u32 for routing table IDs
[NET]: Use u32 for routing table IDs
Use u32 for routing table IDs in net/ipv4 and net/decnet in preparation of support for a larger number of routing tables. net/ipv6 already uses u32 everywhere and needs no further changes. No functional changes are made by this patch.
---
commit 29a0f4a779543907ddf8fbca55b6f1d0e0017f64
tree c559ca79c2d6ab28ceb4a4c1d5ecd5ea81264f0d
parent 1b471cd32acdff18786bc06542c686d52decbc5a
author Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:45:22 +0200 committer Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:45:22 +0200
include/net/dn_fib.h | 4 ++-- include/net/ip_fib.h | 14 +++++++------- net/decnet/dn_fib.c | 6 +++--- net/decnet/dn_table.c | 10 +++++----- net/ipv4/fib_frontend.c | 8 ++++---- net/ipv4/fib_hash.c | 4 ++-- net/ipv4/fib_lookup.h | 4 ++-- net/ipv4/fib_rules.c | 2 +- net/ipv4/fib_semantics.c | 4 ++-- net/ipv4/fib_trie.c | 6 +++--- 10 files changed, 31 insertions(+), 31 deletions(-)
include/net/dn_fib.h +2 -2
@@ -94,7 +94,7 @@ #define DN_FIB_INFO(f) ((f)->fn_info)struct dn_fib_table { -int n; +u32 n; int (*insert)(struct dn_fib_table *t, struct rtmsg *r, struct dn_kern_rta *rta, struct nlmsghdr *n,
@@ -137,7 +137,7 @@ extern int dn_fib_sync_up(struct net_dev/* * dn_tables.c */ -extern struct dn_fib_table *dn_fib_get_table (int n,int creat); +extern struct dn_fib_table *dn_fib_get_table (u32 n,int creat);extern struct dn_fib_table *dn_fib_empty_table (void );extern void dn_fib_table_init (void );extern void dn_fib_table_cleanup (void );
include/net/ip_fib.h +7 -7
@@ -150,7 +150,7 @@ #define FIB_RES_NETMASK(res) (0)#endif /* CONFIG_IP_ROUTE_MULTIPATH_WRANDOM */ struct fib_table { -unsigned char tb_id; +u32 tb_id;unsigned tb_stamp;int (*tb_lookup)(struct fib_table *tb,const struct flowi *flp,struct fib_result *res); int (*tb_insert)(struct fib_table *table, struct rtmsg *r,
@@ -173,14 +173,14 @@ #ifndef CONFIG_IP_MULTIPLE_TABLESextern struct fib_table *ip_fib_local_table;extern struct fib_table *ip_fib_main_table; -static inline struct fib_table *fib_get_table (int id) +static inline struct fib_table *fib_get_table (u32 id) {if (id !=RT_TABLE_LOCAL )return ip_fib_main_table;return ip_fib_local_table; } -static inline struct fib_table *fib_new_table (int id) +static inline struct fib_table *fib_new_table (u32 id) {return fib_get_table (id); }
@@ -205,9 +205,9 @@ #define ip_fib_main_table (fib_tables[RTextern struct fib_table * fib_tables[RT_TABLE_MAX +1 ];extern int fib_lookup (struct flowi *flp,struct fib_result *res); -extern struct fib_table *__fib_new_table (int id); +extern struct fib_table *__fib_new_table (u32 id); -static inline struct fib_table *fib_get_table (int id) +static inline struct fib_table *fib_get_table (u32 id) {if (id ==0 ) id =RT_TABLE_MAIN ;
@@ -215,7 +215,7 @@ static inline struct fib_table *fib_get_return fib_tables[id]; } -static inline struct fib_table *fib_new_table (int id) +static inline struct fib_table *fib_new_table (u32 id) {if (id ==0 ) id =RT_TABLE_MAIN ;
@@ -248,7 +248,7 @@ extern int fib_convert_rtentry(int cmd,extern u32 __fib_res_prefsrc (struct fib_result *res);/* Exported by fib_hash.c */ -extern struct fib_table *fib_hash_init (int id); +extern struct fib_table *fib_hash_init (u32 id);#ifdef CONFIG_IP_MULTIPLE_TABLES extern int fib4_rules_dump (struct sk_buff *skb,struct netlink_callback *cb);
net/decnet/dn_fib.c +3 -3
@@ -534,8 +534,8 @@ int dn_fib_rtm_newroute(struct sk_buff *int dn_fib_dump (struct sk_buff *skb,struct netlink_callback *cb) { -int t; -int s_t; +u32 t; +u32 s_t;struct dn_fib_table *tb; if (NLMSG_PAYLOAD(cb->nlh, 0) >= sizeof(struct rtmsg) &&
@@ -765,7 +765,7 @@ void dn_fib_flush(void) {int flushed =0 ;struct dn_fib_table *tb; -int id; +u32 id;for (id =RT_TABLE_MAX ; id >0 ; id--) {if ((tb =dn_fib_get_table (id,0 )) ==NULL )
net/decnet/dn_table.c +5 -5
@@ -264,7 +264,7 @@ static int dn_fib_nh_match(struct rtmsg }static int dn_fib_dump_info (struct sk_buff *skb,u32 pid,u32 seq,int event, -u8 tb_id,u8 type,u8 scope,void *dst,int dst_len, +u32 tb_id,u8 type,u8 scope,void *dst,int dst_len,struct dn_fib_info *fi,unsigned int flags) {struct rtmsg *rtm;
@@ -327,7 +327,7 @@ rtattr_failure: } -static void dn_rtmsg_fib (int event,struct dn_fib_node *f,int z,int tb_id, +static void dn_rtmsg_fib (int event,struct dn_fib_node *f,int z,u32 tb_id,struct nlmsghdr *nlh,struct netlink_skb_parms *req) {struct sk_buff *skb;
@@ -736,7 +736,7 @@ out: } -struct dn_fib_table *dn_fib_get_table (int n,int create) +struct dn_fib_table *dn_fib_get_table (u32 n,int create) {struct dn_fib_table *t;
@@ -773,7 +773,7 @@ struct dn_fib_table *dn_fib_get_table(inreturn t; } -static void dn_fib_del_tree (int n) +static void dn_fib_del_tree (u32 n) {struct dn_fib_table *t;
@@ -787,7 +787,7 @@ static void dn_fib_del_tree(int n)struct dn_fib_table *dn_fib_empty_table (void ) { -int id; +u32 id;for (id =RT_TABLE_MIN ; id <=RT_TABLE_MAX ; id++)if (dn_fib_tables[id] ==NULL )
net/ipv4/fib_frontend.c +4 -4
@@ -62,7 +62,7 @@ #define RT_TABLE_MIN 1struct fib_table *fib_tables[RT_TABLE_MAX +1 ]; -struct fib_table *__fib_new_table (int id) +struct fib_table *__fib_new_table (u32 id) {struct fib_table *tb;
@@ -82,7 +82,7 @@ static void fib_flush(void)int flushed =0 ;#ifdef CONFIG_IP_MULTIPLE_TABLES struct fib_table *tb; -int id; +u32 id;for (id =RT_TABLE_MAX ; id>0 ; id--) {if ((tb =fib_get_table (id))==NULL )
@@ -333,8 +333,8 @@ int inet_rtm_newroute(struct sk_buff *skint inet_dump_fib (struct sk_buff *skb,struct netlink_callback *cb) { -int t; -int s_t; +u32 t; +u32 s_t;struct fib_table *tb; if (NLMSG_PAYLOAD(cb->nlh, 0) >= sizeof(struct rtmsg) &&
net/ipv4/fib_hash.c +2 -2
@@ -765,9 +765,9 @@ static int fn_hash_dump(struct fib_table }#ifdef CONFIG_IP_MULTIPLE_TABLES -struct fib_table * fib_hash_init(int id) +struct fib_table * fib_hash_init(u32 id)#else -struct fib_table * __init fib_hash_init(int id) +struct fib_table * __init fib_hash_init(u32 id)#endif {struct fib_table *tb;
net/ipv4/fib_lookup.h +2 -2
@@ -30,11 +30,11 @@ extern struct fib_info *fib_create_info(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,u32 pid,u32 seq,int event, -u8 tb_id,u8 type,u8 scope,void *dst, +u32 tb_id,u8 type,u8 scope,void *dst,int dst_len,u8 tos,struct fib_info *fi,unsigned int );extern void rtmsg_fib (int event,u32 key,struct fib_alias *fa, -int z,int tb_id, +int z,u32 tb_id,struct nlmsghdr *n,struct netlink_skb_parms *req);extern struct fib_alias *fib_find_alias (struct list_head *fah,u8 tos,u32 prio);
net/ipv4/fib_rules.c +1 -1
@@ -169,7 +169,7 @@ #endifstatic struct fib_table *fib_empty_table (void ) { -int id; +u32 id;for (id =1 ; id <=RT_TABLE_MAX ; id++)if (fib_tables[id] ==NULL )
net/ipv4/fib_semantics.c +2 -2
@@ -273,7 +273,7 @@ int ip_fib_check_default(u32 gw, struct }void rtmsg_fib (int event,u32 key,struct fib_alias *fa, -int z,int tb_id, +int z,u32 tb_id,struct nlmsghdr *n,struct netlink_skb_parms *req) {struct sk_buff *skb;
@@ -935,7 +935,7 @@ u32 __fib_res_prefsrc(struct fib_resultint fib_dump_info (struct sk_buff *skb,u32 pid,u32 seq,int event, -u8 tb_id,u8 type,u8 scope,void *dst,int dst_len,u8 tos, +u32 tb_id,u8 type,u8 scope,void *dst,int dst_len,u8 tos,struct fib_info *fi,unsigned int flags) {struct rtmsg *rtm;
net/ipv4/fib_trie.c +3 -3
@@ -1148,7 +1148,7 @@ fn_trie_insert(struct fib_table *tb, str key =ntohl (key); -pr_debug ("Insert table=%d %08x/%d\n" , tb->tb_id, key, plen); +pr_debug ("Insert table=%u %08x/%d\n" , tb->tb_id, key, plen); mask =ntohl (inet_make_mask (plen));
@@ -1943,9 +1943,9 @@ out:/* Fix more generic FIB names for init later */ #ifdef CONFIG_IP_MULTIPLE_TABLES -struct fib_table * fib_hash_init(int id) +struct fib_table * fib_hash_init(u32 id)#else -struct fib_table * __init fib_hash_init(int id) +struct fib_table * __init fib_hash_init(u32 id)#endif {struct fib_table *tb;
Re: [NET 01/06]: Use u32 for routing table IDs
From: Patrick McHardy <[email protected]>
Date: Thu, 10 Aug 2006 21:29:59 +0200 (MEST)
Quoted 8 lines
[NET]: Use u32 for routing table IDs
Use u32 for routing table IDs in net/ipv4 and net/decnet in preparation of support for a larger number of routing tables. net/ipv6 already uses u32 everywhere and needs no further changes. No functional changes are made by this patch.
Signed-off-by Patrick McHardy <[email protected]>
Applied.
PATCH 2/6 : Introduce RTA_TABLE/FRA_TABLE attributes
In reply to Patrick McHardy[NET]: Introduce RTA_TABLE/FRA_TABLE attributes
Introduce RTA_TABLE route attribute and FRA_TABLE routing rule attribute to hold 32 bit routing table IDs. Usespace compatibility is provided by continuing to accept and send the rtm_table field, but because of its limited size it can only carry the low 8 bits of the table ID. This implies that if larger IDs are used, _all_ userspace programs using them need to use RTA_TABLE.
---
commit a9fe50e925cdc0471b88bcf6f3cc18278b63c984
tree 08d8bfa20011b5afa940126a8bb0c153729584c3
parent 29a0f4a779543907ddf8fbca55b6f1d0e0017f64
author Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:50:19 +0200 committer Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:50:19 +0200
include/linux/fib_rules.h | 4 ++++ include/linux/rtnetlink.h | 8 ++++++++ include/net/fib_rules.h | 7 +++++++ net/core/fib_rules.c | 5 +++-- net/decnet/dn_fib.c | 7 ++++--- net/decnet/dn_route.c | 1 + net/decnet/dn_table.c | 1 + net/ipv4/fib_frontend.c | 7 ++++--- net/ipv4/fib_rules.c | 1 + net/ipv4/fib_semantics.c | 1 + net/ipv4/route.c | 1 + net/ipv6/fib6_rules.c | 1 + net/ipv6/route.c | 13 +++++++++---- 13 files changed, 45 insertions(+), 12 deletions(-)
include/linux/fib_rules.h +4 -0
@@ -36,6 +36,10 @@ enumFRA_UNUSED5 ,FRA_FWMARK ,/* netfilter mark (IPv4) */ FRA_FLOW ,/* flow/class id */ +FRA_UNUSED6 , +FRA_UNUSED7 , +FRA_UNUSED8 , +FRA_TABLE ,/* Extended table id */ __FRA_MAX };
include/linux/rtnetlink.h +8 -0
@@ -264,6 +264,7 @@ enum rtattr_type_tRTA_CACHEINFO ,RTA_SESSION ,RTA_MP_ALGO , +RTA_TABLE , __RTA_MAX };
@@ -716,6 +717,13 @@ #define BUG_TRAP(x) do { \ } \ }while (0 ) +static inline u32 rtm_get_table(struct rtattr **rta, u8 table) +{ +return RTA_GET_U32 (rta[RTA_TABLE -1 ]); +rtattr_failure: +return table; +} +#endif /* __KERNEL__ */
include/net/fib_rules.h +7 -0
@@ -74,6 +74,13 @@ static inline void fib_rule_put(struct fcall_rcu (&rule->rcu, fib_rule_put_rcu); } +static inline u32 frh_get_table (struct fib_rule_hdr *frh,struct nlattr **nla) +{ +if (nla[FRA_TABLE ]) +return nla_get_u32 (nla[FRA_TABLE ]); +return frh->table; +} +extern int fib_rules_register (struct fib_rules_ops *);extern int fib_rules_unregister (struct fib_rules_ops *);
net/core/fib_rules.c +3 -2
@@ -187,7 +187,7 @@ int fib_nl_newrule(struct sk_buff *skb, rule->action = frh->action; rule->flags = frh->flags; - rule->table = frh->table; + rule->table =frh_get_table (frh, tb);if (!rule->pref && ops->default_pref) rule->pref = ops->default_pref ();
@@ -245,7 +245,7 @@ int fib_nl_delrule(struct sk_buff *skb,if (frh->action && (frh->action != rule->action))continue ; -if (frh->table && (frh->table != rule->table)) +if (frh->table && (frh_get_table (frh, tb) != rule->table))continue ; if (tb[FRA_PRIORITY] &&
@@ -291,6 +291,7 @@ static int fib_nl_fill_rule(struct sk_bu frh =nlmsg_data (nlh); frh->table = rule->table; +NLA_PUT_U32 (skb,FRA_TABLE , rule->table); frh->res1 =0 ; frh->res2 =0 ; frh->action = rule->action;
net/decnet/dn_fib.c +4 -3
@@ -491,7 +491,8 @@ static int dn_fib_check_attr(struct rtmsif (attr) {if (RTA_PAYLOAD (attr) <4 &&RTA_PAYLOAD (attr) !=2 )return -EINVAL ; -if (i !=RTA_MULTIPATH && i !=RTA_METRICS ) +if (i !=RTA_MULTIPATH && i !=RTA_METRICS && + i !=RTA_TABLE ) rta[i-1 ] = (struct rtattr *)RTA_DATA (attr); } }
@@ -508,7 +509,7 @@ int dn_fib_rtm_delroute(struct sk_buff *if (dn_fib_check_attr (r, rta))return -EINVAL ; - tb =dn_fib_get_table (r->rtm_table,0 ); + tb =dn_fib_get_table (rtm_get_table (rta, r->rtm_table),0 );if (tb)return tb->delete (tb, r, (struct dn_kern_rta *)rta, nlh, &NETLINK_CB (skb));
@@ -524,7 +525,7 @@ int dn_fib_rtm_newroute(struct sk_buff *if (dn_fib_check_attr (r, rta))return -EINVAL ; - tb =dn_fib_get_table (r->rtm_table,1 ); + tb =dn_fib_get_table (rtm_get_table (rta, r->rtm_table),1 );if (tb)return tb->insert (tb, r, (struct dn_kern_rta *)rta, nlh, &NETLINK_CB (skb));
net/decnet/dn_route.c +1 -0
@@ -1486,6 +1486,7 @@ static int dn_rt_fill_info(struct sk_buf r->rtm_src_len =0 ; r->rtm_tos =0 ; r->rtm_table =RT_TABLE_MAIN ; +RTA_PUT_U32 (skb,RTA_TABLE ,RT_TABLE_MAIN ); r->rtm_type = rt->rt_type; r->rtm_flags = (rt->rt_flags & ~0xFFFF ) |RTM_F_CLONED ; r->rtm_scope =RT_SCOPE_UNIVERSE ;
net/decnet/dn_table.c +1 -0
@@ -278,6 +278,7 @@ static int dn_fib_dump_info(struct sk_bu rtm->rtm_src_len =0 ; rtm->rtm_tos =0 ; rtm->rtm_table = tb_id; +RTA_PUT_U32 (skb,RTA_TABLE , tb_id); rtm->rtm_flags = fi->fib_flags; rtm->rtm_scope = scope; rtm->rtm_type = type;
net/ipv4/fib_frontend.c +4 -3
@@ -294,7 +294,8 @@ static int inet_check_attr(struct rtmsgif (attr) {if (RTA_PAYLOAD (attr) <4 )return -EINVAL ; -if (i !=RTA_MULTIPATH && i !=RTA_METRICS ) +if (i !=RTA_MULTIPATH && i !=RTA_METRICS && + i !=RTA_TABLE ) *rta = (struct rtattr *)RTA_DATA (attr); } }
@@ -310,7 +311,7 @@ int inet_rtm_delroute(struct sk_buff *skif (inet_check_attr (r, rta))return -EINVAL ; - tb =fib_get_table (r->rtm_table); + tb =fib_get_table (rtm_get_table (rta, r->rtm_table));if (tb)return tb->tb_delete (tb, r, (struct kern_rta *)rta, nlh, &NETLINK_CB (skb));return -ESRCH ;
@@ -325,7 +326,7 @@ int inet_rtm_newroute(struct sk_buff *skif (inet_check_attr (r, rta))return -EINVAL ; - tb =fib_new_table (r->rtm_table); + tb =fib_new_table (rtm_get_table (rta, r->rtm_table));if (tb)return tb->tb_insert (tb, r, (struct kern_rta *)rta, nlh, &NETLINK_CB (skb));return -ENOBUFS ;
net/ipv4/fib_rules.c +1 -0
@@ -184,6 +184,7 @@ static struct nla_policy fib4_rule_polic [FRA_DST] = { .type = NLA_U32 }, [FRA_FWMARK] = { .type = NLA_U32 }, [FRA_FLOW] = { .type = NLA_U32 }, + [FRA_TABLE] = { .type = NLA_U32 }, }; static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
net/ipv4/fib_semantics.c +1 -0
@@ -949,6 +949,7 @@ fib_dump_info(struct sk_buff *skb, u32 p rtm->rtm_src_len =0 ; rtm->rtm_tos = tos; rtm->rtm_table = tb_id; +RTA_PUT_U32 (skb,RTA_TABLE , tb_id); rtm->rtm_type = type; rtm->rtm_flags = fi->fib_flags; rtm->rtm_scope = scope;
net/ipv4/route.c +1 -0
@@ -2652,6 +2652,7 @@ #endif r->rtm_src_len =0 ; r->rtm_tos = rt->fl.fl4_tos; r->rtm_table =RT_TABLE_MAIN ; +RTA_PUT_U32 (skb,RTA_TABLE ,RT_TABLE_MAIN ); r->rtm_type = rt->rt_type; r->rtm_scope =RT_SCOPE_UNIVERSE ; r->rtm_protocol =RTPROT_UNSPEC ;
net/ipv6/fib6_rules.c +1 -0
@@ -129,6 +129,7 @@ static struct nla_policy fib6_rule_polic [FRA_PRIORITY] = { .type = NLA_U32 }, [FRA_SRC] = { .minlen = sizeof(struct in6_addr) }, [FRA_DST] = { .minlen = sizeof(struct in6_addr) }, + [FRA_TABLE] = { .type = NLA_U32 }, }; static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
net/ipv6/route.c +9 -4
@@ -1855,7 +1855,8 @@ int inet6_rtm_delroute(struct sk_buff *sif (inet6_rtm_to_rtmsg (r, arg, &rtmsg))return -EINVAL ; -return ip6_route_del (&rtmsg, nlh, arg, &NETLINK_CB (skb), r->rtm_table); +return ip6_route_del (&rtmsg, nlh, arg, &NETLINK_CB (skb), +rtm_get_table (arg, r->rtm_table)); }int inet6_rtm_newroute (struct sk_buff *skb,struct nlmsghdr * nlh,void *arg)
@@ -1865,7 +1866,8 @@ int inet6_rtm_newroute(struct sk_buff *sif (inet6_rtm_to_rtmsg (r, arg, &rtmsg))return -EINVAL ; -return ip6_route_add (&rtmsg, nlh, arg, &NETLINK_CB (skb), r->rtm_table); +return ip6_route_add (&rtmsg, nlh, arg, &NETLINK_CB (skb), +rtm_get_table (arg, r->rtm_table)); }struct rt6_rtnl_dump_arg
@@ -1883,6 +1885,7 @@ static int rt6_fill_node(struct sk_buffstruct nlmsghdr *nlh;unsigned char *b = skb->tail;struct rta_cacheinfo ci; +u32 table;if (prefix) {/* user wants prefix routes only */ if (!(rt->rt6i_flags &RTF_PREFIX_RT )) {
@@ -1898,9 +1901,11 @@ static int rt6_fill_node(struct sk_buff rtm->rtm_src_len = rt->rt6i_src.plen; rtm->rtm_tos =0 ;if (rt->rt6i_table) - rtm->rtm_table = rt->rt6i_table->tb6_id; + table = rt->rt6i_table->tb6_id;else - rtm->rtm_table =RT6_TABLE_UNSPEC ; + table =RT6_TABLE_UNSPEC ; + rtm->rtm_table = table; +RTA_PUT_U32 (skb,RTA_TABLE , table);if (rt->rt6i_flags&RTF_REJECT ) rtm->rtm_type =RTN_UNREACHABLE ;else if (rt->rt6i_dev && (rt->rt6i_dev->flags&IFF_LOOPBACK ))
Re: [NET 02/06]: Introduce RTA_TABLE/FRA_TABLE attributes
From: Patrick McHardy <[email protected]>
Date: Thu, 10 Aug 2006 21:30:00 +0200 (MEST)
Quoted 10 lines
[NET]: Introduce RTA_TABLE/FRA_TABLE attributes
Introduce
RTA_TABLEroute attribute andFRA_TABLErouting rule attribute to hold 32 bit routing table IDs. Usespace compatibility is provided by continuing to accept and send thertm_tablefield, but because of its limited size it can only carry the low 8 bits of the table ID. This implies that if larger IDs are used, _all_ userspace programs using them need to useRTA_TABLE.Signed-off-by Patrick McHardy <[email protected]>
Applied, thanks Patrick.
Re: [NET 02/06]: Introduce RTA_TABLE/FRA_TABLE attributes
In reply to Patrick McHardyinclude/linux/rtnetlink.h #define BUG_TRAP(x) do { \ · line 726
Quoted 10 lines · Patrick McHardy
include/linux/rtnetlink.h +7
-0+static inline u32 rtm_get_table (struct rtattr **rta,u8 table) +{ +return RTA_GET_U32 (rta[RTA_TABLE -1 ]); +rtattr_failure: +return table; +} +
What's that ? ;)
/mjt
David Miller
maintainerRe: [NET 02/06]: Introduce RTA_TABLE/FRA_TABLE attributes
From: Michael Tokarev <[email protected]>
Date: Fri, 11 Aug 2006 11:02:43 +0400
Quoted 4 lines
Quoted 2 lines · Patrick McHardy
include/linux/rtnetlink.h +0
-0
Quoted 9 lines
include/linux/rtnetlink.h #define BUG_TRAP(x) do { \ · line 726
Quoted 7 lines
include/linux/rtnetlink.h +7
-0+static inline u32 rtm_get_table (struct rtattr **rta,u8 table) +{ +return RTA_GET_U32 (rta[RTA_TABLE -1 ]); +rtattr_failure: +return table; +} +What's that ? ;)
The RTA_GET_U32 macro internally branches to rtattr_failure.
PATCH 3/6 : Increase number of possible routing tables to 2^32
In reply to Patrick McHardy[IPV4]: Increase number of possible routing tables to 2^32
Increase the number of possible routing tables to 2^32 by replacing the fixed sized array of pointers by a hash table and replacing iterations over all possible table IDs by hash table walking.
---
commit 148d1ca7c199005b5a92f8154a7caf3f78529672
tree ee025abdbab6fe6a4eac916791b8a06f0622d71e
parent a9fe50e925cdc0471b88bcf6f3cc18278b63c984
author Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:52:30 +0200 committer Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:52:30 +0200
include/net/ip_fib.h | 25 ++---------- net/ipv4/fib_frontend.c | 102 +++++++++++++++++++++++++++++++---------------- net/ipv4/fib_hash.c | 26 ++++++------ net/ipv4/fib_rules.c | 4 +- net/ipv4/fib_trie.c | 26 ++++++------ 5 files changed, 101 insertions(+), 82 deletions(-)
include/net/ip_fib.h +5 -20
@@ -150,6 +150,7 @@ #define FIB_RES_NETMASK(res) (0)#endif /* CONFIG_IP_ROUTE_MULTIPATH_WRANDOM */ struct fib_table { +struct hlist_node tb_hlist;u32 tb_id;unsigned tb_stamp;int (*tb_lookup)(struct fib_table *tb,const struct flowi *flp,struct fib_result *res);
@@ -200,29 +201,13 @@ static inline void fib_select_default(co }#else /* CONFIG_IP_MULTIPLE_TABLES */ -#define ip_fib_local_table (fib_tables[RT_TABLE_LOCAL]) -#define ip_fib_main_table (fib_tables[RT_TABLE_MAIN]) +#define ip_fib_local_table fib_get_table(RT_TABLE_LOCAL) +#define ip_fib_main_table fib_get_table(RT_TABLE_MAIN) -extern struct fib_table * fib_tables[RT_TABLE_MAX +1 ];extern int fib_lookup (struct flowi *flp,struct fib_result *res); -extern struct fib_table *__fib_new_table (u32 id); - -static inline struct fib_table *fib_get_table (u32 id) -{ -if (id ==0 ) - id =RT_TABLE_MAIN ; - -return fib_tables[id]; -} - -static inline struct fib_table *fib_new_table (u32 id) -{ -if (id ==0 ) - id =RT_TABLE_MAIN ; - -return fib_tables[id] ? :__fib_new_table (id); -} +extern struct fib_table *fib_new_table (u32 id); +extern struct fib_table *fib_get_table (u32 id);extern void fib_select_default (const struct flowi *flp,struct fib_result *res);#endif /* CONFIG_IP_MULTIPLE_TABLES */
net/ipv4/fib_frontend.c +68 -34
160 lines not on this page · raw message
net/ipv4/fib_hash.c +13 -13
@@ -684,7 +684,7 @@ fn_hash_dump_bucket(struct sk_buff *skb,struct fib_node *f;int i, s_i; - s_i = cb->args[3 ]; + s_i = cb->args[4 ]; i =0 ;hlist_for_each_entry (f, node, head, fn_hash) {struct fib_alias *fa;
@@ -704,14 +704,14 @@ fn_hash_dump_bucket(struct sk_buff *skb, fa->fa_tos, fa->fa_info, NLM_F_MULTI) < 0) { - cb->args[3 ] = i; + cb->args[4 ] = i;return -1 ; } next: i++; } } - cb->args[3 ] = i; + cb->args[4 ] = i;return skb->len; }
@@ -722,21 +722,21 @@ fn_hash_dump_zone(struct sk_buff *skb, s {int h, s_h; - s_h = cb->args[2 ]; + s_h = cb->args[3 ];for (h=0 ; h < fz->fz_divisor; h++) {if (h < s_h)continue ;if (h > s_h) -memset (&cb->args[3 ],0 , -sizeof (cb->args) -3 *sizeof (cb->args[0 ])); +memset (&cb->args[4 ],0 , +sizeof (cb->args) -4 *sizeof (cb->args[0 ]));if (fz->fz_hash ==NULL ||hlist_empty (&fz->fz_hash[h]))continue ;if (fn_hash_dump_bucket (skb, cb, tb, fz, &fz->fz_hash[h])<0 ) { - cb->args[2 ] = h; + cb->args[3 ] = h;return -1 ; } } - cb->args[2 ] = h; + cb->args[3 ] = h;return skb->len; }
@@ -746,21 +746,21 @@ static int fn_hash_dump(struct fib_tablestruct fn_zone *fz;struct fn_hash *table = (struct fn_hash *)tb->tb_data; - s_m = cb->args[1 ]; + s_m = cb->args[2 ];read_lock (&fib_hash_lock);for (fz = table->fn_zone_list, m=0 ; fz; fz = fz->fz_next, m++) {if (m < s_m)continue ;if (m > s_m) -memset (&cb->args[2 ],0 , -sizeof (cb->args) -2 *sizeof (cb->args[0 ])); +memset (&cb->args[3 ],0 , +sizeof (cb->args) -3 *sizeof (cb->args[0 ]));if (fn_hash_dump_zone (skb, cb, tb, fz) <0 ) { - cb->args[1 ] = m; + cb->args[2 ] = m;read_unlock (&fib_hash_lock);return -1 ; } }read_unlock (&fib_hash_lock); - cb->args[1 ] = m; + cb->args[2 ] = m;return skb->len; }
net/ipv4/fib_rules.c +2 -2
@@ -172,8 +172,8 @@ static struct fib_table *fib_empty_tableu32 id;for (id =1 ; id <=RT_TABLE_MAX ; id++) -if (fib_tables[id] ==NULL ) -return __fib_new_table (id); +if (fib_get_table (id) ==NULL ) +return fib_new_table (id);return NULL ; }
net/ipv4/fib_trie.c +13 -13
@@ -1848,7 +1848,7 @@ static int fn_trie_dump_fa(t_key key, inu32 xkey =htonl (key); - s_i = cb->args[3 ]; + s_i = cb->args[4 ]; i =0 ;/* rcu_read_lock is hold by caller */
@@ -1870,12 +1870,12 @@ static int fn_trie_dump_fa(t_key key, in plen, fa->fa_tos, fa->fa_info, 0) < 0) { - cb->args[3 ] = i; + cb->args[4 ] = i;return -1 ; } i++; } - cb->args[3 ] = i; + cb->args[4 ] = i;return skb->len; }
@@ -1886,14 +1886,14 @@ static int fn_trie_dump_plen(struct triestruct list_head *fa_head;struct leaf *l =NULL ; - s_h = cb->args[2 ]; + s_h = cb->args[3 ];for (h =0 ; (l =nextleaf (t, l)) !=NULL ; h++) {if (h < s_h)continue ;if (h > s_h) -memset (&cb->args[3 ],0 , -sizeof (cb->args) -3 *sizeof (cb->args[0 ])); +memset (&cb->args[4 ],0 , +sizeof (cb->args) -4 *sizeof (cb->args[0 ])); fa_head =get_fa_head (l, plen);
@@ -1904,11 +1904,11 @@ static int fn_trie_dump_plen(struct triecontinue ;if (fn_trie_dump_fa (l->key, plen, fa_head, tb, skb, cb)<0 ) { - cb->args[2 ] = h; + cb->args[3 ] = h;return -1 ; } } - cb->args[2 ] = h; + cb->args[3 ] = h;return skb->len; }
@@ -1917,23 +1917,23 @@ static int fn_trie_dump(struct fib_tableint m, s_m;struct trie *t = (struct trie *) tb->tb_data; - s_m = cb->args[1 ]; + s_m = cb->args[2 ];rcu_read_lock ();for (m =0 ; m <=32 ; m++) {if (m < s_m)continue ;if (m > s_m) -memset (&cb->args[2 ],0 , -sizeof (cb->args) -2 *sizeof (cb->args[0 ])); +memset (&cb->args[3 ],0 , +sizeof (cb->args) -3 *sizeof (cb->args[0 ]));if (fn_trie_dump_plen (t,32 -m, tb, skb, cb)<0 ) { - cb->args[1 ] = m; + cb->args[2 ] = m; goto out; } }rcu_read_unlock (); - cb->args[1 ] = m; + cb->args[2 ] = m;return skb->len; out:rcu_read_unlock ();
Re: [IPV4 03/06]: Increase number of possible routing tables to 2^32
From: Patrick McHardy <[email protected]>
Date: Thu, 10 Aug 2006 21:30:01 +0200 (MEST)
Quoted 7 lines
[IPV4]: Increase number of possible routing tables to 2^32
Increase the number of possible routing tables to 2^32 by replacing the fixed sized array of pointers by a hash table and replacing iterations over all possible table IDs by hash table walking.
Signed-off-by Patrick McHardy <[email protected]>
Applied.
PATCH 4/6 : Increase number of possible routing tables to 2^32
In reply to Patrick McHardy[IPV6]: Increase number of possible routing tables to 2^32
Increase number of possible routing tables to 2^32 by replacing iterations over all possible table IDs by hash table walking.
---
commit cad398a8f3ef363abba9e6450dded94a022c96fa
tree 4fea9c50650ab65d942dca9c2545d1810b227839
parent 148d1ca7c199005b5a92f8154a7caf3f78529672
author Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:53:33 +0200 committer Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:53:33 +0200
include/net/ip6_route.h | 7 ++ net/ipv6/ip6_fib.c | 171 ++++++++++++++++++++++++++++++++++++++++++----- net/ipv6/route.c | 128 ----------------------------------- 3 files changed, 159 insertions(+), 147 deletions(-)
include/net/ip6_route.h +7 -0
@@ -137,6 +137,13 @@ extern int inet6_rtm_newroute(struct sk_extern int inet6_rtm_delroute (struct sk_buff *skb,struct nlmsghdr * nlh,void *arg);extern int inet6_rtm_getroute (struct sk_buff *skb,struct nlmsghdr * nlh,void *arg); +struct rt6_rtnl_dump_arg +{ +struct sk_buff *skb; +struct netlink_callback *cb; +}; + +extern int rt6_dump_route (struct rt6_info *rt,void *p_arg);extern void rt6_ifdown (struct net_device *dev);extern void rt6_mtu_change (struct net_device *dev,unsigned mtu);
net/ipv6/ip6_fib.c +151 -20
213 lines not on this page · raw message
net/ipv6/route.c +1 -127
146 lines not on this page · raw message
Re: [IPV6 04/06]: Increase number of possible routing tables to 2^32
From: Patrick McHardy <[email protected]>
Date: Thu, 10 Aug 2006 21:30:03 +0200 (MEST)
Quoted 6 lines
[IPV6]: Increase number of possible routing tables to 2^32
Increase number of possible routing tables to 2^32 by replacing iterations over all possible table IDs by hash table walking.
Signed-off-by Patrick McHardy <[email protected]>
Applied.
PATCH 5/6 : Increase number of possible routing tables to 2^32
In reply to Patrick McHardy[DECNET]: Increase number of possible routing tables to 2^32
Increase the number of possible routing tables to 2^32 by replacing the fixed sized array of pointers by a hash table and replacing iterations over all possible table IDs by hash table walking.
---
commit 9203e4cdab89d96c474c6a903ef9a1f47c7eee07
tree e0c6a2c5e3a691919863b4eb871fc3a25ebd5d44
parent cad398a8f3ef363abba9e6450dded94a022c96fa
author Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:54:19 +0200 committer Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:54:19 +0200
include/net/dn_fib.h | 3 - net/decnet/dn_fib.c | 49 ------------------- net/decnet/dn_rules.c | 2 - net/decnet/dn_table.c | 125 ++++++++++++++++++++++++++++++++++++------------- 4 files changed, 93 insertions(+), 86 deletions(-)
include/net/dn_fib.h +1 -2
@@ -94,6 +94,7 @@ #define DN_FIB_INFO(f) ((f)->fn_info)struct dn_fib_table { +struct hlist_node hlist;u32 n; int (*insert)(struct dn_fib_table *t, struct rtmsg *r,
@@ -177,8 +178,6 @@ static inline void dn_fib_res_put(struct fib_rule_put(res->r); } -extern struct dn_fib_table *dn_fib_tables[]; -#else /* Endnode */ #define dn_fib_init () do { } while(0)
net/decnet/dn_fib.c +0 -49
61 lines not on this page · raw message
net/decnet/dn_rules.c +1 -1
@@ -210,7 +210,7 @@ unsigned dnet_addr_type(__le16 addr)struct flowi fl = { .nl_u = { .dn_u = { .daddr = addr } } };struct dn_fib_res res;unsigned ret =RTN_UNICAST ; -struct dn_fib_table *tb = dn_fib_tables[RT_TABLE_LOCAL ]; +struct dn_fib_table *tb =dn_fib_get_table (RT_TABLE_LOCAL ,0 ); res.r =NULL ;
net/decnet/dn_table.c +91 -34
221 lines not on this page · raw message
Re: [DECNET 05/06]: Increase number of possible routing tables to 2^32
From: Patrick McHardy <[email protected]>
Date: Thu, 10 Aug 2006 21:30:04 +0200 (MEST)
Quoted 7 lines
[DECNET]: Increase number of possible routing tables to 2^32
Increase the number of possible routing tables to 2^32 by replacing the fixed sized array of pointers by a hash table and replacing iterations over all possible table IDs by hash table walking.
Signed-off-by Patrick McHardy <[email protected]>
Applied.
PATCH 6/6 : Increate RT_TABLE_MAX to 2^32
In reply to Patrick McHardy[NET]: Increate RT_TABLE_MAX to 2^32
---
commit f20cbb83204cd7e2ffa9cf4e8ee8b6353628d5d3
tree 8f0eaa4219506715449e7118037040f396875c99
parent 9203e4cdab89d96c474c6a903ef9a1f47c7eee07
author Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:54:49 +0200 committer Patrick McHardy <[email protected]> Thu, 10 Aug 2006 20:54:49 +0200
include/linux/rtnetlink.h | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-)
include/linux/rtnetlink.h +1 -3
@@ -239,10 +239,8 @@ enum rt_class_tRT_TABLE_DEFAULT =253 ,RT_TABLE_MAIN =254 ,RT_TABLE_LOCAL =255 , - __RT_TABLE_MAX + RT_TABLE_MAX=0xFFFFFFFF }; -#define RT_TABLE_MAX (__RT_TABLE_MAX - 1) -/* Routing message attributes */
Re: [NET 06/06]: Increate RT_TABLE_MAX to 2^32
From: Patrick McHardy <[email protected]>
Date: Thu, 10 Aug 2006 21:30:06 +0200 (MEST)
Quoted 3 lines
[NET]: Increate
RT_TABLE_MAXto 2^32Signed-off-by Patrick McHardy <[email protected]>
2^32-1 :-)
Applied, thanks Patrick.
Quoted 4 lines · Patrick McHardy
These are the updated patches (against net-2.6.19) to increase the number of possible routing tables to 2^32. They basically consist of four parts:
- Use u32 for routing table IDs everywhere inside the kernel
Just out of curiocity: why current limit of 2^31 isn't sufficient? Or am I missing the point?
Thanks.
/mjt
David Miller
maintainerFrom: Michael Tokarev <[email protected]>
Date: Fri, 11 Aug 2006 10:39:19 +0400
Quoted 8 lines
Quoted 4 lines · Patrick McHardy
These are the updated patches (against net-2.6.19) to increase the number of possible routing tables to 2^32. They basically consist of four parts:
- Use u32 for routing table IDs everywhere inside the kernel
Just out of curiocity: why current limit of 2^31 isn't sufficient? Or am I missing the point?
The current limit is 256 because the table member of the struct used to configure them is an 8-bit quantity.
That's the whole purpose of Patrick's patch set, to provide a new optional attribute that allows specifying a 32-bit rather than the 8-bit table ID.
Quoted 1 line · David Miller
From: Michael Tokarev <[email protected]>
[]
Quoted 10 lines
Quoted 3 lines
Quoted 1 line
- Use u32 for routing table IDs everywhere inside the kernel
Just out of curiocity: why current limit of 2^31 isn't sufficient? Or am I missing the point?
The current limit is 256 because the table member of the struct used to configure them is an 8-bit quantity.
That's the whole purpose of Patrick's patch set, to provide a new optional attribute that allows specifying a 32-bit rather than the 8-bit table ID.
Aha, it was 256, not 2^31. I remember now.
So the question probably should have been like, why u32 and additional attribute (to represent former -1) instead of current int? I mean, it probably makes no difference whenever there are 2^32 or 2^31 tables (both values are pretty large), but 2^32 requires more changes for the existing code.
And while we're at it... How about using table *names* instead of numbers in kernel too, a-la iptables? Once possible number of tables is large, and we're using hashes for tables now anyway, keeping a name inside the table structure wont hurt ;)
/mjt
* Michael Tokarev <[email protected]> 2006-08-11 10:56
Quoted 4 lines
And while we're at it... How about using table *names* instead of numbers in kernel too, a-la iptables? Once possible number of tables is large, and we're using hashes for tables now anyway, keeping a name inside the table structure wont hurt ;)
This is and should be implemented in userspace.