diff --git a/SOURCES/openvswitch-2.15.0.patch b/SOURCES/openvswitch-2.15.0.patch index 4896e33..e110673 100644 --- a/SOURCES/openvswitch-2.15.0.patch +++ b/SOURCES/openvswitch-2.15.0.patch @@ -22037,7 +22037,7 @@ index f2413f5be6..0e4119c0a6 100644 } ds_put_cstr(s, "/ "); diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c -index 72b7915052..b304ad0f9d 100644 +index 72b7915052..b0e0aca9fc 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -48,6 +48,7 @@ static struct hmap ufid_to_tc = HMAP_INITIALIZER(&ufid_to_tc); @@ -22157,7 +22157,41 @@ index 72b7915052..b304ad0f9d 100644 return 0; } -@@ -1406,6 +1423,96 @@ flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl, +@@ -1264,6 +1281,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) + { +@@ -1370,6 +1402,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; +@@ -1406,6 +1443,96 @@ flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl, flower->mask.tunnel.metadata.present.len = tnl->metadata.present.len; } @@ -22254,7 +22288,16 @@ index 72b7915052..b304ad0f9d 100644 static int netdev_tc_flow_put(struct netdev *netdev, struct match *match, struct nlattr *actions, size_t actions_len, -@@ -1650,54 +1757,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1578,7 +1705,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; +@@ -1650,54 +1777,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, } } @@ -22310,7 +22353,7 @@ index 72b7915052..b304ad0f9d 100644 /* ignore exact match on skb_mark of 0. */ if (mask->pkt_mark == UINT32_MAX && !key->pkt_mark) { -@@ -1724,7 +1784,25 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1724,7 +1804,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; } @@ -22336,7 +22379,7 @@ index 72b7915052..b304ad0f9d 100644 action->out.ingress = is_internal_port(netdev_get_type(outdev)); action->type = TC_ACT_OUTPUT; flower.action_count++; -@@ -1779,6 +1857,10 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1779,6 +1877,10 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, const struct nlattr *ct = nl_attr_get(nla); const size_t ct_len = nl_attr_get_size(nla); @@ -22347,7 +22390,7 @@ index 72b7915052..b304ad0f9d 100644 err = parse_put_flow_ct_action(&flower, action, ct, ct_len); if (err) { return err; -@@ -1894,9 +1976,7 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, +@@ -1894,9 +1996,7 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, if (stats) { memset(stats, 0, sizeof *stats); if (!tc_get_flower(&id, &flower)) { @@ -22358,7 +22401,7 @@ index 72b7915052..b304ad0f9d 100644 } } -@@ -1971,6 +2051,96 @@ out: +@@ -1971,6 +2071,96 @@ out: tc_add_del_qdisc(ifindex, false, block_id, TC_INGRESS); } @@ -22455,7 +22498,7 @@ index 72b7915052..b304ad0f9d 100644 static void probe_tc_block_support(int ifindex) { -@@ -2038,6 +2208,7 @@ netdev_tc_init_flow_api(struct netdev *netdev) +@@ -2038,6 +2228,7 @@ netdev_tc_init_flow_api(struct netdev *netdev) block_id = get_block_id_from_netdev(netdev); probe_multi_mask_per_prio(ifindex); diff --git a/SPECS/openvswitch2.15.spec b/SPECS/openvswitch2.15.spec index 2467d02..0aed6bb 100644 --- a/SPECS/openvswitch2.15.spec +++ b/SPECS/openvswitch2.15.spec @@ -57,7 +57,7 @@ Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 2.15.0 -Release: 115%{?dist} +Release: 116%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -702,6 +702,12 @@ exit 0 %endif %changelog +* Mon Aug 08 2022 Open vSwitch CI - 2.15.0-116 +- Merging upstream branch-2.15 [RH git: 12c6518299] + Commit list: + e3909a40ae netdev-offload-tc: Disable offload of IPv6 fragments. + + * Mon Aug 08 2022 Open vSwitch CI - 2.15.0-115 - Merging upstream branch-2.15 [RH git: f0a32c6c60] Commit list: