remove unused ring includes
[dpdk.git] / examples / l3fwd / l3fwd_lpm.c
index 0640ce7..f621269 100644 (file)
@@ -46,7 +46,6 @@
 #include <rte_debug.h>
 #include <rte_ether.h>
 #include <rte_ethdev.h>
-#include <rte_ring.h>
 #include <rte_mempool.h>
 #include <rte_cycles.h>
 #include <rte_mbuf.h>
@@ -98,24 +97,13 @@ static struct ipv6_l3fwd_lpm_route ipv6_l3fwd_lpm_route_array[] = {
        (sizeof(ipv6_l3fwd_lpm_route_array) / sizeof(ipv6_l3fwd_lpm_route_array[0]))
 
 #define IPV4_L3FWD_LPM_MAX_RULES         1024
+#define IPV4_L3FWD_LPM_NUMBER_TBL8S (1 << 8)
 #define IPV6_L3FWD_LPM_MAX_RULES         1024
 #define IPV6_L3FWD_LPM_NUMBER_TBL8S (1 << 16)
 
-/* Used to mark destination port as 'invalid'. */
-#define        BAD_PORT        ((uint16_t)-1)
-
-#define FWDSTEP        4
-
-/* replace first 12B of the ethernet header. */
-#define        MASK_ETH        0x3f
-
 struct rte_lpm *ipv4_l3fwd_lpm_lookup_struct[NB_SOCKETS];
 struct rte_lpm6 *ipv6_l3fwd_lpm_lookup_struct[NB_SOCKETS];
 
-/*
- * Include header file if SSE4_1 is enabled for
- * buffer optimization i.e. ENABLE_MULTI_BUFFER_OPTIMIZE=1.
- */
 #if defined(__SSE4_1__)
 #include "l3fwd_lpm_sse.h"
 #else
@@ -166,11 +154,8 @@ lpm_main_loop(__attribute__((unused)) void *dummy)
                diff_tsc = cur_tsc - prev_tsc;
                if (unlikely(diff_tsc > drain_tsc)) {
 
-                       /*
-                        * This could be optimized (use queueid instead of
-                        * portid), but it is not called so often
-                        */
-                       for (portid = 0; portid < RTE_MAX_ETHPORTS; portid++) {
+                       for (i = 0; i < qconf->n_tx_port; ++i) {
+                               portid = qconf->tx_port_id[i];
                                if (qconf->tx_mbufs[portid].len == 0)
                                        continue;
                                send_burst(qconf,
@@ -193,10 +178,6 @@ lpm_main_loop(__attribute__((unused)) void *dummy)
                        if (nb_rx == 0)
                                continue;
 
-                       /*
-                        * For SSE4_1 use ENABLE_MULTI_BUFFER_OPTIMIZE=1
-                        * code.
-                        */
 #if defined(__SSE4_1__)
                        l3fwd_lpm_send_packets(nb_rx, pkts_burst,
                                                portid, qconf);
@@ -214,14 +195,18 @@ void
 setup_lpm(const int socketid)
 {
        struct rte_lpm6_config config;
+       struct rte_lpm_config config_ipv4;
        unsigned i;
        int ret;
        char s[64];
 
        /* create the LPM table */
+       config_ipv4.max_rules = IPV4_L3FWD_LPM_MAX_RULES;
+       config_ipv4.number_tbl8s = IPV4_L3FWD_LPM_NUMBER_TBL8S;
+       config_ipv4.flags = 0;
        snprintf(s, sizeof(s), "IPV4_L3FWD_LPM_%d", socketid);
-       ipv4_l3fwd_lpm_lookup_struct[socketid] = rte_lpm_create(s, socketid,
-                               IPV4_L3FWD_LPM_MAX_RULES, 0);
+       ipv4_l3fwd_lpm_lookup_struct[socketid] =
+                       rte_lpm_create(s, socketid, &config_ipv4);
        if (ipv4_l3fwd_lpm_lookup_struct[socketid] == NULL)
                rte_exit(EXIT_FAILURE,
                        "Unable to create the l3fwd LPM table on socket %d\n",
@@ -291,6 +276,71 @@ setup_lpm(const int socketid)
        }
 }
 
+int
+lpm_check_ptype(int portid)
+{
+       int i, ret;
+       int ptype_l3_ipv4 = 0, ptype_l3_ipv6 = 0;
+       uint32_t ptype_mask = RTE_PTYPE_L3_MASK;
+
+       ret = rte_eth_dev_get_supported_ptypes(portid, ptype_mask, NULL, 0);
+       if (ret <= 0)
+               return 0;
+
+       uint32_t ptypes[ret];
+
+       ret = rte_eth_dev_get_supported_ptypes(portid, ptype_mask, ptypes, ret);
+       for (i = 0; i < ret; ++i) {
+               if (ptypes[i] & RTE_PTYPE_L3_IPV4)
+                       ptype_l3_ipv4 = 1;
+               if (ptypes[i] & RTE_PTYPE_L3_IPV6)
+                       ptype_l3_ipv6 = 1;
+       }
+
+       if (ptype_l3_ipv4 == 0)
+               printf("port %d cannot parse RTE_PTYPE_L3_IPV4\n", portid);
+
+       if (ptype_l3_ipv6 == 0)
+               printf("port %d cannot parse RTE_PTYPE_L3_IPV6\n", portid);
+
+       if (ptype_l3_ipv4 && ptype_l3_ipv6)
+               return 1;
+
+       return 0;
+
+}
+
+static inline void
+lpm_parse_ptype(struct rte_mbuf *m)
+{
+       struct ether_hdr *eth_hdr;
+       uint32_t packet_type = RTE_PTYPE_UNKNOWN;
+       uint16_t ether_type;
+
+       eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *);
+       ether_type = eth_hdr->ether_type;
+       if (ether_type == rte_cpu_to_be_16(ETHER_TYPE_IPv4))
+               packet_type |= RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
+       else if (ether_type == rte_cpu_to_be_16(ETHER_TYPE_IPv6))
+               packet_type |= RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
+
+       m->packet_type = packet_type;
+}
+
+uint16_t
+lpm_cb_parse_ptype(uint8_t port __rte_unused, uint16_t queue __rte_unused,
+                  struct rte_mbuf *pkts[], uint16_t nb_pkts,
+                  uint16_t max_pkts __rte_unused,
+                  void *user_param __rte_unused)
+{
+       unsigned i;
+
+       for (i = 0; i < nb_pkts; ++i)
+               lpm_parse_ptype(pkts[i]);
+
+       return nb_pkts;
+}
+
 /* Return ipv4/ipv6 lpm fwd lookup struct. */
 void *
 lpm_get_ipv4_l3fwd_lookup_struct(const int socketid)