aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/fib_frontend.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/fib_frontend.c')
-rw-r--r--net/ipv4/fib_frontend.c7
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;