From ae9e0937307d564496bb2e9fd20d09e2681d0b56 Mon Sep 17 00:00:00 2001 From: Open vSwitch CI Date: Mar 04 2022 21:43:25 +0000 Subject: Import openvswitch2.13-2.13.0-163 from Fast DataPath --- diff --git a/SOURCES/openvswitch-2.13.0.patch b/SOURCES/openvswitch-2.13.0.patch index 4bf6791..534f79f 100644 --- a/SOURCES/openvswitch-2.13.0.patch +++ b/SOURCES/openvswitch-2.13.0.patch @@ -1535,7 +1535,7 @@ index e06ddf2671..8e64d74aee 100644 :target: https://ci.appveyor.com/project/blp/ovs/history .. image:: https://api.cirrus-ci.com/github/openvswitch/ovs.svg diff --git a/acinclude.m4 b/acinclude.m4 -index c1470ccc6b..914e27b932 100644 +index c1470ccc6b..6401471494 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -192,10 +192,10 @@ dnl Configure Linux tc compat. @@ -1552,7 +1552,21 @@ index c1470ccc6b..914e27b932 100644 AC_CHECK_MEMBERS([struct tcf_t.firstuse], [], [], [#include ]) -@@ -250,6 +250,18 @@ AC_DEFUN([OVS_CHECK_LINUX_SCTP_CT], [ +@@ -233,6 +233,13 @@ AC_DEFUN([OVS_CHECK_LINUX_TC], [ + ])], + [AC_DEFINE([HAVE_TCA_SKBEDIT_FLAGS], [1], + [Define to 1 if TCA_SKBEDIT_FLAGS is available.])]) ++ ++ AC_COMPILE_IFELSE([ ++ AC_LANG_PROGRAM([#include ], [ ++ int x = TCA_STATS_PKT64; ++ ])], ++ [AC_DEFINE([HAVE_TCA_STATS_PKT64], [1], ++ [Define to 1 if TCA_STATS_PKT64 is available.])]) + ]) + + dnl OVS_CHECK_LINUX_SCTP_CT +@@ -250,6 +257,18 @@ AC_DEFUN([OVS_CHECK_LINUX_SCTP_CT], [ [Define to 1 if SCTP_CONNTRACK_HEARTBEAT_SENT is available.])]) ]) @@ -1571,7 +1585,7 @@ index c1470ccc6b..914e27b932 100644 dnl OVS_FIND_DEPENDENCY(FUNCTION, SEARCH_LIBS, NAME_TO_PRINT) dnl dnl Check for a function in a library list. -@@ -379,7 +391,6 @@ AC_DEFUN([OVS_CHECK_DPDK], [ +@@ -379,7 +398,6 @@ AC_DEFUN([OVS_CHECK_DPDK], [ [AC_MSG_RESULT([no])]) AC_CHECK_DECL([RTE_LIBRTE_MLX5_PMD], [dnl found @@ -1579,7 +1593,7 @@ index c1470ccc6b..914e27b932 100644 AC_CHECK_DECL([RTE_IBVERBS_LINK_DLOPEN], [], [dnl not found OVS_FIND_DEPENDENCY([mlx5dv_create_wq], [mlx5], [libmlx5]) OVS_FIND_DEPENDENCY([verbs_init_cq], [ibverbs], [libibverbs]) -@@ -420,6 +431,16 @@ AC_DEFUN([OVS_CHECK_DPDK], [ +@@ -420,6 +438,16 @@ AC_DEFUN([OVS_CHECK_DPDK], [ if test "$DPDK_AUTO_DISCOVER" = "false"; then OVS_LDFLAGS="$OVS_LDFLAGS -L$DPDK_LIB_DIR" fi @@ -1596,7 +1610,7 @@ index c1470ccc6b..914e27b932 100644 OVS_CFLAGS="$OVS_CFLAGS $DPDK_INCLUDE" OVS_ENABLE_OPTION([-mssse3]) -@@ -567,9 +588,14 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ +@@ -567,9 +595,14 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ OVS_GREP_IFELSE([$KSRC/include/net/ip6_fib.h], [rt6_get_cookie], [OVS_DEFINE([HAVE_RT6_GET_COOKIE])]) @@ -1611,7 +1625,7 @@ index c1470ccc6b..914e27b932 100644 OVS_GREP_IFELSE([$KSRC/include/linux/err.h], [ERR_CAST]) OVS_GREP_IFELSE([$KSRC/include/linux/err.h], [IS_ERR_OR_NULL]) -@@ -765,6 +791,10 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ +@@ -765,6 +798,10 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ [prandom_u32[[\(]]], [OVS_DEFINE([HAVE_PRANDOM_U32])]) OVS_GREP_IFELSE([$KSRC/include/linux/random.h], [prandom_u32_max]) @@ -1622,7 +1636,7 @@ index c1470ccc6b..914e27b932 100644 OVS_GREP_IFELSE([$KSRC/include/net/rtnetlink.h], [get_link_net]) OVS_GREP_IFELSE([$KSRC/include/net/rtnetlink.h], [name_assign_type]) -@@ -918,8 +948,6 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ +@@ -918,8 +955,6 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ OVS_GREP_IFELSE([$KSRC/include/net/sock.h], [sk_no_check_tx]) OVS_GREP_IFELSE([$KSRC/include/linux/udp.h], [no_check6_tx]) @@ -1631,7 +1645,7 @@ index c1470ccc6b..914e27b932 100644 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/protocol.h], [udp_add_offload], [net], [OVS_DEFINE([HAVE_UDP_ADD_OFFLOAD_TAKES_NET])]) -@@ -1294,11 +1322,11 @@ AC_DEFUN([OVS_ENABLE_SPARSE], +@@ -1294,11 +1329,11 @@ AC_DEFUN([OVS_ENABLE_SPARSE], dnl OVS_CTAGS_IDENTIFIERS dnl @@ -80707,6 +80721,105 @@ index 290345dcc4..35edb7cd26 100755 def interactiveMenu(self, sleep_time): # Creates Interactive menu within the script while self.choice != 4: +diff --git a/include/linux/automake.mk b/include/linux/automake.mk +index 8f063f482e..f857c7e088 100644 +--- a/include/linux/automake.mk ++++ b/include/linux/automake.mk +@@ -2,6 +2,7 @@ noinst_HEADERS += \ + include/linux/netlink.h \ + include/linux/netfilter/nf_conntrack_sctp.h \ + include/linux/pkt_cls.h \ ++ include/linux/gen_stats.h \ + include/linux/tc_act/tc_mpls.h \ + include/linux/tc_act/tc_pedit.h \ + include/linux/tc_act/tc_skbedit.h \ +diff --git a/include/linux/gen_stats.h b/include/linux/gen_stats.h +new file mode 100644 +index 0000000000..6fae6f727c +--- /dev/null ++++ b/include/linux/gen_stats.h +@@ -0,0 +1,81 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ ++#ifndef __LINUX_GEN_STATS_WRAPPER_H ++#define __LINUX_GEN_STATS_WRAPPER_H 1 ++ ++#if defined(__KERNEL__) || defined(HAVE_TCA_STATS_PKT64) ++#include_next ++#else ++#include ++ ++enum { ++ TCA_STATS_UNSPEC, ++ TCA_STATS_BASIC, ++ TCA_STATS_RATE_EST, ++ TCA_STATS_QUEUE, ++ TCA_STATS_APP, ++ TCA_STATS_RATE_EST64, ++ TCA_STATS_PAD, ++ TCA_STATS_BASIC_HW, ++ TCA_STATS_PKT64, ++ __TCA_STATS_MAX, ++}; ++#define TCA_STATS_MAX (__TCA_STATS_MAX - 1) ++ ++/** ++ * struct gnet_stats_basic - byte/packet throughput statistics ++ * @bytes: number of seen bytes ++ * @packets: number of seen packets ++ */ ++struct gnet_stats_basic { ++ __u64 bytes; ++ __u32 packets; ++}; ++ ++/** ++ * struct gnet_stats_rate_est - rate estimator ++ * @bps: current byte rate ++ * @pps: current packet rate ++ */ ++struct gnet_stats_rate_est { ++ __u32 bps; ++ __u32 pps; ++}; ++ ++/** ++ * struct gnet_stats_rate_est64 - rate estimator ++ * @bps: current byte rate ++ * @pps: current packet rate ++ */ ++struct gnet_stats_rate_est64 { ++ __u64 bps; ++ __u64 pps; ++}; ++ ++/** ++ * struct gnet_stats_queue - queuing statistics ++ * @qlen: queue length ++ * @backlog: backlog size of queue ++ * @drops: number of dropped packets ++ * @requeues: number of requeues ++ * @overlimits: number of enqueues over the limit ++ */ ++struct gnet_stats_queue { ++ __u32 qlen; ++ __u32 backlog; ++ __u32 drops; ++ __u32 requeues; ++ __u32 overlimits; ++}; ++ ++/** ++ * struct gnet_estimator - rate estimator configuration ++ * @interval: sampling period ++ * @ewma_log: the log of measurement window weight ++ */ ++struct gnet_estimator { ++ signed char interval; ++ unsigned char ewma_log; ++}; ++ ++#endif /* __KERNEL__ || !HAVE_TCA_STATS_PKT64 */ ++#endif /* __LINUX_GEN_STATS_WRAPPER_H */ diff --git a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h index b0a5ce8bec..bc51a5767f 100644 --- a/include/linux/pkt_cls.h @@ -83983,7 +84096,7 @@ index f8c46bbaad..b42d314b65 100644 static int diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c -index 550e440b3a..89d3324e60 100644 +index 550e440b3a..0d0cafc14d 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); @@ -84005,7 +84118,30 @@ index 550e440b3a..89d3324e60 100644 return err; } -@@ -757,8 +760,7 @@ parse_tc_flower_to_match(struct tc_flower *flower, +@@ -502,6 +505,22 @@ flower_tun_opt_to_match(struct match *match, struct tc_flower *flower) + match->wc.masks.tunnel.flags |= FLOW_TNL_F_UDPIF; + } + ++static void ++parse_tc_flower_to_stats(struct tc_flower *flower, ++ struct dpif_flow_stats *stats) ++{ ++ if (!stats) { ++ return; ++ } ++ ++ memset(stats, 0, sizeof *stats); ++ stats->n_packets = get_32aligned_u64(&flower->stats_sw.n_packets); ++ stats->n_packets += get_32aligned_u64(&flower->stats_hw.n_packets); ++ stats->n_bytes = get_32aligned_u64(&flower->stats_sw.n_bytes); ++ stats->n_bytes += get_32aligned_u64(&flower->stats_hw.n_bytes); ++ stats->used = flower->lastused; ++} ++ + static int + parse_tc_flower_to_match(struct tc_flower *flower, + struct match *match, +@@ -757,8 +776,7 @@ parse_tc_flower_to_match(struct tc_flower *flower, action->encap.tp_dst); } if (!action->encap.no_csum) { @@ -84015,7 +84151,21 @@ index 550e440b3a..89d3324e60 100644 } parse_tc_flower_geneve_opts(action, buf); -@@ -1352,6 +1354,66 @@ flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl, +@@ -863,12 +881,7 @@ parse_tc_flower_to_match(struct tc_flower *flower, + + *actions = ofpbuf_at_assert(buf, act_off, sizeof(struct nlattr)); + +- if (stats) { +- memset(stats, 0, sizeof *stats); +- stats->n_packets = get_32aligned_u64(&flower->stats.n_packets); +- stats->n_bytes = get_32aligned_u64(&flower->stats.n_bytes); +- stats->used = flower->lastused; +- } ++ parse_tc_flower_to_stats(flower, stats); + + attrs->offloaded = (flower->offloaded_state == TC_OFFLOADED_STATE_IN_HW) + || (flower->offloaded_state == TC_OFFLOADED_STATE_UNDEFINED); +@@ -1352,6 +1365,66 @@ flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl, flower->mask.tunnel.metadata.present.len = tnl->metadata.present.len; } @@ -84082,7 +84232,7 @@ index 550e440b3a..89d3324e60 100644 static int netdev_tc_flow_put(struct netdev *netdev, struct match *match, struct nlattr *actions, size_t actions_len, -@@ -1572,53 +1634,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1572,53 +1645,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, } } @@ -84137,7 +84287,7 @@ index 550e440b3a..89d3324e60 100644 /* ignore exact match on skb_mark of 0. */ if (mask->pkt_mark == UINT32_MAX && !key->pkt_mark) { -@@ -1699,6 +1715,10 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1699,6 +1726,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); @@ -84148,7 +84298,7 @@ index 550e440b3a..89d3324e60 100644 err = parse_put_flow_ct_action(&flower, action, ct, ct_len); if (err) { return err; -@@ -1727,7 +1747,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, +@@ -1727,7 +1758,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); @@ -84157,7 +84307,18 @@ index 550e440b3a..89d3324e60 100644 } prio = get_prio_for_tc_flower(&flower); -@@ -1837,6 +1857,7 @@ probe_multi_mask_per_prio(int ifindex) +@@ -1810,9 +1841,7 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, + if (stats) { + memset(stats, 0, sizeof *stats); + if (!tc_get_flower(&id, &flower)) { +- stats->n_packets = get_32aligned_u64(&flower.stats.n_packets); +- stats->n_bytes = get_32aligned_u64(&flower.stats.n_bytes); +- stats->used = flower.lastused; ++ parse_tc_flower_to_stats(&flower, stats); + } + } + +@@ -1837,6 +1866,7 @@ probe_multi_mask_per_prio(int ifindex) memset(&flower, 0, sizeof flower); @@ -84165,7 +84326,7 @@ index 550e440b3a..89d3324e60 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 +1889,96 @@ out: +@@ -1868,6 +1898,96 @@ out: tc_add_del_qdisc(ifindex, false, block_id, TC_INGRESS); } @@ -84262,7 +84423,7 @@ index 550e440b3a..89d3324e60 100644 static void probe_tc_block_support(int ifindex) { -@@ -1884,6 +1995,7 @@ probe_tc_block_support(int ifindex) +@@ -1884,6 +2004,7 @@ probe_tc_block_support(int ifindex) memset(&flower, 0, sizeof flower); @@ -84270,7 +84431,7 @@ index 550e440b3a..89d3324e60 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 +2019,7 @@ netdev_tc_init_flow_api(struct netdev *netdev) +@@ -1907,6 +2028,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; @@ -84278,7 +84439,7 @@ index 550e440b3a..89d3324e60 100644 int ifindex; int error; -@@ -1917,20 +2030,30 @@ netdev_tc_init_flow_api(struct netdev *netdev) +@@ -1917,20 +2039,30 @@ netdev_tc_init_flow_api(struct netdev *netdev) return -ifindex; } @@ -86243,7 +86404,7 @@ index 809b405a52..a869b5f390 100644 goto out; } diff --git a/lib/tc.c b/lib/tc.c -index 12af0192b6..e224642fb8 100644 +index 12af0192b6..5337f104c6 100644 --- a/lib/tc.c +++ b/lib/tc.c @@ -60,12 +60,6 @@ VLOG_DEFINE_THIS_MODULE(tc); @@ -86289,20 +86450,62 @@ index 12af0192b6..e224642fb8 100644 int diff = flower_off + (keys->off - mf); ovs_be32 *dst = (void *) (rewrite_key + diff); ovs_be32 *dst_m = (void *) (rewrite_mask + diff); -@@ -1647,8 +1643,10 @@ nl_parse_single_action(struct nlattr *action, struct tc_flower *flower) +@@ -1581,6 +1577,9 @@ static const struct nl_policy stats_policy[] = { + [TCA_STATS_BASIC] = { .type = NL_A_UNSPEC, + .min_len = sizeof(struct gnet_stats_basic), + .optional = false, }, ++ [TCA_STATS_BASIC_HW] = { .type = NL_A_UNSPEC, ++ .min_len = sizeof(struct gnet_stats_basic), ++ .optional = true, }, + }; + + static int +@@ -1592,8 +1591,11 @@ nl_parse_single_action(struct nlattr *action, struct tc_flower *flower) + const char *act_kind; + struct nlattr *action_attrs[ARRAY_SIZE(act_policy)]; + struct nlattr *stats_attrs[ARRAY_SIZE(stats_policy)]; +- struct ovs_flow_stats *stats = &flower->stats; +- const struct gnet_stats_basic *bs; ++ struct ovs_flow_stats *stats_sw = &flower->stats_sw; ++ struct ovs_flow_stats *stats_hw = &flower->stats_hw; ++ const struct gnet_stats_basic *bs_all = NULL; ++ const struct gnet_stats_basic *bs_hw = NULL; ++ struct gnet_stats_basic bs_sw = { .packets = 0, .bytes = 0, }; + int err = 0; + + if (!nl_parse_nested(action, act_policy, action_attrs, +@@ -1646,9 +1648,27 @@ nl_parse_single_action(struct nlattr *action, struct tc_flower *flower) + return EPROTO; } - bs = nl_attr_get_unspec(stats_attrs[TCA_STATS_BASIC], sizeof *bs); +- bs = nl_attr_get_unspec(stats_attrs[TCA_STATS_BASIC], sizeof *bs); - put_32aligned_u64(&stats->n_packets, bs->packets); - put_32aligned_u64(&stats->n_bytes, bs->bytes); -+ if (bs->packets) { -+ put_32aligned_u64(&stats->n_packets, bs->packets); -+ put_32aligned_u64(&stats->n_bytes, bs->bytes); ++ bs_all = nl_attr_get_unspec(stats_attrs[TCA_STATS_BASIC], sizeof *bs_all); ++ if (stats_attrs[TCA_STATS_BASIC_HW]) { ++ bs_hw = nl_attr_get_unspec(stats_attrs[TCA_STATS_BASIC_HW], ++ sizeof *bs_hw); ++ ++ bs_sw.packets = bs_all->packets - bs_hw->packets; ++ bs_sw.bytes = bs_all->bytes - bs_hw->bytes; ++ } else { ++ bs_sw.packets = bs_all->packets; ++ bs_sw.bytes = bs_all->bytes; ++ } ++ ++ if (bs_sw.packets > get_32aligned_u64(&stats_sw->n_packets)) { ++ put_32aligned_u64(&stats_sw->n_packets, bs_sw.packets); ++ put_32aligned_u64(&stats_sw->n_bytes, bs_sw.bytes); ++ } ++ ++ if (bs_hw && bs_hw->packets > get_32aligned_u64(&stats_hw->n_packets)) { ++ put_32aligned_u64(&stats_hw->n_packets, bs_hw->packets); ++ put_32aligned_u64(&stats_hw->n_bytes, bs_hw->bytes); + } return 0; } -@@ -2369,6 +2367,17 @@ nl_msg_put_flower_rewrite_pedits(struct ofpbuf *request, +@@ -2369,6 +2389,17 @@ nl_msg_put_flower_rewrite_pedits(struct ofpbuf *request, return 0; } @@ -86320,7 +86523,7 @@ index 12af0192b6..e224642fb8 100644 static int nl_msg_put_flower_acts(struct ofpbuf *request, struct tc_flower *flower) { -@@ -2403,6 +2412,11 @@ nl_msg_put_flower_acts(struct ofpbuf *request, struct tc_flower *flower) +@@ -2403,6 +2434,11 @@ nl_msg_put_flower_acts(struct ofpbuf *request, struct tc_flower *flower) } break; case TC_ACT_ENCAP: { @@ -86332,7 +86535,7 @@ index 12af0192b6..e224642fb8 100644 act_offset = nl_msg_start_nested(request, act_index++); nl_msg_put_act_tunnel_key_set(request, action->encap.id_present, action->encap.id, -@@ -2460,9 +2474,7 @@ nl_msg_put_flower_acts(struct ofpbuf *request, struct tc_flower *flower) +@@ -2460,9 +2496,7 @@ nl_msg_put_flower_acts(struct ofpbuf *request, struct tc_flower *flower) break; case TC_ACT_OUTPUT: { if (!released && flower->tunnel) { @@ -86343,7 +86546,7 @@ index 12af0192b6..e224642fb8 100644 released = true; } -@@ -2645,6 +2657,7 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower) +@@ -2645,6 +2679,7 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower) bool is_vlan = eth_type_vlan(flower->key.eth_type); bool is_qinq = is_vlan && eth_type_vlan(flower->key.encap_eth_type[0]); bool is_mpls = eth_type_mpls(flower->key.eth_type); @@ -86351,7 +86554,7 @@ index 12af0192b6..e224642fb8 100644 int err; /* need to parse acts first as some acts require changing the matching -@@ -2762,7 +2775,11 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower) +@@ -2762,7 +2797,11 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower) } } @@ -86364,7 +86567,7 @@ index 12af0192b6..e224642fb8 100644 if (flower->tunnel) { nl_msg_put_flower_tunnel(request, flower); -@@ -2771,6 +2788,50 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower) +@@ -2771,6 +2810,50 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower) return 0; } @@ -86415,7 +86618,7 @@ index 12af0192b6..e224642fb8 100644 int tc_replace_flower(struct tcf_id *id, struct tc_flower *flower) { -@@ -2802,6 +2863,20 @@ tc_replace_flower(struct tcf_id *id, struct tc_flower *flower) +@@ -2802,6 +2885,20 @@ tc_replace_flower(struct tcf_id *id, struct tc_flower *flower) id->prio = tc_get_major(tc->tcm_info); id->handle = tc->tcm_handle; @@ -86437,7 +86640,7 @@ index 12af0192b6..e224642fb8 100644 } diff --git a/lib/tc.h b/lib/tc.h -index d31c0953ed..0dc62bd83f 100644 +index d31c0953ed..e5657e52dd 100644 --- a/lib/tc.h +++ b/lib/tc.h @@ -235,7 +235,7 @@ struct tc_action { @@ -86464,7 +86667,17 @@ index d31c0953ed..0dc62bd83f 100644 struct tc_flower { struct tc_flower_key key; struct tc_flower_key mask; -@@ -329,6 +337,8 @@ struct tc_flower { +@@ -311,7 +319,8 @@ struct tc_flower { + int action_count; + struct tc_action actions[TCA_ACT_MAX_NUM]; + +- struct ovs_flow_stats stats; ++ struct ovs_flow_stats stats_sw; ++ struct ovs_flow_stats stats_hw; + uint64_t lastused; + + struct { +@@ -329,6 +338,8 @@ struct tc_flower { bool needs_full_ip_proto_mask; enum tc_offloaded_state offloaded_state; diff --git a/SPECS/openvswitch2.13.spec b/SPECS/openvswitch2.13.spec index fcf582d..dbb6482 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: 162%{?commit0:.%{date}git%{shortcommit0}}%{?commit1:dpdk%{shortcommit1}}%{?dist} +Release: 163%{?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,13 @@ exit 0 %endif %changelog +* Fri Mar 04 2022 Open vSwitch CI - 2.13.0-163 +- Merging upstream branch-2.13 [RH git: 352f0456cb] + Commit list: + 1a5b8b7c4c tc: Fix stats byte count on fragmented packets. + d66f391591 compat: Add gen_stats include to define tc hw stats. + + * Fri Feb 25 2022 Open vSwitch CI - 2.13.0-162 - Merging upstream branch-2.13 [RH git: 02895de52e] Commit list: