[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>
This commit is contained in:

committed by
David S. Miller

parent
2dfe55b47e
commit
9e762a4a89
@@ -491,7 +491,8 @@ static int dn_fib_check_attr(struct rtmsg *r, struct rtattr **rta)
|
||||
if (attr) {
|
||||
if (RTA_PAYLOAD(attr) < 4 && RTA_PAYLOAD(attr) != 2)
|
||||
return -EINVAL;
|
||||
if (i != RTA_MULTIPATH && i != RTA_METRICS)
|
||||
if (i != RTA_MULTIPATH && i != RTA_METRICS &&
|
||||
i != RTA_TABLE)
|
||||
rta[i-1] = (struct rtattr *)RTA_DATA(attr);
|
||||
}
|
||||
}
|
||||
@@ -508,7 +509,7 @@ int dn_fib_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
|
||||
if (dn_fib_check_attr(r, rta))
|
||||
return -EINVAL;
|
||||
|
||||
tb = dn_fib_get_table(r->rtm_table, 0);
|
||||
tb = dn_fib_get_table(rtm_get_table(rta, r->rtm_table), 0);
|
||||
if (tb)
|
||||
return tb->delete(tb, r, (struct dn_kern_rta *)rta, nlh, &NETLINK_CB(skb));
|
||||
|
||||
@@ -524,7 +525,7 @@ int dn_fib_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
|
||||
if (dn_fib_check_attr(r, rta))
|
||||
return -EINVAL;
|
||||
|
||||
tb = dn_fib_get_table(r->rtm_table, 1);
|
||||
tb = dn_fib_get_table(rtm_get_table(rta, r->rtm_table), 1);
|
||||
if (tb)
|
||||
return tb->insert(tb, r, (struct dn_kern_rta *)rta, nlh, &NETLINK_CB(skb));
|
||||
|
||||
|
@@ -1486,6 +1486,7 @@ static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
|
||||
r->rtm_src_len = 0;
|
||||
r->rtm_tos = 0;
|
||||
r->rtm_table = RT_TABLE_MAIN;
|
||||
RTA_PUT_U32(skb, RTA_TABLE, RT_TABLE_MAIN);
|
||||
r->rtm_type = rt->rt_type;
|
||||
r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED;
|
||||
r->rtm_scope = RT_SCOPE_UNIVERSE;
|
||||
|
@@ -278,6 +278,7 @@ static int dn_fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
|
||||
rtm->rtm_src_len = 0;
|
||||
rtm->rtm_tos = 0;
|
||||
rtm->rtm_table = tb_id;
|
||||
RTA_PUT_U32(skb, RTA_TABLE, tb_id);
|
||||
rtm->rtm_flags = fi->fib_flags;
|
||||
rtm->rtm_scope = scope;
|
||||
rtm->rtm_type = type;
|
||||
|
Reference in New Issue
Block a user