diff --git a/SOURCES/openvswitch-2.17.0.patch b/SOURCES/openvswitch-2.17.0.patch
index 78257c4..0e63353 100644
--- a/SOURCES/openvswitch-2.17.0.patch
+++ b/SOURCES/openvswitch-2.17.0.patch
@@ -50531,6 +50531,21 @@ index 8ad5eeb327..6272d340cf 100644
  
  /* Inline implementations. */
  
+diff --git a/include/openvswitch/meta-flow.h b/include/openvswitch/meta-flow.h
+index 045dce8f5f..3b0220aaa2 100644
+--- a/include/openvswitch/meta-flow.h
++++ b/include/openvswitch/meta-flow.h
+@@ -2366,6 +2366,10 @@ void mf_format_subvalue(const union mf_subvalue *subvalue, struct ds *s);
+ void field_array_set(enum mf_field_id id, const union mf_value *,
+                      struct field_array *);
+ 
++/* Mask the required l3 prerequisites if a 'set' action occurs. */
++void mf_set_mask_l3_prereqs(const struct mf_field *, const struct flow *,
++                            struct flow_wildcards *);
++
+ #ifdef __cplusplus
+ }
+ #endif
 diff --git a/include/openvswitch/ofp-actions.h b/include/openvswitch/ofp-actions.h
 index 41bcb55d20..b7231c7bb3 100644
 --- a/include/openvswitch/ofp-actions.h
@@ -53518,7 +53533,7 @@ index 6730301b67..029ca28558 100644
              mcast_snooping_flush_mrouter(m);
              ms->need_revalidate = true;
 diff --git a/lib/meta-flow.c b/lib/meta-flow.c
-index e03cd8d0c5..c576ae6202 100644
+index e03cd8d0c5..474344194f 100644
 --- a/lib/meta-flow.c
 +++ b/lib/meta-flow.c
 @@ -3442,7 +3442,9 @@ mf_get_vl_mff(const struct mf_field *mff,
@@ -53532,6 +53547,35 @@ index e03cd8d0c5..c576ae6202 100644
      }
  
      return NULL;
+@@ -3674,3 +3676,28 @@ mf_bitmap_not(struct mf_bitmap x)
+     bitmap_not(x.bm, MFF_N_IDS);
+     return x;
+ }
++
++void
++mf_set_mask_l3_prereqs(const struct mf_field *mf, const struct flow *fl,
++                       struct flow_wildcards *wc)
++{
++    if (is_ip_any(fl) &&
++        ((mf->id == MFF_IPV4_SRC) ||
++         (mf->id == MFF_IPV4_DST) ||
++         (mf->id == MFF_IPV6_SRC) ||
++         (mf->id == MFF_IPV6_DST) ||
++         (mf->id == MFF_IPV6_LABEL) ||
++         (mf->id == MFF_IP_DSCP) ||
++         (mf->id == MFF_IP_ECN) ||
++         (mf->id == MFF_IP_TTL))) {
++        WC_MASK_FIELD(wc, nw_proto);
++    } else if ((fl->dl_type == htons(ETH_TYPE_ARP)) &&
++               ((mf->id == MFF_ARP_OP) ||
++                (mf->id == MFF_ARP_SHA) ||
++                (mf->id == MFF_ARP_THA) ||
++                (mf->id == MFF_ARP_SPA) ||
++                (mf->id == MFF_ARP_TPA))) {
++        /* mask only the lower 8 bits. */
++        wc->masks.nw_proto = 0xff;
++    }
++}
 diff --git a/lib/namemap.c b/lib/namemap.c
 index 785cda4c27..dd317ea52e 100644
 --- a/lib/namemap.c
@@ -59223,7 +59267,7 @@ index 114aff8ea3..0fc6d2ea60 100644
      enum xc_type type;
      union {
 diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
-index 578cbfe581..97614ec4d7 100644
+index 578cbfe581..ae5e29de7f 100644
 --- a/ofproto/ofproto-dpif-xlate.c
 +++ b/ofproto/ofproto-dpif-xlate.c
 @@ -865,7 +865,7 @@ xlate_xbridge_init(struct xlate_cfg *xcfg, struct xbridge *xbridge)
@@ -59535,7 +59579,15 @@ index 578cbfe581..97614ec4d7 100644
                  return b;
              }
          }
-@@ -5622,7 +5688,8 @@ xlate_sample_action(struct xlate_ctx *ctx,
+@@ -5120,6 +5186,7 @@ compose_dec_ttl(struct xlate_ctx *ctx, struct ofpact_cnt_ids *ids)
+     }
+ 
+     ctx->wc->masks.nw_ttl = 0xff;
++    WC_MASK_FIELD(ctx->wc, nw_proto);
+     if (flow->nw_ttl > 1) {
+         flow->nw_ttl--;
+         return false;
+@@ -5622,7 +5689,8 @@ xlate_sample_action(struct xlate_ctx *ctx,
  
      /* Scale the probability from 16-bit to 32-bit while representing
       * the same percentage. */
@@ -59545,7 +59597,62 @@ index 578cbfe581..97614ec4d7 100644
  
      /* If ofp_port in flow sample action is equel to ofp_port,
       * this sample action is a input port action. */
-@@ -7609,6 +7676,43 @@ xlate_wc_finish(struct xlate_ctx *ctx)
+@@ -7027,6 +7095,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+         case OFPACT_SET_IPV4_SRC:
+             if (flow->dl_type == htons(ETH_TYPE_IP)) {
+                 memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src);
++                WC_MASK_FIELD(wc, nw_proto);
+                 flow->nw_src = ofpact_get_SET_IPV4_SRC(a)->ipv4;
+             }
+             break;
+@@ -7034,12 +7103,14 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+         case OFPACT_SET_IPV4_DST:
+             if (flow->dl_type == htons(ETH_TYPE_IP)) {
+                 memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst);
++                WC_MASK_FIELD(wc, nw_proto);
+                 flow->nw_dst = ofpact_get_SET_IPV4_DST(a)->ipv4;
+             }
+             break;
+ 
+         case OFPACT_SET_IP_DSCP:
+             if (is_ip_any(flow)) {
++                WC_MASK_FIELD(wc, nw_proto);
+                 wc->masks.nw_tos |= IP_DSCP_MASK;
+                 flow->nw_tos &= ~IP_DSCP_MASK;
+                 flow->nw_tos |= ofpact_get_SET_IP_DSCP(a)->dscp;
+@@ -7048,6 +7119,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+ 
+         case OFPACT_SET_IP_ECN:
+             if (is_ip_any(flow)) {
++                WC_MASK_FIELD(wc, nw_proto);
+                 wc->masks.nw_tos |= IP_ECN_MASK;
+                 flow->nw_tos &= ~IP_ECN_MASK;
+                 flow->nw_tos |= ofpact_get_SET_IP_ECN(a)->ecn;
+@@ -7056,6 +7128,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+ 
+         case OFPACT_SET_IP_TTL:
+             if (is_ip_any(flow)) {
++                WC_MASK_FIELD(wc, nw_proto);
+                 wc->masks.nw_ttl = 0xff;
+                 flow->nw_ttl = ofpact_get_SET_IP_TTL(a)->ttl;
+             }
+@@ -7123,6 +7196,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+ 
+             /* Set the field only if the packet actually has it. */
+             if (mf_are_prereqs_ok(mf, flow, wc)) {
++                mf_set_mask_l3_prereqs(mf, flow, wc);
+                 mf_mask_field_masked(mf, ofpact_set_field_mask(set_field), wc);
+                 mf_set_flow_value_masked(mf, set_field->value,
+                                          ofpact_set_field_mask(set_field),
+@@ -7179,6 +7253,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+ 
+         case OFPACT_DEC_TTL:
+             wc->masks.nw_ttl = 0xff;
++            WC_MASK_FIELD(wc, nw_proto);
+             if (compose_dec_ttl(ctx, ofpact_get_DEC_TTL(a))) {
+                 return;
+             }
+@@ -7609,6 +7684,43 @@ xlate_wc_finish(struct xlate_ctx *ctx)
              ctx->wc->masks.vlans[i].tci = 0;
          }
      }
@@ -59589,7 +59696,7 @@ index 578cbfe581..97614ec4d7 100644
  }
  
  /* Translates the flow, actions, or rule in 'xin' into datapath actions in
-@@ -7784,6 +7888,12 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout)
+@@ -7784,6 +7896,12 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout)
          goto exit;
      }
  
@@ -59602,7 +59709,7 @@ index 578cbfe581..97614ec4d7 100644
      /* Tunnel metadata in udpif format must be normalized before translation. */
      if (flow->tunnel.flags & FLOW_TNL_F_UDPIF) {
          const struct tun_table *tun_tab = ofproto_get_tun_tab(
-@@ -8030,6 +8140,10 @@ exit:
+@@ -8030,6 +8148,10 @@ exit:
          if (xin->odp_actions) {
              ofpbuf_clear(xin->odp_actions);
          }
@@ -63678,7 +63785,7 @@ index 2c7e163bd6..7be6628c34 100644
  AT_CLEANUP
  
 diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
-index 7c2edeb9d4..cc5340f376 100644
+index 7c2edeb9d4..b91fe9e41c 100644
 --- a/tests/ofproto-dpif.at
 +++ b/tests/ofproto-dpif.at
 @@ -29,6 +29,58 @@ AT_CHECK([ovs-appctl revalidator/wait])
@@ -63980,15 +64087,18 @@ index 7c2edeb9d4..cc5340f376 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10,11
  ])
-@@ -600,7 +718,7 @@ table=1 ip actions=write_actions(output(13)),goto_table(2)
+@@ -600,9 +718,9 @@ table=1 ip actions=write_actions(output(13)),goto_table(2)
  table=2 ip actions=set_field:192.168.3.91->ip_src,output(11)
  ])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
 -AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
 +AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,nw_frag=no,icmp_type=8,icmp_code=0'], [0], [stdout])
  AT_CHECK([tail -2 stdout], [0],
-   [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_src=192.168.0.1,nw_frag=no
+-  [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_src=192.168.0.1,nw_frag=no
++  [Megaflow: recirc_id=0,eth,icmp,in_port=1,nw_src=192.168.0.1,nw_frag=no
  Datapath actions: 10,set(ipv4(src=192.168.3.91)),11,set(ipv4(src=192.168.3.90)),13
+ ])
+ OVS_VSWITCHD_STOP
 @@ -617,7 +735,7 @@ table=1 icmp6 actions=write_actions(output(13)),goto_table(2)
  table=2 in_port=1,icmp6,icmpv6_type=135 actions=set_field:fe80::4->nd_target,set_field:cc:cc:cc:cc:cc:cc->nd_sll,output(11)
  ])
@@ -64016,7 +64126,7 @@ index 7c2edeb9d4..cc5340f376 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: set(ipv4(src=192.168.3.90)),10,set(ipv4(src=192.168.0.1)),11
  ])
-@@ -661,7 +779,7 @@ OVS_VSWITCHD_START
+@@ -661,11 +779,11 @@ OVS_VSWITCHD_START
  add_of_ports br0 1 10 11
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
@@ -64025,6 +64135,11 @@ index 7c2edeb9d4..cc5340f376 100644
  # Must match on the source address to be able to restore it's value for
  # the second bucket
  AT_CHECK([tail -2 stdout], [0],
+-  [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_src=192.168.0.1,nw_frag=no
++  [Megaflow: recirc_id=0,eth,icmp,in_port=1,nw_src=192.168.0.1,nw_frag=no
+ Datapath actions: set(ipv4(src=192.168.3.90)),10,set(ipv4(src=192.168.0.1)),11
+ ])
+ OVS_VSWITCHD_STOP
 @@ -676,7 +794,7 @@ OVS_VSWITCHD_START
  add_of_ports br0 1 10
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
@@ -64034,7 +64149,16 @@ index 7c2edeb9d4..cc5340f376 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10
  ])
-@@ -708,7 +826,7 @@ OVS_VSWITCHD_START
+@@ -697,7 +815,7 @@ done
+ AT_CHECK([ovs-appctl dpctl/dump-flows | sed 's/dp_hash(.*\/0xf)/dp_hash(0xXXXX\/0xf)/' |  sed 's/packets.*actions:/actions:/' | strip_ufid | strip_used | sort], [0], [dnl
+ flow-dump from the main thread:
+ recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(frag=no), actions:hash(sym_l4(0)),recirc(0x1)
+-recirc_id(0x1),dp_hash(0xXXXX/0xf),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(src=192.168.0.1,frag=no), actions:set(ipv4(src=192.168.3.90)),10,set(ipv4(src=192.168.0.1)),10
++recirc_id(0x1),dp_hash(0xXXXX/0xf),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(src=192.168.0.1,proto=1,frag=no), actions:set(ipv4(src=192.168.3.90)),10,set(ipv4(src=192.168.0.1)),10
+ ])
+ 
+ OVS_VSWITCHD_STOP
+@@ -708,11 +826,11 @@ OVS_VSWITCHD_START
  add_of_ports br0 1 10 11
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
@@ -64043,6 +64167,11 @@ index 7c2edeb9d4..cc5340f376 100644
  # Must match on the source address to be able to restore it's value for
  # the third bucket
  AT_CHECK([tail -2 stdout], [0],
+-  [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_src=192.168.0.1,nw_frag=no
++  [Megaflow: recirc_id=0,eth,icmp,in_port=1,nw_src=192.168.0.1,nw_frag=no
+ Datapath actions: set(ipv4(src=192.168.3.90)),10,set(ipv4(src=192.168.0.1)),11
+ ])
+ OVS_VSWITCHD_STOP
 @@ -723,7 +841,7 @@ OVS_VSWITCHD_START
  add_of_ports br0 1 10
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
@@ -64084,15 +64213,29 @@ index 7c2edeb9d4..cc5340f376 100644
  AT_CHECK([tail -2 stdout], [0],
    [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_src=192.168.0.1,nw_frag=no
  Datapath actions: set(ipv4(src=255.255.255.255)),10,set(ipv4(src=192.168.0.1)),11
-@@ -1288,7 +1406,7 @@ table=1 in_port=1 action=dec_ttl,output:3
+@@ -1288,18 +1406,18 @@ table=1 in_port=1 action=dec_ttl,output:3
  AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
  AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=2,frag=no)' -generate], [0], [stdout])
  AT_CHECK([tail -4 stdout], [0], [
 -Final flow: ip,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=111,nw_tos=0,nw_ecn=0,nw_ttl=1
+-Megaflow: recirc_id=0,eth,ip,in_port=1,nw_ttl=2,nw_frag=no
 +Final flow: ip,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=111,nw_tos=0,nw_ecn=0,nw_ttl=1,nw_frag=no
- Megaflow: recirc_id=0,eth,ip,in_port=1,nw_ttl=2,nw_frag=no
++Megaflow: recirc_id=0,eth,ip,in_port=1,nw_proto=111,nw_ttl=2,nw_frag=no
  Datapath actions: set(ipv4(ttl=1)),2,userspace(pid=0,controller(reason=2,dont_send=0,continuation=0,recirc_id=1,rule_cookie=0,controller_id=0,max_len=65535)),4
  ])
+ AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=3,frag=no)'], [0], [stdout])
+ AT_CHECK([tail -2 stdout], [0],
+-  [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_ttl=3,nw_frag=no
++  [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_proto=111,nw_ttl=3,nw_frag=no
+ Datapath actions: set(ipv4(ttl=2)),2,set(ipv4(ttl=1)),3,4
+ ])
+ AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x86dd),ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'], [0], [stdout])
+ AT_CHECK([tail -2 stdout], [0],
+-  [Megaflow: recirc_id=0,eth,ipv6,in_port=1,nw_ttl=128,nw_frag=no
++  [Megaflow: recirc_id=0,eth,ipv6,in_port=1,nw_proto=10,nw_ttl=128,nw_frag=no
+ Datapath actions: set(ipv6(hlimit=127)),2,set(ipv6(hlimit=126)),3,4
+ ])
+ 
 @@ -1311,7 +1429,7 @@ ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:
  OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
@@ -64102,6 +64245,15 @@ index 7c2edeb9d4..cc5340f376 100644
  ])
  OVS_VSWITCHD_STOP
  AT_CLEANUP
+@@ -1409,7 +1527,7 @@ AT_CHECK([ovs-vsctl -- \
+         --id=@q2 create Queue dscp=2], [0], [ignore])
+ AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(9),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
+ AT_CHECK([tail -2 stdout], [0],
+-  [Megaflow: recirc_id=0,skb_priority=0,eth,ip,in_port=9,nw_tos=252,nw_frag=no
++  [Megaflow: recirc_id=0,skb_priority=0,eth,icmp,in_port=9,nw_tos=252,nw_frag=no
+ Datapath actions: dnl
+ 100,dnl
+ set(ipv4(tos=0x4/0xfc)),set(skb_priority(0x1)),1,dnl
 @@ -1497,13 +1615,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
  OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
@@ -65312,6 +65464,15 @@ index 7c2edeb9d4..cc5340f376 100644
  ])
  
  OVS_VSWITCHD_STOP
+@@ -11504,7 +11737,7 @@ ovs-ofctl dump-flows br0
+ 
+ AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.10.10.2,dst=10.10.10.1,proto=1,tos=1,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
+ AT_CHECK([tail -3 stdout], [0], [dnl
+-Megaflow: recirc_id=0,eth,ip,reg0=0/0x1,in_port=1,nw_src=10.10.10.2,nw_frag=no
++Megaflow: recirc_id=0,eth,icmp,reg0=0/0x1,in_port=1,nw_src=10.10.10.2,nw_frag=no
+ Datapath actions: drop
+ Translation failed (Recursion too deep), packet is dropped.
+ ])
 diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at
 index 736d9809cb..b18f0fbc1e 100644
 --- a/tests/ofproto-macros.at
@@ -65355,7 +65516,7 @@ index 736d9809cb..b18f0fbc1e 100644
  /|ERR|/p
  /|EMER|/p" ${logs}
 diff --git a/tests/ofproto.at b/tests/ofproto.at
-index 156d3e058c..39c3b04704 100644
+index 156d3e058c..32bde5b5a2 100644
 --- a/tests/ofproto.at
 +++ b/tests/ofproto.at
 @@ -3108,7 +3108,7 @@ vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
@@ -65403,6 +65564,192 @@ index 156d3e058c..39c3b04704 100644
  OFPT_BARRIER_REPLY (OF1.3):
  ])
  
+@@ -6448,3 +6448,185 @@ verify_deleted
+ 
+ OVS_VSWITCHD_STOP(["/<invalid/d"])
+ AT_CLEANUP
++
++AT_SETUP([ofproto - implicit mask of ipv4 proto with invalid proto field])
++OVS_VSWITCHD_START
++add_of_ports br0 1 2
++
++AT_DATA([flows.txt], [dnl
++table=0 in_port=1 priority=90,ip,nw_dst=192.168.1.20,actions=mod_nw_dst:192.168.20.20,output=2
++table=0 in_port=1 priority=89,ip,nw_dst=192.168.1.21,actions=mod_nw_src:192.168.20.21,output=2
++table=0 in_port=1 priority=88,ip,nw_dst=192.168.1.10,actions=dec_ttl,output=2
++table=0 in_port=1 priority=87,ip,nw_dst=192.168.1.19,actions=mod_nw_ttl:8,output=2
++table=0 in_port=1 priority=86,ip,nw_dst=192.168.1.18,actions=mod_nw_ecn:2,output=2
++table=0 in_port=1 priority=85,ip,nw_dst=192.168.1.17,actions=mod_nw_tos:0x40,output=2
++table=0 in_port=1 priority=84,ip,nw_dst=192.168.1.16,actions=set_field:192.168.20.26->nw_dst,output=2
++table=0 in_port=1 priority=83,ip,nw_dst=192.168.1.15,actions=set_field:192.168.21.26->nw_src,output=2
++table=0 in_port=1 priority=82,ip,nw_dst=192.168.1.14,actions=set_field:0x40->nw_tos,output=2
++table=0 in_port=1 priority=0,actions=drop
++])
++AT_CHECK([ovs-ofctl del-flows br0])
++AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
++
++dnl send a proto 0 packet to try and poison the DP flow path
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 \
++ '5054000000075054000000050800450000548de140004000289fc0a801c4c0a8011408003bf60002001bbf080a640000000032ad010000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637'])
++
++AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [dnl
++flow-dump from the main thread:
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(dst=192.168.1.20,proto=0,frag=no), packets:0, bytes:0, used:never, actions:2
++])
++
++dnl Send ICMP for mod nw_src and mod nw_dst
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=192.168.1.1,dst=192.168.1.21,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=192.168.1.1,dst=192.168.1.20,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
++
++dnl send ICMP that will dec TTL
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=192.168.1.1,dst=192.168.1.10,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
++
++dnl send ICMP that will mod TTL
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=192.168.1.1,dst=192.168.1.19,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
++
++dnl send ICMP that will mod ECN
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=192.168.1.1,dst=192.168.1.18,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
++
++dnl send ICMP that will mod TOS
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=192.168.1.1,dst=192.168.1.17,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
++
++dnl send ICMP that will set DST
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=192.168.1.1,dst=192.168.1.16,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
++
++dnl send ICMP that will set SRC
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=192.168.1.1,dst=192.168.1.15,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
++
++dnl send ICMP that will set TOS
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=192.168.1.1,dst=192.168.1.14,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
++
++AT_CHECK([ovs-appctl dpctl/dump-flows | sort], [0], [dnl
++flow-dump from the main thread:
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(dst=192.168.1.10,proto=1,ttl=64,frag=no), packets:0, bytes:0, used:never, actions:set(ipv4(ttl=63)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(dst=192.168.1.14,proto=1,tos=0/0xfc,frag=no), packets:0, bytes:0, used:never, actions:set(ipv4(tos=0x40/0xfc)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(dst=192.168.1.16,proto=1,frag=no), packets:0, bytes:0, used:never, actions:set(ipv4(dst=192.168.20.26)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(dst=192.168.1.17,proto=1,tos=0/0xfc,frag=no), packets:0, bytes:0, used:never, actions:set(ipv4(tos=0x40/0xfc)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(dst=192.168.1.18,proto=1,tos=0/0x3,frag=no), packets:0, bytes:0, used:never, actions:set(ipv4(tos=0x2/0x3)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(dst=192.168.1.19,proto=1,ttl=64,frag=no), packets:0, bytes:0, used:never, actions:set(ipv4(ttl=8)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(dst=192.168.1.20,proto=0,frag=no), packets:0, bytes:0, used:never, actions:2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(dst=192.168.1.20,proto=1,frag=no), packets:0, bytes:0, used:never, actions:set(ipv4(dst=192.168.20.20)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(src=192.168.1.1,dst=192.168.1.15,proto=1,frag=no), packets:0, bytes:0, used:never, actions:set(ipv4(src=192.168.21.26)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(src=192.168.1.1,dst=192.168.1.21,proto=1,frag=no), packets:0, bytes:0, used:never, actions:set(ipv4(src=192.168.20.21)),2
++])
++
++OVS_VSWITCHD_STOP
++AT_CLEANUP
++
++AT_SETUP([ofproto - implicit mask of ipv6 proto with HOPOPT field])
++OVS_VSWITCHD_START
++add_of_ports br0 1 2
++
++AT_DATA([flows.txt], [dnl
++table=0 in_port=1 priority=77,ip6,ipv6_dst=111:db8::3,actions=dec_ttl,output=2
++table=0 in_port=1 priority=76,ip6,ipv6_dst=111:db8::4,actions=mod_nw_ttl:8,output=2
++table=0 in_port=1 priority=75,ip6,ipv6_dst=111:db8::5,actions=mod_nw_ecn:2,output=2
++table=0 in_port=1 priority=74,ip6,ipv6_dst=111:db8::6,actions=mod_nw_tos:0x40,output=2
++table=0 in_port=1 priority=73,ip6,ipv6_dst=111:db8::7,actions=set_field:2112:db8::2->ipv6_dst,output=2
++table=0 in_port=1 priority=72,ip6,ipv6_dst=111:db8::8,actions=set_field:2112:db8::3->ipv6_src,output=2
++table=0 in_port=1 priority=72,ip6,ipv6_dst=111:db8::9,actions=set_field:44->ipv6_label,output=2
++table=0 in_port=1 priority=0,actions=drop
++])
++AT_CHECK([ovs-ofctl del-flows br0])
++AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
++
++dnl send a proto 0 packet to try and poison the DP flow path
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x86dd),ipv6(src=2001:db8::1,dst=111:db8::3,proto=0,tclass=0,hlimit=64,frag=no)'])
++
++AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [dnl
++flow-dump from the main thread:
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x86dd),ipv6(dst=111:db8::3,proto=0,hlimit=0,frag=no), packets:0, bytes:0, used:never, actions:userspace(pid=0,controller(reason=2,dont_send=0,continuation=0,recirc_id=1,rule_cookie=0,controller_id=0,max_len=65535))
++])
++
++dnl Send ICMP for mod nw_src and mod nw_dst
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x86dd),ipv6(src=2001:db8::1,dst=111:db8::3,proto=1,tclass=0,hlimit=64,frag=no),icmpv6(type=0,code=8)'])
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x86dd),ipv6(src=2001:db8::1,dst=111:db8::4,proto=1,tclass=0,hlimit=64,frag=no),icmpv6(type=0,code=8)'])
++
++dnl send ICMP that will dec TTL
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x86dd),ipv6(src=2001:db8::1,dst=111:db8::5,proto=1,tclass=0,hlimit=64,frag=no),icmpv6(type=0,code=8)'])
++
++dnl send ICMP that will mod TTL
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x86dd),ipv6(src=2001:db8::1,dst=111:db8::6,proto=1,tclass=0,hlimit=64,frag=no),icmpv6(type=0,code=8)'])
++
++dnl send ICMP that will mod ECN
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x86dd),ipv6(src=2001:db8::1,dst=111:db8::7,proto=1,tclass=0,hlimit=64,frag=no),icmpv6(type=0,code=8)'])
++
++dnl send ICMP that will mod TOS
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x86dd),ipv6(src=2001:db8::1,dst=111:db8::8,proto=1,tclass=0,hlimit=64,frag=no),icmpv6(type=0,code=8)'])
++
++dnl send ICMP that will set LABEL
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x86dd),ipv6(src=2001:db8::1,dst=111:db8::9,proto=1,tclass=0,hlimit=64,frag=no),icmpv6(type=0,code=8)'])
++
++AT_CHECK([ovs-appctl dpctl/dump-flows | sort], [0], [dnl
++flow-dump from the main thread:
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x86dd),ipv6(dst=111:db8::3,proto=0,hlimit=0,frag=no), packets:0, bytes:0, used:never, actions:userspace(pid=0,controller(reason=2,dont_send=0,continuation=0,recirc_id=1,rule_cookie=0,controller_id=0,max_len=65535))
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x86dd),ipv6(dst=111:db8::3,proto=1,hlimit=64,frag=no), packets:0, bytes:0, used:never, actions:set(ipv6(hlimit=63)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x86dd),ipv6(dst=111:db8::4,proto=1,hlimit=64,frag=no), packets:0, bytes:0, used:never, actions:set(ipv6(hlimit=8)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x86dd),ipv6(dst=111:db8::5,proto=1,tclass=0/0x3,frag=no), packets:0, bytes:0, used:never, actions:set(ipv6(tclass=0x2/0x3)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x86dd),ipv6(dst=111:db8::6,proto=1,tclass=0/0xfc,frag=no), packets:0, bytes:0, used:never, actions:set(ipv6(tclass=0x40/0xfc)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x86dd),ipv6(dst=111:db8::7,proto=1,frag=no), packets:0, bytes:0, used:never, actions:set(ipv6(dst=2112:db8::2)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x86dd),ipv6(dst=111:db8::9,label=0,proto=1,frag=no), packets:0, bytes:0, used:never, actions:set(ipv6(label=0x2c)),2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x86dd),ipv6(src=2001:db8::1,dst=111:db8::8,proto=1,frag=no), packets:0, bytes:0, used:never, actions:set(ipv6(src=2112:db8::3)),2
++])
++
++OVS_VSWITCHD_STOP
++AT_CLEANUP
++
++AT_SETUP([ofproto - implicit mask of ARP OPer field])
++OVS_VSWITCHD_START
++add_of_ports br0 1 2
++
++AT_DATA([flows.txt], [dnl
++table=0 in_port=1 priority=77,arp,arp_sha=00:01:02:03:04:06,actions=set_field:0x1->arp_op,2
++table=0 in_port=1 priority=76,arp,arp_sha=00:01:02:03:04:07,actions=set_field:00:02:03:04:05:06->arp_sha,2
++table=0 in_port=1 priority=75,arp,arp_sha=00:01:02:03:04:08,actions=set_field:ff:00:00:00:00:ff->arp_tha,2
++table=0 in_port=1 priority=74,arp,arp_sha=00:01:02:03:04:09,actions=set_field:172.31.110.26->arp_spa,2
++table=0 in_port=1 priority=73,arp,arp_sha=00:01:02:03:04:0a,actions=set_field:172.31.110.10->arp_tpa,2
++table=0 in_port=1 priority=1,actions=drop
++])
++
++AT_CHECK([ovs-ofctl del-flows br0])
++AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
++
++dnl Send op == 0 packet
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 \
++ 'ffffffffffffaa55aa550000080600010800060400000001020304070c0a00010000000000000c0a0002'])
++
++AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [dnl
++flow-dump from the main thread:
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0806),arp(op=0,sha=00:01:02:03:04:07), packets:0, bytes:0, used:never, actions:2
++])
++
++dnl Send op 2 -> set op
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0806),arp(sip=172.31.110.1,tip=172.31.110.25,op=2,sha=00:01:02:03:04:06,tha=ff:ff:ff:ff:ff:ff)'])
++
++dnl Send op 1 -> set SHA
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0806),arp(sip=172.31.110.1,tip=172.31.110.25,op=1,sha=00:01:02:03:04:07,tha=ff:ff:ff:ff:ff:ff)'])
++
++dnl Send op 1 -> set THA
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0806),arp(sip=172.31.110.1,tip=172.31.110.25,op=1,sha=00:01:02:03:04:08,tha=ff:ff:ff:ff:ff:ff)'])
++
++dnl Send op 1 -> set SIP
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0806),arp(sip=172.31.110.1,tip=172.31.110.25,op=1,sha=00:01:02:03:04:09,tha=ff:ff:ff:ff:ff:ff)'])
++
++dnl Send op 1 -> set TIP
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0806),arp(sip=172.31.110.1,tip=172.31.110.25,op=1,sha=00:01:02:03:04:0a,tha=ff:ff:ff:ff:ff:ff)'])
++
++AT_CHECK([ovs-appctl dpctl/dump-flows | sort], [0], [dnl
++flow-dump from the main thread:
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0806),arp(op=0,sha=00:01:02:03:04:07), packets:0, bytes:0, used:never, actions:2
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0806),arp(op=1,sha=00:01:02:03:04:07), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(action))
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0806),arp(op=1,sha=00:01:02:03:04:08,tha=ff:ff:ff:ff:ff:ff), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(action))
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0806),arp(op=2,sha=00:01:02:03:04:06), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(action))
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0806),arp(sip=172.31.110.1,op=1,sha=00:01:02:03:04:09), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(action))
++recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0806),arp(tip=172.31.110.25,op=1,sha=00:01:02:03:04:0a), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(action))
++])
++
++OVS_VSWITCHD_STOP
++AT_CLEANUP
 diff --git a/tests/ovs-macros.at b/tests/ovs-macros.at
 index 66545da572..d09dbb4cd5 100644
 --- a/tests/ovs-macros.at
@@ -66515,7 +66862,7 @@ index 876cb836cd..4a183bf186 100644
              db.tmp], [0], [stdout], [stderr])
  PARSE_LISTENING_PORT([listener.log], [BAD_TCP_PORT])
 diff --git a/tests/packet-type-aware.at b/tests/packet-type-aware.at
-index 054dcc9ccf..3b5c66fe52 100644
+index 054dcc9ccf..d63528e69e 100644
 --- a/tests/packet-type-aware.at
 +++ b/tests/packet-type-aware.at
 @@ -326,7 +326,7 @@ ovs-appctl time/warp 1000
@@ -66613,6 +66960,15 @@ index 054dcc9ccf..3b5c66fe52 100644
  ])
  
  AT_CHECK([
+@@ -1021,7 +1021,7 @@ AT_CHECK([
+ ], [0], [flow-dump from the main thread:
+ recirc_id(0),in_port(p0),packet_type(ns=0,id=0),eth(src=aa:bb:cc:00:00:02,dst=aa:bb:cc:00:00:01),eth_type(0x0800),ipv4(dst=20.0.0.1,proto=47,frag=no), packets:3, bytes:378, used:0.0s, actions:tnl_pop(gre_sys)
+ tunnel(src=20.0.0.2,dst=20.0.0.1,flags(-df-csum)),recirc_id(0),in_port(gre_sys),packet_type(ns=1,id=0x8847),eth_type(0x8847),mpls(label=999/0x0,tc=0/0,ttl=64/0x0,bos=1/1), packets:3, bytes:264, used:0.0s, actions:push_eth(src=00:00:00:00:00:00,dst=00:00:00:00:00:00),pop_mpls(eth_type=0x800),recirc(0x1)
+-tunnel(src=20.0.0.2,dst=20.0.0.1,flags(-df-csum)),recirc_id(0x1),in_port(gre_sys),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(ttl=64,frag=no), packets:3, bytes:294, used:0.0s, actions:set(ipv4(ttl=63)),int-br
++tunnel(src=20.0.0.2,dst=20.0.0.1,flags(-df-csum)),recirc_id(0x1),in_port(gre_sys),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(proto=1,ttl=64,frag=no), packets:3, bytes:294, used:0.0s, actions:set(ipv4(ttl=63)),int-br
+ ])
+ 
+ ovs-appctl time/warp 1000
 diff --git a/tests/pmd.at b/tests/pmd.at
 index a2f9d34a2a..a2832b544c 100644
 --- a/tests/pmd.at
diff --git a/SPECS/openvswitch2.17.spec b/SPECS/openvswitch2.17.spec
index 181b9e4..26e2dc4 100644
--- a/SPECS/openvswitch2.17.spec
+++ b/SPECS/openvswitch2.17.spec
@@ -57,7 +57,7 @@ Summary: Open vSwitch
 Group: System Environment/Daemons daemon/database/utilities
 URL: http://www.openvswitch.org/
 Version: 2.17.0
-Release: 76%{?dist}
+Release: 77%{?dist}
 
 # Nearly all of openvswitch is ASL 2.0.  The bugtool is LGPLv2+, and the
 # lib/sflow*.[ch] files are SISSL
@@ -748,6 +748,31 @@ exit 0
 %endif
 
 %changelog
+* Tue Apr 04 2023 Timothy Redaelli <tredaelli@redhat.com> - 2.17.0-77
+- ofproto-dpif-xlate: Always mask ip proto field. [RH git: cfd5c61966] (#2134873)
+    The ofproto layer currently treats nw_proto field as overloaded to mean
+    both that a proper nw layer exists, as well as the value contained in
+    the header for the nw proto.  However, this is incorrect behavior as
+    relevant standards permit that any value, including '0' should be treated
+    as a valid value.
+    
+    Because of this overload, when the ofproto layer builds action list for
+    a packet with nw_proto of 0, it won't build the complete action list that
+    we expect to be built for the packet.  That will cause a bad behavior
+    where all packets passing the datapath will fall into an incomplete
+    action set.
+    
+    The fix here is to unwildcard nw_proto, allowing us to preserve setting
+    actions for protocols which we know have support for the actions we
+    program.  This means that a traffic which contains nw_proto == 0 cannot
+    cause connectivity breakage with other traffic on the link.
+    
+    Reported-by: David Marchand <dmarchand@redhat.com>
+    Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2134873
+    Acked-by: Ilya Maximets <i.maximets@ovn.org>
+    Signed-off-by: Aaron Conole <aconole@redhat.com>
+
+
 * Wed Mar 29 2023 Open vSwitch CI <ovs-ci@redhat.com> - 2.17.0-76
 - Merging upstream branch-2.17 [RH git: d63f1374ab]
     Commit list: