X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fl3fwd%2Fl3fwd_em_hlm_sse.h;h=5001c724c9bc126f3cb3ce8bfe7f29b0d135c0e9;hb=8353a36a9b4b0766d4f3433fa6ad8fd41cb60bbc;hp=891ae2e4ccd687f6afa5ca64cf63c8d6bbc0e142;hpb=fdefa0a9328d9cde51a882ff95ae4158c0413022;p=dpdk.git diff --git a/examples/l3fwd/l3fwd_em_hlm_sse.h b/examples/l3fwd/l3fwd_em_hlm_sse.h index 891ae2e4cc..5001c724c9 100644 --- a/examples/l3fwd/l3fwd_em_hlm_sse.h +++ b/examples/l3fwd/l3fwd_em_hlm_sse.h @@ -34,19 +34,11 @@ #ifndef __L3FWD_EM_HLM_SSE_H__ #define __L3FWD_EM_HLM_SSE_H__ -/** - * @file - * This is an optional implementation of packet classification in Exact-Match - * path using rte_hash_lookup_multi method from previous implementation. - * While sequential classification seems to be faster, it's disabled by default - * and can be enabled with HASH_LOOKUP_MULTI global define in compilation time. - */ - #include "l3fwd_sse.h" -static inline void +static inline __attribute__((always_inline)) void em_get_dst_port_ipv4x8(struct lcore_conf *qconf, struct rte_mbuf *m[8], - uint8_t portid, uint32_t dst_port[8]) + uint8_t portid, uint16_t dst_port[8]) { int32_t ret[8]; union ipv4_5tuple_host key[8]; @@ -168,9 +160,9 @@ get_ipv6_5tuple(struct rte_mbuf *m0, __m128i mask0, key->xmm[2] = _mm_and_si128(tmpdata2, mask1); } -static inline void +static inline __attribute__((always_inline)) void em_get_dst_port_ipv6x8(struct lcore_conf *qconf, struct rte_mbuf *m[8], - uint8_t portid, uint32_t dst_port[8]) + uint8_t portid, uint16_t dst_port[8]) { int32_t ret[8]; union ipv6_5tuple_host key[8]; @@ -247,8 +239,13 @@ em_get_dst_port(const struct lcore_conf *qconf, struct rte_mbuf *pkt, uint8_t next_hop; struct ipv4_hdr *ipv4_hdr; struct ipv6_hdr *ipv6_hdr; + uint32_t tcp_or_udp; + uint32_t l3_ptypes; + + tcp_or_udp = pkt->packet_type & (RTE_PTYPE_L4_TCP | RTE_PTYPE_L4_UDP); + l3_ptypes = pkt->packet_type & RTE_PTYPE_L3_MASK; - if (RTE_ETH_IS_IPV4_HDR(pkt->packet_type)) { + if (tcp_or_udp && (l3_ptypes == RTE_PTYPE_L3_IPV4)) { /* Handle IPv4 headers.*/ ipv4_hdr = rte_pktmbuf_mtod_offset(pkt, struct ipv4_hdr *, @@ -263,7 +260,7 @@ em_get_dst_port(const struct lcore_conf *qconf, struct rte_mbuf *pkt, return next_hop; - } else if (RTE_ETH_IS_IPV6_HDR(pkt->packet_type)) { + } else if (tcp_or_udp && (l3_ptypes == RTE_PTYPE_L3_IPV6)) { /* Handle IPv6 headers.*/ ipv6_hdr = rte_pktmbuf_mtod_offset(pkt, struct ipv6_hdr *, @@ -292,7 +289,7 @@ l3fwd_em_send_packets(int nb_rx, struct rte_mbuf **pkts_burst, uint8_t portid, struct lcore_conf *qconf) { int32_t j; - uint32_t dst_port[MAX_PKT_BURST]; + uint16_t dst_port[MAX_PKT_BURST]; /* * Send nb_rx - nb_rx%8 packets @@ -312,27 +309,31 @@ l3fwd_em_send_packets(int nb_rx, struct rte_mbuf **pkts_burst, pkts_burst[j+6]->packet_type & pkts_burst[j+7]->packet_type; - if (pkt_type & RTE_PTYPE_L3_IPV4) { + uint32_t l3_type = pkt_type & RTE_PTYPE_L3_MASK; + uint32_t tcp_or_udp = pkt_type & + (RTE_PTYPE_L4_TCP | RTE_PTYPE_L4_UDP); + + if (tcp_or_udp && (l3_type == RTE_PTYPE_L3_IPV4)) { em_get_dst_port_ipv4x8(qconf, &pkts_burst[j], portid, &dst_port[j]); - } else if (pkt_type & RTE_PTYPE_L3_IPV6) { + } else if (tcp_or_udp && (l3_type == RTE_PTYPE_L3_IPV6)) { em_get_dst_port_ipv6x8(qconf, &pkts_burst[j], portid, &dst_port[j]); } else { dst_port[j] = em_get_dst_port(qconf, pkts_burst[j], portid); - dst_port[j+1] = em_get_dst_port(qconf, pkts_burst[j], portid); - dst_port[j+2] = em_get_dst_port(qconf, pkts_burst[j], portid); - dst_port[j+3] = em_get_dst_port(qconf, pkts_burst[j], portid); - dst_port[j+4] = em_get_dst_port(qconf, pkts_burst[j], portid); - dst_port[j+5] = em_get_dst_port(qconf, pkts_burst[j], portid); - dst_port[j+6] = em_get_dst_port(qconf, pkts_burst[j], portid); - dst_port[j+7] = em_get_dst_port(qconf, pkts_burst[j], portid); + dst_port[j+1] = em_get_dst_port(qconf, pkts_burst[j+1], portid); + dst_port[j+2] = em_get_dst_port(qconf, pkts_burst[j+2], portid); + dst_port[j+3] = em_get_dst_port(qconf, pkts_burst[j+3], portid); + dst_port[j+4] = em_get_dst_port(qconf, pkts_burst[j+4], portid); + dst_port[j+5] = em_get_dst_port(qconf, pkts_burst[j+5], portid); + dst_port[j+6] = em_get_dst_port(qconf, pkts_burst[j+6], portid); + dst_port[j+7] = em_get_dst_port(qconf, pkts_burst[j+7], portid); } } - for (; j < n; j++) + for (; j < nb_rx; j++) dst_port[j] = em_get_dst_port(qconf, pkts_burst[j], portid); send_packets_multi(qconf, pkts_burst, dst_port, nb_rx);