|
@@ -1268,12 +1268,9 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
|
|
#endif
|
|
|
rth->dst.output = ip_rt_bug;
|
|
|
|
|
|
- rth->rt_key_dst = daddr;
|
|
|
- rth->rt_key_src = saddr;
|
|
|
rth->rt_genid = rt_genid(dev_net(dev));
|
|
|
rth->rt_flags = RTCF_MULTICAST;
|
|
|
rth->rt_type = RTN_MULTICAST;
|
|
|
- rth->rt_key_tos = tos;
|
|
|
rth->rt_dst = daddr;
|
|
|
rth->rt_src = saddr;
|
|
|
rth->rt_route_iif = dev->ifindex;
|
|
@@ -1392,12 +1389,9 @@ static int __mkroute_input(struct sk_buff *skb,
|
|
|
goto cleanup;
|
|
|
}
|
|
|
|
|
|
- rth->rt_key_dst = daddr;
|
|
|
- rth->rt_key_src = saddr;
|
|
|
rth->rt_genid = rt_genid(dev_net(rth->dst.dev));
|
|
|
rth->rt_flags = flags;
|
|
|
rth->rt_type = res->type;
|
|
|
- rth->rt_key_tos = tos;
|
|
|
rth->rt_dst = daddr;
|
|
|
rth->rt_src = saddr;
|
|
|
rth->rt_route_iif = in_dev->dev->ifindex;
|
|
@@ -1563,12 +1557,9 @@ local_input:
|
|
|
rth->dst.tclassid = itag;
|
|
|
#endif
|
|
|
|
|
|
- rth->rt_key_dst = daddr;
|
|
|
- rth->rt_key_src = saddr;
|
|
|
rth->rt_genid = rt_genid(net);
|
|
|
rth->rt_flags = flags|RTCF_LOCAL;
|
|
|
rth->rt_type = res.type;
|
|
|
- rth->rt_key_tos = tos;
|
|
|
rth->rt_dst = daddr;
|
|
|
rth->rt_src = saddr;
|
|
|
rth->rt_route_iif = dev->ifindex;
|
|
@@ -1668,9 +1659,7 @@ EXPORT_SYMBOL(ip_route_input);
|
|
|
|
|
|
/* called with rcu_read_lock() */
|
|
|
static struct rtable *__mkroute_output(const struct fib_result *res,
|
|
|
- const struct flowi4 *fl4,
|
|
|
- __be32 orig_daddr, __be32 orig_saddr,
|
|
|
- int orig_oif, __u8 orig_rtos,
|
|
|
+ const struct flowi4 *fl4, int orig_oif,
|
|
|
struct net_device *dev_out,
|
|
|
unsigned int flags)
|
|
|
{
|
|
@@ -1721,12 +1710,9 @@ static struct rtable *__mkroute_output(const struct fib_result *res,
|
|
|
|
|
|
rth->dst.output = ip_output;
|
|
|
|
|
|
- rth->rt_key_dst = orig_daddr;
|
|
|
- rth->rt_key_src = orig_saddr;
|
|
|
rth->rt_genid = rt_genid(dev_net(dev_out));
|
|
|
rth->rt_flags = flags;
|
|
|
rth->rt_type = type;
|
|
|
- rth->rt_key_tos = orig_rtos;
|
|
|
rth->rt_dst = fl4->daddr;
|
|
|
rth->rt_src = fl4->saddr;
|
|
|
rth->rt_route_iif = 0;
|
|
@@ -1777,16 +1763,12 @@ struct rtable *__ip_route_output_key(struct net *net, struct flowi4 *fl4)
|
|
|
unsigned int flags = 0;
|
|
|
struct fib_result res;
|
|
|
struct rtable *rth;
|
|
|
- __be32 orig_daddr;
|
|
|
- __be32 orig_saddr;
|
|
|
int orig_oif;
|
|
|
|
|
|
res.tclassid = 0;
|
|
|
res.fi = NULL;
|
|
|
res.table = NULL;
|
|
|
|
|
|
- orig_daddr = fl4->daddr;
|
|
|
- orig_saddr = fl4->saddr;
|
|
|
orig_oif = fl4->flowi4_oif;
|
|
|
|
|
|
fl4->flowi4_iif = net->loopback_dev->ifindex;
|
|
@@ -1948,8 +1930,7 @@ struct rtable *__ip_route_output_key(struct net *net, struct flowi4 *fl4)
|
|
|
|
|
|
|
|
|
make_route:
|
|
|
- rth = __mkroute_output(&res, fl4, orig_daddr, orig_saddr, orig_oif,
|
|
|
- tos, dev_out, flags);
|
|
|
+ rth = __mkroute_output(&res, fl4, orig_oif, dev_out, flags);
|
|
|
|
|
|
out:
|
|
|
rcu_read_unlock();
|
|
@@ -2014,9 +1995,6 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
|
|
|
if (new->dev)
|
|
|
dev_hold(new->dev);
|
|
|
|
|
|
- rt->rt_key_dst = ort->rt_key_dst;
|
|
|
- rt->rt_key_src = ort->rt_key_src;
|
|
|
- rt->rt_key_tos = ort->rt_key_tos;
|
|
|
rt->rt_route_iif = ort->rt_route_iif;
|
|
|
rt->rt_iif = ort->rt_iif;
|
|
|
rt->rt_oif = ort->rt_oif;
|
|
@@ -2058,7 +2036,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,
|
|
|
+static int rt_fill_info(struct net *net, __be32 src, u8 tos,
|
|
|
struct sk_buff *skb, u32 pid, u32 seq, int event,
|
|
|
int nowait, unsigned int flags)
|
|
|
{
|
|
@@ -2077,7 +2055,7 @@ static int rt_fill_info(struct net *net,
|
|
|
r->rtm_family = AF_INET;
|
|
|
r->rtm_dst_len = 32;
|
|
|
r->rtm_src_len = 0;
|
|
|
- r->rtm_tos = rt->rt_key_tos;
|
|
|
+ r->rtm_tos = tos;
|
|
|
r->rtm_table = RT_TABLE_MAIN;
|
|
|
if (nla_put_u32(skb, RTA_TABLE, RT_TABLE_MAIN))
|
|
|
goto nla_put_failure;
|
|
@@ -2090,9 +2068,9 @@ static int rt_fill_info(struct net *net,
|
|
|
|
|
|
if (nla_put_be32(skb, RTA_DST, rt->rt_dst))
|
|
|
goto nla_put_failure;
|
|
|
- if (rt->rt_key_src) {
|
|
|
+ if (src) {
|
|
|
r->rtm_src_len = 32;
|
|
|
- if (nla_put_be32(skb, RTA_SRC, rt->rt_key_src))
|
|
|
+ if (nla_put_be32(skb, RTA_SRC, src))
|
|
|
goto nla_put_failure;
|
|
|
}
|
|
|
if (rt->dst.dev &&
|
|
@@ -2104,7 +2082,7 @@ static int rt_fill_info(struct net *net,
|
|
|
goto nla_put_failure;
|
|
|
#endif
|
|
|
if (!rt_is_input_route(rt) &&
|
|
|
- rt->rt_src != rt->rt_key_src) {
|
|
|
+ rt->rt_src != src) {
|
|
|
if (nla_put_be32(skb, RTA_PREFSRC, rt->rt_src))
|
|
|
goto nla_put_failure;
|
|
|
}
|
|
@@ -2248,7 +2226,8 @@ 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, skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq,
|
|
|
+ err = rt_fill_info(net, src, rtm->rtm_tos, skb,
|
|
|
+ NETLINK_CB(in_skb).pid, nlh->nlmsg_seq,
|
|
|
RTM_NEWROUTE, 0, 0);
|
|
|
if (err <= 0)
|
|
|
goto errout_free;
|