diff mbox

vxlan: fix wrong usage of VXLAN_VID_MASK

Message ID 1426263233-27443-1-git-send-email-alexey.kodanev@oracle.com
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Alexey Kodanev March 13, 2015, 4:13 p.m. UTC
commit dfd8645ea1bd9127 wrongly assumes that VXLAN_VDI_MASK includes
eight lower order reserved bits of VNI field that are using for remote
checksum offload.

Right now, when VNI number greater then 0xffff, vxlan_udp_encap_recv()
will always return with 'bad_flag' error, reducing the usable vni range
from 0..16777215 to 0..65535. Also, it doesn't really check whether RCO
bits processed or not.

Fix it by adding new VNI mask which has all 32 bits of VNI field:
24 bits for id and 8 bits for other usage.

Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com>
---
 drivers/net/vxlan.c |    4 ++--
 include/net/vxlan.h |    1 +
 2 files changed, 3 insertions(+), 2 deletions(-)

Comments

David Miller March 13, 2015, 5:08 p.m. UTC | #1
From: Alexey Kodanev <alexey.kodanev@oracle.com>
Date: Fri, 13 Mar 2015 19:13:53 +0300

> commit dfd8645ea1bd9127 wrongly assumes that VXLAN_VDI_MASK includes
> eight lower order reserved bits of VNI field that are using for remote
> checksum offload.
> 
> Right now, when VNI number greater then 0xffff, vxlan_udp_encap_recv()
> will always return with 'bad_flag' error, reducing the usable vni range
> from 0..16777215 to 0..65535. Also, it doesn't really check whether RCO
> bits processed or not.
> 
> Fix it by adding new VNI mask which has all 32 bits of VNI field:
> 24 bits for id and 8 bits for other usage.
> 
> Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com>

Looks good, applied, thanks!
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 1e0a775..f8528a4 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -1218,7 +1218,7 @@  static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
 			goto drop;
 
 		flags &= ~VXLAN_HF_RCO;
-		vni &= VXLAN_VID_MASK;
+		vni &= VXLAN_VNI_MASK;
 	}
 
 	/* For backwards compatibility, only allow reserved fields to be
@@ -1239,7 +1239,7 @@  static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
 		flags &= ~VXLAN_GBP_USED_BITS;
 	}
 
-	if (flags || (vni & ~VXLAN_VID_MASK)) {
+	if (flags || vni & ~VXLAN_VNI_MASK) {
 		/* If there are any unprocessed flags remaining treat
 		 * this as a malformed packet. This behavior diverges from
 		 * VXLAN RFC (RFC7348) which stipulates that bits in reserved
diff --git a/include/net/vxlan.h b/include/net/vxlan.h
index eabd3a0..c73e7ab 100644
--- a/include/net/vxlan.h
+++ b/include/net/vxlan.h
@@ -91,6 +91,7 @@  struct vxlanhdr {
 
 #define VXLAN_N_VID     (1u << 24)
 #define VXLAN_VID_MASK  (VXLAN_N_VID - 1)
+#define VXLAN_VNI_MASK  (VXLAN_VID_MASK << 8)
 #define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr))
 
 struct vxlan_metadata {