/***************************************************************** * ethersrv initialization wrapper: * Equivalent of main function ****************************************************************/ void ethersrv_init(char *service_name, uint64_t queueid, ether_get_mac_address_t get_mac_ptr, ether_terminate_queue terminate_queue_ptr, ether_transmit_pbuf_list_t transmit_ptr, ether_get_tx_free_slots tx_free_slots_ptr, ether_handle_free_TX_slot handle_free_tx_slot_ptr, size_t rx_bufsz, ether_rx_register_buffer rx_register_buffer_ptr, ether_rx_get_free_slots rx_get_free_slots_ptr) { errval_t err; ETHERSRV_DEBUG("in the server_init\n"); assert(service_name != NULL); assert(get_mac_ptr != NULL); assert(transmit_ptr != NULL); assert(tx_free_slots_ptr != NULL); assert(handle_free_tx_slot_ptr != NULL); assert(rx_register_buffer_ptr != NULL); assert(rx_get_free_slots_ptr != NULL); exported_queueid = queueid; rx_buffer_size = rx_bufsz; ether_terminate_queue_ptr = terminate_queue_ptr; ether_get_mac_address_ptr = get_mac_ptr; ether_transmit_pbuf_list_ptr = transmit_ptr; tx_free_slots_fn_ptr = tx_free_slots_ptr; handle_free_tx_slot_fn_ptr = handle_free_tx_slot_ptr; rx_register_buffer_fn_ptr = rx_register_buffer_ptr; rx_get_free_slots_fn_ptr = rx_get_free_slots_ptr; snprintf(exported_queue_name, sizeof(exported_queue_name), "%s_%"PRIu64"", service_name, queueid); buffers_list = NULL; netd[0] = NULL; netd[1] = NULL; buffer_id_counter = 0; netd_buffer_count = 0; client_no = 0; uint8_t my_mac[6] = {0}; ether_get_mac_address_ptr(my_mac); printf("############################################\n"); printf("For service [%s] MAC= %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", service_name, my_mac[0], my_mac[1], my_mac[2], my_mac[3], my_mac[4], my_mac[5]); bm = netbench_alloc("DRV", EVENT_LIST_SIZE); size_t driver_supported_buffers = tx_free_slots_fn_ptr(); printf("using %zd slots for internal buffer\n", driver_supported_buffers); assert(driver_supported_buffers >= 1); /* exporting ether interface */ err = net_queue_manager_export(NULL, // state for connect/export callbacks export_ether_cb, connect_ether_cb, get_default_waitset(), IDC_EXPORT_FLAGS_DEFAULT); if (err_is_fail(err)) { DEBUG_ERR(err, "%s export failed", exported_queue_name); abort(); } // FIXME: How do we decide this reasonably use_sf = !force_disable_sf && (queueid == 0); if (use_sf || is_loopback_device) { // start software filtering service init_soft_filters_service(service_name, queueid, rx_bufsz); } } // end function: ethersrv_init
static void remaining_lwip_initialization(char *card_name, uint64_t queueid) { nb = netbench_alloc("app", RECORDED_EVENTS_COUNT); //asq: connect to the NIC driver, before doing anything else idc_connect_to_driver(card_name, queueid); DEBUGPRINTPS("Connected to driver [%s]\n", card_name); stats_init(); sys_init(); DEBUGPRINTPS("remaining_lwip_init: allocating pbuf memory\n"); #ifdef CONFIG_QEMU_NETWORK printf("#### Networking with small amount of memory #####\n"); #endif // CONFIG_QEMU_NETWORK printf("#### [%u:%"PRIuDOMAINID":%s] [%s] [%d] MEM_SIZE[%d], " "PBUF_POOL_SIZE[%d], MEMP_MAX[%d], RECEIVE_BUFFERS[%d] qid[%"PRIu64"]####\n", disp_get_core_id(), disp_get_domain_id(), disp_name(), MEM_CONF_LOC, is_ctl, MEM_SIZE, PBUF_POOL_SIZE, MEMP_MAX, RECEIVE_BUFFERS, queueid); memp_init(); // 0'st buffer DEBUGPRINTPS("remaining_lwip_init: allocating memory for sending\n"); mem_init(); // 1'th buffer DEBUGPRINTPS("remaining_lwip_init: done with memroy allocation\n"); DEBUGPRINTPS("LWIP: lwip_starting\n"); netif_init(); #if LWIP_SOCKET lwip_socket_init(); #endif /* LWIP_SOCKET */ ip_init(); DEBUGPRINTPS("r_lwip_init: done ip_init\n"); #if LWIP_ARP etharp_init(); #endif /* LWIP_ARP */ #if LWIP_RAW raw_init(); #endif /* LWIP_RAW */ #if LWIP_UDP udp_init(); DEBUGPRINTPS("r_lwip_init: done udp_init\n"); #endif /* LWIP_UDP */ #if LWIP_TCP tcp_init(); DEBUGPRINTPS("r_lwip_init: done tcp_init\n"); #endif /* LWIP_TCP */ #if LWIP_SNMP snmp_init(); DEBUGPRINTPS("r_lwip_init: done snmp_init\n"); #endif /* LWIP_SNMP */ #if LWIP_AUTOIP autoip_init(); DEBUGPRINTPS("r_lwip_init: done autoip_init\n"); #endif /* LWIP_AUTOIP */ #if LWIP_IGMP igmp_init(); DEBUGPRINTPS("r_lwip_init: done igmp_init\n"); #endif /* LWIP_IGMP */ DEBUGPRINTPS("r_lwip_init: done2 igmp_init\n"); #if LWIP_DNS DEBUGPRINTPS("r_lwip_init: starting DNS_init\n"); dns_init(); DEBUGPRINTPS("r_lwip_init: done DNS_init\n"); #endif /* LWIP_DNS */ DEBUGPRINTPS("LWIP: lwip_started\n"); }