In order to use dpdk ports in ovs they have to be bound to a DPDK compatible driver before ovs is started.
This patch adds the possibility to hotplug (or hot-unplug) a device after ovs has been started. The implementation adds an appctl command: netdev-dpdk/port-clt After the user attaches a new device, it has to be added to a bridge using the to use the add-port command, similarly, before detaching a device, it has to be removed using the del-port command. Signed-off-by: Mauricio Vasquez B <mauricio.vasquezber...@studenti.polito.it> --- lib/netdev-dpdk.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 7c4cd07..05fa0df 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1982,6 +1982,75 @@ netdev_dpdk_set_admin_state(struct unixctl_conn *conn, int argc, unixctl_command_reply(conn, "OK"); } +static void +netdev_dpdk_port_ctl(struct unixctl_conn *conn, int argc OVS_UNUSED, + const char *argv[], void *aux OVS_UNUSED) +{ + int ret; + uint8_t port_id; + unsigned int parsed_port; + char devname[RTE_ETH_NAME_MAX_LEN]; + char response[512]; + + ovs_mutex_lock(&dpdk_mutex); + + if (strcmp(argv[1], "attach") == 0) { + ret = rte_eth_dev_attach(argv[2], &port_id); + if (ret < 0) { + snprintf(response, sizeof(response), + "Error attaching device '%s'", argv[2]); + unixctl_command_reply_error(conn, response); + goto unlock; + } + + snprintf(response, sizeof(response), + "Device '%s' has been attached as 'dpdk%d'", argv[2], port_id); + unixctl_command_reply(conn, response); + + } else if (strcmp(argv[1], "detach") == 0) { + ret = dpdk_dev_parse_name(argv[2], "dpdk", &parsed_port); + if (ret) { + snprintf(response, sizeof(response), + "'%s' is not a valid dpdk device", argv[2]); + unixctl_command_reply_error(conn, response); + goto unlock; + } + + port_id = parsed_port; + + struct netdev * netdev = netdev_from_name(argv[2]); + if (netdev) { + netdev_close(netdev); + snprintf(response, sizeof(response), + "Port '%s' is being used. Remove it before detaching", + argv[2]); + unixctl_command_reply_error(conn, response); + goto unlock; + } + + rte_eth_dev_close(port_id); + + ret = rte_eth_dev_detach(port_id, devname); + if (ret < 0) { + snprintf(response, sizeof(response), + "Port '%s' can not be detached", argv[2]); + unixctl_command_reply_error(conn, response); + goto unlock; + } + + snprintf(response, sizeof(response), + "Port '%s' has been detached", argv[2]); + unixctl_command_reply(conn, response); + } else { + snprintf(response, sizeof(response), + "'%s' is not a valid argument", argv[1]); + unixctl_command_reply_error(conn, response); + } + +unlock: + ovs_mutex_unlock(&dpdk_mutex); +} + /* * Set virtqueue flags so that we do not receive interrupts. */ @@ -2262,6 +2331,10 @@ dpdk_common_init(void) "[netdev] up|down", 1, 2, netdev_dpdk_set_admin_state, NULL); + unixctl_command_register("netdev-dpdk/port-ctl", + "attach/detach device", 2, 2, + netdev_dpdk_port_ctl, NULL); + ovs_thread_create("dpdk_watchdog", dpdk_watchdog, NULL); } -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev