diff options
author | Patrick McHardy <kaber@trash.net> | 2006-08-11 02:09:48 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-09-22 17:54:25 -0400 |
commit | 9e762a4a89b302cb3b26a1f9bb33eff459eaeca9 (patch) | |
tree | 4be606cc6bfe097beac3aeeea32b4adc107409b7 /net/ipv4 | |
parent | 2dfe55b47e3d66ded5a84caf71e0da5710edf48b (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.c | 7 | ||||
-rw-r--r-- | net/ipv4/fib_rules.c | 1 | ||||
-rw-r--r-- | net/ipv4/fib_semantics.c | 1 | ||||
-rw-r--r-- | net/ipv4/route.c | 1 |
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 | ||
189 | static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, | 190 | static 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; |