examples/l3fwd: fix size of destination port ids
[dpdk.git] / examples / l3fwd / l3fwd_em_hlm_sse.h
index 891ae2e..5001c72 100644 (file)
 #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);