From 1ab728bfd7928d206f4e37783642dbe9d16eda75 Mon Sep 17 00:00:00 2001 From: Open vSwitch CI Date: Apr 04 2023 00:10:28 +0000 Subject: Import openvswitch2.17-2.17.0-87 from Fast DataPath --- diff --git a/SOURCES/openvswitch-2.17.0.patch b/SOURCES/openvswitch-2.17.0.patch index 78257c4..75243fe 100644 --- a/SOURCES/openvswitch-2.17.0.patch +++ b/SOURCES/openvswitch-2.17.0.patch @@ -54217,7 +54217,7 @@ index 94dc6a9b74..303b99daf4 100644 .queue = rss_data->queue, .key_len = 0, diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c -index 9845e8d3fe..efb92d5dd7 100644 +index 9845e8d3fe..6d918aebd6 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -44,6 +44,7 @@ @@ -54259,7 +54259,7 @@ index 9845e8d3fe..efb92d5dd7 100644 }; static void -@@ -198,13 +209,39 @@ del_ufid_tc_mapping(const ovs_u128 *ufid) +@@ -198,15 +209,42 @@ del_ufid_tc_mapping(const ovs_u128 *ufid) ovs_mutex_unlock(&ufid_lock); } @@ -54285,6 +54285,7 @@ index 9845e8d3fe..efb92d5dd7 100644 int err; - err = tc_del_filter(id); +- if (!err) { + if (stats) { + memset(stats, 0, sizeof *stats); + if (!tc_get_flower(id, &flower)) { @@ -54298,10 +54299,13 @@ index 9845e8d3fe..efb92d5dd7 100644 + } + + err = tc_del_flower_filter(id); - if (!err) { ++ if (!err || err == ENODEV) { del_ufid_tc_mapping(ufid); ++ return 0; } -@@ -214,7 +251,7 @@ del_filter_and_ufid_mapping(struct tcf_id *id, const ovs_u128 *ufid) + return err; + } +@@ -214,7 +252,7 @@ del_filter_and_ufid_mapping(struct tcf_id *id, const ovs_u128 *ufid) /* Add ufid entry to ufid_to_tc hashmap. */ static void add_ufid_tc_mapping(struct netdev *netdev, const ovs_u128 *ufid, @@ -54310,7 +54314,7 @@ index 9845e8d3fe..efb92d5dd7 100644 { struct ufid_tc_data *new_data = xzalloc(sizeof *new_data); size_t ufid_hash = hash_bytes(ufid, sizeof *ufid, 0); -@@ -226,6 +263,9 @@ add_ufid_tc_mapping(struct netdev *netdev, const ovs_u128 *ufid, +@@ -226,6 +264,9 @@ add_ufid_tc_mapping(struct netdev *netdev, const ovs_u128 *ufid, new_data->ufid = *ufid; new_data->id = *id; new_data->netdev = netdev_ref(netdev); @@ -54320,7 +54324,7 @@ index 9845e8d3fe..efb92d5dd7 100644 ovs_mutex_lock(&ufid_lock); hmap_insert(&ufid_to_tc, &new_data->ufid_to_tc_node, ufid_hash); -@@ -257,6 +297,30 @@ get_ufid_tc_mapping(const ovs_u128 *ufid, struct tcf_id *id) +@@ -257,6 +298,30 @@ get_ufid_tc_mapping(const ovs_u128 *ufid, struct tcf_id *id) return ENOENT; } @@ -54351,7 +54355,7 @@ index 9845e8d3fe..efb92d5dd7 100644 /* Find ufid entry in ufid_to_tc hashmap using tcf_id id. * The result is saved in ufid. * -@@ -405,7 +469,7 @@ delete_chains_from_netdev(struct netdev *netdev, struct tcf_id *id) +@@ -405,7 +470,7 @@ delete_chains_from_netdev(struct netdev *netdev, struct tcf_id *id) */ HMAP_FOR_EACH_POP (chain_node, node, &map) { id->chain = chain_node->chain; @@ -54360,7 +54364,7 @@ index 9845e8d3fe..efb92d5dd7 100644 free(chain_node); } } -@@ -417,16 +481,16 @@ delete_chains_from_netdev(struct netdev *netdev, struct tcf_id *id) +@@ -417,16 +482,16 @@ delete_chains_from_netdev(struct netdev *netdev, struct tcf_id *id) static int netdev_tc_flow_flush(struct netdev *netdev) { @@ -54380,7 +54384,7 @@ index 9845e8d3fe..efb92d5dd7 100644 if (!err) { del_ufid_tc_mapping_unlocked(&data->ufid); } -@@ -481,10 +545,10 @@ netdev_tc_flow_dump_destroy(struct netdev_flow_dump *dump) +@@ -481,10 +546,10 @@ netdev_tc_flow_dump_destroy(struct netdev_flow_dump *dump) static void parse_flower_rewrite_to_netlink_action(struct ofpbuf *buf, @@ -54394,7 +54398,7 @@ index 9845e8d3fe..efb92d5dd7 100644 for (int type = 0; type < ARRAY_SIZE(set_flower_map); type++) { char *put = NULL; -@@ -550,30 +614,42 @@ flower_tun_opt_to_match(struct match *match, struct tc_flower *flower) +@@ -550,30 +615,42 @@ flower_tun_opt_to_match(struct match *match, struct tc_flower *flower) struct geneve_opt *opt, *opt_mask; int len, cnt = 0; @@ -54444,7 +54448,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } static void -@@ -585,8 +661,10 @@ parse_tc_flower_to_stats(struct tc_flower *flower, +@@ -585,8 +662,10 @@ parse_tc_flower_to_stats(struct tc_flower *flower, } memset(stats, 0, sizeof *stats); @@ -54457,7 +54461,7 @@ index 9845e8d3fe..efb92d5dd7 100644 stats->used = flower->lastused; } -@@ -616,7 +694,8 @@ parse_tc_flower_terse_to_match(struct tc_flower *flower, +@@ -616,7 +695,8 @@ parse_tc_flower_terse_to_match(struct tc_flower *flower, } static int @@ -54467,7 +54471,7 @@ index 9845e8d3fe..efb92d5dd7 100644 struct match *match, struct nlattr **actions, struct dpif_flow_stats *stats, -@@ -803,18 +882,24 @@ parse_tc_flower_to_match(struct tc_flower *flower, +@@ -803,18 +883,24 @@ parse_tc_flower_to_match(struct tc_flower *flower, &flower->key.tunnel.ipv6.ipv6_src, &flower->mask.tunnel.ipv6.ipv6_src); } @@ -54486,18 +54490,18 @@ index 9845e8d3fe..efb92d5dd7 100644 + if (flower->mask.tunnel.tp_src) { + match_set_tun_tp_dst_masked(match, flower->key.tunnel.tp_src, + flower->mask.tunnel.tp_src); - } -- if (flower->key.tunnel.metadata.present.len) { ++ } + if (flower->mask.tunnel.tp_dst) { + match_set_tun_tp_dst_masked(match, flower->key.tunnel.tp_dst, + flower->mask.tunnel.tp_dst); -+ } + } +- if (flower->key.tunnel.metadata.present.len) { + + if (!strcmp(netdev_get_type(netdev), "geneve")) { flower_tun_opt_to_match(match, flower); } } -@@ -877,7 +962,7 @@ parse_tc_flower_to_match(struct tc_flower *flower, +@@ -877,7 +963,7 @@ parse_tc_flower_to_match(struct tc_flower *flower, } break; case TC_ACT_PEDIT: { @@ -54506,7 +54510,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } break; case TC_ACT_ENCAP: { -@@ -947,7 +1032,11 @@ parse_tc_flower_to_match(struct tc_flower *flower, +@@ -947,7 +1033,11 @@ parse_tc_flower_to_match(struct tc_flower *flower, ct_offset = nl_msg_start_nested(buf, OVS_ACTION_ATTR_CT); if (action->ct.commit) { @@ -54519,7 +54523,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } if (action->ct.zone) { -@@ -965,13 +1054,13 @@ parse_tc_flower_to_match(struct tc_flower *flower, +@@ -965,13 +1055,13 @@ parse_tc_flower_to_match(struct tc_flower *flower, struct { ovs_u128 key; ovs_u128 mask; @@ -54539,7 +54543,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } if (action->ct.nat_type) { -@@ -1048,23 +1137,28 @@ netdev_tc_flow_dump_next(struct netdev_flow_dump *dump, +@@ -1048,23 +1138,28 @@ netdev_tc_flow_dump_next(struct netdev_flow_dump *dump, get_tc_qdisc_hook(netdev)); while (nl_dump_next(dump->nl_dump, &nl_flow, rbuffer)) { @@ -54572,7 +54576,7 @@ index 9845e8d3fe..efb92d5dd7 100644 match->wc.masks.in_port.odp_port = u32_to_odp(UINT32_MAX); match->flow.in_port.odp_port = dump->port; match_set_recirc_id(match, id.chain); -@@ -1164,7 +1258,12 @@ parse_put_flow_ct_action(struct tc_flower *flower, +@@ -1164,7 +1259,12 @@ parse_put_flow_ct_action(struct tc_flower *flower, NL_ATTR_FOR_EACH_UNSAFE (ct_attr, ct_left, ct, ct_len) { switch (nl_attr_type(ct_attr)) { case OVS_CT_ATTR_COMMIT: { @@ -54586,7 +54590,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } break; case OVS_CT_ATTR_ZONE: { -@@ -1194,15 +1293,20 @@ parse_put_flow_ct_action(struct tc_flower *flower, +@@ -1194,15 +1294,20 @@ parse_put_flow_ct_action(struct tc_flower *flower, break; case OVS_CT_ATTR_LABELS: { const struct { @@ -54611,7 +54615,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } } -@@ -1222,8 +1326,8 @@ parse_put_flow_set_masked_action(struct tc_flower *flower, +@@ -1222,8 +1327,8 @@ parse_put_flow_set_masked_action(struct tc_flower *flower, uint64_t set_stub[1024 / 8]; struct ofpbuf set_buf = OFPBUF_STUB_INITIALIZER(set_stub); char *set_data, *set_mask; @@ -54622,7 +54626,7 @@ index 9845e8d3fe..efb92d5dd7 100644 const struct nlattr *attr; int i, j, type; size_t size; -@@ -1265,14 +1369,6 @@ parse_put_flow_set_masked_action(struct tc_flower *flower, +@@ -1265,14 +1370,6 @@ parse_put_flow_set_masked_action(struct tc_flower *flower, } } @@ -54637,7 +54641,7 @@ index 9845e8d3fe..efb92d5dd7 100644 if (hasmask && !is_all_zeros(set_mask, size)) { VLOG_DBG_RL(&rl, "unsupported sub attribute of set action type %d", type); -@@ -1281,6 +1377,8 @@ parse_put_flow_set_masked_action(struct tc_flower *flower, +@@ -1281,6 +1378,8 @@ parse_put_flow_set_masked_action(struct tc_flower *flower, } ofpbuf_uninit(&set_buf); @@ -54646,7 +54650,7 @@ index 9845e8d3fe..efb92d5dd7 100644 return 0; } -@@ -1288,6 +1386,7 @@ static int +@@ -1288,6 +1387,7 @@ static int parse_put_flow_set_action(struct tc_flower *flower, struct tc_action *action, const struct nlattr *set, size_t set_len) { @@ -54654,7 +54658,7 @@ index 9845e8d3fe..efb92d5dd7 100644 const struct nlattr *tunnel; const struct nlattr *tun_attr; size_t tun_left, tunnel_len; -@@ -1306,6 +1405,7 @@ parse_put_flow_set_action(struct tc_flower *flower, struct tc_action *action, +@@ -1306,6 +1406,7 @@ parse_put_flow_set_action(struct tc_flower *flower, struct tc_action *action, action->type = TC_ACT_ENCAP; action->encap.id_present = false; @@ -54662,7 +54666,7 @@ index 9845e8d3fe..efb92d5dd7 100644 flower->action_count++; NL_ATTR_FOR_EACH_UNSAFE(tun_attr, tun_left, tunnel, tunnel_len) { switch (nl_attr_type(tun_attr)) { -@@ -1330,6 +1430,18 @@ parse_put_flow_set_action(struct tc_flower *flower, struct tc_action *action, +@@ -1330,6 +1431,18 @@ parse_put_flow_set_action(struct tc_flower *flower, struct tc_action *action, action->encap.ttl = nl_attr_get_u8(tun_attr); } break; @@ -54681,7 +54685,7 @@ index 9845e8d3fe..efb92d5dd7 100644 case OVS_TUNNEL_KEY_ATTR_IPV6_SRC: { action->encap.ipv6.ipv6_src = nl_attr_get_in6_addr(tun_attr); -@@ -1354,12 +1466,31 @@ parse_put_flow_set_action(struct tc_flower *flower, struct tc_action *action, +@@ -1354,12 +1467,31 @@ parse_put_flow_set_action(struct tc_flower *flower, struct tc_action *action, action->encap.data.present.len = nl_attr_get_size(tun_attr); } break; @@ -54713,7 +54717,7 @@ index 9845e8d3fe..efb92d5dd7 100644 static int test_key_and_mask(struct match *match) { -@@ -1442,8 +1573,23 @@ test_key_and_mask(struct match *match) +@@ -1442,8 +1574,23 @@ test_key_and_mask(struct match *match) return EOPNOTSUPP; } @@ -54738,7 +54742,7 @@ index 9845e8d3fe..efb92d5dd7 100644 return EOPNOTSUPP; } -@@ -1452,18 +1598,51 @@ test_key_and_mask(struct match *match) +@@ -1452,18 +1599,51 @@ test_key_and_mask(struct match *match) static void flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl, @@ -54776,11 +54780,11 @@ index 9845e8d3fe..efb92d5dd7 100644 + flower->mask.tunnel.metadata.present.len = tnl->metadata.present.len; + memset(&tnl_mask->metadata.present.len, 0, + sizeof tnl_mask->metadata.present.len); - ++ + if (!tnl->metadata.present.len) { + return; + } -+ + + memcpy(flower->key.tunnel.metadata.opts.gnv, tnl->metadata.opts.gnv, + tnl->metadata.present.len); memcpy(flower->mask.tunnel.metadata.opts.gnv, tnl_mask->metadata.opts.gnv, @@ -54793,7 +54797,7 @@ index 9845e8d3fe..efb92d5dd7 100644 len = flower->key.tunnel.metadata.present.len; while (len) { opt = &flower->key.tunnel.metadata.opts.gnv[cnt]; -@@ -1474,8 +1653,6 @@ flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl, +@@ -1474,8 +1654,6 @@ flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl, cnt += sizeof(struct geneve_opt) / 4 + opt->length; len -= sizeof(struct geneve_opt) + opt->length * 4; } @@ -54802,7 +54806,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } static void -@@ -1541,6 +1718,12 @@ parse_match_ct_state_to_flower(struct tc_flower *flower, struct match *match) +@@ -1541,6 +1719,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); } @@ -54815,7 +54819,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } if (mask->ct_zone) { -@@ -1574,7 +1757,8 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1574,7 +1758,8 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, const struct flow *key = &match->flow; struct flow *mask = &match->wc.masks; const struct flow_tnl *tnl = &match->flow.tunnel; @@ -54825,7 +54829,7 @@ index 9845e8d3fe..efb92d5dd7 100644 struct tc_action *action; bool recirc_act = false; uint32_t block_id = 0; -@@ -1615,17 +1799,49 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1615,17 +1800,49 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, flower.key.tunnel.ttl = tnl->ip_ttl; flower.key.tunnel.tp_src = tnl->tp_src; flower.key.tunnel.tp_dst = tnl->tp_dst; @@ -54877,7 +54881,7 @@ index 9845e8d3fe..efb92d5dd7 100644 flower.key.eth_type = key->dl_type; flower.mask.eth_type = mask->dl_type; -@@ -1638,7 +1854,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1638,7 +1855,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, if (mask->vlans[0].tpid && eth_type_vlan(key->vlans[0].tpid)) { flower.key.encap_eth_type[0] = flower.key.eth_type; @@ -54886,7 +54890,7 @@ index 9845e8d3fe..efb92d5dd7 100644 flower.key.eth_type = key->vlans[0].tpid; flower.mask.eth_type = mask->vlans[0].tpid; } -@@ -1734,7 +1950,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1734,7 +1951,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, memset(&mask->arp_tha, 0, sizeof mask->arp_tha); } @@ -54895,7 +54899,7 @@ index 9845e8d3fe..efb92d5dd7 100644 flower.key.ip_proto = key->nw_proto; flower.mask.ip_proto = mask->nw_proto; mask->nw_proto = 0; -@@ -1841,7 +2057,25 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1841,7 +2058,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; } @@ -54921,7 +54925,7 @@ index 9845e8d3fe..efb92d5dd7 100644 action->out.ingress = is_internal_port(netdev_get_type(outdev)); action->type = TC_ACT_OUTPUT; flower.action_count++; -@@ -1879,10 +2113,6 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1879,10 +2114,6 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, if (err) { return err; } @@ -54932,7 +54936,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_SET_MASKED) { const struct nlattr *set = nl_attr_get(nla); const size_t set_len = nl_attr_get_size(nla); -@@ -1929,10 +2159,12 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1929,10 +2160,12 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, return EOPNOTSUPP; } @@ -54946,7 +54950,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } prio = get_prio_for_tc_flower(&flower); -@@ -1950,8 +2182,9 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1950,8 +2183,9 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, if (!err) { if (stats) { memset(stats, 0, sizeof *stats); @@ -54957,7 +54961,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } return err; -@@ -1989,8 +2222,16 @@ netdev_tc_flow_get(struct netdev *netdev, +@@ -1989,8 +2223,16 @@ netdev_tc_flow_get(struct netdev *netdev, } in_port = netdev_ifindex_to_odp_port(id.ifindex); @@ -54975,7 +54979,7 @@ index 9845e8d3fe..efb92d5dd7 100644 match->wc.masks.in_port.odp_port = u32_to_odp(UINT32_MAX); match->flow.in_port.odp_port = in_port; match_set_recirc_id(match, id.chain); -@@ -2003,7 +2244,6 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, +@@ -2003,7 +2245,6 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, const ovs_u128 *ufid, struct dpif_flow_stats *stats) { @@ -54983,7 +54987,7 @@ index 9845e8d3fe..efb92d5dd7 100644 struct tcf_id id; int error; -@@ -2012,18 +2252,7 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, +@@ -2012,18 +2253,7 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, return error; } @@ -55003,7 +55007,7 @@ index 9845e8d3fe..efb92d5dd7 100644 } static int -@@ -2077,13 +2306,13 @@ probe_multi_mask_per_prio(int ifindex) +@@ -2077,13 +2307,13 @@ probe_multi_mask_per_prio(int ifindex) id2 = tc_make_tcf_id(ifindex, block_id, prio, TC_INGRESS); error = tc_replace_flower(&id2, &flower); @@ -55019,7 +55023,7 @@ index 9845e8d3fe..efb92d5dd7 100644 multi_mask_per_prio = true; VLOG_INFO("probe tc: multiple masks on single tc prio is supported."); -@@ -2135,7 +2364,7 @@ probe_ct_state_support(int ifindex) +@@ -2135,7 +2365,7 @@ probe_ct_state_support(int ifindex) goto out_del; } @@ -55028,7 +55032,7 @@ index 9845e8d3fe..efb92d5dd7 100644 ct_state_support = OVS_CS_F_NEW | OVS_CS_F_ESTABLISHED | OVS_CS_F_TRACKED | -@@ -2149,7 +2378,7 @@ probe_ct_state_support(int ifindex) +@@ -2149,7 +2379,7 @@ probe_ct_state_support(int ifindex) goto out_del; } @@ -55037,7 +55041,7 @@ index 9845e8d3fe..efb92d5dd7 100644 /* Test for ct_state INVALID support */ memset(&flower, 0, sizeof flower); -@@ -2160,7 +2389,7 @@ probe_ct_state_support(int ifindex) +@@ -2160,7 +2390,7 @@ probe_ct_state_support(int ifindex) goto out; } @@ -55046,7 +55050,7 @@ index 9845e8d3fe..efb92d5dd7 100644 ct_state_support |= OVS_CS_F_INVALID; /* Test for ct_state REPLY support */ -@@ -2176,7 +2405,7 @@ probe_ct_state_support(int ifindex) +@@ -2176,7 +2406,7 @@ probe_ct_state_support(int ifindex) ct_state_support |= OVS_CS_F_REPLY_DIR; out_del: @@ -55055,7 +55059,7 @@ index 9845e8d3fe..efb92d5dd7 100644 out: tc_add_del_qdisc(ifindex, false, 0, TC_INGRESS); VLOG_INFO("probe tc: supported ovs ct_state bits: 0x%x", ct_state_support); -@@ -2251,7 +2480,7 @@ netdev_tc_init_flow_api(struct netdev *netdev) +@@ -2251,7 +2481,7 @@ netdev_tc_init_flow_api(struct netdev *netdev) /* fallback here if delete chains fail */ if (!get_chain_supported) { @@ -67165,7 +67169,7 @@ index d21fd777dd..c37852b216 100644 OVS_VSWITCHD_STOP diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at -index 80bc1dd5c3..84bab88be2 100644 +index 80bc1dd5c3..bf60e4cb27 100644 --- a/tests/system-offloads-traffic.at +++ b/tests/system-offloads-traffic.at @@ -90,7 +90,7 @@ AT_CHECK([tc -o -s -d filter show dev ovs-p0 ingress | @@ -67186,7 +67190,7 @@ index 80bc1dd5c3..84bab88be2 100644 OVS_TRAFFIC_VSWITCHD_STOP AT_CLEANUP -@@ -168,3 +168,131 @@ matchall +@@ -168,3 +168,186 @@ matchall ]) OVS_TRAFFIC_VSWITCHD_STOP AT_CLEANUP @@ -67318,6 +67322,61 @@ index 80bc1dd5c3..84bab88be2 100644 + +OVS_TRAFFIC_VSWITCHD_STOP +AT_CLEANUP ++ ++AT_SETUP([offloads - delete ufid mapping if device not exist - offloads enabled]) ++OVS_TRAFFIC_VSWITCHD_START([], [], [-- set Open_vSwitch . other_config:hw-offload=true]) ++ ++AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"]) ++ ++ADD_NAMESPACES(at_ns0, at_ns1, at_ns2) ++ ++dnl Disable IPv6 to skip unexpected flow ++AT_CHECK([sysctl -w net.ipv6.conf.br0.disable_ipv6=1], [0], [ignore]) ++NS_CHECK_EXEC([at_ns0], [sysctl -w net.ipv6.conf.all.disable_ipv6=1], [0], [ignore]) ++NS_CHECK_EXEC([at_ns1], [sysctl -w net.ipv6.conf.all.disable_ipv6=1], [0], [ignore]) ++NS_CHECK_EXEC([at_ns2], [sysctl -w net.ipv6.conf.all.disable_ipv6=1], [0], [ignore]) ++ ++ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24", "aa:1a:54:e9:c5:56") ++ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24") ++ ++NS_CHECK_EXEC([at_ns0], [ping -q -c 2 -i 0.2 10.1.1.2 | FORMAT_PING], [0], [dnl ++2 packets transmitted, 2 received, 0% packet loss, time 0ms ++]) ++ ++dnl Delete and add interface ovs-p0/p0 ++AT_CHECK([ip link del dev ovs-p0]) ++AT_CHECK([ip link add p0 type veth peer name ovs-p0 || return 77]) ++AT_CHECK([ip link set p0 netns at_ns0]) ++AT_CHECK([ip link set dev ovs-p0 up]) ++NS_CHECK_EXEC([at_ns0], [ip addr add dev p0 "10.1.1.1/24"]) ++NS_CHECK_EXEC([at_ns0], [ip link set dev p0 up]) ++NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address "aa:1a:54:e9:c5:56"]) ++ ++AT_CHECK([ovs-appctl revalidator/purge], [0]) ++ ++dnl Generate flows to trigger the hmap expand once ++ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24") ++NS_CHECK_EXEC([at_ns0], [ping -q -c 2 -i 0.2 10.1.1.2 | FORMAT_PING], [0], [dnl ++2 packets transmitted, 2 received, 0% packet loss, time 0ms ++]) ++NS_CHECK_EXEC([at_ns0], [ping -q -c 2 -i 0.2 10.1.1.3 | FORMAT_PING], [0], [dnl ++2 packets transmitted, 2 received, 0% packet loss, time 0ms ++]) ++ ++AT_CHECK([ovs-appctl revalidator/purge], [0]) ++dnl Fix purge fail occasionally ++AT_CHECK([ovs-appctl revalidator/purge], [0]) ++ ++AT_CHECK([test $(ovs-appctl dpctl/dump-flows | grep -c "eth_type(0x0800)") -eq 0], [0], [ignore]) ++ ++OVS_TRAFFIC_VSWITCHD_STOP(["/could not open network device ovs-p0/d ++/on nonexistent port/d ++/failed to flow_get/d ++/Failed to acquire udpif_key/d ++/No such device/d ++/failed to offload flow/d ++"]) ++AT_CLEANUP diff --git a/tests/system-route.at b/tests/system-route.at index 1714273e35..270956d13f 100644 --- a/tests/system-route.at diff --git a/SPECS/openvswitch2.17.spec b/SPECS/openvswitch2.17.spec index af97be5..43d836d 100644 --- a/SPECS/openvswitch2.17.spec +++ b/SPECS/openvswitch2.17.spec @@ -63,7 +63,7 @@ Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 2.17.0 -Release: 86%{?dist} +Release: 87%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -749,6 +749,12 @@ exit 0 %endif %changelog +* Mon Apr 03 2023 Open vSwitch CI - 2.17.0-87 +- Merging upstream branch-2.17 [RH git: 9d9c53c9e5] + Commit list: + be19308aaf netdev-offload-tc: Del ufid mapping if device not exist. + + * Wed Mar 29 2023 Open vSwitch CI - 2.17.0-86 - Merging upstream branch-2.17 [RH git: 83c0a82801] Commit list: