/* Init NetLink and UVHost sockets */ int vr_dpdk_netlink_init(void) { void *event_sock = NULL; int ret; RTE_LOG(INFO, VROUTER, "Starting NetLink...\n"); ret = vr_message_transport_register(&dpdk_nl_transport); if (ret) return ret; #ifdef AGENT_VROUTER_TCP vr_dpdk.netlink_sock = vr_usocket(NETLINK, TCP); #else vr_dpdk.netlink_sock = vr_usocket(NETLINK, UNIX); #endif if (!vr_dpdk.netlink_sock) { RTE_LOG(ERR, VROUTER, " error creating NetLink server socket:" " %s (%d)\n", rte_strerror(errno), errno); goto error; } RTE_LOG(INFO, VROUTER, " NetLink TCP socket FD is %d\n", ((struct vr_usocket *)vr_dpdk.netlink_sock)->usock_fd); ret = vr_nl_uvhost_connect(); if (ret != 0) { RTE_LOG(ERR, VROUTER, " error creating uvhost connection\n"); goto error; } /* create and bind event usock to wake up the NetLink lcore */ event_sock = (void *)vr_usocket(EVENT, RAW); if (!event_sock) { RTE_LOG(ERR, VROUTER, " error creating NetLink event\n"); goto error; } if (vr_usocket_bind_usockets(vr_dpdk.netlink_sock, event_sock)) { RTE_LOG(ERR, VROUTER, " error binding NetLink event\n"); goto error; } vr_dpdk.netlink_event_sock = event_sock; return 0; error: vr_message_transport_unregister(&dpdk_nl_transport); vr_usocket_close(vr_dpdk.netlink_sock); return -1; }
int dpdk_packet_socket_init(void) { unsigned lcore_id; struct vr_dpdk_lcore *lcorep; void *event_sock = NULL; int err; vr_dpdk.packet_transport = (void *)vr_usocket(PACKET, RAW); if (!vr_dpdk.packet_transport) return -1; if (!vr_dpdk.packet_ring) { vr_dpdk.packet_ring = rte_ring_lookup("pkt0_tx"); if (!vr_dpdk.packet_ring) { /* multi-producers single-consumer ring */ vr_dpdk.packet_ring = rte_ring_create("pkt0_tx", VR_DPDK_TX_RING_SZ, SOCKET_ID_ANY, RING_F_SC_DEQ); if (!vr_dpdk.packet_ring) { RTE_LOG(ERR, VROUTER, " error creating pkt0 ring\n"); goto error; } } } /* socket events to wake up the pkt0 lcore */ RTE_LCORE_FOREACH(lcore_id) { lcorep = vr_dpdk.lcores[lcore_id]; event_sock = (void *)vr_usocket(EVENT, RAW); if (!event_sock) { goto error; } if (vr_usocket_bind_usockets(vr_dpdk.packet_transport, event_sock)) goto error; lcorep->lcore_event_sock = event_sock; } return 0; error: err = errno; if (event_sock) vr_usocket_close(event_sock); vr_usocket_close(vr_dpdk.packet_transport); vr_dpdk.packet_transport = NULL; errno = err; return -ENOMEM; }
int dpdk_packet_socket_init(void) { void *event_sock = NULL; int err; vr_dpdk.packet_transport = (void *)vr_usocket(PACKET, RAW); if (!vr_dpdk.packet_transport) return -1; if (!vr_dpdk.packet_ring) { vr_dpdk.packet_ring = rte_ring_lookup("packet_tx"); if (!vr_dpdk.packet_ring) { /* multi-producers single-consumer ring */ vr_dpdk.packet_ring = rte_ring_create("packet_tx", VR_DPDK_TX_RING_SZ, SOCKET_ID_ANY, RING_F_SC_DEQ); if (!vr_dpdk.packet_ring) { RTE_LOG(ERR, VROUTER, " error creating packet ring\n"); goto error; } } } /* create and bind event usock to wake up the packet lcore */ event_sock = (void *)vr_usocket(EVENT, RAW); if (!event_sock) { RTE_LOG(ERR, VROUTER, " error creating packet event\n"); goto error; } if (vr_usocket_bind_usockets(vr_dpdk.packet_transport, event_sock)) { RTE_LOG(ERR, VROUTER, " error binding packet event\n"); goto error; } vr_dpdk.packet_event_sock = event_sock; return 0; error: err = errno; if (event_sock) vr_usocket_close(event_sock); vr_usocket_close(vr_dpdk.packet_transport); vr_dpdk.packet_transport = NULL; errno = err; return -ENOMEM; }