void ofp_multicast_thread(int core_id) { odph_linux_pthread_t test_linux_pthread; odp_cpumask_t cpumask; odp_cpumask_zero(&cpumask); odp_cpumask_set(&cpumask, core_id); ofp_linux_pthread_create(&test_linux_pthread, &cpumask, mcasttest, NULL, ODP_THREAD_WORKER ); }
void ofp_start_webserver_thread(int core_id) { odph_linux_pthread_t test_linux_pthread; odp_cpumask_t cpumask; odp_cpumask_zero(&cpumask); odp_cpumask_set(&cpumask, core_id); ofp_linux_pthread_create(&test_linux_pthread, &cpumask, webserver, NULL, ODP_THREAD_WORKER ); }
static int start_performance(int core_id) { odph_linux_pthread_t cli_linux_pthread; odp_cpumask_t cpumask; odp_cpumask_zero(&cpumask); odp_cpumask_set(&cpumask, core_id); return ofp_linux_pthread_create(&cli_linux_pthread, &cpumask, perf_client, NULL, ODP_THREAD_WORKER ); }
int ofp_init_global(ofp_init_global_t *params) { int i; HANDLE_ERROR(ofp_init_pre_global(NULL, NULL, params->pkt_hook, NULL, ARP_AGE_INTERVAL, ARP_ENTRY_TIMEOUT)); /* cpu mask for slow path threads */ odp_cpumask_zero(&cpumask); odp_cpumask_set(&cpumask, params->linux_core_id); OFP_INFO("Slow path threads on core %d", odp_cpumask_first(&cpumask)); HANDLE_ERROR(ofp_set_vxlan_interface_queue()); /* Create interfaces */ for (i = 0; i < params->if_count; ++i) HANDLE_ERROR(ofp_ifnet_create(params->if_names[i], params->burst_recv_mode ? ODP_PKTIN_MODE_RECV : ODP_PKTIN_MODE_SCHED)); #ifdef SP /* Start Netlink server process */ if (!ofp_linux_pthread_create(&shm->nl_thread, &cpumask, START_NL_SERVER, NULL, ODP_THREAD_CONTROL)) { OFP_ERR("Failed to start Netlink thread."); return -1; } shm->nl_thread_is_running = 1; #endif /* SP */ odp_schedule_resume(); return 0; }
static void test_tls_errno(void) { odp_cpumask_t cpumask; odph_linux_pthread_t threads; odp_barrier_t barrier__; odp_barrier_t *barrier; CU_ASSERT(1 == odp_cpumask_default_worker(&cpumask, 1)); barrier = &barrier__; odp_barrier_init(barrier, 2); CU_ASSERT(1 == ofp_linux_pthread_create( &threads, &cpumask, other_thread, (void *)barrier, ODP_THREAD_CONTROL)); /* Initialize this thread's ofp_errno. */ ofp_errno = 0; /* Test 1 - Test that an assignment to the current thread's ofp_errno * does not modify the ofp_errno of other_thread. */ odp_barrier_wait(barrier); ofp_errno = OFP_EIO; odp_barrier_wait(barrier); CU_ASSERT_EQUAL(ofp_errno, OFP_EIO); /* Test 2 - Test both threads. */ odp_barrier_wait(barrier); ofp_errno = OFP_EPERM; odp_barrier_wait(barrier); CU_ASSERT_EQUAL(ofp_errno, OFP_EPERM); odph_linux_pthread_join(&threads, 1); }
/** main() Application entry point * * @param argc int * @param argv[] char* * @return int * */ int main(int argc, char *argv[]) { odph_linux_pthread_t thread_tbl[MAX_WORKERS]; appl_args_t params; int core_count, num_workers; odp_cpumask_t cpumask; char cpumaskstr[64]; /* Parse and store the application arguments */ parse_args(argc, argv, ¶ms); /* Print both system and application information */ print_info(NO_PATH(argv[0]), ¶ms); if (odp_init_global(NULL, NULL)) { OFP_ERR("Error: ODP global init failed.\n"); exit(EXIT_FAILURE); } if (odp_init_local(ODP_THREAD_CONTROL)) { OFP_ERR("Error: ODP local init failed.\n"); exit(EXIT_FAILURE); } core_count = odp_cpu_count(); num_workers = core_count; if (params.core_count) num_workers = params.core_count; if (num_workers > MAX_WORKERS) num_workers = MAX_WORKERS; if (core_count > 1) num_workers--; num_workers = odp_cpumask_default_worker(&cpumask, num_workers); odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr)); printf("Num worker threads: %i\n", num_workers); printf("first CPU: %i\n", odp_cpumask_first(&cpumask)); printf("cpu mask: %s\n", cpumaskstr); memset(&app_init_params, 0, sizeof(app_init_params)); app_init_params.linux_core_id = 0; app_init_params.if_count = params.if_count; app_init_params.if_names = params.if_names; if (ofp_init_global(&app_init_params)) { OFP_ERR("Error: OFP global init failed.\n"); exit(EXIT_FAILURE); } memset(thread_tbl, 0, sizeof(thread_tbl)); /* Start dataplane dispatcher worker threads */ ofp_linux_pthread_create(thread_tbl, &cpumask, default_event_dispatcher, ofp_eth_vlan_processing, ODP_THREAD_CONTROL ); /* other app code here.*/ /* Start CLI */ ofp_start_cli_thread(app_init_params.linux_core_id, params.conf_file); sleep(5); ofp_loglevel = OFP_LOG_INFO; config_suite_framework(app_init_params.linux_core_id); OFP_INFO("\n\nSuite: IPv4 UDP socket: create and close.\n\n"); if (!init_suite(NULL)) run_suite(create_close_udp, create_close_udp_noproto); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 TCP socket: create and close.\n\n"); if (!init_suite(NULL)) run_suite(create_close_tcp, create_close_tcp_noproto); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 UDP socket: create and close.\n\n"); if (!init_suite(NULL)) run_suite(create_close_udp6, create_close_udp6_noproto); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 TCP socket: create and close.\n\n"); if (!init_suite(NULL)) run_suite(create_close_tcp6, create_close_tcp6_noproto); end_suite(); OFP_INFO("Test ended.\n"); #endif /* INET6 */ OFP_INFO("\n\nSuite: IPv4 UDP socket: bind.\n\n"); if (!init_suite(init_udp_create_socket)) run_suite(bind_ip4_local_ip, bind_ip4_any); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 TCP socket: bind.\n\n"); if (!init_suite(init_tcp_create_socket)) run_suite(bind_ip4_local_ip, bind_ip4_any); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 UDP socket: bind.\n\n"); if (!init_suite(init_udp6_create_socket)) run_suite(bind_ip6_local_ip, bind_ip6_any); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 TCP socket: bind.\n\n"); if (!init_suite(init_tcp6_create_socket)) run_suite(bind_ip6_local_ip, bind_ip6_any); end_suite(); OFP_INFO("Test ended.\n"); #endif /* INET6 */ OFP_INFO("\n\nSuite: IPv4 UDP socket: shutdown.\n\n"); if (!init_suite(init_udp_create_socket)) run_suite(shutdown_socket, shutdown_socket); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 TCP socket: shutdown (no connection).\n\n"); if (!init_suite(init_tcp_create_socket)) run_suite(shutdown_socket, shutdown_socket); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 UDP socket: shutdown.\n\n"); if (!init_suite(init_udp6_create_socket)) run_suite(shutdown_socket, shutdown_socket); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 TCP socket: shutdown (no connection).\n\n"); if (!init_suite(init_tcp6_create_socket)) run_suite(shutdown_socket, shutdown_socket); end_suite(); OFP_INFO("Test ended.\n"); #endif /* INET6 */ OFP_INFO("\n\nSuite: IPv4 UDP socket: connect.\n\n"); if (!init_suite(init_udp_create_socket)) run_suite(connect_udp4, connect_bind_udp4); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 UDP socket: connect + shutdown.\n\n"); if (!init_suite(init_udp_create_socket)) run_suite(connect_shutdown_udp4, connect_shutdown_bind_udp4); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 UDP socket: connect.\n\n"); if (!init_suite(init_udp6_create_socket)) run_suite(connect_udp6, connect_bind_udp6); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 UDP socket: connect + shutdown.\n\n"); if (!init_suite(init_udp6_create_socket)) run_suite(connect_shutdown_udp6, connect_shutdown_bind_udp6); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 UDP socket: connect + shutdown + any.\n\n"); if (!init_suite(init_udp6_create_socket)) run_suite(connect_shutdown_udp6_any, connect_shutdown_bind_udp6_any); end_suite(); OFP_INFO("Test ended.\n"); #endif /* INET6 */ OFP_INFO("\n\nSuite: IPv4 UDP socket BIND local address: send + sendto\n\n"); if (!init_suite(init_udp_bind_local_ip)) run_suite(send_ip4_udp_local_ip, sendto_ip4_udp_local_ip); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 UDP socket bind any address: send + sendto\n\n"); if (!init_suite(init_udp_bind_any)) run_suite(send_ip4_udp_any, sendto_ip4_udp_any); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 UDP socket BIND local address: send + sendto\n\n"); if (!init_suite(init_udp6_bind_local_ip)) run_suite(send_ip6_udp_local_ip, sendto_ip6_udp_local_ip); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 UDP socket bind any address: send + sendto\n\n"); if (!init_suite(init_udp6_bind_any)) run_suite(send_ip6_udp_any, sendto_ip6_udp_any); end_suite(); OFP_INFO("Test ended.\n"); #endif /* INET6 */ OFP_INFO("\n\nSuite: IPv4 UDP bind local IP: sendto + recv.\n\n"); if (!init_suite(init_udp_local_ip)) run_suite(send_udp_local_ip, recv_udp); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 UDP bind local IP: sendto + recvfrom.\n\n"); if (!init_suite(init_udp_bind_local_ip)) run_suite(send_udp_local_ip, recvfrom_udp); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 UDP bind any address: sendto + recv.\n\n"); if (!init_suite(init_udp_any)) run_suite(send_udp_any, recv_udp); end_suite(); OFP_INFO("\n\nSuite: IPv4 UDP bind any address: sendto + recvfrom.\n\n"); if (!init_suite(init_udp_bind_any)) run_suite(send_udp_any, recvfrom_udp); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 UDP bind any address: sendto + recvfrom(NULL addr).\n\n"); if (!init_suite(init_udp_bind_any)) run_suite(send_udp_any, recvfrom_udp_null_addr); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 UDP bind local IP: sendto + recv.\n\n"); if (!init_suite(init_udp6_bind_local_ip)) run_suite(send_udp6_local_ip, recv_udp); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 UDP bind local IP: sendto + recvfrom.\n\n"); if (!init_suite(init_udp6_bind_local_ip)) run_suite(send_udp6_local_ip, recvfrom_udp6); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 UDP bind any IP: sendto + recv.\n\n"); if (!init_suite(init_udp6_bind_any)) run_suite(send_udp6_any, recv_udp); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 UDP bind any IP: sendto + recvfrom.\n\n"); if (!init_suite(init_udp6_bind_any)) run_suite(send_udp6_any, recvfrom_udp6); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 UDP bind any IP: sendto + recvfrom(NULL addr).\n\n"); if (!init_suite(init_udp6_bind_any)) run_suite(send_udp6_any, recvfrom_udp_null_addr); end_suite(); OFP_INFO("Test ended.\n"); #endif /*INET6*/ OFP_INFO("\n\nSuite: IPv4 TCP socket local IP: listen.\n\n"); if (!init_suite(init_tcp_bind_local_ip)) run_suite(listen_tcp, listen_tcp); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 TCP socket local IP: listen.\n\n"); if (!init_suite(init_tcp6_bind_local_ip)) run_suite(listen_tcp, listen_tcp); end_suite(); OFP_INFO("Test ended.\n"); #endif /*INET6*/ OFP_INFO("\n\nSuite: IPv4 TCP socket local IP: connect + accept.\n\n"); if (!init_suite(init_tcp_bind_listen_local_ip)) run_suite(connect_tcp4_local_ip, accept_tcp4); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 TCP socket any IP: connect + accept.\n\n"); if (!init_suite(init_tcp_bind_listen_any)) run_suite(connect_tcp4_any, accept_tcp4); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 TCP socket local IP: connect + accept null address.\n\n"); if (!init_suite(init_tcp_bind_listen_local_ip)) run_suite(connect_tcp4_local_ip, accept_tcp4_null_addr); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 TCP socket local IP: connect + accept.\n\n"); if (!init_suite(init_tcp6_bind_listen_local_ip)) run_suite(connect_tcp6_local_ip, accept_tcp6); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 TCP socket any IP: connect + accept.\n\n"); if (!init_suite(init_tcp6_bind_listen_any)) run_suite(connect_tcp6_any, accept_tcp6); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 TCP socket local IP: connect + accept null address.\n\n"); if (!init_suite(init_tcp6_bind_listen_local_ip)) run_suite(connect_tcp6_local_ip, accept_tcp6_null_addr); end_suite(); OFP_INFO("Test ended.\n"); #endif /*INET6*/ OFP_INFO("\n\nSuite: IPv4 TCP socket local IP: send + recv.\n\n"); if (!init_suite(init_tcp_bind_listen_local_ip)) run_suite(send_tcp4_local_ip, receive_tcp); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 TCP socket any IP: send + recv.\n\n"); if (!init_suite(init_tcp_bind_listen_any)) run_suite(send_tcp4_any, receive_tcp); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 TCP socket local IP: send + recv.\n\n"); if (!init_suite(init_tcp6_bind_listen_local_ip)) run_suite(send_tcp6_local_ip, receive_tcp); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 TCP socket any IP: send + recv.\n\n"); if (!init_suite(init_tcp6_bind_listen_any)) run_suite(send_tcp6_any, receive_tcp); end_suite(); OFP_INFO("Test ended.\n"); #endif /*INET6*/ OFP_INFO("\n\nSuite: IPv4 UDP bind local IP: select + recv.\n\n"); if (!init_suite(init_udp_bind_local_ip)) run_suite(send_udp_local_ip, select_recv_udp); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 TCP bind local IP: select + accept + recv.\n\n"); if (!init_suite(init_tcp_bind_listen_local_ip)) run_suite(send_tcp4_local_ip, select_recv_tcp); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 UDP bind local IP: select + recv.\n\n"); if (!init_suite(init_udp6_bind_local_ip)) run_suite(send_udp6_local_ip, select_recv_udp); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv6 TCP bind local IP: select + accept + recv.\n\n"); if (!init_suite(init_tcp6_bind_listen_local_ip)) run_suite(send_tcp6_local_ip, select_recv_tcp); end_suite(); OFP_INFO("Test ended.\n"); #endif /*INET6*/ OFP_INFO("\n\nSuite: IPv4 UDP bindlocal IP: select + recv x2.\n\n"); if (!init_suite(init_udp_bind_local_ip)) run_suite(send_udp_local_ip, select_recv_udp_2); end_suite(); OFP_INFO("Test ended.\n"); OFP_INFO("\n\nSuite: IPv4 UDP bind local IP: socket_sigevent rcv.\n\n"); if (!init_suite(init_udp_bind_local_ip)) run_suite(recv_send_udp_local_ip, socket_sigevent_udp4); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 UDP bind local IP: socket_sigevent rcv.\n\n"); if (!init_suite(init_udp6_bind_local_ip)) run_suite(recv_send_udp6_local_ip, socket_sigevent_udp6); end_suite(); OFP_INFO("Test ended.\n"); #endif /*INET6*/ OFP_INFO("\n\nSuite: IPv4 TCP bind local IP: socket_sigevent rcv.\n\n"); if (!init_suite(init_tcp_bind_listen_local_ip)) run_suite(connect_recv_send_tcp_local_ip, socket_sigevent_tcp_rcv); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 TCP bind local IP: socket_sigevent rcv.\n\n"); if (!init_suite(init_tcp6_bind_listen_local_ip)) run_suite(connect_recv_send_tcp6_local_ip, socket_sigevent_tcp_rcv); end_suite(); OFP_INFO("Test ended.\n"); #endif /*INET6*/ OFP_INFO("\n\nSuite: IPv4 TCP bind local IP: socket_sigevent accept.\n\n"); if (!init_suite(init_tcp_bind_listen_local_ip)) run_suite(connect_tcp_delayed_local_ip, socket_sigevent_tcp_accept); end_suite(); OFP_INFO("Test ended.\n"); #ifdef INET6 OFP_INFO("\n\nSuite: IPv6 TCP bind local IP: socket_sigevent accept.\n\n"); if (!init_suite(init_tcp6_bind_listen_local_ip)) run_suite(connect_tcp6_delayed_local_ip, socket_sigevent_tcp_accept); end_suite(); OFP_INFO("Test ended.\n"); #endif /*INET6*/ odph_linux_pthread_join(thread_tbl, num_workers); printf("End Main()\n"); return 0; }
/** * main() Application entry point * * This is the main function of the FPM application, it's a minimalistic * example, see 'usage' function for available arguments and usage. * * Using the number of available cores as input, this example sets up * ODP dispatcher threads executing OFP VLAN processesing and starts * a CLI function on a managment core. * * @param argc int * @param argv[] char* * @return int * */ int main(int argc, char *argv[]) { odph_linux_pthread_t thread_tbl[MAX_WORKERS]; appl_args_t params; int core_count, num_workers, ret_val; odp_cpumask_t cpumask; char cpumaskstr[64]; /* Parse and store the application arguments */ if (parse_args(argc, argv, ¶ms) != EXIT_SUCCESS) return EXIT_FAILURE; /* Print both system and application information */ print_info(NO_PATH(argv[0]), ¶ms); /* * Before any ODP API functions can be called, we must first init the ODP * globals, e.g. availale accelerators or software implementations for * shared memory, threads, pool, qeueus, sheduler, pktio, timer, crypto * and classification. */ if (odp_init_global(NULL, NULL)) { OFP_ERR("Error: ODP global init failed.\n"); odp_term_global(); return EXIT_FAILURE; } /* * When the gloabel ODP level init has been done, we can now issue a * local init per thread. This must also be done before any other ODP API * calls may be made. Local inits are made here for shared memory, * threads, pktio and scheduler. */ #if ODP_VERSION < 106 if (odp_init_local(ODP_THREAD_CONTROL) != 0) { OFP_ERR("Error: ODP local init failed.\n"); odp_term_global(); return EXIT_FAILURE; } #endif /* * Get the number of cores available to ODP, one run-to-completion thread * will be created per core. */ core_count = odp_cpu_count(); num_workers = core_count; if (params.core_count) num_workers = params.core_count; if (num_workers > MAX_WORKERS) num_workers = MAX_WORKERS; /* * This example assumes that core #0 runs Linux kernel background tasks. * By default, cores #1 and beyond will be populated with a OFP * processing thread each. */ memset(&app_init_params, 0, sizeof(app_init_params)); app_init_params.linux_core_id = 0; if (core_count > 1) num_workers--; /* * Initializes cpumask with CPUs available for worker threads. * Sets up to 'num' CPUs and returns the count actually set. * Use zero for all available CPUs. */ num_workers = odp_cpumask_default_worker(&cpumask, num_workers); if (odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr)) < 0) { OFP_ERR("Error: Too small buffer provided to " \ "odp_cpumask_to_str\n"); odp_term_global(); return EXIT_FAILURE; } printf("Num worker threads: %i\n", num_workers); printf("first CPU: %i\n", odp_cpumask_first(&cpumask)); printf("cpu mask: %s\n", cpumaskstr); app_init_params.if_count = params.if_count; app_init_params.if_names = params.if_names; app_init_params.pkt_hook[OFP_HOOK_LOCAL] = fastpath_local_hook; /* * Now that ODP has been initalized, we can initialize OFP. This will * open a pktio instance for each interface supplied as argument by the * user. * * General configuration will be to pktio and schedluer queues here in * addition will fast path interface configuration. */ if (ofp_init_global(&app_init_params) != 0) { odp_term_global(); return EXIT_FAILURE; } /* * Create and launch dataplane dispatcher worker threads to be placed * according to the cpumask, thread_tbl will be populated with the * created pthread IDs. * * In this case, all threads will run the default_event_dispatcher * function with ofp_eth_vlan_processing as argument. * * If different dispatchers should run, or the same be run with differnt * input arguments, the cpumask is used to control this. */ memset(thread_tbl, 0, sizeof(thread_tbl)); ret_val = ofp_linux_pthread_create(thread_tbl, &cpumask, default_event_dispatcher, ofp_eth_vlan_processing, ODP_THREAD_CONTROL ); if (ret_val != num_workers) { OFP_ERR("Error: Failed to create worker threads, " \ "expected %d, got %d\n", num_workers, ret_val); odp_term_global(); return EXIT_FAILURE; } /* * Now when the ODP dispatcher threads are running, further applications * can be launched, in this case, we will start the OFP CLI thread on * the management core, i.e. not competing for cpu cycles with the * worker threads */ ofp_start_cli_thread(app_init_params.linux_core_id, params.conf_file); /* * If we choose to check performance, a performance monitoring client * will be started on the management core. Once every second it will * read the statistics from the workers from a shared memory region. * Using this has negligible performance impact (<<0.01%). */ if (params.perf_stat) { if (start_performance(app_init_params.linux_core_id) <= 0) { OFP_ERR("Error: Failed to init performance monitor\n"); odp_term_global(); return EXIT_FAILURE; } } /* * Wait here until all worker threads have terminated, then free up all * resources allocated by odp_init_global(). */ odph_linux_pthread_join(thread_tbl, num_workers); if (odp_term_global() != 0) return EXIT_FAILURE; printf("FPM End Main()\n"); return EXIT_SUCCESS; }
/** main() Application entry point * * @param argc int * @param argv[] char* * @return int * */ int main(int argc, char *argv[]) { odph_linux_pthread_t thread_tbl[MAX_WORKERS]; appl_args_t params; int core_count, num_workers; odp_cpumask_t cpumask; char cpumaskstr[64]; /* Parse and store the application arguments */ parse_args(argc, argv, ¶ms); /* Print both system and application information */ print_info(NO_PATH(argv[0]), ¶ms); if (odp_init_global(NULL, NULL)) { OFP_ERR("Error: ODP global init failed.\n"); exit(EXIT_FAILURE); } if (odp_init_local(ODP_THREAD_CONTROL)) { OFP_ERR("Error: ODP local init failed.\n"); exit(EXIT_FAILURE); } core_count = odp_cpu_count(); num_workers = core_count; if (params.core_count) num_workers = params.core_count; if (num_workers > MAX_WORKERS) num_workers = MAX_WORKERS; /* * By default core #0 runs Linux kernel background tasks. * Start mapping thread from core #1 */ memset(&app_init_params, 0, sizeof(app_init_params)); app_init_params.linux_core_id = 0; if (core_count > 1) num_workers--; num_workers = odp_cpumask_default_worker(&cpumask, num_workers); odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr)); printf("Num worker threads: %i\n", num_workers); printf("first CPU: %i\n", odp_cpumask_first(&cpumask)); printf("cpu mask: %s\n", cpumaskstr); app_init_params.if_count = params.if_count; app_init_params.if_names = params.if_names; app_init_params.pkt_hook[OFP_HOOK_LOCAL] = fastpath_local_hook; if (ofp_init_global(&app_init_params)) { OFP_ERR("Error: OFP global init failed.\n"); exit(EXIT_FAILURE); } memset(thread_tbl, 0, sizeof(thread_tbl)); /* Start dataplane dispatcher worker threads */ ofp_linux_pthread_create(thread_tbl, &cpumask, default_event_dispatcher, ofp_eth_vlan_processing, ODP_THREAD_CONTROL ); /* other app code here.*/ /* Start CLI */ ofp_start_cli_thread(app_init_params.linux_core_id, params.conf_file); /* sysctl test thread */ ofp_start_sysctl_thread(app_init_params.linux_core_id); odph_linux_pthread_join(thread_tbl, num_workers); printf("End Main()\n"); return 0; }
static int ofp_lib_start(void) { ofp_init_global_t app_init_params; odph_linux_pthread_t thread_tbl[32]; int ret_val, num_workers = 1; odp_cpumask_t cpumask; char cpumaskstr[64]; if (ofp_init_global_called) return EXIT_FAILURE; /* * Before any ODP API functions can be called, we must first init the ODP * globals, e.g. availale accelerators or software implementations for * shared memory, threads, pool, qeueus, sheduler, pktio, timer, crypto * and classification. */ if (odp_init_global(NULL, NULL)) { OFP_ERR("ODP global init failed."); return EXIT_FAILURE; } /* * When the gloabel ODP level init has been done, we can now issue a * local init per thread. This must also be done before any other ODP API * calls may be made. Local inits are made here for shared memory, * threads, pktio and scheduler. */ if (odp_init_local(ODP_THREAD_CONTROL) != 0) { OFP_ERR("ODP local init failed."); odp_term_global(); return EXIT_FAILURE; } /* * Initializes cpumask with CPUs available for worker threads. * Sets up to 'num' CPUs and returns the count actually set. * Use zero for all available CPUs. */ num_workers = odp_cpumask_default_worker(&cpumask, num_workers); if (odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr)) < 0) { OFP_ERR("Error: Too small buffer provided to " "odp_cpumask_to_str"); odp_term_local(); odp_term_global(); return EXIT_FAILURE; } printf("Num worker threads: %i\n", num_workers); printf("first CPU: %i\n", odp_cpumask_first(&cpumask)); printf("cpu mask: %s\n", cpumaskstr); /* * Now that ODP has been initalized, we can initialize OFP. This will * open a pktio instance for each interface supplied as argument by the * user. * * General configuration will be to pktio and schedluer queues here in * addition will fast path interface configuration. */ memset(&app_init_params, 0, sizeof(app_init_params)); if (ofp_init_global(&app_init_params) != 0) { OFP_ERR("OFP global init failed."); ofp_term_global(); odp_term_local(); odp_term_global(); return EXIT_FAILURE; } if (ofp_init_local() != 0) { OFP_ERR("Error: OFP local init failed."); ofp_term_local(); ofp_term_global(); odp_term_local(); odp_term_global(); return EXIT_FAILURE; } /* * Create and launch dataplane dispatcher worker threads to be placed * according to the cpumask, thread_tbl will be populated with the * created pthread IDs. * * In this case, all threads will run the default_event_dispatcher * function with ofp_eth_vlan_processing as argument. * * If different dispatchers should run, or the same be run with differnt * input arguments, the cpumask is used to control this. */ memset(thread_tbl, 0, sizeof(thread_tbl)); ret_val = ofp_linux_pthread_create(thread_tbl, &cpumask, default_event_dispatcher, ofp_eth_vlan_processing, ODP_THREAD_CONTROL); if (ret_val != num_workers) { OFP_ERR("Error: Failed to create worker threads, " "expected %d, got %d", num_workers, ret_val); ofp_stop_processing(); odph_linux_pthread_join(thread_tbl, num_workers); ofp_term_local(); ofp_term_global(); odp_term_local(); odp_term_global(); return EXIT_FAILURE; } ofp_ifconfig(); return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { odph_linux_pthread_t thread_tbl[MAX_WORKERS], dispatcher_thread; appl_args_t params; int core_count, num_workers; odp_cpumask_t cpu_mask; char cpumaskstr[64]; int cpu, first_cpu, i; struct pktio_thr_arg pktio_thr_args[MAX_WORKERS]; /* Parse and store the application arguments */ parse_args(argc, argv, ¶ms); /* Print both system and application information */ print_info(NO_PATH(argv[0]), ¶ms); if (odp_init_global(NULL, NULL)) { OFP_ERR("Error: ODP global init failed.\n"); exit(EXIT_FAILURE); } odp_init_local(ODP_THREAD_CONTROL); memset(&app_init_params, 0, sizeof(app_init_params)); app_init_params.linux_core_id = 0; app_init_params.if_count = params.if_count; app_init_params.if_names = params.if_names; app_init_params.burst_recv_mode = 1; ofp_init_global(&app_init_params); ofp_init_local(); memset(thread_tbl, 0, sizeof(thread_tbl)); memset(pktio_thr_args, 0, sizeof(pktio_thr_args)); core_count = odp_cpu_count(); num_workers = core_count; if (params.core_count) num_workers = params.core_count < core_count? params.core_count: core_count; first_cpu = 1; num_workers -= first_cpu; if (num_workers > MAX_WORKERS) num_workers = MAX_WORKERS; if (num_workers < params.if_count) { OFP_ERR("At least %u fastpath cores required.\n", params.if_count); exit(EXIT_FAILURE); } printf("Num worker threads: %i\n", num_workers); printf("first CPU: %i\n", first_cpu); for (i = 0; i < num_workers; ++i) { pktio_thr_args[i].pkt_func = ofp_eth_vlan_processing; pktio_thr_args[i].port = i % params.if_count; odp_cpumask_zero(&cpu_mask); cpu = first_cpu + i; odp_cpumask_set(&cpu_mask, cpu); odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr)); OFP_DBG("Starting pktio receive on core: %d port: %d\n", cpu, pktio_thr_args[i].port); OFP_DBG("cpu mask: %s\n", cpumaskstr); ofp_linux_pthread_create(&thread_tbl[i], &cpu_mask, pkt_io_recv, &pktio_thr_args[i], ODP_THREAD_WORKER ); } odp_cpumask_zero(&cpu_mask); odp_cpumask_set(&cpu_mask, app_init_params.linux_core_id + 1); ofp_linux_pthread_create(&dispatcher_thread, &cpu_mask, event_dispatcher, NULL, ODP_THREAD_CONTROL ); /* Start CLI */ ofp_start_cli_thread(app_init_params.linux_core_id, params.conf_file); sleep(1); udp_fwd_cfg(params.sock_count, params.laddr, params.raddr); odph_linux_pthread_join(thread_tbl, num_workers); printf("End Main()\n"); return 0; }
/** main() Application entry point * * @param argc int * @param argv[] char* * @return int * */ int main(int argc, char *argv[]) { odph_linux_pthread_t thread_tbl[MAX_WORKERS], dispatcher_thread; appl_args_t params; int core_count, num_workers; odp_cpumask_t cpu_mask; char cpumaskstr[64]; int cpu, first_cpu, i; struct pktio_thr_arg pktio_thr_args[MAX_WORKERS]; /* Parse and store the application arguments */ parse_args(argc, argv, ¶ms); /* Print both system and application information */ print_info(NO_PATH(argv[0]), ¶ms); if (odp_init_global(NULL, NULL)) { OFP_ERR("Error: ODP global init failed.\n"); exit(EXIT_FAILURE); } if (odp_init_local(ODP_THREAD_CONTROL)) { OFP_ERR("Error: ODP local init failed.\n"); exit(EXIT_FAILURE); } memset(thread_tbl, 0, sizeof(thread_tbl)); memset(pktio_thr_args, 0, sizeof(pktio_thr_args)); core_count = odp_cpu_count(); num_workers = core_count; first_cpu = 1; if (params.core_count) num_workers = params.core_count; if (num_workers > MAX_WORKERS) num_workers = MAX_WORKERS; /* * By default core #0 runs Linux kernel background tasks. * Start mapping thread from core #1 */ memset(&app_init_params, 0, sizeof(app_init_params)); app_init_params.linux_core_id = 0; if (core_count <= 1) { OFP_ERR("Burst mode requires multiple cores.\n"); exit(EXIT_FAILURE); } num_workers--; printf("Num worker threads: %i\n", num_workers); printf("first CPU: %i\n", first_cpu); app_init_params.if_count = params.if_count; app_init_params.if_names = params.if_names; app_init_params.pkt_hook[OFP_HOOK_LOCAL] = fastpath_local_hook; app_init_params.burst_recv_mode = 1; if (ofp_init_global(&app_init_params)) { OFP_ERR("Error: OFP global init failed.\n"); exit(EXIT_FAILURE); } if (num_workers < params.if_count) { OFP_ERR("At least %u fastpath cores required.\n", params.if_count); exit(EXIT_FAILURE); } for (i = 0; i < num_workers; ++i) { pktio_thr_args[i].pkt_func = ofp_eth_vlan_processing; pktio_thr_args[i].port = i % params.if_count; odp_cpumask_zero(&cpu_mask); cpu = first_cpu + i; odp_cpumask_set(&cpu_mask, cpu); odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr)); OFP_DBG("Starting pktio receive on core: %d port: %d\n", cpu, pktio_thr_args[i].port); OFP_DBG("cpu mask: %s\n", cpumaskstr); ofp_linux_pthread_create(&thread_tbl[i], &cpu_mask, pkt_io_recv, &pktio_thr_args[i], ODP_THREAD_WORKER ); } odp_cpumask_zero(&cpu_mask); odp_cpumask_set(&cpu_mask, app_init_params.linux_core_id); ofp_linux_pthread_create(&dispatcher_thread, &cpu_mask, event_dispatcher, NULL, ODP_THREAD_CONTROL ); /* other app code here.*/ /* Start CLI */ ofp_start_cli_thread(app_init_params.linux_core_id, params.conf_file); odph_linux_pthread_join(thread_tbl, num_workers); printf("End Main()\n"); return 0; }