diff --git a/SOURCES/openvswitch-2.13.0.patch b/SOURCES/openvswitch-2.13.0.patch index 408f960..5df841e 100644 --- a/SOURCES/openvswitch-2.13.0.patch +++ b/SOURCES/openvswitch-2.13.0.patch @@ -85017,7 +85017,7 @@ index f8c46bbaad..b42d314b65 100644 static int diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c -index 550e440b3a..474f54c52e 100644 +index 550e440b3a..bbdc5d14db 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); @@ -85144,7 +85144,41 @@ index 550e440b3a..474f54c52e 100644 return 0; } -@@ -1352,6 +1359,72 @@ flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl, +@@ -1210,6 +1217,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) + { +@@ -1316,6 +1338,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; +@@ -1352,6 +1379,72 @@ flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl, flower->mask.tunnel.metadata.present.len = tnl->metadata.present.len; } @@ -85217,7 +85251,16 @@ index 550e440b3a..474f54c52e 100644 static int netdev_tc_flow_put(struct netdev *netdev, struct match *match, struct nlattr *actions, size_t actions_len, -@@ -1572,53 +1645,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1500,7 +1593,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, + mask->dl_type = 0; + mask->in_port.odp_port = 0; + +- 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; +@@ -1572,53 +1665,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, } } @@ -85272,7 +85315,7 @@ index 550e440b3a..474f54c52e 100644 /* ignore exact match on skb_mark of 0. */ if (mask->pkt_mark == UINT32_MAX && !key->pkt_mark) { -@@ -1644,7 +1671,25 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1644,7 +1691,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; } @@ -85298,7 +85341,7 @@ index 550e440b3a..474f54c52e 100644 action->out.ingress = is_internal_port(netdev_get_type(outdev)); action->type = TC_ACT_OUTPUT; flower.action_count++; -@@ -1699,6 +1744,10 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1699,6 +1764,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); @@ -85309,7 +85352,7 @@ index 550e440b3a..474f54c52e 100644 err = parse_put_flow_ct_action(&flower, action, ct, ct_len); if (err) { return err; -@@ -1727,7 +1776,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1727,7 +1796,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, if (get_ufid_tc_mapping(ufid, &id) == 0) { VLOG_DBG_RL(&rl, "updating old handle: %d prio: %d", id.handle, id.prio); @@ -85318,7 +85361,7 @@ index 550e440b3a..474f54c52e 100644 } prio = get_prio_for_tc_flower(&flower); -@@ -1810,9 +1859,7 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, +@@ -1810,9 +1879,7 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, if (stats) { memset(stats, 0, sizeof *stats); if (!tc_get_flower(&id, &flower)) { @@ -85329,7 +85372,7 @@ index 550e440b3a..474f54c52e 100644 } } -@@ -1837,6 +1884,7 @@ probe_multi_mask_per_prio(int ifindex) +@@ -1837,6 +1904,7 @@ probe_multi_mask_per_prio(int ifindex) memset(&flower, 0, sizeof flower); @@ -85337,7 +85380,7 @@ index 550e440b3a..474f54c52e 100644 flower.key.eth_type = htons(ETH_P_IP); flower.mask.eth_type = OVS_BE16_MAX; memset(&flower.key.dst_mac, 0x11, sizeof flower.key.dst_mac); -@@ -1868,6 +1916,96 @@ out: +@@ -1868,6 +1936,96 @@ out: tc_add_del_qdisc(ifindex, false, block_id, TC_INGRESS); } @@ -85434,7 +85477,7 @@ index 550e440b3a..474f54c52e 100644 static void probe_tc_block_support(int ifindex) { -@@ -1884,6 +2022,7 @@ probe_tc_block_support(int ifindex) +@@ -1884,6 +2042,7 @@ probe_tc_block_support(int ifindex) memset(&flower, 0, sizeof flower); @@ -85442,7 +85485,7 @@ index 550e440b3a..474f54c52e 100644 flower.key.eth_type = htons(ETH_P_IP); flower.mask.eth_type = OVS_BE16_MAX; memset(&flower.key.dst_mac, 0x11, sizeof flower.key.dst_mac); -@@ -1907,6 +2046,7 @@ netdev_tc_init_flow_api(struct netdev *netdev) +@@ -1907,6 +2066,7 @@ netdev_tc_init_flow_api(struct netdev *netdev) static struct ovsthread_once block_once = OVSTHREAD_ONCE_INITIALIZER; enum tc_qdisc_hook hook = get_tc_qdisc_hook(netdev); uint32_t block_id = 0; @@ -85450,7 +85493,7 @@ index 550e440b3a..474f54c52e 100644 int ifindex; int error; -@@ -1917,20 +2057,30 @@ netdev_tc_init_flow_api(struct netdev *netdev) +@@ -1917,20 +2077,30 @@ netdev_tc_init_flow_api(struct netdev *netdev) return -ifindex; } diff --git a/SPECS/openvswitch2.13.spec b/SPECS/openvswitch2.13.spec index e2c565a..46af9d7 100644 --- a/SPECS/openvswitch2.13.spec +++ b/SPECS/openvswitch2.13.spec @@ -59,7 +59,7 @@ Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 2.13.0 -Release: 195%{?commit0:.%{date}git%{shortcommit0}}%{?commit1:dpdk%{shortcommit1}}%{?dist} +Release: 196%{?commit0:.%{date}git%{shortcommit0}}%{?commit1:dpdk%{shortcommit1}}%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -715,6 +715,12 @@ exit 0 %endif %changelog +* Mon Aug 08 2022 Open vSwitch CI - 2.13.0-196 +- Merging upstream branch-2.13 [RH git: e447babd7c] + Commit list: + 6e3e6e404a netdev-offload-tc: Disable offload of IPv6 fragments. + + * Mon Aug 08 2022 Open vSwitch CI - 2.13.0-195 - Merging upstream branch-2.13 [RH git: 30c4266e60] Commit list: