[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [UNIKRAFT PATCH v2 06/15] plat/tap: Add tap to the bridge
The patch implements support to add the tap device to a user provided bridge. Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx> --- plat/drivers/tap/tap.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ plat/linuxu/tap_io.c | 2 ++ 2 files changed, 62 insertions(+) diff --git a/plat/drivers/tap/tap.c b/plat/drivers/tap/tap.c index d60ca46..d5e1c42 100644 --- a/plat/drivers/tap/tap.c +++ b/plat/drivers/tap/tap.c @@ -175,11 +175,64 @@ static int tap_netdev_txq_info_get(struct uk_netdev *dev, __u16 queue_id, struct uk_netdev_queue_info *qinfo); static int tap_device_create(struct tap_net_dev *tdev, __u32 feature_flags); static int tap_mac_generate(__u8 *addr, int len, __u8 dev_id); +static int tap_dev_br_add(struct tap_net_dev *tdev); +static int tap_dev_index_get(struct tap_net_dev *tdev); /** * Local function definitions */ +static int tap_dev_index_get(struct tap_net_dev *tdev) +{ + int rc = 0; + struct uk_ifreq ifrq = {0}; + + snprintf(ifrq.ifr_name, sizeof(ifrq.ifr_name), "%s", + tdev->name); + + rc = tap_netif_configure(tdev->ctrl_sock, UK_SIOCGIFINDEX, &ifrq); + if (rc < 0) { + uk_pr_err(DRIVER_NAME": Failed to fetch the index\n"); + goto exit; + } + + rc = ifrq.ifr_ifindex; +exit: + return rc; + +} + +static int tap_dev_br_add(struct tap_net_dev *tdev) +{ + int rc = -EINVAL; + struct uk_ifreq ifrq = {0}; + + if (!tap_drv.bridge_ifs[tdev->tid]) + goto exit; + + /** + * Get the bridge name. + */ + snprintf(ifrq.ifr_name, sizeof(ifrq.ifr_name), "%s", + tap_drv.bridge_ifs[tdev->tid]); + + rc = tap_dev_index_get(tdev); + if (rc < 0) + return rc; + + ifrq.ifr_ifindex = rc; + rc = tap_netif_configure(tdev->ctrl_sock, UK_SIOCBRADDIF, &ifrq); + if (rc < 0) { + uk_pr_err(DRIVER_NAME": Failed to add the interface %s to bridge %s\n", + tdev->name, tap_drv.bridge_ifs[tdev->tid]); + goto exit; + } + rc = 0; + +exit: + return rc; +} + static int tap_netdev_recv(struct uk_netdev *dev, struct uk_netdev_rx_queue *queue, struct uk_netbuf **pkt) @@ -413,6 +466,13 @@ static int tap_netdev_configure(struct uk_netdev *n, goto close_ctrl_sock; } + rc = tap_dev_br_add(tdev); + if (rc < 0) { + uk_pr_err(DRIVER_NAME": Failed(%d) to add the bridge interface\n", + rc); + goto close_ctrl_sock; + } + /* Initialize the tx/rx queues */ UK_TAILQ_INIT(&tdev->rxqs); tdev->rxq_cnt = 0; diff --git a/plat/linuxu/tap_io.c b/plat/linuxu/tap_io.c index 888ef83..de8b3db 100644 --- a/plat/linuxu/tap_io.c +++ b/plat/linuxu/tap_io.c @@ -67,8 +67,10 @@ int tap_netif_configure(int fd, __u32 request, void *arg) struct uk_ifreq *usr_ifr = (struct uk_ifreq *) arg; switch (request) { + case UK_SIOCGIFINDEX: case UK_SIOCGIFHWADDR: case UK_SIOCSIFHWADDR: + case UK_SIOCBRADDIF: break; default: rc = -EINVAL; -- 2.7.4
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |