aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2006-08-11 02:09:48 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2006-09-22 17:54:25 -0400
commit9e762a4a89b302cb3b26a1f9bb33eff459eaeca9 (patch)
tree4be606cc6bfe097beac3aeeea32b4adc107409b7 /net/ipv4
parent2dfe55b47e3d66ded5a84caf71e0da5710edf48b (diff)
[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. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/fib_frontend.c7
-rw-r--r--net/ipv4/fib_rules.c1
-rw-r--r--net/ipv4/fib_semantics.c1
-rw-r--r--net/ipv4/route.c1
4 files changed, 7 insertions, 3 deletions
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index 06f4b23f6f57..2696ede52de2 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -294,7 +294,8 @@ static int inet_check_attr(struct rtmsg *r, struct rtattr **rta)
294 if (attr) { 294 if (attr) {
295 if (RTA_PAYLOAD(attr) < 4) 295 if (RTA_PAYLOAD(attr) < 4)
296 return -EINVAL; 296 return -EINVAL;
297 if (i != RTA_MULTIPATH && i != RTA_METRICS) 297 if (i != RTA_MULTIPATH && i != RTA_METRICS &&
298 i != RTA_TABLE)
298 *rta = (struct rtattr*)RTA_DATA(attr); 299 *rta = (struct rtattr*)RTA_DATA(attr);
299 } 300 }
300 } 301 }
@@ -310,7 +311,7 @@ int inet_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
310 if (inet_check_attr(r, rta)) 311 if (inet_check_attr(r, rta))
311 return -EINVAL; 312 return -EINVAL;
312 313
313 tb = fib_get_table(r->rtm_table); 314 tb = fib_get_table(rtm_get_table(rta, r->rtm_table));
314 if (tb) 315 if (tb)
315 return tb->tb_delete(tb, r, (struct kern_rta*)rta, nlh, &NETLINK_CB(skb)); 316 return tb->tb_delete(tb, r, (struct kern_rta*)rta, nlh, &NETLINK_CB(skb));
316 return -ESRCH; 317 return -ESRCH;
@@ -325,7 +326,7 @@ int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
325 if (inet_check_attr(r, rta)) 326 if (inet_check_attr(r, rta))
326 return -EINVAL; 327 return -EINVAL;
327 328
328 tb = fib_new_table(r->rtm_table); 329 tb = fib_new_table(rtm_get_table(rta, r->rtm_table));
329 if (tb) 330 if (tb)
330 return tb->tb_insert(tb, r, (struct kern_rta*)rta, nlh, &NETLINK_CB(skb)); 331 return tb->tb_insert(tb, r, (struct kern_rta*)rta, nlh, &NETLINK_CB(skb));
331 return -ENOBUFS; 332 return -ENOBUFS;
diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c
index 58fb91b00fdf..0330b9cc4b58 100644
--- a/net/ipv4/fib_rules.c
+++ b/net/ipv4/fib_rules.c
@@ -184,6 +184,7 @@ static struct nla_policy fib4_rule_policy[FRA_MAX+1] __read_mostly = {
184 [FRA_DST] = { .type = NLA_U32 }, 184 [FRA_DST] = { .type = NLA_U32 },
185 [FRA_FWMARK] = { .type = NLA_U32 }, 185 [FRA_FWMARK] = { .type = NLA_U32 },
186 [FRA_FLOW] = { .type = NLA_U32 }, 186 [FRA_FLOW] = { .type = NLA_U32 },
187 [FRA_TABLE] = { .type = NLA_U32 },
187}; 188};
188 189
189static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, 190static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
index c7a112b5a185..ab753df20a39 100644
--- a/net/ipv4/fib_semantics.c
+++ b/net/ipv4/fib_semantics.c
@@ -953,6 +953,7 @@ fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
953 rtm->rtm_src_len = 0; 953 rtm->rtm_src_len = 0;
954 rtm->rtm_tos = tos; 954 rtm->rtm_tos = tos;
955 rtm->rtm_table = tb_id; 955 rtm->rtm_table = tb_id;
956 RTA_PUT_U32(skb, RTA_TABLE, tb_id);
956 rtm->rtm_type = type; 957 rtm->rtm_type = type;
957 rtm->rtm_flags = fi->fib_flags; 958 rtm->rtm_flags = fi->fib_flags;
958 rtm->rtm_scope = scope; 959 rtm->rtm_scope = scope;
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index b873cbcdd0b8..12128b82c9dc 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -2652,6 +2652,7 @@ static int rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
2652 r->rtm_src_len = 0; 2652 r->rtm_src_len = 0;
2653 r->rtm_tos = rt->fl.fl4_tos; 2653 r->rtm_tos = rt->fl.fl4_tos;
2654 r->rtm_table = RT_TABLE_MAIN; 2654 r->rtm_table = RT_TABLE_MAIN;
2655 RTA_PUT_U32(skb, RTA_TABLE, RT_TABLE_MAIN);
2655 r->rtm_type = rt->rt_type; 2656 r->rtm_type = rt->rt_type;
2656 r->rtm_scope = RT_SCOPE_UNIVERSE; 2657 r->rtm_scope = RT_SCOPE_UNIVERSE;
2657 r->rtm_protocol = RTPROT_UNSPEC; 2658 r->rtm_protocol = RTPROT_UNSPEC;