diff --git a/SOURCES/openvswitch-2.16.0.patch b/SOURCES/openvswitch-2.16.0.patch
index 768c771..21b015a 100644
--- a/SOURCES/openvswitch-2.16.0.patch
+++ b/SOURCES/openvswitch-2.16.0.patch
@@ -800,10 +800,15 @@ index b7d577870d..fe24f9abdf 100644
      return false;
  }
 diff --git a/lib/dpif-netdev-extract-avx512.c b/lib/dpif-netdev-extract-avx512.c
-index ec64419e38..8d8003b05f 100644
+index ec64419e38..77f28810c7 100644
 --- a/lib/dpif-netdev-extract-avx512.c
 +++ b/lib/dpif-netdev-extract-avx512.c
-@@ -161,6 +161,15 @@ _mm512_maskz_permutexvar_epi8_wrap(__mmask64 kmask, __m512i idx, __m512i a)
+@@ -157,10 +157,19 @@ _mm512_maskz_permutexvar_epi8_wrap(__mmask64 kmask, __m512i idx, __m512i a)
+   0, 0, 0, 0, /* Src IP */                                              \
+   0, 0, 0, 0, /* Dst IP */
+ 
+-#define PATTERN_IPV4_MASK PATTERN_IPV4_GEN(0xFF, 0xFE, 0xFF, 0xFF)
++#define PATTERN_IPV4_MASK PATTERN_IPV4_GEN(0xFF, 0xBF, 0xFF, 0xFF)
  #define PATTERN_IPV4_UDP PATTERN_IPV4_GEN(0x45, 0, 0, 0x11)
  #define PATTERN_IPV4_TCP PATTERN_IPV4_GEN(0x45, 0, 0, 0x06)
  
@@ -819,7 +824,52 @@ index ec64419e38..8d8003b05f 100644
  #define NU 0
  #define PATTERN_IPV4_UDP_SHUFFLE \
     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, NU, NU, /* Ether */ \
-@@ -320,8 +329,16 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] =
+@@ -217,6 +226,25 @@ _mm512_maskz_permutexvar_epi8_wrap(__mmask64 kmask, __m512i idx, __m512i a)
+ #define PATTERN_DT1Q_IPV4_TCP_KMASK \
+     (KMASK_ETHER | (KMASK_DT1Q << 16) | (KMASK_IPV4 << 24) | (KMASK_TCP << 40))
+ 
++/* Miniflow Strip post-processing masks.
++ * This allows unsetting specific bits from the resulting miniflow. It is used
++ * for e.g. IPv4 where the "DF" bit is never pushed to the miniflow itself.
++ * The NC define is for "No Change", allowing the bits to pass through.
++ */
++#define NC 0xFF
++
++#define PATTERN_STRIP_IPV4_MASK                                         \
++    NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC,     \
++    NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, 0xBF, NC, NC, NC,   \
++    NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC,     \
++    NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC
++
++#define PATTERN_STRIP_DOT1Q_IPV4_MASK                                   \
++    NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC,     \
++    NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC,     \
++    NC, NC, NC, NC, 0xBF, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC,   \
++    NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC
++
+ /* This union allows initializing static data as u8, but easily loading it
+  * into AVX512 registers too. The union ensures proper alignment for the zmm.
+  */
+@@ -241,8 +269,9 @@ struct mfex_profile {
+     union mfex_data probe_mask;
+     union mfex_data probe_data;
+ 
+-    /* Required for reshaping packet into miniflow. */
++    /* Required for reshaping packet into miniflow and post-processing it. */
+     union mfex_data store_shuf;
++    union mfex_data strip_mask;
+     __mmask64 store_kmsk;
+ 
+     /* Constant data to set in mf.bits and dp_packet data on hit. */
+@@ -310,6 +339,7 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] =
+         .probe_data.u8_data = { PATTERN_ETHERTYPE_IPV4 PATTERN_IPV4_UDP},
+ 
+         .store_shuf.u8_data = { PATTERN_IPV4_UDP_SHUFFLE },
++        .strip_mask.u8_data = { PATTERN_STRIP_IPV4_MASK },
+         .store_kmsk = PATTERN_IPV4_UDP_KMASK,
+ 
+         .mf_bits = { 0x18a0000000000000, 0x0000000000040401},
+@@ -320,10 +350,19 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] =
      },
  
      [PROFILE_ETH_IPV4_TCP] = {
@@ -837,8 +887,19 @@ index ec64419e38..8d8003b05f 100644
 +        },
  
          .store_shuf.u8_data = { PATTERN_IPV4_TCP_SHUFFLE },
++        .strip_mask.u8_data = { PATTERN_STRIP_IPV4_MASK },
          .store_kmsk = PATTERN_IPV4_TCP_KMASK,
-@@ -353,10 +370,16 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] =
+ 
+         .mf_bits = { 0x18a0000000000000, 0x0000000000044401},
+@@ -342,6 +381,7 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] =
+         },
+ 
+         .store_shuf.u8_data = { PATTERN_DT1Q_IPV4_UDP_SHUFFLE },
++        .strip_mask.u8_data = { PATTERN_STRIP_DOT1Q_IPV4_MASK },
+         .store_kmsk = PATTERN_DT1Q_IPV4_UDP_KMASK,
+ 
+         .mf_bits = { 0x38a0000000000000, 0x0000000000040401},
+@@ -353,20 +393,27 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] =
  
      [PROFILE_ETH_VLAN_IPV4_TCP] = {
          .probe_mask.u8_data = {
@@ -857,7 +918,19 @@ index ec64419e38..8d8003b05f 100644
          },
  
          .store_shuf.u8_data = { PATTERN_DT1Q_IPV4_TCP_SHUFFLE },
-@@ -374,16 +397,31 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] =
++        .strip_mask.u8_data = { PATTERN_STRIP_DOT1Q_IPV4_MASK },
+         .store_kmsk = PATTERN_DT1Q_IPV4_TCP_KMASK,
+ 
+         .mf_bits = { 0x38a0000000000000, 0x0000000000044401},
+         .dp_pkt_offs = {
+             14, UINT16_MAX, 18, 38,
+         },
+-        .dp_pkt_min_size = 46,
++        .dp_pkt_min_size = 58,
+     },
+ };
+ 
+@@ -374,16 +421,31 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] =
  /* Protocol specific helper functions, for calculating offsets/lenghts. */
  static int32_t
  mfex_ipv4_set_l2_pad_size(struct dp_packet *pkt, struct ip_header *nh,
@@ -898,7 +971,15 @@ index ec64419e38..8d8003b05f 100644
  }
  
  /* Fixup the VLAN CFI and PCP, reading the PCP from the input to this function,
-@@ -450,7 +488,14 @@ mfex_avx512_process(struct dp_packet_batch *packets,
+@@ -433,6 +495,7 @@ mfex_avx512_process(struct dp_packet_batch *packets,
+     __m512i v_vals = _mm512_loadu_si512(&profile->probe_data);
+     __m512i v_mask = _mm512_loadu_si512(&profile->probe_mask);
+     __m512i v_shuf = _mm512_loadu_si512(&profile->store_shuf);
++    __m512i v_strp = _mm512_loadu_si512(&profile->strip_mask);
+ 
+     __mmask64 k_shuf = profile->store_kmsk;
+     __m128i v_bits = _mm_loadu_si128((void *) &profile->mf_bits);
+@@ -450,10 +513,17 @@ mfex_avx512_process(struct dp_packet_batch *packets,
  
          /* Load packet data and probe with AVX512 mask & compare. */
          const uint8_t *pkt = dp_packet_data(packet);
@@ -913,8 +994,23 @@ index ec64419e38..8d8003b05f 100644
 +
          __m512i v_pkt0_masked = _mm512_and_si512(v_pkt0, v_mask);
          __mmask64 k_cmp = _mm512_cmpeq_epi8_mask(v_pkt0_masked, v_vals);
-         if (k_cmp != UINT64_MAX) {
-@@ -498,7 +543,8 @@ mfex_avx512_process(struct dp_packet_batch *packets,
+-        if (k_cmp != UINT64_MAX) {
++        if (OVS_UNLIKELY(k_cmp != UINT64_MAX)) {
+             continue;
+         }
+ 
+@@ -481,8 +551,9 @@ mfex_avx512_process(struct dp_packet_batch *packets,
+             v_blk0 = _mm512_maskz_permutex2var_epi8_skx(k_shuf, v_pkt0,
+                                                         v_shuf, v512_zeros);
+         }
+-        _mm512_storeu_si512(&blocks[2], v_blk0);
+ 
++        __m512i v_blk0_strip = _mm512_and_si512(v_blk0, v_strp);
++        _mm512_storeu_si512(&blocks[2], v_blk0_strip);
+ 
+         /* Perform "post-processing" per profile, handling details not easily
+          * handled in the above generic AVX512 code. Examples include TCP flag
+@@ -498,7 +569,8 @@ mfex_avx512_process(struct dp_packet_batch *packets,
  
                  uint32_t size_from_ipv4 = size - VLAN_ETH_HEADER_LEN;
                  struct ip_header *nh = (void *)&pkt[VLAN_ETH_HEADER_LEN];
@@ -924,7 +1020,7 @@ index ec64419e38..8d8003b05f 100644
                      continue;
                  }
  
-@@ -512,7 +558,8 @@ mfex_avx512_process(struct dp_packet_batch *packets,
+@@ -512,7 +584,8 @@ mfex_avx512_process(struct dp_packet_batch *packets,
  
                  uint32_t size_from_ipv4 = size - VLAN_ETH_HEADER_LEN;
                  struct ip_header *nh = (void *)&pkt[VLAN_ETH_HEADER_LEN];
@@ -934,7 +1030,7 @@ index ec64419e38..8d8003b05f 100644
                      continue;
                  }
              } break;
-@@ -525,7 +572,8 @@ mfex_avx512_process(struct dp_packet_batch *packets,
+@@ -525,7 +598,8 @@ mfex_avx512_process(struct dp_packet_batch *packets,
                  /* Handle dynamic l2_pad_size. */
                  uint32_t size_from_ipv4 = size - sizeof(struct eth_header);
                  struct ip_header *nh = (void *)&pkt[sizeof(struct eth_header)];
@@ -944,7 +1040,7 @@ index ec64419e38..8d8003b05f 100644
                      continue;
                  }
              } break;
-@@ -534,7 +582,8 @@ mfex_avx512_process(struct dp_packet_batch *packets,
+@@ -534,7 +608,8 @@ mfex_avx512_process(struct dp_packet_batch *packets,
                  /* Handle dynamic l2_pad_size. */
                  uint32_t size_from_ipv4 = size - sizeof(struct eth_header);
                  struct ip_header *nh = (void *)&pkt[sizeof(struct eth_header)];
diff --git a/SPECS/openvswitch2.16.spec b/SPECS/openvswitch2.16.spec
index cedf2fa..4d003d9 100644
--- a/SPECS/openvswitch2.16.spec
+++ b/SPECS/openvswitch2.16.spec
@@ -57,7 +57,7 @@ Summary: Open vSwitch
 Group: System Environment/Daemons daemon/database/utilities
 URL: http://www.openvswitch.org/
 Version: 2.16.0
-Release: 48%{?dist}
+Release: 49%{?dist}
 
 # Nearly all of openvswitch is ASL 2.0.  The bugtool is LGPLv2+, and the
 # lib/sflow*.[ch] files are SISSL
@@ -699,6 +699,12 @@ exit 0
 %endif
 
 %changelog
+* Tue Feb 08 2022 Open vSwitch CI <ovs-ci@redhat.com> - 2.16.0-49
+- Merging upstream branch-2.16 [RH git: 4541c91b99]
+    Commit list:
+    418e6a0b8e dpif-netdev: fix vlan and ipv4 parsing in avx512
+
+
 * Mon Feb 07 2022 Michael Santana <msantana@redhat.com> - 2.16.0-48
 - Merging upstream branch-2.16 [RH git: 9d51785142]
     Commit list: