Thanks. I'll look into this. When I checked before everything was passing so perhaps a rebase is needed.
On Wed, May 13, 2015 at 4:50 AM, Maxim Uvarov <[email protected]> wrote: > For linux-generic it breaks classification test: > > Test: classification_pktio_test ...FAILED > 1. classification/odp_classification_tests.c:513 - queue == > queue_list[CLS_DEFAULT] > 2. classification/odp_classification_tests.c:563 - queue == > queue_list[CLS_ERROR] > > Maxim. > > > On 05/08/2015 04:00, Bill Fischofer wrote: > >> Lazy parsing defers parsing until the results are actually needed. >> This allows applications that do their own parsing and never reference >> ODP parse results to avoid the overhead of SW parsing. >> >> Signed-off-by: Bill Fischofer <[email protected]> >> --- >> >> Changes in v5: >> - Streamline implementation for odp-dpdk compatibility >> >> Changes in v4: >> - Rebase to avoid merge conflicts with commit db1f4e58 >> >> Changes in v3: >> - Incorporate review comments from Maxim >> >> Changes in v2; >> - Corrected processing of odp_packet_has_error() >> >> .../linux-generic/include/odp_packet_internal.h | 13 +++- >> platform/linux-generic/odp_packet.c | 30 ++++++-- >> platform/linux-generic/odp_packet_flags.c | 86 >> +++++++++++++--------- >> platform/linux-generic/odp_packet_io.c | 2 +- >> platform/linux-generic/odp_packet_socket.c | 6 +- >> 5 files changed, 91 insertions(+), 46 deletions(-) >> >> diff --git a/platform/linux-generic/include/odp_packet_internal.h >> b/platform/linux-generic/include/odp_packet_internal.h >> index c3dcdd8..e534cdd 100644 >> --- a/platform/linux-generic/include/odp_packet_internal.h >> +++ b/platform/linux-generic/include/odp_packet_internal.h >> @@ -34,7 +34,8 @@ typedef union { >> uint32_t all; >> struct { >> - /* Bitfield flags for each protocol */ >> + uint32_t unparsed:1; /**< Set to inticate parse needed */ >> + >> uint32_t l2:1; /**< known L2 protocol present */ >> uint32_t l3:1; /**< known L3 protocol present */ >> uint32_t l4:1; /**< known L4 protocol present */ >> @@ -248,6 +249,14 @@ static inline void packet_set_len(odp_packet_t pkt, >> uint32_t len) >> odp_packet_hdr(pkt)->frame_len = len; >> } >> +#define ODP_PACKET_UNPARSED ~0 >> + >> +static inline void _odp_packet_reset_parse(odp_packet_t pkt) >> +{ >> + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); >> + pkt_hdr->input_flags.all = ODP_PACKET_UNPARSED; >> +} >> + >> /* Forward declarations */ >> int _odp_packet_copy_to_packet(odp_packet_t srcpkt, uint32_t srcoffset, >> odp_packet_t dstpkt, uint32_t dstoffset, >> @@ -257,7 +266,7 @@ void _odp_packet_copy_md_to_packet(odp_packet_t >> srcpkt, odp_packet_t dstpkt); >> odp_packet_t _odp_packet_alloc(odp_pool_t pool_hdl); >> -int _odp_packet_parse(odp_packet_t pkt); >> +int _odp_packet_parse(odp_packet_hdr_t *pkt_hdr); >> /* Convert a packet handle to a buffer handle */ >> odp_buffer_t _odp_packet_to_buffer(odp_packet_t pkt); >> diff --git a/platform/linux-generic/odp_packet.c >> b/platform/linux-generic/odp_packet.c >> index 815c57f..387c49a 100644 >> --- a/platform/linux-generic/odp_packet.c >> +++ b/platform/linux-generic/odp_packet.c >> @@ -242,12 +242,17 @@ void odp_packet_user_u64_set(odp_packet_t pkt, >> uint64_t ctx) >> void *odp_packet_l2_ptr(odp_packet_t pkt, uint32_t *len) >> { >> odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); >> + if (pkt_hdr->input_flags.unparsed) >> + _odp_packet_parse(pkt_hdr); >> return packet_map(pkt_hdr, pkt_hdr->l2_offset, len); >> } >> uint32_t odp_packet_l2_offset(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->l2_offset; >> + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); >> + if (pkt_hdr->input_flags.unparsed) >> + _odp_packet_parse(pkt_hdr); >> + return pkt_hdr->l2_offset; >> } >> int odp_packet_l2_offset_set(odp_packet_t pkt, uint32_t offset) >> @@ -257,6 +262,8 @@ int odp_packet_l2_offset_set(odp_packet_t pkt, >> uint32_t offset) >> if (offset >= pkt_hdr->frame_len) >> return -1; >> + if (pkt_hdr->input_flags.unparsed) >> + _odp_packet_parse(pkt_hdr); >> pkt_hdr->l2_offset = offset; >> return 0; >> } >> @@ -264,12 +271,17 @@ int odp_packet_l2_offset_set(odp_packet_t pkt, >> uint32_t offset) >> void *odp_packet_l3_ptr(odp_packet_t pkt, uint32_t *len) >> { >> odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); >> + if (pkt_hdr->input_flags.unparsed) >> + _odp_packet_parse(pkt_hdr); >> return packet_map(pkt_hdr, pkt_hdr->l3_offset, len); >> } >> uint32_t odp_packet_l3_offset(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->l3_offset; >> + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); >> + if (pkt_hdr->input_flags.unparsed) >> + _odp_packet_parse(pkt_hdr); >> + return pkt_hdr->l3_offset; >> } >> int odp_packet_l3_offset_set(odp_packet_t pkt, uint32_t offset) >> @@ -279,6 +291,8 @@ int odp_packet_l3_offset_set(odp_packet_t pkt, >> uint32_t offset) >> if (offset >= pkt_hdr->frame_len) >> return -1; >> + if (pkt_hdr->input_flags.unparsed) >> + _odp_packet_parse(pkt_hdr); >> pkt_hdr->l3_offset = offset; >> return 0; >> } >> @@ -286,12 +300,17 @@ int odp_packet_l3_offset_set(odp_packet_t pkt, >> uint32_t offset) >> void *odp_packet_l4_ptr(odp_packet_t pkt, uint32_t *len) >> { >> odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); >> + if (pkt_hdr->input_flags.unparsed) >> + _odp_packet_parse(pkt_hdr); >> return packet_map(pkt_hdr, pkt_hdr->l4_offset, len); >> } >> uint32_t odp_packet_l4_offset(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->l4_offset; >> + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); >> + if (pkt_hdr->input_flags.unparsed) >> + _odp_packet_parse(pkt_hdr); >> + return pkt_hdr->l4_offset; >> } >> int odp_packet_l4_offset_set(odp_packet_t pkt, uint32_t offset) >> @@ -301,6 +320,8 @@ int odp_packet_l4_offset_set(odp_packet_t pkt, >> uint32_t offset) >> if (offset >= pkt_hdr->frame_len) >> return -1; >> + if (pkt_hdr->input_flags.unparsed) >> + _odp_packet_parse(pkt_hdr); >> pkt_hdr->l4_offset = offset; >> return 0; >> } >> @@ -790,9 +811,8 @@ static inline void parse_udp(odp_packet_hdr_t >> *pkt_hdr, >> * Simple packet parser >> */ >> -int _odp_packet_parse(odp_packet_t pkt) >> +int _odp_packet_parse(odp_packet_hdr_t *pkt_hdr) >> { >> - odp_packet_hdr_t *const pkt_hdr = odp_packet_hdr(pkt); >> odph_ethhdr_t *eth; >> odph_vlanhdr_t *vlan; >> uint16_t ethtype; >> diff --git a/platform/linux-generic/odp_packet_flags.c >> b/platform/linux-generic/odp_packet_flags.c >> index ab3d12f..4f680a1 100644 >> --- a/platform/linux-generic/odp_packet_flags.c >> +++ b/platform/linux-generic/odp_packet_flags.c >> @@ -7,182 +7,198 @@ >> #include <odp/packet_flags.h> >> #include <odp_packet_internal.h> >> +#define retflag(p, x) do { \ >> + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(p); \ >> + if (pkt_hdr->input_flags.unparsed) \ >> + _odp_packet_parse(pkt_hdr); \ >> + return pkt_hdr->x; \ >> + } while (0) >> + >> +#define setflag(p, x, v) do { \ >> + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(p); \ >> + if (pkt_hdr->input_flags.unparsed) \ >> + _odp_packet_parse(pkt_hdr); \ >> + pkt_hdr->x = v & 1; \ >> + } while (0) >> int odp_packet_has_error(odp_packet_t pkt) >> { >> - return (odp_packet_hdr(pkt)->error_flags.all != 0); >> + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); >> + if (pkt_hdr->input_flags.unparsed) >> + _odp_packet_parse(pkt_hdr); >> + return odp_packet_hdr(pkt)->error_flags.all != 0; >> } >> /* Get Input Flags */ >> int odp_packet_has_l2(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.l2; >> + retflag(pkt, input_flags.l2); >> } >> int odp_packet_has_l3(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.l3; >> + retflag(pkt, input_flags.l3); >> } >> int odp_packet_has_l4(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.l4; >> + retflag(pkt, input_flags.l4); >> } >> int odp_packet_has_eth(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.eth; >> + retflag(pkt, input_flags.eth); >> } >> int odp_packet_has_jumbo(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.jumbo; >> + retflag(pkt, input_flags.jumbo); >> } >> int odp_packet_has_vlan(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.vlan; >> + retflag(pkt, input_flags.vlan); >> } >> int odp_packet_has_vlan_qinq(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.vlan_qinq; >> + retflag(pkt, input_flags.vlan_qinq); >> } >> int odp_packet_has_arp(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.arp; >> + retflag(pkt, input_flags.arp); >> } >> int odp_packet_has_ipv4(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.ipv4; >> + retflag(pkt, input_flags.ipv4); >> } >> int odp_packet_has_ipv6(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.ipv6; >> + retflag(pkt, input_flags.ipv6); >> } >> int odp_packet_has_ipfrag(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.ipfrag; >> + retflag(pkt, input_flags.ipfrag); >> } >> int odp_packet_has_ipopt(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.ipopt; >> + retflag(pkt, input_flags.ipopt); >> } >> int odp_packet_has_ipsec(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.ipsec; >> + retflag(pkt, input_flags.ipsec); >> } >> int odp_packet_has_udp(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.udp; >> + retflag(pkt, input_flags.udp); >> } >> int odp_packet_has_tcp(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.tcp; >> + retflag(pkt, input_flags.tcp); >> } >> int odp_packet_has_sctp(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.sctp; >> + retflag(pkt, input_flags.sctp); >> } >> int odp_packet_has_icmp(odp_packet_t pkt) >> { >> - return odp_packet_hdr(pkt)->input_flags.icmp; >> + retflag(pkt, input_flags.icmp); >> } >> /* Set Input Flags */ >> void odp_packet_has_l2_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.l2 = val; >> + setflag(pkt, input_flags.l2, val); >> } >> void odp_packet_has_l3_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.l3 = val; >> + setflag(pkt, input_flags.l3, val); >> } >> void odp_packet_has_l4_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.l4 = val; >> + setflag(pkt, input_flags.l4, val); >> } >> void odp_packet_has_eth_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.eth = val; >> + setflag(pkt, input_flags.eth, val); >> } >> void odp_packet_has_jumbo_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.jumbo = val; >> + setflag(pkt, input_flags.jumbo, val); >> } >> void odp_packet_has_vlan_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.vlan = val; >> + setflag(pkt, input_flags.vlan, val); >> } >> void odp_packet_has_vlan_qinq_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.vlan_qinq = val; >> + setflag(pkt, input_flags.vlan_qinq, val); >> } >> void odp_packet_has_arp_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.arp = val; >> + setflag(pkt, input_flags.arp, val); >> } >> void odp_packet_has_ipv4_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.ipv4 = val; >> + setflag(pkt, input_flags.ipv4, val); >> } >> void odp_packet_has_ipv6_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.ipv6 = val; >> + setflag(pkt, input_flags.ipv6, val); >> } >> void odp_packet_has_ipfrag_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.ipfrag = val; >> + setflag(pkt, input_flags.ipfrag, val); >> } >> void odp_packet_has_ipopt_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.ipopt = val; >> + setflag(pkt, input_flags.ipopt, val); >> } >> void odp_packet_has_ipsec_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.ipsec = val; >> + setflag(pkt, input_flags.ipsec, val); >> } >> void odp_packet_has_udp_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.udp = val; >> + setflag(pkt, input_flags.udp, val); >> } >> void odp_packet_has_tcp_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.tcp = val; >> + setflag(pkt, input_flags.tcp, val); >> } >> void odp_packet_has_sctp_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.sctp = val; >> + setflag(pkt, input_flags.sctp, val); >> } >> void odp_packet_has_icmp_set(odp_packet_t pkt, int val) >> { >> - odp_packet_hdr(pkt)->input_flags.icmp = val; >> + setflag(pkt, input_flags.icmp, val); >> } >> diff --git a/platform/linux-generic/odp_packet_io.c >> b/platform/linux-generic/odp_packet_io.c >> index f16685d..5ae24b9 100644 >> --- a/platform/linux-generic/odp_packet_io.c >> +++ b/platform/linux-generic/odp_packet_io.c >> @@ -378,7 +378,7 @@ static int deq_loopback(pktio_entry_t *pktio_entry, >> odp_packet_t pkts[], >> for (i = 0; i < nbr; ++i) { >> pkts[i] = >> _odp_packet_from_buffer(odp_hdr_to_buf(hdr_tbl[i])); >> - _odp_packet_parse(pkts[i]); >> + _odp_packet_reset_parse(pkts[i]); >> } >> return nbr; >> diff --git a/platform/linux-generic/odp_packet_socket.c >> b/platform/linux-generic/odp_packet_socket.c >> index 2802c43..9272146 100644 >> --- a/platform/linux-generic/odp_packet_socket.c >> +++ b/platform/linux-generic/odp_packet_socket.c >> @@ -251,7 +251,7 @@ int recv_pkt_sock_basic(pkt_sock_t *const pkt_sock, >> /* Parse and set packet header data */ >> odp_packet_pull_tail(pkt, pkt_sock->max_frame_len - >> recv_bytes); >> - _odp_packet_parse(pkt); >> + _odp_packet_reset_parse(pkt); >> pkt_table[nb_rx] = pkt; >> pkt = ODP_PACKET_INVALID; >> @@ -360,7 +360,7 @@ int recv_pkt_sock_mmsg(pkt_sock_t *const pkt_sock, >> odp_packet_pull_tail(pkt_table[i], >> pkt_sock->max_frame_len - >> msgvec[i].msg_len); >> - _odp_packet_parse(pkt_table[i]); >> + _odp_packet_reset_parse(pkt_table[i]); >> pkt_table[nb_rx] = pkt_table[i]; >> nb_rx++; >> @@ -519,7 +519,7 @@ static inline unsigned pkt_mmap_v2_rx(int sock, >> struct ring *ring, >> mmap_rx_user_ready(ppd.raw); >> /* Parse and set packet header data */ >> - _odp_packet_parse(pkt_table[i]); >> + _odp_packet_reset_parse(pkt_table[i]); >> frame_num = next_frame_num; >> i++; >> > > _______________________________________________ > lng-odp mailing list > [email protected] > https://lists.linaro.org/mailman/listinfo/lng-odp >
_______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
