Skip to content

Commit

Permalink
vrf: Increment Icmp6InMsgs on the original netdev
Browse files Browse the repository at this point in the history
Get the ingress interface and increment ICMP counters based on that
instead of skb->dev when the the dev is a VRF device.

This is a follow up on the following message:
https://www.spinics.net/lists/netdev/msg560268.html

v2: Avoid changing skb->dev since it has unintended effect for local
    delivery (David Ahern).
Signed-off-by: Stephen Suryaputra <ssuryaextr@gmail.com>
Reviewed-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Stephen Suryaputra authored and David S. Miller committed Jun 12, 2019
1 parent f0d2ca1 commit e1ae5c2
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 8 deletions.
16 changes: 16 additions & 0 deletions include/net/addrconf.h
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,22 @@ static inline struct inet6_dev *__in6_dev_get(const struct net_device *dev)
return rcu_dereference_rtnl(dev->ip6_ptr);
}

/**
* __in6_dev_stats_get - get inet6_dev pointer for stats
* @dev: network device
* @skb: skb for original incoming interface if neeeded
*
* Caller must hold rcu_read_lock or RTNL, because this function
* does not take a reference on the inet6_dev.
*/
static inline struct inet6_dev *__in6_dev_stats_get(const struct net_device *dev,
const struct sk_buff *skb)
{
if (netif_is_l3_master(dev))
dev = dev_get_by_index_rcu(dev_net(dev), inet6_iif(skb));
return __in6_dev_get(dev);
}

/**
* __in6_dev_get_safely - get inet6_dev pointer from netdevice
* @dev: network device
Expand Down
17 changes: 11 additions & 6 deletions net/ipv6/icmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -393,23 +393,28 @@ static struct dst_entry *icmpv6_route_lookup(struct net *net,
return ERR_PTR(err);
}

static int icmp6_iif(const struct sk_buff *skb)
static struct net_device *icmp6_dev(const struct sk_buff *skb)
{
int iif = skb->dev->ifindex;
struct net_device *dev = skb->dev;

/* for local traffic to local address, skb dev is the loopback
* device. Check if there is a dst attached to the skb and if so
* get the real device index. Same is needed for replies to a link
* local address on a device enslaved to an L3 master device
*/
if (unlikely(iif == LOOPBACK_IFINDEX || netif_is_l3_master(skb->dev))) {
if (unlikely(dev->ifindex == LOOPBACK_IFINDEX || netif_is_l3_master(skb->dev))) {
const struct rt6_info *rt6 = skb_rt6_info(skb);

if (rt6)
iif = rt6->rt6i_idev->dev->ifindex;
dev = rt6->rt6i_idev->dev;
}

return iif;
return dev;
}

static int icmp6_iif(const struct sk_buff *skb)
{
return icmp6_dev(skb)->ifindex;
}

/*
Expand Down Expand Up @@ -810,7 +815,7 @@ void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
static int icmpv6_rcv(struct sk_buff *skb)
{
struct net *net = dev_net(skb->dev);
struct net_device *dev = skb->dev;
struct net_device *dev = icmp6_dev(skb);
struct inet6_dev *idev = __in6_dev_get(dev);
const struct in6_addr *saddr, *daddr;
struct icmp6hdr *hdr;
Expand Down
4 changes: 2 additions & 2 deletions net/ipv6/reassembly.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *skb,
skb_network_header_len(skb));

rcu_read_lock();
__IP6_INC_STATS(net, __in6_dev_get(dev), IPSTATS_MIB_REASMOKS);
__IP6_INC_STATS(net, __in6_dev_stats_get(dev, skb), IPSTATS_MIB_REASMOKS);
rcu_read_unlock();
fq->q.rb_fragments = RB_ROOT;
fq->q.fragments_tail = NULL;
Expand All @@ -312,7 +312,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *skb,
net_dbg_ratelimited("ip6_frag_reasm: no memory for reassembly\n");
out_fail:
rcu_read_lock();
__IP6_INC_STATS(net, __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS);
__IP6_INC_STATS(net, __in6_dev_stats_get(dev, skb), IPSTATS_MIB_REASMFAILS);
rcu_read_unlock();
inet_frag_kill(&fq->q);
return -1;
Expand Down

0 comments on commit e1ae5c2

Please sign in to comment.