* [PATCH net 0/4] ip_gre: a bunch of fixes for erspan
@ 2017-10-01 14:00 Xin Long
2017-10-01 14:00 ` [PATCH net 1/4] ip_gre: get key from session_id correctly in erspan_rcv Xin Long
2017-10-02 5:32 ` [PATCH net 0/4] ip_gre: a bunch of fixes for erspan David Miller
0 siblings, 2 replies; 6+ messages in thread
From: Xin Long @ 2017-10-01 14:00 UTC (permalink / raw)
To: network dev; +Cc: davem, Dmitry Kozlov, William Tu
This patchset is to fix some issues that could cause 0 or low
performance, and even unexpected truncated packets on erspan.
Xin Long (4):
ip_gre: get key from session_id correctly in erspan_rcv
ip_gre: check packet length and mtu correctly in erspan_xmit
ip_gre: set tunnel hlen properly in erspan_tunnel_init
ip_gre: erspan device should keep dst
net/ipv4/ip_gre.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
--
2.1.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net 1/4] ip_gre: get key from session_id correctly in erspan_rcv
2017-10-01 14:00 [PATCH net 0/4] ip_gre: a bunch of fixes for erspan Xin Long
@ 2017-10-01 14:00 ` Xin Long
2017-10-01 14:00 ` [PATCH net 2/4] ip_gre: check packet length and mtu correctly in erspan_xmit Xin Long
2017-10-02 5:32 ` [PATCH net 0/4] ip_gre: a bunch of fixes for erspan David Miller
1 sibling, 1 reply; 6+ messages in thread
From: Xin Long @ 2017-10-01 14:00 UTC (permalink / raw)
To: network dev; +Cc: davem, Dmitry Kozlov, William Tu
erspan only uses the first 10 bits of session_id as the key to look
up the tunnel. But in erspan_rcv, it missed 'session_id & ID_MASK'
when getting the key from session_id.
If any other flag is also set in session_id in a packet, it would
fail to find the tunnel due to incorrect key in erspan_rcv.
This patch is to add 'session_id & ID_MASK' there and also remove
the unnecessary variable session_id.
Fixes: 84e54fe0a5ea ("gre: introduce native tunnel support for ERSPAN")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/ipv4/ip_gre.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 8b837f6..b25b1e5 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -259,7 +259,6 @@ static int erspan_rcv(struct sk_buff *skb, struct tnl_ptk_info *tpi,
struct ip_tunnel *tunnel;
struct erspanhdr *ershdr;
const struct iphdr *iph;
- __be32 session_id;
__be32 index;
int len;
@@ -275,8 +274,7 @@ static int erspan_rcv(struct sk_buff *skb, struct tnl_ptk_info *tpi,
/* The original GRE header does not have key field,
* Use ERSPAN 10-bit session ID as key.
*/
- session_id = cpu_to_be32(ntohs(ershdr->session_id));
- tpi->key = session_id;
+ tpi->key = cpu_to_be32(ntohs(ershdr->session_id) & ID_MASK);
index = ershdr->md.index;
tunnel = ip_tunnel_lookup(itn, skb->dev->ifindex,
tpi->flags | TUNNEL_KEY,
--
2.1.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net 2/4] ip_gre: check packet length and mtu correctly in erspan_xmit
2017-10-01 14:00 ` [PATCH net 1/4] ip_gre: get key from session_id correctly in erspan_rcv Xin Long
@ 2017-10-01 14:00 ` Xin Long
2017-10-01 14:00 ` [PATCH net 3/4] ip_gre: set tunnel hlen properly in erspan_tunnel_init Xin Long
0 siblings, 1 reply; 6+ messages in thread
From: Xin Long @ 2017-10-01 14:00 UTC (permalink / raw)
To: network dev; +Cc: davem, Dmitry Kozlov, William Tu
As a ARPHRD_ETHER device, skb->len in erspan_xmit is the length
of the whole ether packet. So before checking if a packet size
exceeds the mtu, skb->len should subtract dev->hard_header_len.
Otherwise, all packets with max size according to mtu would be
trimmed to be truncated packet.
Fixes: 84e54fe0a5ea ("gre: introduce native tunnel support for ERSPAN")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/ipv4/ip_gre.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index b25b1e5..2a4ef9d 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -731,7 +731,7 @@ static netdev_tx_t erspan_xmit(struct sk_buff *skb,
if (skb_cow_head(skb, dev->needed_headroom))
goto free_skb;
- if (skb->len > dev->mtu) {
+ if (skb->len - dev->hard_header_len > dev->mtu) {
pskb_trim(skb, dev->mtu);
truncate = true;
}
--
2.1.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net 3/4] ip_gre: set tunnel hlen properly in erspan_tunnel_init
2017-10-01 14:00 ` [PATCH net 2/4] ip_gre: check packet length and mtu correctly in erspan_xmit Xin Long
@ 2017-10-01 14:00 ` Xin Long
2017-10-01 14:00 ` [PATCH net 4/4] ip_gre: erspan device should keep dst Xin Long
0 siblings, 1 reply; 6+ messages in thread
From: Xin Long @ 2017-10-01 14:00 UTC (permalink / raw)
To: network dev; +Cc: davem, Dmitry Kozlov, William Tu
According to __gre_tunnel_init, tunnel->hlen should be set as the
headers' length between inner packet and outer iphdr.
It would be used especially to calculate a proper mtu when updating
mtu in tnl_update_pmtu. Now without setting it, a bigger mtu value
than expected would be updated, which hurts performance a lot.
This patch is to fix it by setting tunnel->hlen with:
tunnel->tun_hlen + tunnel->encap_hlen + sizeof(struct erspanhdr)
Fixes: 84e54fe0a5ea ("gre: introduce native tunnel support for ERSPAN")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/ipv4/ip_gre.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 2a4ef9d..fad0bb1 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -1245,7 +1245,9 @@ static int erspan_tunnel_init(struct net_device *dev)
tunnel->tun_hlen = 8;
tunnel->parms.iph.protocol = IPPROTO_GRE;
- t_hlen = tunnel->hlen + sizeof(struct iphdr) + sizeof(struct erspanhdr);
+ tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen +
+ sizeof(struct erspanhdr);
+ t_hlen = tunnel->hlen + sizeof(struct iphdr);
dev->needed_headroom = LL_MAX_HEADER + t_hlen + 4;
dev->mtu = ETH_DATA_LEN - t_hlen - 4;
--
2.1.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net 4/4] ip_gre: erspan device should keep dst
2017-10-01 14:00 ` [PATCH net 3/4] ip_gre: set tunnel hlen properly in erspan_tunnel_init Xin Long
@ 2017-10-01 14:00 ` Xin Long
0 siblings, 0 replies; 6+ messages in thread
From: Xin Long @ 2017-10-01 14:00 UTC (permalink / raw)
To: network dev; +Cc: davem, Dmitry Kozlov, William Tu
The patch 'ip_gre: ipgre_tap device should keep dst' fixed
the issue ipgre_tap dev mtu couldn't be updated in tx path.
The same fix is needed for erspan as well.
Fixes: 84e54fe0a5ea ("gre: introduce native tunnel support for ERSPAN")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/ipv4/ip_gre.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index fad0bb1..467e44d 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -1254,6 +1254,7 @@ static int erspan_tunnel_init(struct net_device *dev)
dev->features |= GRE_FEATURES;
dev->hw_features |= GRE_FEATURES;
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
+ netif_keep_dst(dev);
return ip_tunnel_init(dev);
}
--
2.1.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net 0/4] ip_gre: a bunch of fixes for erspan
2017-10-01 14:00 [PATCH net 0/4] ip_gre: a bunch of fixes for erspan Xin Long
2017-10-01 14:00 ` [PATCH net 1/4] ip_gre: get key from session_id correctly in erspan_rcv Xin Long
@ 2017-10-02 5:32 ` David Miller
1 sibling, 0 replies; 6+ messages in thread
From: David Miller @ 2017-10-02 5:32 UTC (permalink / raw)
To: lucien.xin; +Cc: netdev, xeb, u9012063
From: Xin Long <lucien.xin@gmail.com>
Date: Sun, 1 Oct 2017 22:00:52 +0800
> This patchset is to fix some issues that could cause 0 or low
> performance, and even unexpected truncated packets on erspan.
Series applied, thanks.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-10-02 5:32 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-10-01 14:00 [PATCH net 0/4] ip_gre: a bunch of fixes for erspan Xin Long
2017-10-01 14:00 ` [PATCH net 1/4] ip_gre: get key from session_id correctly in erspan_rcv Xin Long
2017-10-01 14:00 ` [PATCH net 2/4] ip_gre: check packet length and mtu correctly in erspan_xmit Xin Long
2017-10-01 14:00 ` [PATCH net 3/4] ip_gre: set tunnel hlen properly in erspan_tunnel_init Xin Long
2017-10-01 14:00 ` [PATCH net 4/4] ip_gre: erspan device should keep dst Xin Long
2017-10-02 5:32 ` [PATCH net 0/4] ip_gre: a bunch of fixes for erspan David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).