diff options
Diffstat (limited to 'net/ipv4/fib_frontend.c')
-rw-r--r-- | net/ipv4/fib_frontend.c | 7 |
1 files changed, 4 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; |