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/decnet | |
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/decnet')
-rw-r--r-- | net/decnet/dn_fib.c | 7 | ||||
-rw-r--r-- | net/decnet/dn_route.c | 1 | ||||
-rw-r--r-- | net/decnet/dn_table.c | 1 |
3 files changed, 6 insertions, 3 deletions
diff --git a/net/decnet/dn_fib.c b/net/decnet/dn_fib.c index 7b3bf5c3d720..fb596373daa8 100644 --- a/net/decnet/dn_fib.c +++ b/net/decnet/dn_fib.c | |||
@@ -491,7 +491,8 @@ static int dn_fib_check_attr(struct rtmsg *r, struct rtattr **rta) | |||
491 | if (attr) { | 491 | if (attr) { |
492 | if (RTA_PAYLOAD(attr) < 4 && RTA_PAYLOAD(attr) != 2) | 492 | if (RTA_PAYLOAD(attr) < 4 && RTA_PAYLOAD(attr) != 2) |
493 | return -EINVAL; | 493 | return -EINVAL; |
494 | if (i != RTA_MULTIPATH && i != RTA_METRICS) | 494 | if (i != RTA_MULTIPATH && i != RTA_METRICS && |
495 | i != RTA_TABLE) | ||
495 | rta[i-1] = (struct rtattr *)RTA_DATA(attr); | 496 | rta[i-1] = (struct rtattr *)RTA_DATA(attr); |
496 | } | 497 | } |
497 | } | 498 | } |
@@ -508,7 +509,7 @@ int dn_fib_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
508 | if (dn_fib_check_attr(r, rta)) | 509 | if (dn_fib_check_attr(r, rta)) |
509 | return -EINVAL; | 510 | return -EINVAL; |
510 | 511 | ||
511 | tb = dn_fib_get_table(r->rtm_table, 0); | 512 | tb = dn_fib_get_table(rtm_get_table(rta, r->rtm_table), 0); |
512 | if (tb) | 513 | if (tb) |
513 | return tb->delete(tb, r, (struct dn_kern_rta *)rta, nlh, &NETLINK_CB(skb)); | 514 | return tb->delete(tb, r, (struct dn_kern_rta *)rta, nlh, &NETLINK_CB(skb)); |
514 | 515 | ||
@@ -524,7 +525,7 @@ int dn_fib_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
524 | if (dn_fib_check_attr(r, rta)) | 525 | if (dn_fib_check_attr(r, rta)) |
525 | return -EINVAL; | 526 | return -EINVAL; |
526 | 527 | ||
527 | tb = dn_fib_get_table(r->rtm_table, 1); | 528 | tb = dn_fib_get_table(rtm_get_table(rta, r->rtm_table), 1); |
528 | if (tb) | 529 | if (tb) |
529 | return tb->insert(tb, r, (struct dn_kern_rta *)rta, nlh, &NETLINK_CB(skb)); | 530 | return tb->insert(tb, r, (struct dn_kern_rta *)rta, nlh, &NETLINK_CB(skb)); |
530 | 531 | ||
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 5e6f4616ca10..4c963213fba5 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
@@ -1486,6 +1486,7 @@ static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, | |||
1486 | r->rtm_src_len = 0; | 1486 | r->rtm_src_len = 0; |
1487 | r->rtm_tos = 0; | 1487 | r->rtm_tos = 0; |
1488 | r->rtm_table = RT_TABLE_MAIN; | 1488 | r->rtm_table = RT_TABLE_MAIN; |
1489 | RTA_PUT_U32(skb, RTA_TABLE, RT_TABLE_MAIN); | ||
1489 | r->rtm_type = rt->rt_type; | 1490 | r->rtm_type = rt->rt_type; |
1490 | r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED; | 1491 | r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED; |
1491 | r->rtm_scope = RT_SCOPE_UNIVERSE; | 1492 | r->rtm_scope = RT_SCOPE_UNIVERSE; |
diff --git a/net/decnet/dn_table.c b/net/decnet/dn_table.c index 1601ee5406a8..eca7c1e10c80 100644 --- a/net/decnet/dn_table.c +++ b/net/decnet/dn_table.c | |||
@@ -278,6 +278,7 @@ static int dn_fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event, | |||
278 | rtm->rtm_src_len = 0; | 278 | rtm->rtm_src_len = 0; |
279 | rtm->rtm_tos = 0; | 279 | rtm->rtm_tos = 0; |
280 | rtm->rtm_table = tb_id; | 280 | rtm->rtm_table = tb_id; |
281 | RTA_PUT_U32(skb, RTA_TABLE, tb_id); | ||
281 | rtm->rtm_flags = fi->fib_flags; | 282 | rtm->rtm_flags = fi->fib_flags; |
282 | rtm->rtm_scope = scope; | 283 | rtm->rtm_scope = scope; |
283 | rtm->rtm_type = type; | 284 | rtm->rtm_type = type; |