| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Girish Moodalbail <girish.moodalbail@oracle.com> |
| Date: Thu, 8 Jun 2017 17:07:48 -0700 |
| Subject: geneve: add missing rx stats accounting |
| |
| From: Girish Moodalbail <girish.moodalbail@oracle.com> |
| |
| |
| [ Upstream commit fe741e2362f33bbea813bcc3a921de356c6653db ] |
| |
| There are few places on the receive path where packet drops and packet |
| errors were not accounted for. This patch fixes that issue. |
| |
| Signed-off-by: Girish Moodalbail <girish.moodalbail@oracle.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/geneve.c | 36 ++++++++++++++++++++++++------------ |
| 1 file changed, 24 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/net/geneve.c |
| +++ b/drivers/net/geneve.c |
| @@ -209,6 +209,7 @@ static void geneve_rx(struct geneve_dev |
| struct genevehdr *gnvh = geneve_hdr(skb); |
| struct metadata_dst *tun_dst = NULL; |
| struct pcpu_sw_netstats *stats; |
| + unsigned int len; |
| int err = 0; |
| void *oiph; |
| |
| @@ -222,8 +223,10 @@ static void geneve_rx(struct geneve_dev |
| tun_dst = udp_tun_rx_dst(skb, geneve_get_sk_family(gs), flags, |
| vni_to_tunnel_id(gnvh->vni), |
| gnvh->opt_len * 4); |
| - if (!tun_dst) |
| + if (!tun_dst) { |
| + geneve->dev->stats.rx_dropped++; |
| goto drop; |
| + } |
| /* Update tunnel dst according to Geneve options. */ |
| ip_tunnel_info_opts_set(&tun_dst->u.tun_info, |
| gnvh->options, gnvh->opt_len * 4); |
| @@ -231,8 +234,11 @@ static void geneve_rx(struct geneve_dev |
| /* Drop packets w/ critical options, |
| * since we don't support any... |
| */ |
| - if (gnvh->critical) |
| + if (gnvh->critical) { |
| + geneve->dev->stats.rx_frame_errors++; |
| + geneve->dev->stats.rx_errors++; |
| goto drop; |
| + } |
| } |
| |
| skb_reset_mac_header(skb); |
| @@ -243,8 +249,10 @@ static void geneve_rx(struct geneve_dev |
| skb_dst_set(skb, &tun_dst->dst); |
| |
| /* Ignore packet loops (and multicast echo) */ |
| - if (ether_addr_equal(eth_hdr(skb)->h_source, geneve->dev->dev_addr)) |
| + if (ether_addr_equal(eth_hdr(skb)->h_source, geneve->dev->dev_addr)) { |
| + geneve->dev->stats.rx_errors++; |
| goto drop; |
| + } |
| |
| oiph = skb_network_header(skb); |
| skb_reset_network_header(skb); |
| @@ -276,13 +284,15 @@ static void geneve_rx(struct geneve_dev |
| } |
| } |
| |
| - stats = this_cpu_ptr(geneve->dev->tstats); |
| - u64_stats_update_begin(&stats->syncp); |
| - stats->rx_packets++; |
| - stats->rx_bytes += skb->len; |
| - u64_stats_update_end(&stats->syncp); |
| - |
| - gro_cells_receive(&geneve->gro_cells, skb); |
| + len = skb->len; |
| + err = gro_cells_receive(&geneve->gro_cells, skb); |
| + if (likely(err == NET_RX_SUCCESS)) { |
| + stats = this_cpu_ptr(geneve->dev->tstats); |
| + u64_stats_update_begin(&stats->syncp); |
| + stats->rx_packets++; |
| + stats->rx_bytes += len; |
| + u64_stats_update_end(&stats->syncp); |
| + } |
| return; |
| drop: |
| /* Consume bad packet */ |
| @@ -332,7 +342,7 @@ static int geneve_udp_encap_recv(struct |
| struct geneve_sock *gs; |
| int opts_len; |
| |
| - /* Need Geneve and inner Ethernet header to be present */ |
| + /* Need UDP and Geneve header to be present */ |
| if (unlikely(!pskb_may_pull(skb, GENEVE_BASE_HLEN))) |
| goto drop; |
| |
| @@ -355,8 +365,10 @@ static int geneve_udp_encap_recv(struct |
| opts_len = geneveh->opt_len * 4; |
| if (iptunnel_pull_header(skb, GENEVE_BASE_HLEN + opts_len, |
| htons(ETH_P_TEB), |
| - !net_eq(geneve->net, dev_net(geneve->dev)))) |
| + !net_eq(geneve->net, dev_net(geneve->dev)))) { |
| + geneve->dev->stats.rx_dropped++; |
| goto drop; |
| + } |
| |
| geneve_rx(geneve, gs, skb); |
| return 0; |