|
@@ -2305,7 +2305,7 @@ struct rtable *ip_route_output_flow(struct net *net, struct flowi4 *flp4,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(ip_route_output_flow);
|
|
EXPORT_SYMBOL_GPL(ip_route_output_flow);
|
|
|
|
|
|
-static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
|
|
|
|
|
|
+static int rt_fill_info(struct net *net, __be32 dst, __be32 src, u32 table_id,
|
|
struct flowi4 *fl4, struct sk_buff *skb, u32 portid,
|
|
struct flowi4 *fl4, struct sk_buff *skb, u32 portid,
|
|
u32 seq, int event, int nowait, unsigned int flags)
|
|
u32 seq, int event, int nowait, unsigned int flags)
|
|
{
|
|
{
|
|
@@ -2325,8 +2325,8 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
|
|
r->rtm_dst_len = 32;
|
|
r->rtm_dst_len = 32;
|
|
r->rtm_src_len = 0;
|
|
r->rtm_src_len = 0;
|
|
r->rtm_tos = fl4->flowi4_tos;
|
|
r->rtm_tos = fl4->flowi4_tos;
|
|
- r->rtm_table = RT_TABLE_MAIN;
|
|
|
|
- if (nla_put_u32(skb, RTA_TABLE, RT_TABLE_MAIN))
|
|
|
|
|
|
+ r->rtm_table = table_id;
|
|
|
|
+ if (nla_put_u32(skb, RTA_TABLE, table_id))
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
r->rtm_type = rt->rt_type;
|
|
r->rtm_type = rt->rt_type;
|
|
r->rtm_scope = RT_SCOPE_UNIVERSE;
|
|
r->rtm_scope = RT_SCOPE_UNIVERSE;
|
|
@@ -2431,6 +2431,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh)
|
|
int err;
|
|
int err;
|
|
int mark;
|
|
int mark;
|
|
struct sk_buff *skb;
|
|
struct sk_buff *skb;
|
|
|
|
+ u32 table_id = RT_TABLE_MAIN;
|
|
|
|
|
|
err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv4_policy);
|
|
err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv4_policy);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
@@ -2500,7 +2501,10 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh)
|
|
if (rtm->rtm_flags & RTM_F_NOTIFY)
|
|
if (rtm->rtm_flags & RTM_F_NOTIFY)
|
|
rt->rt_flags |= RTCF_NOTIFY;
|
|
rt->rt_flags |= RTCF_NOTIFY;
|
|
|
|
|
|
- err = rt_fill_info(net, dst, src, &fl4, skb,
|
|
|
|
|
|
+ if (rtm->rtm_flags & RTM_F_LOOKUP_TABLE)
|
|
|
|
+ table_id = rt->rt_table_id;
|
|
|
|
+
|
|
|
|
+ err = rt_fill_info(net, dst, src, table_id, &fl4, skb,
|
|
NETLINK_CB(in_skb).portid, nlh->nlmsg_seq,
|
|
NETLINK_CB(in_skb).portid, nlh->nlmsg_seq,
|
|
RTM_NEWROUTE, 0, 0);
|
|
RTM_NEWROUTE, 0, 0);
|
|
if (err < 0)
|
|
if (err < 0)
|