diff options
author | Nikolay Aleksandrov | 2015-08-19 05:12:29 +0200 |
---|---|---|
committer | David S. Miller | 2015-08-20 21:59:42 +0200 |
commit | 57b8efa1a5e4baf3dfca8d5d7bfb946bd44ff390 (patch) | |
tree | 7c932d050bbcf8057793985a9fb9a4ee9c662b9b /drivers/net/vrf.c | |
parent | vrf: vrf_master_ifindex_rcu is not always called with rcu read lock (diff) | |
download | kernel-qcow2-linux-57b8efa1a5e4baf3dfca8d5d7bfb946bd44ff390.tar.gz kernel-qcow2-linux-57b8efa1a5e4baf3dfca8d5d7bfb946bd44ff390.tar.xz kernel-qcow2-linux-57b8efa1a5e4baf3dfca8d5d7bfb946bd44ff390.zip |
vrf: plug skb leaks
Currently whenever a packet different from ETH_P_IP is sent through the
VRF device it is leaked so plug the leaks and properly drop these
packets.
Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Acked-by: David Ahern <dsa@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/vrf.c')
-rw-r--r-- | drivers/net/vrf.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index ed208317cbb5..4aa06450fafa 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c @@ -97,6 +97,12 @@ static bool is_ip_rx_frame(struct sk_buff *skb) return false; } +static void vrf_tx_error(struct net_device *vrf_dev, struct sk_buff *skb) +{ + vrf_dev->stats.tx_errors++; + kfree_skb(skb); +} + /* note: already called with rcu_read_lock */ static rx_handler_result_t vrf_handle_frame(struct sk_buff **pskb) { @@ -149,7 +155,8 @@ static struct rtnl_link_stats64 *vrf_get_stats64(struct net_device *dev, static netdev_tx_t vrf_process_v6_outbound(struct sk_buff *skb, struct net_device *dev) { - return 0; + vrf_tx_error(dev, skb); + return NET_XMIT_DROP; } static int vrf_send_v4_prep(struct sk_buff *skb, struct flowi4 *fl4, @@ -206,8 +213,7 @@ static netdev_tx_t vrf_process_v4_outbound(struct sk_buff *skb, out: return ret; err: - vrf_dev->stats.tx_errors++; - kfree_skb(skb); + vrf_tx_error(vrf_dev, skb); goto out; } @@ -219,6 +225,7 @@ static netdev_tx_t is_ip_tx_frame(struct sk_buff *skb, struct net_device *dev) case htons(ETH_P_IPV6): return vrf_process_v6_outbound(skb, dev); default: + vrf_tx_error(dev, skb); return NET_XMIT_DROP; } } |