|
@@ -440,7 +440,7 @@ static int rt_cache_seq_show(struct seq_file *seq, void *v)
|
|
|
r->rt_key_tos,
|
|
|
-1,
|
|
|
HHUptod,
|
|
|
- r->rt_spec_dst, &len);
|
|
|
+ 0, &len);
|
|
|
|
|
|
seq_printf(seq, "%*s\n", 127 - len, "");
|
|
|
}
|
|
@@ -1978,7 +1978,6 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
|
|
{
|
|
|
unsigned int hash;
|
|
|
struct rtable *rth;
|
|
|
- __be32 spec_dst;
|
|
|
struct in_device *in_dev = __in_dev_get_rcu(dev);
|
|
|
u32 itag = 0;
|
|
|
int err;
|
|
@@ -1999,10 +1998,8 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
|
|
if (ipv4_is_zeronet(saddr)) {
|
|
|
if (!ipv4_is_local_multicast(daddr))
|
|
|
goto e_inval;
|
|
|
- spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);
|
|
|
} else {
|
|
|
- err = fib_validate_source(skb, saddr, 0, tos, 0, dev, &spec_dst,
|
|
|
- &itag);
|
|
|
+ err = fib_validate_source(skb, saddr, 0, tos, 0, dev, &itag);
|
|
|
if (err < 0)
|
|
|
goto e_err;
|
|
|
}
|
|
@@ -2029,7 +2026,6 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
|
|
rth->rt_oif = 0;
|
|
|
rth->rt_mark = skb->mark;
|
|
|
rth->rt_gateway = daddr;
|
|
|
- rth->rt_spec_dst= spec_dst;
|
|
|
rth->rt_peer_genid = 0;
|
|
|
rt_init_peer(rth, dev_net(dev)->ipv4.peers);
|
|
|
rth->fi = NULL;
|
|
@@ -2093,7 +2089,6 @@ static int __mkroute_input(struct sk_buff *skb,
|
|
|
int err;
|
|
|
struct in_device *out_dev;
|
|
|
unsigned int flags = 0;
|
|
|
- __be32 spec_dst;
|
|
|
u32 itag;
|
|
|
|
|
|
/* get a working reference to the output device */
|
|
@@ -2105,7 +2100,7 @@ static int __mkroute_input(struct sk_buff *skb,
|
|
|
|
|
|
|
|
|
err = fib_validate_source(skb, saddr, daddr, tos, FIB_RES_OIF(*res),
|
|
|
- in_dev->dev, &spec_dst, &itag);
|
|
|
+ in_dev->dev, &itag);
|
|
|
if (err < 0) {
|
|
|
ip_handle_martian_source(in_dev->dev, in_dev, skb, daddr,
|
|
|
saddr);
|
|
@@ -2157,7 +2152,6 @@ static int __mkroute_input(struct sk_buff *skb,
|
|
|
rth->rt_oif = 0;
|
|
|
rth->rt_mark = skb->mark;
|
|
|
rth->rt_gateway = daddr;
|
|
|
- rth->rt_spec_dst= spec_dst;
|
|
|
rth->rt_peer_genid = 0;
|
|
|
rt_init_peer(rth, &res->table->tb_peers);
|
|
|
rth->fi = NULL;
|
|
@@ -2223,7 +2217,6 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
|
|
u32 itag = 0;
|
|
|
struct rtable *rth;
|
|
|
unsigned int hash;
|
|
|
- __be32 spec_dst;
|
|
|
int err = -EINVAL;
|
|
|
struct net *net = dev_net(dev);
|
|
|
|
|
@@ -2281,12 +2274,11 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
|
|
if (res.type == RTN_LOCAL) {
|
|
|
err = fib_validate_source(skb, saddr, daddr, tos,
|
|
|
net->loopback_dev->ifindex,
|
|
|
- dev, &spec_dst, &itag);
|
|
|
+ dev, &itag);
|
|
|
if (err < 0)
|
|
|
goto martian_source_keep_err;
|
|
|
if (err)
|
|
|
flags |= RTCF_DIRECTSRC;
|
|
|
- spec_dst = daddr;
|
|
|
goto local_input;
|
|
|
}
|
|
|
|
|
@@ -2302,11 +2294,8 @@ brd_input:
|
|
|
if (skb->protocol != htons(ETH_P_IP))
|
|
|
goto e_inval;
|
|
|
|
|
|
- if (ipv4_is_zeronet(saddr))
|
|
|
- spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);
|
|
|
- else {
|
|
|
- err = fib_validate_source(skb, saddr, 0, tos, 0, dev, &spec_dst,
|
|
|
- &itag);
|
|
|
+ if (!ipv4_is_zeronet(saddr)) {
|
|
|
+ err = fib_validate_source(skb, saddr, 0, tos, 0, dev, &itag);
|
|
|
if (err < 0)
|
|
|
goto martian_source_keep_err;
|
|
|
if (err)
|
|
@@ -2344,7 +2333,6 @@ local_input:
|
|
|
rth->rt_oif = 0;
|
|
|
rth->rt_mark = skb->mark;
|
|
|
rth->rt_gateway = daddr;
|
|
|
- rth->rt_spec_dst= spec_dst;
|
|
|
rth->rt_peer_genid = 0;
|
|
|
rt_init_peer(rth, net->ipv4.peers);
|
|
|
rth->fi = NULL;
|
|
@@ -2362,7 +2350,6 @@ local_input:
|
|
|
|
|
|
no_route:
|
|
|
RT_CACHE_STAT_INC(in_no_route);
|
|
|
- spec_dst = inet_select_addr(dev, 0, RT_SCOPE_UNIVERSE);
|
|
|
res.type = RTN_UNREACHABLE;
|
|
|
if (err == -ESRCH)
|
|
|
err = -ENETUNREACH;
|
|
@@ -2545,7 +2532,6 @@ static struct rtable *__mkroute_output(const struct fib_result *res,
|
|
|
rth->rt_oif = orig_oif;
|
|
|
rth->rt_mark = fl4->flowi4_mark;
|
|
|
rth->rt_gateway = fl4->daddr;
|
|
|
- rth->rt_spec_dst= fl4->saddr;
|
|
|
rth->rt_peer_genid = 0;
|
|
|
rt_init_peer(rth, (res->table ?
|
|
|
&res->table->tb_peers :
|
|
@@ -2554,12 +2540,9 @@ static struct rtable *__mkroute_output(const struct fib_result *res,
|
|
|
|
|
|
RT_CACHE_STAT_INC(out_slow_tot);
|
|
|
|
|
|
- if (flags & RTCF_LOCAL) {
|
|
|
+ if (flags & RTCF_LOCAL)
|
|
|
rth->dst.input = ip_local_deliver;
|
|
|
- rth->rt_spec_dst = fl4->daddr;
|
|
|
- }
|
|
|
if (flags & (RTCF_BROADCAST | RTCF_MULTICAST)) {
|
|
|
- rth->rt_spec_dst = fl4->saddr;
|
|
|
if (flags & RTCF_LOCAL &&
|
|
|
!(dev_out->flags & IFF_LOOPBACK)) {
|
|
|
rth->dst.output = ip_mc_output;
|
|
@@ -2890,7 +2873,6 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
|
|
|
rt->rt_dst = ort->rt_dst;
|
|
|
rt->rt_src = ort->rt_src;
|
|
|
rt->rt_gateway = ort->rt_gateway;
|
|
|
- rt->rt_spec_dst = ort->rt_spec_dst;
|
|
|
rt_transfer_peer(rt, ort);
|
|
|
rt->fi = ort->fi;
|
|
|
if (rt->fi)
|
|
@@ -2965,10 +2947,8 @@ static int rt_fill_info(struct net *net,
|
|
|
nla_put_u32(skb, RTA_FLOW, rt->dst.tclassid))
|
|
|
goto nla_put_failure;
|
|
|
#endif
|
|
|
- if (rt_is_input_route(rt)) {
|
|
|
- if (nla_put_be32(skb, RTA_PREFSRC, rt->rt_spec_dst))
|
|
|
- goto nla_put_failure;
|
|
|
- } else if (rt->rt_src != rt->rt_key_src) {
|
|
|
+ if (!rt_is_input_route(rt) &&
|
|
|
+ rt->rt_src != rt->rt_key_src) {
|
|
|
if (nla_put_be32(skb, RTA_PREFSRC, rt->rt_src))
|
|
|
goto nla_put_failure;
|
|
|
}
|