aboutsummaryrefslogtreecommitdiffstats
path: root/net/decnet
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/decnet
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/decnet')
-rw-r--r--net/decnet/dn_fib.c7
-rw-r--r--net/decnet/dn_route.c1
-rw-r--r--net/decnet/dn_table.c1
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;