From f2274a9dd6ef7ddb32f3506f37bc19c6a81eaf60 Mon Sep 17 00:00:00 2001 From: Open vSwitch CI Date: Jun 07 2024 03:30:36 +0000 Subject: Import openvswitch3.3-3.3.0-27 from Fast DataPath --- diff --git a/SOURCES/openvswitch-3.3.0.patch b/SOURCES/openvswitch-3.3.0.patch index 217aa88..78671c3 100644 --- a/SOURCES/openvswitch-3.3.0.patch +++ b/SOURCES/openvswitch-3.3.0.patch @@ -562,10 +562,61 @@ index 305822293b..df7bf8e6b3 100644 if (dp_packet_hwol_tx_ip_csum(p)) { diff --git a/lib/dp-packet.h b/lib/dp-packet.h -index 2fa17d8140..3622764c47 100644 +index 2fa17d8140..a75b1c5cdb 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h -@@ -1300,6 +1300,14 @@ dp_packet_hwol_set_tunnel_vxlan(struct dp_packet *b) +@@ -604,25 +604,6 @@ dp_packet_get_nd_payload(const struct dp_packet *b) + } + + #ifdef DPDK_NETDEV +-static inline void +-dp_packet_set_l2_len(struct dp_packet *b, size_t l2_len) +-{ +- b->mbuf.l2_len = l2_len; +-} +- +-static inline void +-dp_packet_set_l3_len(struct dp_packet *b, size_t l3_len) +-{ +- b->mbuf.l3_len = l3_len; +-} +- +-static inline void +-dp_packet_set_l4_len(struct dp_packet *b, size_t l4_len) +-{ +- b->mbuf.l4_len = l4_len; +-} +- +- + static inline uint64_t * + dp_packet_ol_flags_ptr(const struct dp_packet *b) + { +@@ -642,24 +623,6 @@ dp_packet_flow_mark_ptr(const struct dp_packet *b) + } + + #else +-static inline void +-dp_packet_set_l2_len(struct dp_packet *b OVS_UNUSED, size_t l2_len OVS_UNUSED) +-{ +- /* There is no implementation. */ +-} +- +-static inline void +-dp_packet_set_l3_len(struct dp_packet *b OVS_UNUSED, size_t l3_len OVS_UNUSED) +-{ +- /* There is no implementation. */ +-} +- +-static inline void +-dp_packet_set_l4_len(struct dp_packet *b OVS_UNUSED, size_t l4_len OVS_UNUSED) +-{ +- /* There is no implementation. */ +-} +- + static inline uint32_t * + dp_packet_ol_flags_ptr(const struct dp_packet *b) + { +@@ -1300,6 +1263,14 @@ dp_packet_hwol_set_tunnel_vxlan(struct dp_packet *b) *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TUNNEL_VXLAN; } @@ -880,7 +931,7 @@ index c59b51b611..a8e3f457b9 100644 if (n) { diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c -index 45f61930d4..9249b9e9c6 100644 +index 45f61930d4..e77c881a77 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -607,6 +607,9 @@ int netdev_dpdk_get_vid(const struct netdev_dpdk *dev); @@ -893,17 +944,19 @@ index 45f61930d4..9249b9e9c6 100644 static bool is_dpdk_class(const struct netdev_class *class) { -@@ -1351,6 +1354,18 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev) +@@ -1351,6 +1354,20 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev) info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_TCP_CKSUM; } + if (!strcmp(info.driver_name, "net_ice") -+ || !strcmp(info.driver_name, "net_i40e")) { ++ || !strcmp(info.driver_name, "net_i40e") ++ || !strcmp(info.driver_name, "net_iavf")) { + /* FIXME: Driver advertises the capability but doesn't seem + * to actually support it correctly. Can remove this once + * the driver is fixed on DPDK side. */ + VLOG_INFO("%s: disabled Tx outer udp checksum offloads for a " -+ "net/ice or net/i40e port.", netdev_get_name(&dev->up)); ++ "net/ice, net/i40e or net/iavf port.", ++ netdev_get_name(&dev->up)); + info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM; + info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO; + info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO; @@ -912,7 +965,7 @@ index 45f61930d4..9249b9e9c6 100644 if (info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM) { dev->hw_ol_features |= NETDEV_TX_IPV4_CKSUM_OFFLOAD; } else { -@@ -2364,17 +2379,16 @@ netdev_dpdk_set_config(struct netdev *netdev, const struct smap *args, +@@ -2364,17 +2381,16 @@ netdev_dpdk_set_config(struct netdev *netdev, const struct smap *args, struct eth_addr mac; if (!dpdk_port_is_representor(dev)) { @@ -938,23 +991,31 @@ index 45f61930d4..9249b9e9c6 100644 } else if (!eth_addr_equals(dev->requested_hwaddr, mac)) { dev->requested_hwaddr = mac; netdev_request_reconfigure(netdev); -@@ -2569,21 +2583,57 @@ netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf) +@@ -2567,73 +2583,133 @@ static bool + netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf) + { struct dp_packet *pkt = CONTAINER_OF(mbuf, struct dp_packet, mbuf); - struct tcp_header *th; - +- struct tcp_header *th; +- - if (!(mbuf->ol_flags & (RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_L4_MASK - | RTE_MBUF_F_TX_TCP_SEG))) { - mbuf->ol_flags &= ~(RTE_MBUF_F_TX_IPV4 | RTE_MBUF_F_TX_IPV6); -+ const uint64_t all_requests = (RTE_MBUF_F_TX_IP_CKSUM | -+ RTE_MBUF_F_TX_L4_MASK | -+ RTE_MBUF_F_TX_OUTER_IP_CKSUM | -+ RTE_MBUF_F_TX_OUTER_UDP_CKSUM | -+ RTE_MBUF_F_TX_TCP_SEG); -+ const uint64_t all_marks = (RTE_MBUF_F_TX_IPV4 | -+ RTE_MBUF_F_TX_IPV6 | -+ RTE_MBUF_F_TX_OUTER_IPV4 | -+ RTE_MBUF_F_TX_OUTER_IPV6 | -+ RTE_MBUF_F_TX_TUNNEL_MASK); ++ void *l2; ++ void *l3; ++ void *l4; ++ ++ const uint64_t all_inner_requests = (RTE_MBUF_F_TX_IP_CKSUM | ++ RTE_MBUF_F_TX_L4_MASK | ++ RTE_MBUF_F_TX_TCP_SEG); ++ const uint64_t all_outer_requests = (RTE_MBUF_F_TX_OUTER_IP_CKSUM | ++ RTE_MBUF_F_TX_OUTER_UDP_CKSUM); ++ const uint64_t all_requests = all_inner_requests | all_outer_requests; ++ const uint64_t all_inner_marks = (RTE_MBUF_F_TX_IPV4 | ++ RTE_MBUF_F_TX_IPV6); ++ const uint64_t all_outer_marks = (RTE_MBUF_F_TX_OUTER_IPV4 | ++ RTE_MBUF_F_TX_OUTER_IPV6 | ++ RTE_MBUF_F_TX_TUNNEL_MASK); ++ const uint64_t all_marks = all_inner_marks | all_outer_marks; + + if (!(mbuf->ol_flags & all_requests)) { + /* No offloads requested, no marks should be set. */ @@ -971,73 +1032,150 @@ index 45f61930d4..9249b9e9c6 100644 return true; } - /* If packet is vxlan or geneve tunnel packet, calculate outer - * l2 len and outer l3 len. Inner l2/l3/l4 len are calculated - * before. */ +- /* If packet is vxlan or geneve tunnel packet, calculate outer +- * l2 len and outer l3 len. Inner l2/l3/l4 len are calculated +- * before. */ - if (mbuf->ol_flags & - (RTE_MBUF_F_TX_TUNNEL_GENEVE | RTE_MBUF_F_TX_TUNNEL_VXLAN)) { +- mbuf->outer_l2_len = (char *) dp_packet_l3(pkt) - +- (char *) dp_packet_eth(pkt); +- mbuf->outer_l3_len = (char *) dp_packet_l4(pkt) - +- (char *) dp_packet_l3(pkt); + const uint64_t tunnel_type = mbuf->ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK; -+ if (tunnel_type == RTE_MBUF_F_TX_TUNNEL_GENEVE || -+ tunnel_type == RTE_MBUF_F_TX_TUNNEL_VXLAN) { - mbuf->outer_l2_len = (char *) dp_packet_l3(pkt) - - (char *) dp_packet_eth(pkt); - mbuf->outer_l3_len = (char *) dp_packet_l4(pkt) - - (char *) dp_packet_l3(pkt); -+ -+ /* If neither inner checksums nor TSO is requested, inner marks -+ * should not be set. */ -+ if (!(mbuf->ol_flags & (RTE_MBUF_F_TX_IP_CKSUM | -+ RTE_MBUF_F_TX_L4_MASK | -+ RTE_MBUF_F_TX_TCP_SEG))) { -+ mbuf->ol_flags &= ~(RTE_MBUF_F_TX_IPV4 | -+ RTE_MBUF_F_TX_IPV6); -+ } -+ } else if (OVS_UNLIKELY(tunnel_type)) { ++ if (OVS_UNLIKELY(tunnel_type && ++ tunnel_type != RTE_MBUF_F_TX_TUNNEL_GENEVE && ++ tunnel_type != RTE_MBUF_F_TX_TUNNEL_VXLAN)) { + VLOG_WARN_RL(&rl, "%s: Unexpected tunnel type: %#"PRIx64, + netdev_get_name(&dev->up), tunnel_type); + netdev_dpdk_mbuf_dump(netdev_get_name(&dev->up), + "Packet with unexpected tunnel type", mbuf); + return false; ++ } ++ ++ if (tunnel_type && (mbuf->ol_flags & all_inner_requests)) { ++ if (mbuf->ol_flags & all_outer_requests) { ++ mbuf->outer_l2_len = (char *) dp_packet_l3(pkt) - ++ (char *) dp_packet_eth(pkt); ++ mbuf->outer_l3_len = (char *) dp_packet_l4(pkt) - ++ (char *) dp_packet_l3(pkt); ++ ++ /* Inner L2 length must account for the tunnel header length. */ ++ l2 = dp_packet_l4(pkt); ++ l3 = dp_packet_inner_l3(pkt); ++ l4 = dp_packet_inner_l4(pkt); ++ } else { ++ /* If no outer offloading is requested, clear outer marks. */ ++ mbuf->ol_flags &= ~all_outer_marks; ++ mbuf->outer_l2_len = 0; ++ mbuf->outer_l3_len = 0; ++ ++ /* Skip outer headers. */ ++ l2 = dp_packet_eth(pkt); ++ l3 = dp_packet_inner_l3(pkt); ++ l4 = dp_packet_inner_l4(pkt); ++ } } else { - mbuf->l2_len = (char *) dp_packet_l3(pkt) - - (char *) dp_packet_eth(pkt); -@@ -2602,15 +2652,14 @@ netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf) - } +- mbuf->l2_len = (char *) dp_packet_l3(pkt) - +- (char *) dp_packet_eth(pkt); +- mbuf->l3_len = (char *) dp_packet_l4(pkt) - +- (char *) dp_packet_l3(pkt); ++ if (tunnel_type) { ++ /* No inner offload is requested, fallback to non tunnel ++ * checksum offloads. */ ++ mbuf->ol_flags &= ~all_inner_marks; ++ if (mbuf->ol_flags & RTE_MBUF_F_TX_OUTER_IP_CKSUM) { ++ mbuf->ol_flags |= RTE_MBUF_F_TX_IP_CKSUM; ++ mbuf->ol_flags |= RTE_MBUF_F_TX_IPV4; ++ } ++ if (mbuf->ol_flags & RTE_MBUF_F_TX_OUTER_UDP_CKSUM) { ++ mbuf->ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM; ++ mbuf->ol_flags |= mbuf->ol_flags & RTE_MBUF_F_TX_OUTER_IPV4 ++ ? RTE_MBUF_F_TX_IPV4 : RTE_MBUF_F_TX_IPV6; ++ } ++ mbuf->ol_flags &= ~(all_outer_requests | all_outer_marks); ++ } + mbuf->outer_l2_len = 0; + mbuf->outer_l3_len = 0; +- } +- th = dp_packet_l4(pkt); + +- if (mbuf->ol_flags & RTE_MBUF_F_TX_TCP_SEG) { +- if (!th) { +- VLOG_WARN_RL(&rl, "%s: TCP Segmentation without L4 header" +- " pkt len: %"PRIu32"", dev->up.name, mbuf->pkt_len); +- return false; +- } ++ l2 = dp_packet_eth(pkt); ++ l3 = dp_packet_l3(pkt); ++ l4 = dp_packet_l4(pkt); } - if (mbuf->ol_flags & RTE_MBUF_F_TX_TCP_CKSUM) { -+ if ((mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_TCP_CKSUM) { - if (!th) { - VLOG_WARN_RL(&rl, "%s: TCP offloading without L4 header" - " pkt len: %"PRIu32"", dev->up.name, mbuf->pkt_len); - return false; - } +- if (!th) { +- VLOG_WARN_RL(&rl, "%s: TCP offloading without L4 header" +- " pkt len: %"PRIu32"", dev->up.name, mbuf->pkt_len); +- return false; +- } ++ ovs_assert(l4); - if (mbuf->ol_flags & (RTE_MBUF_F_TX_TUNNEL_GENEVE | - RTE_MBUF_F_TX_TUNNEL_VXLAN)) { +- mbuf->tso_segsz = dev->mtu - mbuf->l2_len - mbuf->l3_len - +- mbuf->l4_len - mbuf->outer_l3_len; ++ mbuf->l2_len = (char *) l3 - (char *) l2; ++ mbuf->l3_len = (char *) l4 - (char *) l3; ++ ++ if (mbuf->ol_flags & RTE_MBUF_F_TX_TCP_SEG) { ++ struct tcp_header *th = l4; ++ uint16_t link_tso_segsz; ++ int hdr_len; ++ ++ mbuf->l4_len = TCP_OFFSET(th->tcp_ctl) * 4; + if (tunnel_type) { - mbuf->tso_segsz = dev->mtu - mbuf->l2_len - mbuf->l3_len - - mbuf->l4_len - mbuf->outer_l3_len; ++ link_tso_segsz = dev->mtu - mbuf->l2_len - mbuf->l3_len - ++ mbuf->l4_len - mbuf->outer_l3_len; } else { -@@ -2629,11 +2678,14 @@ netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf) - return false; - } +- mbuf->l4_len = TCP_OFFSET(th->tcp_ctl) * 4; +- mbuf->tso_segsz = dev->mtu - mbuf->l3_len - mbuf->l4_len; ++ link_tso_segsz = dev->mtu - mbuf->l3_len - mbuf->l4_len; + } + +- if (mbuf->ol_flags & RTE_MBUF_F_TX_TCP_SEG) { +- int hdr_len = mbuf->l2_len + mbuf->l3_len + mbuf->l4_len; +- if (OVS_UNLIKELY((hdr_len + +- mbuf->tso_segsz) > dev->max_packet_len)) { +- VLOG_WARN_RL(&rl, "%s: Oversized TSO packet. hdr: %"PRIu32", " +- "gso: %"PRIu32", max len: %"PRIu32"", +- dev->up.name, hdr_len, mbuf->tso_segsz, +- dev->max_packet_len); +- return false; +- } ++ if (mbuf->tso_segsz > link_tso_segsz) { ++ mbuf->tso_segsz = link_tso_segsz; } -+ } - if (mbuf->ol_flags & RTE_MBUF_F_TX_IPV4) { - mbuf->ol_flags |= RTE_MBUF_F_TX_IP_CKSUM; -- } ++ hdr_len = mbuf->l2_len + mbuf->l3_len + mbuf->l4_len; ++ if (OVS_UNLIKELY((hdr_len + mbuf->tso_segsz) > dev->max_packet_len)) { ++ VLOG_WARN_RL(&rl, "%s: Oversized TSO packet. hdr: %"PRIu32", " ++ "gso: %"PRIu32", max len: %"PRIu32"", ++ dev->up.name, hdr_len, mbuf->tso_segsz, ++ dev->max_packet_len); ++ return false; + } + } ++ + /* If L4 checksum is requested, IPv4 should be requested as well. */ + if (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK + && mbuf->ol_flags & RTE_MBUF_F_TX_IPV4) { + mbuf->ol_flags |= RTE_MBUF_F_TX_IP_CKSUM; - } ++ } + return true; } -@@ -2664,6 +2716,35 @@ netdev_dpdk_prep_hwol_batch(struct netdev_dpdk *dev, struct rte_mbuf **pkts, +@@ -2664,6 +2740,35 @@ netdev_dpdk_prep_hwol_batch(struct netdev_dpdk *dev, struct rte_mbuf **pkts, return cnt; } @@ -1073,7 +1211,7 @@ index 45f61930d4..9249b9e9c6 100644 /* Tries to transmit 'pkts' to txq 'qid' of device 'dev'. Takes ownership of * 'pkts', even in case of failure. * -@@ -2680,6 +2761,8 @@ netdev_dpdk_eth_tx_burst(struct netdev_dpdk *dev, int qid, +@@ -2680,6 +2785,8 @@ netdev_dpdk_eth_tx_burst(struct netdev_dpdk *dev, int qid, VLOG_WARN_RL(&rl, "%s: Output batch contains invalid packets. " "Only %u/%u are valid: %s", netdev_get_name(&dev->up), nb_tx_prep, cnt, rte_strerror(rte_errno)); @@ -1172,10 +1310,84 @@ index bf91ef462e..80ccade06a 100644 return netdev->get_features_error; } diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c -index dee9ab344e..d6f46ac4ae 100644 +index dee9ab344e..0f9f07f44b 100644 --- a/lib/netdev-native-tnl.c +++ b/lib/netdev-native-tnl.c -@@ -932,9 +932,9 @@ netdev_srv6_build_header(const struct netdev *netdev, +@@ -240,35 +240,15 @@ udp_extract_tnl_md(struct dp_packet *packet, struct flow_tnl *tnl, + return udp + 1; + } + +-/* Calculate inner l2 l3 l4 len as tunnel outer header is not +- * encapsulated now. */ + static void + dp_packet_tnl_ol_process(struct dp_packet *packet, + const struct ovs_action_push_tnl *data) + { +- struct udp_header *udp = NULL; +- uint8_t opt_len = 0; +- struct eth_header *eth = NULL; + struct ip_header *ip = NULL; +- struct genevehdr *gnh = NULL; + +- /* l2 l3 l4 len refer to inner len, tunnel outer +- * header is not encapsulated here. */ + if (dp_packet_hwol_l4_mask(packet)) { + ip = dp_packet_l3(packet); + +- if (ip->ip_proto == IPPROTO_TCP) { +- struct tcp_header *th = dp_packet_l4(packet); +- dp_packet_set_l4_len(packet, TCP_OFFSET(th->tcp_ctl) * 4); +- } else if (ip->ip_proto == IPPROTO_UDP) { +- dp_packet_set_l4_len(packet, UDP_HEADER_LEN); +- } else if (ip->ip_proto == IPPROTO_SCTP) { +- dp_packet_set_l4_len(packet, SCTP_HEADER_LEN); +- } +- +- dp_packet_set_l3_len(packet, (char *) dp_packet_l4(packet) - +- (char *) dp_packet_l3(packet)); +- + if (data->tnl_type == OVS_VPORT_TYPE_GENEVE || + data->tnl_type == OVS_VPORT_TYPE_VXLAN) { + +@@ -279,32 +259,12 @@ dp_packet_tnl_ol_process(struct dp_packet *packet, + dp_packet_hwol_set_tx_ipv6(packet); + } + } ++ } + +- /* Attention please, tunnel inner l2 len is consist of udp header +- * len and tunnel header len and inner l2 len. */ +- if (data->tnl_type == OVS_VPORT_TYPE_GENEVE) { +- eth = (struct eth_header *)(data->header); +- ip = (struct ip_header *)(eth + 1); +- udp = (struct udp_header *)(ip + 1); +- gnh = (struct genevehdr *)(udp + 1); +- opt_len = gnh->opt_len * 4; +- dp_packet_hwol_set_tunnel_geneve(packet); +- dp_packet_set_l2_len(packet, (char *) dp_packet_l3(packet) - +- (char *) dp_packet_eth(packet) + +- GENEVE_BASE_HLEN + opt_len); +- } else if (data->tnl_type == OVS_VPORT_TYPE_VXLAN) { +- dp_packet_hwol_set_tunnel_vxlan(packet); +- dp_packet_set_l2_len(packet, (char *) dp_packet_l3(packet) - +- (char *) dp_packet_eth(packet) + +- VXLAN_HLEN); +- } +- } else { +- /* Mark non-l4 packets as tunneled. */ +- if (data->tnl_type == OVS_VPORT_TYPE_GENEVE) { +- dp_packet_hwol_set_tunnel_geneve(packet); +- } else if (data->tnl_type == OVS_VPORT_TYPE_VXLAN) { +- dp_packet_hwol_set_tunnel_vxlan(packet); +- } ++ if (data->tnl_type == OVS_VPORT_TYPE_GENEVE) { ++ dp_packet_hwol_set_tunnel_geneve(packet); ++ } else if (data->tnl_type == OVS_VPORT_TYPE_VXLAN) { ++ dp_packet_hwol_set_tunnel_vxlan(packet); + } + } + +@@ -932,9 +892,9 @@ netdev_srv6_build_header(const struct netdev *netdev, const struct netdev_tnl_build_header_params *params) { const struct netdev_tunnel_config *tnl_cfg; @@ -1186,7 +1398,7 @@ index dee9ab344e..d6f46ac4ae 100644 ovs_be16 dl_type; int nr_segs; int i; -@@ -978,8 +978,7 @@ netdev_srv6_build_header(const struct netdev *netdev, +@@ -978,8 +938,7 @@ netdev_srv6_build_header(const struct netdev *netdev, return EOPNOTSUPP; } @@ -1196,7 +1408,7 @@ index dee9ab344e..d6f46ac4ae 100644 for (i = 0; i < nr_segs; i++) { /* Segment list is written to the header in reverse order. */ memcpy(s, &segs[nr_segs - i - 1], sizeof *s); -@@ -1068,7 +1067,10 @@ netdev_srv6_pop_header(struct dp_packet *packet) +@@ -1068,7 +1027,10 @@ netdev_srv6_pop_header(struct dp_packet *packet) } pkt_metadata_init_tnl(md); diff --git a/SPECS/openvswitch3.3.spec b/SPECS/openvswitch3.3.spec index bb4438b..312d73c 100644 --- a/SPECS/openvswitch3.3.spec +++ b/SPECS/openvswitch3.3.spec @@ -57,7 +57,7 @@ Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 3.3.0 -Release: 26%{?dist} +Release: 27%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -767,6 +767,17 @@ exit 0 %endif %changelog +* Thu Jun 06 2024 Open vSwitch CI - 3.3.0-27 +- Merging upstream branch-3.3 [RH git: 63995fdae6] + Commit list: + 5bb95ad089 netdev-dpdk: Refactor tunnel checksum offloading. + a9248871af netdev-dpdk: Use guest TSO segmentation size hint. + 55d2e6d3dc netdev-dpdk: Refactor TSO request code. + 2fe3ab83ab netdev-dpdk: Fix inner checksum when outer is not supported. + 537a6bcda7 netdev-dpdk: Disable outer UDP checksum for net/iavf. + 2e03f5567c netdev-dpdk: Fallback to non tunnel checksum offloading. + + * Wed Jun 05 2024 Open vSwitch CI - 3.3.0-26 - Merging upstream branch-3.3 [RH git: 00e3d428c5] Commit list: