For userspace vxlan and geneve tunnel tso, this commit fix one packet leak and modify style issues.
Signed-off-by: Dexia Li <[email protected]> --- lib/dp-packet.c | 6 +++--- lib/dp-packet.h | 46 +++++++++++++++++++++-------------------- lib/netdev-dpdk.c | 5 ++--- lib/netdev-native-tnl.c | 26 +++++++++++------------ lib/netdev.c | 28 +++++++++++++++++++------ 5 files changed, 64 insertions(+), 47 deletions(-) diff --git a/lib/dp-packet.c b/lib/dp-packet.c index cb20608d7..e7738c37a 100644 --- a/lib/dp-packet.c +++ b/lib/dp-packet.c @@ -548,7 +548,7 @@ dp_packet_compare_offsets(struct dp_packet *b1, struct dp_packet *b2, void dp_packet_tnl_outer_ol_send_prepare(struct dp_packet *p, - uint64_t flags) + uint64_t flags) { if (dp_packet_hwol_is_outer_ipv4_cksum(p)) { if (!(flags & NETDEV_TX_OFFLOAD_OUTER_IP_CKSUM)) { @@ -558,7 +558,7 @@ dp_packet_tnl_outer_ol_send_prepare(struct dp_packet *p, } } - if (!dp_packet_hwol_is_outer_UDP_cksum(p)) { + if (!dp_packet_hwol_is_outer_udp_cksum(p)) { return; } @@ -596,7 +596,7 @@ dp_packet_ol_send_prepare(struct dp_packet *p, uint64_t flags) return; } - if (dp_packet_l4_checksum_good(p) && (!tnl_inner)) { + if (dp_packet_l4_checksum_good(p) && !tnl_inner) { dp_packet_hwol_reset_tx_l4_csum(p); return; } diff --git a/lib/dp-packet.h b/lib/dp-packet.h index cf341f09c..c9ec47c31 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -92,16 +92,16 @@ enum dp_packet_offload_mask { /* Offload packet is tunnel VXLAN. */ DEF_OL_FLAG(DP_PACKET_OL_TX_TUNNEL_VXLAN, RTE_MBUF_F_TX_TUNNEL_VXLAN, 0x4000), - /* Offload tunnel packet, out is ipv4 */ + /* Offload tunnel packet, out is IPV4 */ DEF_OL_FLAG(DP_PACKET_OL_TX_OUTER_IPV4, RTE_MBUF_F_TX_OUTER_IPV4, 0x8000), - /* Offload TUNNEL out ipv4 checksum */ + /* Offload tunnel out IPV4 checksum */ DEF_OL_FLAG(DP_PACKET_OL_TX_OUTER_IP_CKSUM, RTE_MBUF_F_TX_OUTER_IP_CKSUM, 0x10000), - /* Offload TUNNEL out udp checksum */ + /* Offload tunnel out UDP checksum */ DEF_OL_FLAG(DP_PACKET_OL_TX_OUTER_UDP_CKSUM, RTE_MBUF_F_TX_OUTER_UDP_CKSUM, 0x20000), - /* Offload tunnel packet, out is ipv6 */ + /* Offload tunnel packet, out is IPV6 */ DEF_OL_FLAG(DP_PACKET_OL_TX_OUTER_IPV6, RTE_MBUF_F_TX_OUTER_IPV6, 0x40000), @@ -164,9 +164,9 @@ struct dp_packet { * or UINT16_MAX. */ uint16_t l4_ofs; /* Transport-level header offset, or UINT16_MAX. */ - uint16_t inner_l3_ofs; /* inner Network-level header offset, + uint16_t inner_l3_ofs; /* Inner Network-level header offset, * or UINT16_MAX. */ - uint16_t inner_l4_ofs; /* inner Transport-level header offset, + uint16_t inner_l4_ofs; /* Inner Transport-level header offset, or UINT16_MAX. */ uint32_t cutlen; /* length in bytes to cut from the end. */ ovs_be32 packet_type; /* Packet type as defined in OpenFlow */ @@ -279,8 +279,8 @@ bool dp_packet_compare_offsets(struct dp_packet *good, struct dp_packet *test, struct ds *err_str); void dp_packet_ol_send_prepare(struct dp_packet *, uint64_t); -void dp_packet_tnl_outer_ol_send_prepare(struct dp_packet *p, - uint64_t flags); +void dp_packet_tnl_outer_ol_send_prepare(struct dp_packet *, + uint64_t); @@ -640,19 +640,19 @@ dp_packet_flow_mark_ptr(const struct dp_packet *b) static inline void dp_packet_set_l2_len(struct dp_packet *b OVS_UNUSED, size_t l2_len OVS_UNUSED) { - /* There are no implementation */ + /* 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 are no implementation */ + /* 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 are no implementation */ + /* There is no implementation. */ } static inline uint32_t * @@ -1162,23 +1162,26 @@ dp_packet_hwol_is_tunnel_vxlan(struct dp_packet *b) return !!(*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_TUNNEL_VXLAN); } -/* Returns 'true' if packet 'b' is marked for out ipv4. */ +/* Returns 'true' if packet 'b' is marked as a tunnel + * packet with outer header being IPv4. */ static inline bool dp_packet_hwol_is_outer_ipv4(struct dp_packet *b) { return !!(*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_OUTER_IPV4); } -/* Returns 'true' if packet 'b' is marked for out ipv4 csum offload. */ +/* Returns 'true' if a tunnel packet 'b' is marked for IPv4 checksum offload + * for the outer header. */ static inline bool dp_packet_hwol_is_outer_ipv4_cksum(struct dp_packet *b) { return !!(*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_OUTER_IP_CKSUM); } -/* Returns 'true' if packet 'b' is marked for out udp csum offload. */ +/* Returns 'true' if a tunnel packet 'b' is marked for UDP checksum offload + * for the outer header. */ static inline bool -dp_packet_hwol_is_outer_UDP_cksum(struct dp_packet *b) +dp_packet_hwol_is_outer_udp_cksum(struct dp_packet *b) { return !!(*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_OUTER_UDP_CKSUM); } @@ -1205,7 +1208,8 @@ dp_packet_hwol_set_tx_ipv6(struct dp_packet *a) *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_IPV6; } -/* Mark packet 'a' as IPv6. */ +/* Returns 'true' if packet 'b' is marked as a tunnel + * packet with outer header being IPv6. */ static inline void dp_packet_hwol_set_tx_outer_ipv6(struct dp_packet *a) { @@ -1266,30 +1270,28 @@ dp_packet_hwol_set_tcp_seg(struct dp_packet *b) *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TCP_SEG; } -/* Mark packet 'b' for tunnel geneve offloading. It implies that - * the packet 'b' is marked for tunnel geneve offloading. */ +/* Mark packet 'b' for tunnel geneve offloading. */ static inline void dp_packet_hwol_set_tunnel_geneve(struct dp_packet *b) { *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TUNNEL_GENEVE; } -/* Mark packet 'b' for tunnel vxlan offloading. It implies that - * the packet 'b' is marked for tunnel vxlan offloading. */ +/* Mark packet 'b' for tunnel vxlan offloading. */ static inline void dp_packet_hwol_set_tunnel_vxlan(struct dp_packet *b) { *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TUNNEL_VXLAN; } -/* Mark packet 'b' for out ipv4 packet. */ +/* Mark packet 'b' as a tunnel packet with IPv4 outer header. */ static inline void dp_packet_hwol_set_tx_outer_ipv4(struct dp_packet *b) { *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_OUTER_IPV4; } -/* Mark packet 'b' for out ipv4 csum offloading. */ +/* Mark packet 'b' for IPv4 checksum offload for the outer header. */ static inline void dp_packet_hwol_set_tx_outer_ipv4_csum(struct dp_packet *b) { diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index e4d95d0a3..fb26825ff 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1157,7 +1157,6 @@ dpdk_eth_dev_port_config(struct netdev_dpdk *dev, int n_rxq, int n_txq) conf.txmode.offloads |= RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM; } - /* Limit configured rss hash functions to only those supported * by the eth device. */ conf.rx_adv_conf.rss_conf.rss_hf &= info.flow_type_rss_offloads; @@ -2570,8 +2569,8 @@ netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf) 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->tso_segsz = dev->mtu - mbuf->l2_len - mbuf->l3_len - + mbuf->l4_len - mbuf->outer_l3_len; } else { mbuf->l4_len = TCP_OFFSET(th->tcp_ctl) * 4; mbuf->tso_segsz = dev->mtu - mbuf->l3_len - mbuf->l4_len; diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c index 35767800c..d513194dc 100644 --- a/lib/netdev-native-tnl.c +++ b/lib/netdev-native-tnl.c @@ -245,8 +245,8 @@ udp_extract_tnl_md(struct dp_packet *packet, struct flow_tnl *tnl, * encapsulated now. */ static void dp_packet_tnl_ol_process(const struct netdev *netdev, - struct dp_packet *packet, - const struct ovs_action_push_tnl *data) + struct dp_packet *packet, + const struct ovs_action_push_tnl *data) { struct udp_header *udp = NULL; uint8_t opt_len = 0; @@ -256,8 +256,8 @@ dp_packet_tnl_ol_process(const struct netdev *netdev, /* 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 (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); @@ -269,10 +269,10 @@ dp_packet_tnl_ol_process(const struct netdev *netdev, } dp_packet_set_l3_len(packet, (char *) dp_packet_l4(packet) - - (char *) dp_packet_l3(packet)); + (char *) dp_packet_l3(packet)); - if (!strcmp(netdev_get_type(netdev), "geneve") || - !strcmp(netdev_get_type(netdev), "vxlan")) { + if (data->tnl_type == OVS_VPORT_TYPE_GENEVE || + data->tnl_type == OVS_VPORT_TYPE_VXLAN) { if (IP_VER(ip->ip_ihl_ver) == 4) { dp_packet_hwol_set_tx_ipv4(packet); @@ -284,7 +284,7 @@ dp_packet_tnl_ol_process(const struct netdev *netdev, /* Attention please, tunnel inner l2 len is consist of udp header * len and tunnel header len and inner l2 len. */ - if (!strcmp(netdev_get_type(netdev), "geneve")) { + 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); @@ -292,13 +292,13 @@ dp_packet_tnl_ol_process(const struct netdev *netdev, 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 (!strcmp(netdev_get_type(netdev), "vxlan")) { + (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); + (char *) dp_packet_eth(packet) + + VXLAN_HLEN); } } } diff --git a/lib/netdev.c b/lib/netdev.c index db0610304..dc3089396 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -70,6 +70,8 @@ COVERAGE_DEFINE(netdev_sent); COVERAGE_DEFINE(netdev_add_router); COVERAGE_DEFINE(netdev_get_stats); COVERAGE_DEFINE(netdev_push_header_drops); +COVERAGE_DEFINE(netdev_vxlan_tso_not_support); +COVERAGE_DEFINE(netdev_geneve_tso_not_support); COVERAGE_DEFINE(netdev_soft_seg_good); COVERAGE_DEFINE(netdev_soft_seg_drops); @@ -915,12 +917,16 @@ netdev_send(struct netdev *netdev, int qid, struct dp_packet_batch *batch, if (dp_packet_hwol_is_tunnel_vxlan(packet) && !(netdev_flags & NETDEV_TX_VXLAN_TNL_TSO)) { VLOG_ERR("No VXLAN TSO support"); + COVERAGE_INC(netdev_vxlan_tso_not_support); + dp_packet_delete(packet); return false; } if (dp_packet_hwol_is_tunnel_geneve(packet) && !(netdev_flags & NETDEV_TX_GENEVE_TNL_TSO)) { VLOG_ERR("No GENEVE TSO support"); + COVERAGE_INC(netdev_geneve_tso_not_support); + dp_packet_delete(packet); return false; } return netdev_send_tso(netdev, qid, batch, concurrent_txq); @@ -1001,19 +1007,29 @@ netdev_push_header(const struct netdev *netdev, size_t i, size = dp_packet_batch_size(batch); DP_PACKET_BATCH_REFILL_FOR_EACH (i, size, packet, batch) { - if (OVS_UNLIKELY(strcmp(netdev_get_type(netdev), "vxlan") && - strcmp(netdev_get_type(netdev), "geneve") && + if (OVS_UNLIKELY(data->tnl_type != OVS_VPORT_TYPE_GENEVE && + data->tnl_type != OVS_VPORT_TYPE_VXLAN && dp_packet_hwol_is_tso(packet))) { COVERAGE_INC(netdev_push_header_drops); dp_packet_delete(packet); - VLOG_WARN_RL(&rl, "%s: Tunneling packets with tso HW offload" - "flags is not supported: packet dropped", + VLOG_WARN_RL(&rl, "Tunneling packets with TSO is not supported" + "for %s tunnels, packet dropped", netdev_get_name(netdev)); } else { - if (strcmp(netdev_get_type(netdev), "vxlan") && - strcmp(netdev_get_type(netdev), "geneve")) { + if (OVS_UNLIKELY(dp_packet_hwol_is_tunnel_geneve(packet) || + dp_packet_hwol_is_tunnel_vxlan(packet))) { + COVERAGE_INC(netdev_push_header_drops); + dp_packet_delete(packet); + VLOG_WARN_RL(&rl, "%s tunnel tso packet before encap" + "not support, packet dropped", + netdev_get_name(netdev)); + } + + if (data->tnl_type != OVS_VPORT_TYPE_GENEVE && + data->tnl_type != OVS_VPORT_TYPE_VXLAN) { dp_packet_ol_send_prepare(packet, 0); } + netdev->netdev_class->push_header(netdev, packet, data); pkt_metadata_init(&packet->md, data->out_port); -- 2.33.0.windows.2 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
