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/dn_fib.c | |
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/dn_fib.c')
-rw-r--r-- | net/decnet/dn_fib.c | 7 |
1 files changed, 4 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 | ||