net: Loopback ifindex is constant now
As pointed out, there are places, that access net->loopback_dev->ifindex and after ifindex generation is made per-net this value becomes constant equals 1. So go ahead and introduce the LOOPBACK_IFINDEX constant and use it where appropriate. Signed-off-by: Pavel Emelyanov <xemul@parallels.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
aa79e66eee
commit
1fb9489bf1
|
@ -197,6 +197,7 @@ static __net_init int loopback_net_init(struct net *net)
|
||||||
if (err)
|
if (err)
|
||||||
goto out_free_netdev;
|
goto out_free_netdev;
|
||||||
|
|
||||||
|
BUG_ON(dev->ifindex != LOOPBACK_IFINDEX);
|
||||||
net->loopback_dev = dev;
|
net->loopback_dev = dev;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,13 @@ struct net {
|
||||||
struct sock *diag_nlsk;
|
struct sock *diag_nlsk;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ifindex generation is per-net namespace, and loopback is
|
||||||
|
* always the 1st device in ns (see net_dev_init), thus any
|
||||||
|
* loopback device should get ifindex 1
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOOPBACK_IFINDEX 1
|
||||||
|
|
||||||
#include <linux/seq_file_net.h>
|
#include <linux/seq_file_net.h>
|
||||||
|
|
||||||
|
|
|
@ -961,7 +961,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowidn *o
|
||||||
.saddr = oldflp->saddr,
|
.saddr = oldflp->saddr,
|
||||||
.flowidn_scope = RT_SCOPE_UNIVERSE,
|
.flowidn_scope = RT_SCOPE_UNIVERSE,
|
||||||
.flowidn_mark = oldflp->flowidn_mark,
|
.flowidn_mark = oldflp->flowidn_mark,
|
||||||
.flowidn_iif = init_net.loopback_dev->ifindex,
|
.flowidn_iif = LOOPBACK_IFINDEX,
|
||||||
.flowidn_oif = oldflp->flowidn_oif,
|
.flowidn_oif = oldflp->flowidn_oif,
|
||||||
};
|
};
|
||||||
struct dn_route *rt = NULL;
|
struct dn_route *rt = NULL;
|
||||||
|
@ -979,7 +979,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowidn *o
|
||||||
"dn_route_output_slow: dst=%04x src=%04x mark=%d"
|
"dn_route_output_slow: dst=%04x src=%04x mark=%d"
|
||||||
" iif=%d oif=%d\n", le16_to_cpu(oldflp->daddr),
|
" iif=%d oif=%d\n", le16_to_cpu(oldflp->daddr),
|
||||||
le16_to_cpu(oldflp->saddr),
|
le16_to_cpu(oldflp->saddr),
|
||||||
oldflp->flowidn_mark, init_net.loopback_dev->ifindex,
|
oldflp->flowidn_mark, LOOPBACK_IFINDEX,
|
||||||
oldflp->flowidn_oif);
|
oldflp->flowidn_oif);
|
||||||
|
|
||||||
/* If we have an output interface, verify its a DECnet device */
|
/* If we have an output interface, verify its a DECnet device */
|
||||||
|
@ -1042,7 +1042,7 @@ source_ok:
|
||||||
if (!fld.daddr)
|
if (!fld.daddr)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
fld.flowidn_oif = init_net.loopback_dev->ifindex;
|
fld.flowidn_oif = LOOPBACK_IFINDEX;
|
||||||
res.type = RTN_LOCAL;
|
res.type = RTN_LOCAL;
|
||||||
goto make_route;
|
goto make_route;
|
||||||
}
|
}
|
||||||
|
|
|
@ -218,7 +218,7 @@ __be32 fib_compute_spec_dst(struct sk_buff *skb)
|
||||||
scope = RT_SCOPE_UNIVERSE;
|
scope = RT_SCOPE_UNIVERSE;
|
||||||
if (!ipv4_is_zeronet(ip_hdr(skb)->saddr)) {
|
if (!ipv4_is_zeronet(ip_hdr(skb)->saddr)) {
|
||||||
fl4.flowi4_oif = 0;
|
fl4.flowi4_oif = 0;
|
||||||
fl4.flowi4_iif = net->loopback_dev->ifindex;
|
fl4.flowi4_iif = LOOPBACK_IFINDEX;
|
||||||
fl4.daddr = ip_hdr(skb)->saddr;
|
fl4.daddr = ip_hdr(skb)->saddr;
|
||||||
fl4.saddr = 0;
|
fl4.saddr = 0;
|
||||||
fl4.flowi4_tos = RT_TOS(ip_hdr(skb)->tos);
|
fl4.flowi4_tos = RT_TOS(ip_hdr(skb)->tos);
|
||||||
|
|
|
@ -1798,7 +1798,7 @@ static struct mr_table *ipmr_rt_fib_lookup(struct net *net, struct sk_buff *skb)
|
||||||
.flowi4_oif = (rt_is_output_route(rt) ?
|
.flowi4_oif = (rt_is_output_route(rt) ?
|
||||||
skb->dev->ifindex : 0),
|
skb->dev->ifindex : 0),
|
||||||
.flowi4_iif = (rt_is_output_route(rt) ?
|
.flowi4_iif = (rt_is_output_route(rt) ?
|
||||||
net->loopback_dev->ifindex :
|
LOOPBACK_IFINDEX :
|
||||||
skb->dev->ifindex),
|
skb->dev->ifindex),
|
||||||
.flowi4_mark = skb->mark,
|
.flowi4_mark = skb->mark,
|
||||||
};
|
};
|
||||||
|
|
|
@ -85,7 +85,7 @@ static bool rpfilter_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
||||||
return ipv4_is_local_multicast(iph->daddr) ^ invert;
|
return ipv4_is_local_multicast(iph->daddr) ^ invert;
|
||||||
flow.flowi4_iif = 0;
|
flow.flowi4_iif = 0;
|
||||||
} else {
|
} else {
|
||||||
flow.flowi4_iif = dev_net(par->in)->loopback_dev->ifindex;
|
flow.flowi4_iif = LOOPBACK_IFINDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
flow.daddr = iph->saddr;
|
flow.daddr = iph->saddr;
|
||||||
|
|
|
@ -1619,7 +1619,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||||
|
|
||||||
if (res.type == RTN_LOCAL) {
|
if (res.type == RTN_LOCAL) {
|
||||||
err = fib_validate_source(skb, saddr, daddr, tos,
|
err = fib_validate_source(skb, saddr, daddr, tos,
|
||||||
net->loopback_dev->ifindex,
|
LOOPBACK_IFINDEX,
|
||||||
dev, in_dev, &itag);
|
dev, in_dev, &itag);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto martian_source_keep_err;
|
goto martian_source_keep_err;
|
||||||
|
@ -1895,7 +1895,7 @@ struct rtable *__ip_route_output_key(struct net *net, struct flowi4 *fl4)
|
||||||
|
|
||||||
orig_oif = fl4->flowi4_oif;
|
orig_oif = fl4->flowi4_oif;
|
||||||
|
|
||||||
fl4->flowi4_iif = net->loopback_dev->ifindex;
|
fl4->flowi4_iif = LOOPBACK_IFINDEX;
|
||||||
fl4->flowi4_tos = tos & IPTOS_RT_MASK;
|
fl4->flowi4_tos = tos & IPTOS_RT_MASK;
|
||||||
fl4->flowi4_scope = ((tos & RTO_ONLINK) ?
|
fl4->flowi4_scope = ((tos & RTO_ONLINK) ?
|
||||||
RT_SCOPE_LINK : RT_SCOPE_UNIVERSE);
|
RT_SCOPE_LINK : RT_SCOPE_UNIVERSE);
|
||||||
|
@ -1984,7 +1984,7 @@ struct rtable *__ip_route_output_key(struct net *net, struct flowi4 *fl4)
|
||||||
if (!fl4->daddr)
|
if (!fl4->daddr)
|
||||||
fl4->daddr = fl4->saddr = htonl(INADDR_LOOPBACK);
|
fl4->daddr = fl4->saddr = htonl(INADDR_LOOPBACK);
|
||||||
dev_out = net->loopback_dev;
|
dev_out = net->loopback_dev;
|
||||||
fl4->flowi4_oif = net->loopback_dev->ifindex;
|
fl4->flowi4_oif = LOOPBACK_IFINDEX;
|
||||||
res.type = RTN_LOCAL;
|
res.type = RTN_LOCAL;
|
||||||
flags |= RTCF_LOCAL;
|
flags |= RTCF_LOCAL;
|
||||||
goto make_route;
|
goto make_route;
|
||||||
|
|
|
@ -965,7 +965,7 @@ struct dst_entry * ip6_route_output(struct net *net, const struct sock *sk,
|
||||||
{
|
{
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
|
||||||
fl6->flowi6_iif = net->loopback_dev->ifindex;
|
fl6->flowi6_iif = LOOPBACK_IFINDEX;
|
||||||
|
|
||||||
if ((sk && sk->sk_bound_dev_if) || rt6_need_strict(&fl6->daddr))
|
if ((sk && sk->sk_bound_dev_if) || rt6_need_strict(&fl6->daddr))
|
||||||
flags |= RT6_LOOKUP_F_IFACE;
|
flags |= RT6_LOOKUP_F_IFACE;
|
||||||
|
|
Loading…
Reference in New Issue