|
@@ -1272,7 +1272,6 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
|
|
rth->rt_flags = RTCF_MULTICAST;
|
|
|
rth->rt_type = RTN_MULTICAST;
|
|
|
rth->rt_dst = daddr;
|
|
|
- rth->rt_src = saddr;
|
|
|
rth->rt_route_iif = dev->ifindex;
|
|
|
rth->rt_iif = dev->ifindex;
|
|
|
rth->rt_oif = 0;
|
|
@@ -1393,7 +1392,6 @@ static int __mkroute_input(struct sk_buff *skb,
|
|
|
rth->rt_flags = flags;
|
|
|
rth->rt_type = res->type;
|
|
|
rth->rt_dst = daddr;
|
|
|
- rth->rt_src = saddr;
|
|
|
rth->rt_route_iif = in_dev->dev->ifindex;
|
|
|
rth->rt_iif = in_dev->dev->ifindex;
|
|
|
rth->rt_oif = 0;
|
|
@@ -1561,7 +1559,6 @@ local_input:
|
|
|
rth->rt_flags = flags|RTCF_LOCAL;
|
|
|
rth->rt_type = res.type;
|
|
|
rth->rt_dst = daddr;
|
|
|
- rth->rt_src = saddr;
|
|
|
rth->rt_route_iif = dev->ifindex;
|
|
|
rth->rt_iif = dev->ifindex;
|
|
|
rth->rt_oif = 0;
|
|
@@ -1714,7 +1711,6 @@ static struct rtable *__mkroute_output(const struct fib_result *res,
|
|
|
rth->rt_flags = flags;
|
|
|
rth->rt_type = type;
|
|
|
rth->rt_dst = fl4->daddr;
|
|
|
- rth->rt_src = fl4->saddr;
|
|
|
rth->rt_route_iif = 0;
|
|
|
rth->rt_iif = orig_oif ? : dev_out->ifindex;
|
|
|
rth->rt_oif = orig_oif;
|
|
@@ -2005,7 +2001,6 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
|
|
|
rt->rt_flags = ort->rt_flags;
|
|
|
rt->rt_type = ort->rt_type;
|
|
|
rt->rt_dst = ort->rt_dst;
|
|
|
- rt->rt_src = ort->rt_src;
|
|
|
rt->rt_gateway = ort->rt_gateway;
|
|
|
rt->fi = ort->fi;
|
|
|
if (rt->fi)
|
|
@@ -2036,7 +2031,7 @@ struct rtable *ip_route_output_flow(struct net *net, struct flowi4 *flp4,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ip_route_output_flow);
|
|
|
|
|
|
-static int rt_fill_info(struct net *net, __be32 src, u8 tos,
|
|
|
+static int rt_fill_info(struct net *net, __be32 src, struct flowi4 *fl4,
|
|
|
struct sk_buff *skb, u32 pid, u32 seq, int event,
|
|
|
int nowait, unsigned int flags)
|
|
|
{
|
|
@@ -2055,7 +2050,7 @@ static int rt_fill_info(struct net *net, __be32 src, u8 tos,
|
|
|
r->rtm_family = AF_INET;
|
|
|
r->rtm_dst_len = 32;
|
|
|
r->rtm_src_len = 0;
|
|
|
- r->rtm_tos = tos;
|
|
|
+ r->rtm_tos = fl4->flowi4_tos;
|
|
|
r->rtm_table = RT_TABLE_MAIN;
|
|
|
if (nla_put_u32(skb, RTA_TABLE, RT_TABLE_MAIN))
|
|
|
goto nla_put_failure;
|
|
@@ -2082,11 +2077,11 @@ static int rt_fill_info(struct net *net, __be32 src, u8 tos,
|
|
|
goto nla_put_failure;
|
|
|
#endif
|
|
|
if (!rt_is_input_route(rt) &&
|
|
|
- rt->rt_src != src) {
|
|
|
- if (nla_put_be32(skb, RTA_PREFSRC, rt->rt_src))
|
|
|
+ fl4->saddr != src) {
|
|
|
+ if (nla_put_be32(skb, RTA_PREFSRC, fl4->saddr))
|
|
|
goto nla_put_failure;
|
|
|
}
|
|
|
- if (rt->rt_dst != rt->rt_gateway &&
|
|
|
+ if (fl4->daddr != rt->rt_gateway &&
|
|
|
nla_put_be32(skb, RTA_GATEWAY, rt->rt_gateway))
|
|
|
goto nla_put_failure;
|
|
|
|
|
@@ -2116,7 +2111,7 @@ static int rt_fill_info(struct net *net, __be32 src, u8 tos,
|
|
|
if (ipv4_is_multicast(dst) && !ipv4_is_local_multicast(dst) &&
|
|
|
IPV4_DEVCONF_ALL(net, MC_FORWARDING)) {
|
|
|
int err = ipmr_get_route(net, skb,
|
|
|
- rt->rt_src, rt->rt_dst,
|
|
|
+ fl4->saddr, fl4->daddr,
|
|
|
r, nowait);
|
|
|
if (err <= 0) {
|
|
|
if (!nowait) {
|
|
@@ -2151,6 +2146,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void
|
|
|
struct rtmsg *rtm;
|
|
|
struct nlattr *tb[RTA_MAX+1];
|
|
|
struct rtable *rt = NULL;
|
|
|
+ struct flowi4 fl4;
|
|
|
__be32 dst = 0;
|
|
|
__be32 src = 0;
|
|
|
u32 iif;
|
|
@@ -2185,6 +2181,13 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void
|
|
|
iif = tb[RTA_IIF] ? nla_get_u32(tb[RTA_IIF]) : 0;
|
|
|
mark = tb[RTA_MARK] ? nla_get_u32(tb[RTA_MARK]) : 0;
|
|
|
|
|
|
+ memset(&fl4, 0, sizeof(fl4));
|
|
|
+ fl4.daddr = dst;
|
|
|
+ fl4.saddr = src;
|
|
|
+ fl4.flowi4_tos = rtm->rtm_tos;
|
|
|
+ fl4.flowi4_oif = tb[RTA_OIF] ? nla_get_u32(tb[RTA_OIF]) : 0;
|
|
|
+ fl4.flowi4_mark = mark;
|
|
|
+
|
|
|
if (iif) {
|
|
|
struct net_device *dev;
|
|
|
|
|
@@ -2205,13 +2208,6 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void
|
|
|
if (err == 0 && rt->dst.error)
|
|
|
err = -rt->dst.error;
|
|
|
} else {
|
|
|
- struct flowi4 fl4 = {
|
|
|
- .daddr = dst,
|
|
|
- .saddr = src,
|
|
|
- .flowi4_tos = rtm->rtm_tos,
|
|
|
- .flowi4_oif = tb[RTA_OIF] ? nla_get_u32(tb[RTA_OIF]) : 0,
|
|
|
- .flowi4_mark = mark,
|
|
|
- };
|
|
|
rt = ip_route_output_key(net, &fl4);
|
|
|
|
|
|
err = 0;
|
|
@@ -2226,7 +2222,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void
|
|
|
if (rtm->rtm_flags & RTM_F_NOTIFY)
|
|
|
rt->rt_flags |= RTCF_NOTIFY;
|
|
|
|
|
|
- err = rt_fill_info(net, src, rtm->rtm_tos, skb,
|
|
|
+ err = rt_fill_info(net, src, &fl4, skb,
|
|
|
NETLINK_CB(in_skb).pid, nlh->nlmsg_seq,
|
|
|
RTM_NEWROUTE, 0, 0);
|
|
|
if (err <= 0)
|