geneve: fix options len parsing as 32-bits words 43/31843/2
authorMohammed Hawari <mohammed@hawari.fr>
Wed, 31 Mar 2021 15:26:19 +0000 (17:26 +0200)
committerDamjan Marion <dmarion@me.com>
Mon, 12 Apr 2021 16:00:25 +0000 (16:00 +0000)
See https://tools.ietf.org/html/rfc8926 3.4. second paragraph Opt Len

Change-Id: I191d835651b2fa64eeb4ec4271497cf3342554be
Signed-off-by: Mohammed Hawari <mohammed@hawari.fr>
Type: fix

src/plugins/geneve/geneve_packet.h

index a0d0687..fb21a31 100644 (file)
@@ -171,14 +171,15 @@ vnet_set_geneve_version (geneve_header_t * h, u8 version)
 static inline u8
 vnet_get_geneve_options_len (geneve_header_t * h)
 {
-  return ((h->first_word & GENEVE_OPTLEN_MASK) >> GENEVE_OPTLEN_SHIFT);
+  return ((h->first_word & GENEVE_OPTLEN_MASK) >> GENEVE_OPTLEN_SHIFT) << 2;
 }
 
 static inline void
 vnet_set_geneve_options_len (geneve_header_t * h, u8 len)
 {
+  ASSERT ((len & 0x3) == 0);
   h->first_word &= ~(GENEVE_OPTLEN_MASK);
-  h->first_word |= ((len << GENEVE_OPTLEN_SHIFT) & GENEVE_OPTLEN_MASK);
+  h->first_word |= ((len << (GENEVE_OPTLEN_SHIFT - 2)) & GENEVE_OPTLEN_MASK);
 }
 
 static inline u8