1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2016 Intel Corporation 3 */ 4 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <stdint.h> 8 #include <inttypes.h> 9 #include <sys/types.h> 10 #include <string.h> 11 #include <sys/queue.h> 12 #include <stdarg.h> 13 #include <errno.h> 14 #include <getopt.h> 15 #include <unistd.h> 16 17 #include <rte_common.h> 18 #include <rte_byteorder.h> 19 #include <rte_log.h> 20 #include <rte_memory.h> 21 #include <rte_memcpy.h> 22 #include <rte_eal.h> 23 #include <rte_per_lcore.h> 24 #include <rte_launch.h> 25 #include <rte_atomic.h> 26 #include <rte_cycles.h> 27 #include <rte_prefetch.h> 28 #include <rte_lcore.h> 29 #include <rte_branch_prediction.h> 30 #include <rte_interrupts.h> 31 #include <rte_pci.h> 32 #include <rte_random.h> 33 #include <rte_debug.h> 34 #include <rte_ether.h> 35 #include <rte_ethdev.h> 36 #include <rte_mempool.h> 37 #include <rte_mbuf.h> 38 #include <rte_ip.h> 39 #include <rte_tcp.h> 40 #include <rte_lpm.h> 41 #include <rte_lpm6.h> 42 43 #include "main.h" 44 45 int 46 main(int argc, char **argv) 47 { 48 uint32_t lcore; 49 int ret; 50 51 /* Init EAL */ 52 ret = rte_eal_init(argc, argv); 53 if (ret < 0) 54 return -1; 55 argc -= ret; 56 argv += ret; 57 58 /* Parse application arguments (after the EAL ones) */ 59 ret = app_parse_args(argc, argv); 60 if (ret < 0) { 61 app_print_usage(); 62 return -1; 63 } 64 65 /* Init */ 66 app_init(); 67 68 /* Launch per-lcore init on every lcore */ 69 rte_eal_mp_remote_launch(app_lcore_main_loop, NULL, CALL_MAIN); 70 RTE_LCORE_FOREACH_WORKER(lcore) { 71 if (rte_eal_wait_lcore(lcore) < 0) 72 return -1; 73 } 74 75 return 0; 76 } 77 78 int 79 app_lcore_main_loop(__rte_unused void *arg) 80 { 81 unsigned lcore; 82 83 lcore = rte_lcore_id(); 84 85 if (lcore == app.core_rx) { 86 switch (app.pipeline_type) { 87 case e_APP_PIPELINE_ACL: 88 app_main_loop_rx(); 89 return 0; 90 91 default: 92 app_main_loop_rx_metadata(); 93 return 0; 94 } 95 } 96 97 if (lcore == app.core_worker) { 98 switch (app.pipeline_type) { 99 case e_APP_PIPELINE_STUB: 100 app_main_loop_worker_pipeline_stub(); 101 return 0; 102 103 case e_APP_PIPELINE_HASH_KEY8_EXT: 104 case e_APP_PIPELINE_HASH_KEY8_LRU: 105 case e_APP_PIPELINE_HASH_KEY16_EXT: 106 case e_APP_PIPELINE_HASH_KEY16_LRU: 107 case e_APP_PIPELINE_HASH_KEY32_EXT: 108 case e_APP_PIPELINE_HASH_KEY32_LRU: 109 case e_APP_PIPELINE_HASH_SPEC_KEY8_EXT: 110 case e_APP_PIPELINE_HASH_SPEC_KEY8_LRU: 111 case e_APP_PIPELINE_HASH_SPEC_KEY16_EXT: 112 case e_APP_PIPELINE_HASH_SPEC_KEY16_LRU: 113 case e_APP_PIPELINE_HASH_SPEC_KEY32_EXT: 114 case e_APP_PIPELINE_HASH_SPEC_KEY32_LRU: 115 /* cases for cuckoo hash table types */ 116 case e_APP_PIPELINE_HASH_CUCKOO_KEY8: 117 case e_APP_PIPELINE_HASH_CUCKOO_KEY16: 118 case e_APP_PIPELINE_HASH_CUCKOO_KEY32: 119 case e_APP_PIPELINE_HASH_CUCKOO_KEY48: 120 case e_APP_PIPELINE_HASH_CUCKOO_KEY64: 121 case e_APP_PIPELINE_HASH_CUCKOO_KEY80: 122 case e_APP_PIPELINE_HASH_CUCKOO_KEY96: 123 case e_APP_PIPELINE_HASH_CUCKOO_KEY112: 124 case e_APP_PIPELINE_HASH_CUCKOO_KEY128: 125 app_main_loop_worker_pipeline_hash(); 126 return 0; 127 128 case e_APP_PIPELINE_ACL: 129 #ifndef RTE_LIB_ACL 130 rte_exit(EXIT_FAILURE, "ACL not present in build\n"); 131 #else 132 app_main_loop_worker_pipeline_acl(); 133 return 0; 134 #endif 135 136 case e_APP_PIPELINE_LPM: 137 app_main_loop_worker_pipeline_lpm(); 138 return 0; 139 140 case e_APP_PIPELINE_LPM_IPV6: 141 app_main_loop_worker_pipeline_lpm_ipv6(); 142 return 0; 143 144 case e_APP_PIPELINE_NONE: 145 default: 146 app_main_loop_worker(); 147 return 0; 148 } 149 } 150 151 if (lcore == app.core_tx) { 152 app_main_loop_tx(); 153 return 0; 154 } 155 156 return 0; 157 } 158