bogdanPricope replied on github web page: platform/linux-generic/pktio/dpdk.c line 44 @@ -337,39 +337,62 @@ static struct rte_mempool_ops ops_stack = { MEMPOOL_REGISTER_OPS(ops_stack); -#define HAS_IP4_CSUM_FLAG(m, f) ((m->ol_flags & PKT_RX_IP_CKSUM_MASK) == f) +#define IP4_CSUM_RESULT(m) (m->ol_flags & PKT_RX_IP_CKSUM_MASK) +#define L4_CSUM_RESULT(m) (m->ol_flags & PKT_RX_L4_CKSUM_MASK) #define HAS_L4_PROTO(m, proto) ((m->packet_type & RTE_PTYPE_L4_MASK) == proto) -#define HAS_L4_CSUM_FLAG(m, f) ((m->ol_flags & PKT_RX_L4_CKSUM_MASK) == f) #define PKTIN_CSUM_BITS 0x1C static inline int pkt_set_ol_rx(odp_pktin_config_opt_t *pktin_cfg, odp_packet_hdr_t *pkt_hdr, struct rte_mbuf *mbuf) { + uint32_t packet_csum_result; + if (pktin_cfg->bit.ipv4_chksum && - RTE_ETH_IS_IPV4_HDR(mbuf->packet_type) && - HAS_IP4_CSUM_FLAG(mbuf, PKT_RX_IP_CKSUM_BAD)) { - if (pktin_cfg->bit.drop_ipv4_err) - return -1; + RTE_ETH_IS_IPV4_HDR(mbuf->packet_type)) { + packet_csum_result = IP4_CSUM_RESULT(mbuf); + + if (packet_csum_result == PKT_RX_IP_CKSUM_GOOD) { + pkt_hdr->p.input_flags.l3_chksum_done = 1; + } else if (packet_csum_result != PKT_RX_IP_CKSUM_UNKNOWN) { + if (pktin_cfg->bit.drop_ipv4_err) + return -1; - pkt_hdr->p.error_flags.ip_err = 1; + pkt_hdr->p.input_flags.l3_chksum_done = 1; + pkt_hdr->p.error_flags.ip_err = 1; + pkt_hdr->p.error_flags.l3_chksum = 1; + } } if (pktin_cfg->bit.udp_chksum && - HAS_L4_PROTO(mbuf, RTE_PTYPE_L4_UDP) && - HAS_L4_CSUM_FLAG(mbuf, PKT_RX_L4_CKSUM_BAD)) { - if (pktin_cfg->bit.drop_udp_err) - return -1; + HAS_L4_PROTO(mbuf, RTE_PTYPE_L4_UDP)) {
Comment: This function should set csum related input/error flags for L3 (IPv4 packets) and for L4 UDP/TCP (IPv4/IPv6 packets); all flags should be set if requested at configuration time (pktin_cfg->bit.*). I donât see how your function is doing this. And yes, flags are uint64_t in dpdk 17.08/17.02. I will generate a new version for this. struct rte_mbuf { â¦â¦â¦â¦ uint64_t ol_flags; /**< Offload features. */ â¦â¦â¦â¦ } > muvarov wrote > @bogdanPricope will that be the same and more clear > https://github.com/muvarov/odp/commit/c56c3663725c73e7cf1a39fb6e37341dd2f3649f > ? Also flags are uint16_t in my version of dpdk, not uint32_t. >> muvarov wrote >> @bogdanPricope hm, please skip that comment, logic looks like correct. >>> bogdanPricope wrote >>> error_flags.tcp_err and error_flags.udp_err are part of existing API. >>>> bogdanPricope wrote >>>> Cannot avoid the 'ifs'. Final code (not diffs) looks better and easier to >>>> understand. >>>>> bogdanPricope wrote >>>>> Prints were already there. We only changed the conditions for printing to >>>>> highlight the new API. >>>>>> muvarov wrote >>>>>> common errors set for tcp and udp here. >>>>>>> muvarov wrote >>>>>>> too many ifs overcompicate function and makes it hard to read. Tcp >>>>>>> packet and pktin_cfg->bit.udp_chksum=0 in settings will not to tcp 'if' >>>>>>> bellow. >>>>>>>> muvarov wrote >>>>>>>> prints for fast path functions is bad thing. Bellow is print_pkts() >>>>>>>> which does all printing. Or we need to move it here at least. Or >>>>>>>> better to move out all printing from fast path. https://github.com/Linaro/odp/pull/269#discussion_r149890452 updated_at 2017-11-09 08:51:47