diff --git a/SOURCES/openvswitch-2.16.0.patch b/SOURCES/openvswitch-2.16.0.patch index e9d843e..2e8fc9b 100644 --- a/SOURCES/openvswitch-2.16.0.patch +++ b/SOURCES/openvswitch-2.16.0.patch @@ -3331,7 +3331,7 @@ index 60dd138914..911f55fe74 100644 } else { a = nl_attr_find(reply, 0, IFLA_STATS); diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c -index 9845e8d3fe..e1568e38a0 100644 +index 9845e8d3fe..3bbada7ad6 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -481,10 +481,10 @@ netdev_tc_flow_dump_destroy(struct netdev_flow_dump *dump) @@ -3405,7 +3405,41 @@ index 9845e8d3fe..e1568e38a0 100644 return 0; } -@@ -1541,6 +1537,12 @@ parse_match_ct_state_to_flower(struct tc_flower *flower, struct match *match) +@@ -1360,6 +1356,21 @@ parse_put_flow_set_action(struct tc_flower *flower, struct tc_action *action, + return 0; + } + ++static bool ++is_ipv6_fragment_and_masked(const struct flow *key, const struct flow *mask) ++{ ++ if (key->dl_type != htons(ETH_P_IPV6)) { ++ return false; ++ } ++ if (mask->nw_proto && key->nw_proto == IPPROTO_FRAGMENT) { ++ return true; ++ } ++ if (key->nw_frag & (mask->nw_frag & FLOW_NW_FRAG_ANY)) { ++ return true; ++ } ++ return false; ++} ++ + static int + test_key_and_mask(struct match *match) + { +@@ -1442,6 +1453,11 @@ test_key_and_mask(struct match *match) + return EOPNOTSUPP; + } + ++ if (is_ipv6_fragment_and_masked(key, mask)) { ++ VLOG_DBG_RL(&rl, "offloading of IPv6 fragments isn't supported"); ++ return EOPNOTSUPP; ++ } ++ + if (!is_all_zeros(mask, sizeof *mask)) { + VLOG_DBG_RL(&rl, "offloading isn't supported, unknown attribute"); + return EOPNOTSUPP; +@@ -1541,6 +1557,12 @@ parse_match_ct_state_to_flower(struct tc_flower *flower, struct match *match) flower->key.ct_state &= ~(TCA_FLOWER_KEY_CT_FLAGS_NEW); flower->mask.ct_state &= ~(TCA_FLOWER_KEY_CT_FLAGS_NEW); } @@ -3418,7 +3452,16 @@ index 9845e8d3fe..e1568e38a0 100644 } if (mask->ct_zone) { -@@ -1841,7 +1843,25 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1734,7 +1756,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, + memset(&mask->arp_tha, 0, sizeof mask->arp_tha); + } + +- if (is_ip_any(key)) { ++ if (is_ip_any(key) && !is_ipv6_fragment_and_masked(key, mask)) { + flower.key.ip_proto = key->nw_proto; + flower.mask.ip_proto = mask->nw_proto; + mask->nw_proto = 0; +@@ -1841,7 +1863,25 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, VLOG_DBG_RL(&rl, "Can't find netdev for output port %d", port); return ENODEV; } @@ -3444,7 +3487,7 @@ index 9845e8d3fe..e1568e38a0 100644 action->out.ingress = is_internal_port(netdev_get_type(outdev)); action->type = TC_ACT_OUTPUT; flower.action_count++; -@@ -2015,9 +2035,7 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, +@@ -2015,9 +2055,7 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, if (stats) { memset(stats, 0, sizeof *stats); if (!tc_get_flower(&id, &flower)) { diff --git a/SPECS/openvswitch2.16.spec b/SPECS/openvswitch2.16.spec index e5ed7da..76d5555 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: 92%{?dist} +Release: 93%{?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 +* Mon Aug 08 2022 Open vSwitch CI - 2.16.0-93 +- Merging upstream branch-2.16 [RH git: 3bb0f66a11] + Commit list: + c85d35ea1a netdev-offload-tc: Disable offload of IPv6 fragments. + + * Mon Aug 08 2022 Open vSwitch CI - 2.16.0-92 - Merging upstream branch-2.16 [RH git: 6cd148d13d] Commit list: