diff --git a/SOURCES/openvswitch-3.5.0.patch b/SOURCES/openvswitch-3.5.0.patch index ba68ada..9ae8a75 100644 --- a/SOURCES/openvswitch-3.5.0.patch +++ b/SOURCES/openvswitch-3.5.0.patch @@ -817,7 +817,7 @@ index df7bf8e6b3..dad0d7be3a 100644 if (dp_packet_hwol_tx_ip_csum(p)) { diff --git a/lib/dp-packet.h b/lib/dp-packet.h -index 4afbbe7223..f94a82b07c 100644 +index 4afbbe7223..0f487a4283 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -104,6 +104,9 @@ enum dp_packet_offload_mask { @@ -838,7 +838,41 @@ index 4afbbe7223..f94a82b07c 100644 DP_PACKET_OL_TX_OUTER_IPV4 | \ DP_PACKET_OL_TX_OUTER_IP_CKSUM | \ DP_PACKET_OL_TX_OUTER_UDP_CKSUM | \ -@@ -1171,6 +1175,22 @@ dp_packet_hwol_is_tunnel_vxlan(struct dp_packet *b) +@@ -206,6 +210,7 @@ static inline void dp_packet_set_tso_segsz(struct dp_packet *, uint16_t); + void *dp_packet_resize_l2(struct dp_packet *, int increment); + void *dp_packet_resize_l2_5(struct dp_packet *, int increment); + static inline void *dp_packet_eth(const struct dp_packet *); ++static inline void dp_packet_reset_outer_offsets(struct dp_packet *); + static inline void dp_packet_reset_offsets(struct dp_packet *); + static inline void dp_packet_reset_offload(struct dp_packet *); + static inline uint16_t dp_packet_l2_pad_size(const struct dp_packet *); +@@ -429,15 +434,22 @@ dp_packet_eth(const struct dp_packet *b) + ? dp_packet_data(b) : NULL; + } + +-/* Resets all layer offsets. 'l3' offset must be set before 'l2' can be +- * retrieved. */ ++/* Resets all outer layer offsets. */ + static inline void +-dp_packet_reset_offsets(struct dp_packet *b) ++dp_packet_reset_outer_offsets(struct dp_packet *b) + { + b->l2_pad_size = 0; + b->l2_5_ofs = UINT16_MAX; + b->l3_ofs = UINT16_MAX; + b->l4_ofs = UINT16_MAX; ++} ++ ++/* Resets all layer offsets. 'l3' offset must be set before 'l2' can be ++ * retrieved. */ ++static inline void ++dp_packet_reset_offsets(struct dp_packet *b) ++{ ++ dp_packet_reset_outer_offsets(b); + b->inner_l3_ofs = UINT16_MAX; + b->inner_l4_ofs = UINT16_MAX; + } +@@ -1171,6 +1183,22 @@ dp_packet_hwol_is_tunnel_vxlan(struct dp_packet *b) return !!(*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_TUNNEL_VXLAN); } @@ -861,27 +895,23 @@ index 4afbbe7223..f94a82b07c 100644 /* Returns 'true' if packet 'b' is marked for outer IPv4 checksum offload. */ static inline bool dp_packet_hwol_is_outer_ipv4_cksum(const struct dp_packet *b) -@@ -1289,11 +1309,19 @@ dp_packet_hwol_set_tunnel_vxlan(struct dp_packet *b) +@@ -1289,12 +1317,11 @@ dp_packet_hwol_set_tunnel_vxlan(struct dp_packet *b) *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TUNNEL_VXLAN; } +-/* Clears tunnel offloading marks. */ +/* Mark packet 'b' for GRE tunnel offloading. */ -+static inline void -+dp_packet_hwol_set_tunnel_gre(struct dp_packet *b) -+{ -+ *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TUNNEL_GRE; -+} -+ - /* Clears tunnel offloading marks. */ static inline void - dp_packet_hwol_reset_tunnel(struct dp_packet *b) +-dp_packet_hwol_reset_tunnel(struct dp_packet *b) ++dp_packet_hwol_set_tunnel_gre(struct dp_packet *b) { - *dp_packet_ol_flags_ptr(b) &= ~(DP_PACKET_OL_TX_TUNNEL_VXLAN | -+ DP_PACKET_OL_TX_TUNNEL_GRE | - DP_PACKET_OL_TX_TUNNEL_GENEVE); +- *dp_packet_ol_flags_ptr(b) &= ~(DP_PACKET_OL_TX_TUNNEL_VXLAN | +- DP_PACKET_OL_TX_TUNNEL_GENEVE); ++ *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TUNNEL_GRE; } -@@ -1352,6 +1380,9 @@ dp_packet_hwol_reset_tcp_seg(struct dp_packet *p) + /* Mark packet 'b' as a tunnel packet with outer IPv4 header. */ +@@ -1352,6 +1379,9 @@ dp_packet_hwol_reset_tcp_seg(struct dp_packet *p) ol_flags |= DP_PACKET_OL_TX_OUTER_IP_CKSUM; } ol_flags |= DP_PACKET_OL_TX_OUTER_UDP_CKSUM; @@ -892,25 +922,168 @@ index 4afbbe7223..f94a82b07c 100644 *dp_packet_ol_flags_ptr(p) = ol_flags; diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c -index 2a529f272d..b572fab23d 100644 +index 2a529f272d..11f82210a8 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c -@@ -8928,9 +8928,7 @@ dp_netdev_recirculate(struct dp_netdev_pmd_thread *pmd, - struct dp_packet *packet; - - DP_PACKET_BATCH_REFILL_FOR_EACH (i, size, packet, packets) { +@@ -115,7 +115,6 @@ COVERAGE_DEFINE(datapath_drop_lock_error); + COVERAGE_DEFINE(datapath_drop_userspace_action_error); + COVERAGE_DEFINE(datapath_drop_tunnel_push_error); + COVERAGE_DEFINE(datapath_drop_tunnel_pop_error); +-COVERAGE_DEFINE(datapath_drop_tunnel_tso_recirc); + COVERAGE_DEFINE(datapath_drop_recirc_error); + COVERAGE_DEFINE(datapath_drop_invalid_port); + COVERAGE_DEFINE(datapath_drop_invalid_bond); +@@ -8923,34 +8922,6 @@ static void + dp_netdev_recirculate(struct dp_netdev_pmd_thread *pmd, + struct dp_packet_batch *packets) + { +- static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); +- size_t i, size = dp_packet_batch_size(packets); +- struct dp_packet *packet; +- +- DP_PACKET_BATCH_REFILL_FOR_EACH (i, size, packet, packets) { - if (dp_packet_hwol_is_tunnel_geneve(packet) || - dp_packet_hwol_is_tunnel_vxlan(packet)) { - -+ if (dp_packet_hwol_is_tunnel(packet)) { - if (dp_packet_hwol_is_tso(packet)) { - /* Can't perform GSO in the middle of a pipeline. */ - COVERAGE_INC(datapath_drop_tunnel_tso_recirc); +- if (dp_packet_hwol_is_tso(packet)) { +- /* Can't perform GSO in the middle of a pipeline. */ +- COVERAGE_INC(datapath_drop_tunnel_tso_recirc); +- dp_packet_delete(packet); +- VLOG_WARN_RL(&rl, "Recirculating tunnel packets with " +- "TSO is not supported"); +- continue; +- } +- /* Have to fix all the checksums before re-parsing, because the +- * packet will be treated as having a single set of headers. */ +- dp_packet_ol_send_prepare(packet, 0); +- /* This packet must not be marked with anything tunnel-related. */ +- dp_packet_hwol_reset_tunnel(packet); +- /* Clear inner offsets. Other ones are collateral, but they will +- * be re-initialized on re-parsing. */ +- dp_packet_reset_offsets(packet); +- } +- dp_packet_batch_refill(packets, packet, i); +- } +- + dp_netdev_input__(pmd, packets, true, 0); + } + diff --git a/lib/flow.c b/lib/flow.c -index 9be4375246..0eb34892f2 100644 +index 9be4375246..ef719471c6 100644 --- a/lib/flow.c +++ b/lib/flow.c -@@ -1187,7 +1187,7 @@ parse_dl_type(const void **datap, size_t *sizep, ovs_be16 *first_vlan_tci_p) +@@ -402,6 +402,14 @@ parse_ethertype(const void **datap, size_t *sizep) + return htons(FLOW_DL_TYPE_NONE); + } + ++static inline bool ++icmp6_is_nd(const struct icmp6_data_header *icmp6) ++{ ++ return (icmp6->icmp6_base.icmp6_code == 0 && ++ (icmp6->icmp6_base.icmp6_type == ND_NEIGHBOR_SOLICIT || ++ icmp6->icmp6_base.icmp6_type == ND_NEIGHBOR_ADVERT)); ++} ++ + /* Returns 'true' if the packet is an ND packet. In that case the '*nd_target' + * and 'arp_buf[]' are filled in. If the packet is not an ND packet, 'false' + * is returned and no values are filled in on '*nd_target' or 'arp_buf[]'. */ +@@ -412,9 +420,7 @@ parse_icmpv6(const void **datap, size_t *sizep, + const union ovs_16aligned_in6_addr **nd_target, + struct eth_addr arp_buf[2], uint8_t *opt_type) + { +- if (icmp6->icmp6_base.icmp6_code != 0 || +- (icmp6->icmp6_base.icmp6_type != ND_NEIGHBOR_SOLICIT && +- icmp6->icmp6_base.icmp6_type != ND_NEIGHBOR_ADVERT)) { ++ if (!icmp6_is_nd(icmp6)) { + return false; + } + +@@ -804,6 +810,7 @@ miniflow_extract(struct dp_packet *packet, struct miniflow *dst) + uint8_t nw_frag, nw_tos, nw_ttl, nw_proto; + uint8_t *ct_nw_proto_p = NULL; + ovs_be16 ct_tp_src = 0, ct_tp_dst = 0; ++ bool tunneling; + + /* Metadata. */ + if (flow_tnl_dst_is_set(&md->tunnel)) { +@@ -857,7 +864,13 @@ miniflow_extract(struct dp_packet *packet, struct miniflow *dst) + + /* Initialize packet's layer pointer and offsets. */ + frame = data; +- dp_packet_reset_offsets(packet); ++ tunneling = dp_packet_hwol_is_tunnel(packet); ++ if (tunneling) { ++ /* Preserve inner offsets from previous circulation. */ ++ dp_packet_reset_outer_offsets(packet); ++ } else { ++ dp_packet_reset_offsets(packet); ++ } + + if (packet_type == htonl(PT_ETH)) { + /* Must have full Ethernet header to proceed. */ +@@ -936,9 +949,16 @@ miniflow_extract(struct dp_packet *packet, struct miniflow *dst) + nw_proto = nh->ip_proto; + nw_frag = ipv4_get_nw_frag(nh); + data_pull(&data, &size, ip_len); +- dp_packet_hwol_set_tx_ipv4(packet); +- if (dp_packet_ip_checksum_good(packet)) { +- dp_packet_hwol_set_tx_ip_csum(packet); ++ if (tunneling) { ++ dp_packet_hwol_set_tx_outer_ipv4(packet); ++ if (dp_packet_ip_checksum_good(packet)) { ++ dp_packet_hwol_set_tx_outer_ipv4_csum(packet); ++ } ++ } else { ++ dp_packet_hwol_set_tx_ipv4(packet); ++ if (dp_packet_ip_checksum_good(packet)) { ++ dp_packet_hwol_set_tx_ip_csum(packet); ++ } + } + } else if (dl_type == htons(ETH_TYPE_IPV6)) { + const struct ovs_16aligned_ip6_hdr *nh = data; +@@ -953,7 +973,11 @@ miniflow_extract(struct dp_packet *packet, struct miniflow *dst) + } + data_pull(&data, &size, sizeof *nh); + +- dp_packet_hwol_set_tx_ipv6(packet); ++ if (tunneling) { ++ dp_packet_hwol_set_tx_outer_ipv6(packet); ++ } else { ++ dp_packet_hwol_set_tx_ipv6(packet); ++ } + plen = ntohs(nh->ip6_plen); + dp_packet_set_l2_pad_size(packet, size - plen); + size = plen; /* Never pull padding. */ +@@ -1078,7 +1102,11 @@ miniflow_extract(struct dp_packet *packet, struct miniflow *dst) + dp_packet_ol_l4_csum_check_partial(packet); + if (dp_packet_l4_checksum_good(packet) + || dp_packet_ol_l4_csum_partial(packet)) { +- dp_packet_hwol_set_csum_udp(packet); ++ if (tunneling) { ++ dp_packet_hwol_set_outer_udp_csum(packet); ++ } else { ++ dp_packet_hwol_set_csum_udp(packet); ++ } + } + } + } else if (OVS_LIKELY(nw_proto == IPPROTO_SCTP)) { +@@ -1166,6 +1194,15 @@ miniflow_extract(struct dp_packet *packet, struct miniflow *dst) + } + } + } ++ } else if (ct_nw_proto_p && ++ (*ct_nw_proto_p == IPPROTO_TCP || ++ *ct_nw_proto_p == IPPROTO_UDP || ++ *ct_nw_proto_p == IPPROTO_SCTP || ++ *ct_nw_proto_p == IPPROTO_ICMP || ++ (*ct_nw_proto_p == IPPROTO_ICMPV6 && !icmp6_is_nd(data)))) { ++ miniflow_pad_from_64(mf, ct_tp_src); ++ miniflow_push_be16(mf, ct_tp_src, ct_tp_src); ++ miniflow_push_be16(mf, ct_tp_dst, ct_tp_dst); + } + out: + dst->map = mf.map; +@@ -1187,7 +1224,7 @@ parse_dl_type(const void **datap, size_t *sizep, ovs_be16 *first_vlan_tci_p) * If 'packet' is not an Ethernet packet embedding TCP, returns 0. * 'dl_type_p' will be set only if the 'packet' is an Ethernet packet. * 'nw_frag_p' will be set only if the 'packet' is an IP packet. @@ -2527,7 +2700,7 @@ index c0ecad6cfb..66bfd0e8ed 100644 + +AT_CLEANUP diff --git a/tests/system-traffic.at b/tests/system-traffic.at -index 16de8da20f..04328db4cc 100644 +index 16de8da20f..0215453230 100644 --- a/tests/system-traffic.at +++ b/tests/system-traffic.at @@ -557,7 +557,6 @@ OVS_TRAFFIC_VSWITCHD_STOP @@ -2687,32 +2860,199 @@ index 16de8da20f..04328db4cc 100644 OVS_CHECK_GRE() CHECK_NO_TC_OFFLOAD() OVS_TRAFFIC_VSWITCHD_START() -@@ -4603,7 +4707,11 @@ NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -W 2 10.1.1.2 | FORMAT_PING +@@ -4603,6 +4707,95 @@ NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -W 2 10.1.1.2 | FORMAT_PING dnl Check userspace conntrack fragmentation counters. DPCTL_CHECK_FRAGMENTATION_PASS() --OVS_TRAFFIC_VSWITCHD_STOP +dnl Ipv4 max packet size fragmentation dropped. +NS_EXEC([at_ns0], [ping -s 65507 -q -c 1 -W 0.5 10.1.1.2]) +OVS_CHECK_FRAG_LARGE() + +OVS_TRAFFIC_VSWITCHD_STOP(["/Unsupported big reassembled v4 packet/d"]) ++AT_CLEANUP ++ ++AT_SETUP([conntrack - IPv4 fragmentation with ct orig match]) ++CHECK_CONNTRACK() ++OVS_TRAFFIC_VSWITCHD_START() ++ ++ADD_NAMESPACES(at_ns0, at_ns1) ++ ++ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24") ++ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24") ++ ++AT_DATA([flows.txt], [dnl ++priority=1,action=drop ++priority=10,arp,action=normal ++priority=100,ip,ct_state=-trk,action=ct(table=0) ++priority=100,in_port=2,icmp,ct_state=+rpl,action=1 ++priority=100,in_port=1,ip,ct_nw_proto=17,ct_tp_src=1,ct_tp_dst=2,ct_state=+new+trk,action=ct(commit) ++priority=100,in_port=1,ip,ct_nw_proto=1,ct_tp_src=8,ct_tp_dst=0,ct_state=+new+trk,action=ct(commit),2 ++]) ++ ++AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt]) ++ ++dnl Packet content: ++dnl Ethernet II, Src: 50:54:00:00:00:0a, Dst: 50:54:00:00:00:09 ++dnl Type: IPv4 (0x0800) ++dnl Internet Protocol Version 4, Src: 10.1.1.1, Dst: 10.1.1.2 ++dnl Total Length: 1420 ++dnl Identification: 0x0001 (1) ++dnl 001. .... = Flags: 0x1, More fragments ++dnl 0... .... = Reserved bit: Not set ++dnl .0.. .... = Don't fragment: Not set ++dnl ..1. .... = More fragments: Set ++dnl ...0 0000 0000 0000 = Fragment Offset: 0 ++dnl Time to Live: 64 ++dnl Protocol: UDP (17) ++dnl User Datagram Protocol, Src Port: 1, Dst Port: 2 ++dnl Source Port: 1 ++dnl Destination Port: 2 ++dnl Length: 1608 ++dnl UDP payload (1392 bytes) ++dnl Data (1392 bytes) ++eth="50 54 00 00 00 09 50 54 00 00 00 0a 08 00" ++ip="45 00 05 8c 00 01 20 00 40 11 3f 5c 0a 01 01 01 0a 01 01 02" ++udp="00 01 00 02 06 48 dd 56" ++data_len=$(seq 1392) ++data=$(printf '00 %.0s' ${data_len}) ++packet="${eth} ${ip} ${udp} ${data}" ++NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 ${packet} > /dev/null]) ++ ++dnl Packet content: ++dnl Ethernet II, Src: 50:54:00:00:00:0a, Dst: 50:54:00:00:00:09 ++dnl Type: IPv4 (0x0800) ++dnl Internet Protocol Version 4, Src: 10.1.1.1, Dst: 10.1.1.2 ++dnl 0100 .... = Version: 4 ++dnl .... 0101 = Header Length: 20 bytes (5) ++dnl Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT) ++dnl 0000 00.. = Differentiated Services Codepoint: Default (0) ++dnl .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0) ++dnl Total Length: 228 ++dnl Identification: 0x0001 (1) ++dnl 000. .... = Flags: 0x0 ++dnl 0... .... = Reserved bit: Not set ++dnl .0.. .... = Don't fragment: Not set ++dnl ..0. .... = More fragments: Not set ++dnl ...0 0000 1010 1111 = Fragment Offset: 1400 ++dnl Time to Live: 64 ++dnl Protocol: UDP (17) ++dnl Data (208 bytes) ++eth="50 54 00 00 00 09 50 54 00 00 00 0a 08 00" ++ip="45 00 00 e4 00 01 00 af 40 11 63 55 0a 01 01 01 0a 01 01 02" ++data_len=$(seq 208) ++data=$(printf '00 %.0s' ${data_len}) ++packet="${eth} ${ip} ${data}" ++NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 ${packet} > /dev/null]) ++ ++NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 1 -W 1 10.1.1.2 | FORMAT_PING], [0], [dnl ++1 packets transmitted, 1 received, 0% packet loss, time 0ms ++]) ++ ++AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | sort], [0], [dnl ++icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=,type=0,code=0) ++udp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=,dport=),reply=(src=10.1.1.2,dst=10.1.1.1,sport=,dport=) ++]) ++ + OVS_TRAFFIC_VSWITCHD_STOP AT_CLEANUP - AT_SETUP([conntrack - IPv4 fragmentation expiry]) -@@ -4897,7 +5005,11 @@ NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -W 2 fc00::2 | FORMAT_PING +@@ -4897,6 +5090,96 @@ NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -W 2 fc00::2 | FORMAT_PING 3 packets transmitted, 3 received, 0% packet loss, time 0ms ]) --OVS_TRAFFIC_VSWITCHD_STOP +dnl Ipv6 max packet size fragmentation dropped. +NS_EXEC([at_ns0], [ping6 -s 65487 -q -c 1 -W 0.5 fc00::2]) +OVS_CHECK_FRAG_LARGE() + +OVS_TRAFFIC_VSWITCHD_STOP(["/Unsupported big reassembled v6 packet/d"]) ++AT_CLEANUP ++ ++AT_SETUP([conntrack - IPv6 fragmentation with ct orig match]) ++CHECK_CONNTRACK() ++OVS_TRAFFIC_VSWITCHD_START() ++ ++ADD_NAMESPACES(at_ns0, at_ns1) ++ ++ADD_VETH(p0, at_ns0, br0, "fc00::1/96", "50:54:00:00:00:09", [], "nodad") ++ADD_VETH(p1, at_ns1, br0, "fc00::2/96", "50:54:00:00:00:0a", [], "nodad") ++ ++AT_DATA([flows.txt], [dnl ++priority=1,action=drop ++priority=10,ipv6,ct_state=-trk,action=ct(table=0) ++priority=10,in_port=2,ipv6,ct_tp_src=128,ct_state=+trk+est+rpl,action=1 ++priority=10,in_port=1,ipv6,ct_nw_proto=17,ct_tp_src=1,ct_tp_dst=2,ct_state=+new+trk,action=ct(commit) ++priority=10,in_port=1,ipv6,ct_nw_proto=58,ct_tp_src=128,ct_tp_dst=0,ct_state=+new+trk,action=ct(commit),2 ++priority=100,icmp6,icmp_type=135,action=normal ++priority=100,icmp6,icmp_type=136,action=normal ++]) ++ ++AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt]) ++ ++dnl Packet content: ++dnl Ethernet II, Src: 50:54:00:00:00:0a, Dst: 50:54:00:00:00:09 ++dnl Type: IPv6 (0x86dd) ++dnl Internet Protocol Version 6, Src: fc00::1, Dst: fc00::2 ++dnl Payload Length: 1344 ++dnl Next Header: Fragment Header for IPv6 (44) ++dnl Hop Limit: 64 ++dnl Fragment Header for IPv6 ++dnl Next header: UDP (17) ++dnl Reserved octet: 0x00 ++dnl 0000 0000 0000 0... = Offset: 0 (0 bytes) ++dnl .... .... .... .00. = Reserved bits: 0 ++dnl .... .... .... ...1 = More Fragments: Yes ++dnl Identification: 0x9bdb1fa7 ++dnl User Datagram Protocol, Src Port: 1, Dst Port: 2 ++dnl Source Port: 1 ++dnl Destination Port: 2 ++dnl Length: 1608 ++dnl UDP payload (1328 bytes) ++dnl Data (1328 bytes) ++eth="50 54 00 00 00 09 50 54 00 00 00 0a 86 dd" ++ipv6="60 00 00 00 05 40 2c 40 fc 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 \ ++ fc 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 11 00 00 01 9b db 1f a7" ++udp="00 01 00 02 06 48 fb 56" ++data_len=$(seq 1328) ++data=$(printf '00 %.0s' ${data_len}) ++packet="${eth} ${ipv6} ${udp} ${data}" ++NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 ${packet} > /dev/null]) ++ ++dnl IPv6 Packet content ++dnl Ethernet II, Src: 50:54:00:00:00:0a, Dst: 50:54:00:00:00:09 ++dnl Type: IPv6 (0x86dd) ++dnl Internet Protocol Version 6, Src: fc00::1, Dst: fc00::2 ++dnl Payload Length: 280 ++dnl Next Header: Fragment Header for IPv6 (44) ++dnl Hop Limit: 64 ++dnl Fragment Header for IPv6 ++dnl Next header: UDP (17) ++dnl Reserved octet: 0x00 ++dnl 0000 0101 0011 1... = Offset: 167 (1336 bytes) ++dnl .... .... .... .00. = Reserved bits: 0 ++dnl .... .... .... ...0 = More Fragments: No ++dnl Identification: 0x9bdb1fa7 ++dnl Data (272 bytes) ++eth="50 54 00 00 00 09 50 54 00 00 00 0a 86 dd" ++ipv6="60 00 00 00 01 18 2c 40 fc 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 \ ++ fc 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 11 00 05 38 9b db 1f a7" ++data_len=$(seq 272) ++data=$(printf '00 %.0s' ${data_len}) ++packet="${eth} ${ipv6} ${data}" ++NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 ${packet} > /dev/null]) ++ ++dnl Send also fragmented ICMPv6. ++NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 1 -W 1 fc00::2 | FORMAT_PING], [0], [dnl ++1 packets transmitted, 1 received, 0% packet loss, time 0ms ++]) ++ ++AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2) | sort], [0], [dnl ++icmpv6,orig=(src=fc00::1,dst=fc00::2,id=,type=128,code=0),reply=(src=fc00::2,dst=fc00::1,id=,type=129,code=0) ++udp,orig=(src=fc00::1,dst=fc00::2,sport=,dport=),reply=(src=fc00::2,dst=fc00::1,sport=,dport=) ++]) ++ + OVS_TRAFFIC_VSWITCHD_STOP AT_CLEANUP - AT_SETUP([conntrack - IPv6 fragmentation expiry]) diff --git a/tests/system-userspace-macros.at b/tests/system-userspace-macros.at index c1be973478..49b277a089 100644 --- a/tests/system-userspace-macros.at diff --git a/SPECS/openvswitch3.5.spec b/SPECS/openvswitch3.5.spec index a6c660a..54bcf8f 100644 --- a/SPECS/openvswitch3.5.spec +++ b/SPECS/openvswitch3.5.spec @@ -57,7 +57,7 @@ Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 3.5.0 -Release: 0.21%{?dist} +Release: 0.22%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -766,6 +766,13 @@ exit 0 %endif %changelog +* Thu Feb 13 2025 Open vSwitch CI - 3.5.0-0.22 +- Merging upstream branch-3.5 [RH git: 1a12aa074b] + Commit list: + 196145a4ab miniflow_extract: Push ct_tp_{src, dst} for later frags. (FDP-124) + d087675baa dpif-netdev: Preserve inner offloads on recirculation. (FDP-1144) + + * Wed Feb 12 2025 Open vSwitch CI - 3.5.0-0.21 - Merging upstream branch-3.5 [RH git: e816014db7] Commit list: