From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 42160459BD; Tue, 17 Sep 2024 13:52:27 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 294E9402CB; Tue, 17 Sep 2024 13:52:27 +0200 (CEST) Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) by mails.dpdk.org (Postfix) with ESMTP id 9D51240261 for ; Tue, 17 Sep 2024 13:52:25 +0200 (CEST) Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-42cb9a0c300so47620105e9.0 for ; Tue, 17 Sep 2024 04:52:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1726573945; x=1727178745; darn=dpdk.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=z4czfNhmJqW2cRuDBwXTI/5W8ai/es3eDYWzC0V70kg=; b=XlLHd69swy7YHqog1tX3Mn5bY9Eh88nHiZ1a6CsAN4qUoQKk8QHbHH9VZpB1mgqWwD fuaF6Z9J/EAKoYdUOhIJuqFzpcKQnBMN/haBa/oAMbVWFINOCLweVUuH6ZGqSrkNVcAo l73QyioQ0nwgxnVJJoL8SuHAOOPj7Sbfe3t8b3+VoGG8UO0M8uArjQwElSiZxqnNhIT0 D35yg0eNTgXl8SJiSsoEM+MQizqhMlLPpyXlLLUo8/cn9dHmPHoMTSDstYCcjXwGkOr5 chl4vZHYWwTSZyIAVkq0p/SsyVDmCIdmusWbO+60+DLFRjLA2IXPXnvLM0vT/24WqxmR N4wA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1726573945; x=1727178745; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=z4czfNhmJqW2cRuDBwXTI/5W8ai/es3eDYWzC0V70kg=; b=GAmI42DJOCNwZ6lMrlIzIErOhBw8xtTmUJGnd5RWnQCPcgfJQeoUIqRGLt/gVO0x96 SrCKUPZE/Nfv4vzl59VtOU0Adv5uMKSyZQJ6qwJP0Y34JyyX7DmwgVWE7Wks9HPYgWys sOUs0GmwpyrqM37+2tNPVPAY3sQMTaAoAWC5WjrbhwOW99SvOD2+FlQFBEa7iVIpWfED cKplOu4uYeXA03bCwmDHQOoN39GfpvswjG2DH5uJzoCAHdcUaEgFOsFtIO3ivMyi01Cc raUjJtLWucWWs+iQBXVuaYAbDbf4ORK1dcvvMyox8mQsxfpcd+KwRYtPumPwwUDVwkzS 4k0g== X-Gm-Message-State: AOJu0YxWJXCQqCnWkcXwXU+a7j9eBPiEhUX4Mk/3QwcU7p6H16mA/QH+ bBP5nTo/Q6PbjFfoLsXT+T760kdJZf2BkmdZqD0PcIXwgRhHdL1o5CtZEQ== X-Google-Smtp-Source: AGHT+IGbu16GEysrrf+ubO3yRt+hYHv3DdsNygeA9cFpsLG3xXv+P15tHWtcwwUQb2kA7pkhs1++Tg== X-Received: by 2002:a05:600c:511d:b0:42c:bae0:f05b with SMTP id 5b1f17b1804b1-42e6928e39emr30300265e9.1.1726573944271; Tue, 17 Sep 2024 04:52:24 -0700 (PDT) Received: from localhost.localdomain ([176.13.132.173]) by smtp.googlemail.com with ESMTPSA id 5b1f17b1804b1-42da24274dfsm100944365e9.45.2024.09.17.04.52.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Sep 2024 04:52:23 -0700 (PDT) From: Isaac Boukris To: dev@dpdk.org Cc: stephen@networkplumber.org, mb@smartsharesystems.com, Isaac Boukris Subject: [PATCH] net/tap: add new macpair option for split MAC address Date: Tue, 17 Sep 2024 14:51:47 +0300 Message-ID: <20240917115147.378146-1-iboukris@gmail.com> X-Mailer: git-send-email 2.45.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Normally, the MAC address of the kernel interface is the same as in the interface in dpdk, as they represent the same interface. It is useful to allow viewing them as separate connected interfaces (like ip's veth). This solves a problem I have running a freebsd-based IPv6 stack on top of dpdk and using the tap interface, as both the kernel and freebsd stacks configure the MAC derived IPv6 address on the interface (as can be seen with ifconfig for the kernel), and they both complain about duplicate IPv6 address and the freebsd disables IPv6 as a result. Signed-off-by: Isaac Boukris --- doc/guides/nics/tap.rst | 18 +++++++++++++++++ drivers/net/tap/rte_eth_tap.c | 37 ++++++++++++++++++++++++++++++----- drivers/net/tap/rte_eth_tap.h | 1 + 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/doc/guides/nics/tap.rst b/doc/guides/nics/tap.rst index f01663c700..fd936c6084 100644 --- a/doc/guides/nics/tap.rst +++ b/doc/guides/nics/tap.rst @@ -71,6 +71,24 @@ But this behavior can be overridden by the use of the persist flag, example:: --vdev=net_tap0,iface=tap0,persist ... +Normally, the MAC address of the kernel interface is the same as in the +interface in dpdk, as they represent the same interface. If a MAC address is set +by the dpdk application using ``rte_eth_dev_default_mac_addr_set()`` then the +kernel interface changes accordingly (but not vice versa). + +If the ``macpair`` option is given, then the MAC address of the kernel +interface is initially set to a different random MAC address and it is no +longer altered by dpdk. This allows to view the two interfaces as separate +connected interfaces, similar to linux's veth pair interfaces. For instance, +you can configure an IP address on the kernel interface with the ``ip`` command +in the same subnet as the one used in dpdk and use it as next gateway. + +The ``macpair`` options is incompatible with the ``remote`` option (see above). + +Example:: + + --vdev=net_tap0,iface=tap0,macpair + TUN devices ----------- diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index c5af5751f6..3cdd130092 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -56,6 +56,7 @@ #define ETH_TAP_MAC_ARG "mac" #define ETH_TAP_MAC_FIXED "fixed" #define ETH_TAP_PERSIST_ARG "persist" +#define ETH_TAP_MACPAIR_ARG "macpair" #define ETH_TAP_USR_MAC_FMT "xx:xx:xx:xx:xx:xx" #define ETH_TAP_CMP_MAC_FMT "0123456789ABCDEFabcdef" @@ -95,6 +96,7 @@ static const char *valid_arguments[] = { ETH_TAP_REMOTE_ARG, ETH_TAP_MAC_ARG, ETH_TAP_PERSIST_ARG, + ETH_TAP_MACPAIR_ARG, NULL }; @@ -1391,6 +1393,12 @@ tap_mac_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr) dev->device->name); return -EINVAL; } + + if (pmd->mac_pair) { + rte_ether_addr_copy(&pmd->eth_addr, mac_addr); + return 0; + } + /* Check the actual current MAC address on the tap netdevice */ ret = tap_ioctl(pmd, SIOCGIFHWADDR, &ifr, 0, LOCAL_ONLY); if (ret < 0) @@ -1915,7 +1923,7 @@ static const struct eth_dev_ops ops = { static int eth_dev_tap_create(struct rte_vdev_device *vdev, const char *tap_name, char *remote_iface, struct rte_ether_addr *mac_addr, - enum rte_tuntap_type type, int persist) + enum rte_tuntap_type type, int persist, int mac_pair) { int numa_node = rte_socket_id(); struct rte_eth_dev *dev; @@ -2023,12 +2031,20 @@ eth_dev_tap_create(struct rte_vdev_device *vdev, const char *tap_name, if (pmd->type == ETH_TUNTAP_TYPE_TAP) { memset(&ifr, 0, sizeof(struct ifreq)); ifr.ifr_hwaddr.sa_family = AF_LOCAL; - rte_memcpy(ifr.ifr_hwaddr.sa_data, &pmd->eth_addr, - RTE_ETHER_ADDR_LEN); + + if (mac_pair) { + rte_eth_random_addr((uint8_t *)ifr.ifr_hwaddr.sa_data); + } else { + memcpy(ifr.ifr_hwaddr.sa_data, &pmd->eth_addr, + RTE_ETHER_ADDR_LEN); + } + if (tap_ioctl(pmd, SIOCSIFHWADDR, &ifr, 0, LOCAL_ONLY) < 0) goto error_exit; } + pmd->mac_pair = mac_pair; + /* Make network device persist after application exit */ pmd->persist = persist; @@ -2306,7 +2322,7 @@ rte_pmd_tun_probe(struct rte_vdev_device *dev) TAP_LOG(DEBUG, "Initializing pmd_tun for %s", name); ret = eth_dev_tap_create(dev, tun_name, remote_iface, 0, - ETH_TUNTAP_TYPE_TUN, 0); + ETH_TUNTAP_TYPE_TUN, 0, 0); leave: if (ret == -1) { @@ -2429,6 +2445,7 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev) struct rte_eth_dev *eth_dev; int tap_devices_count_increased = 0; int persist = 0; + int mac_pair = 0; name = rte_vdev_device_name(dev); params = rte_vdev_device_args(dev); @@ -2504,6 +2521,16 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev) goto leave; } + if (rte_kvargs_count(kvlist, ETH_TAP_MACPAIR_ARG) == 1) { + if (strlen(remote_iface)) { + TAP_LOG(ERR, "mac pair not supported " + "with remote interface."); + ret = -1; + goto leave; + } + mac_pair = 1; + } + if (rte_kvargs_count(kvlist, ETH_TAP_MAC_ARG) == 1) { ret = rte_kvargs_process(kvlist, ETH_TAP_MAC_ARG, @@ -2533,7 +2560,7 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev) tap_devices_count++; tap_devices_count_increased = 1; ret = eth_dev_tap_create(dev, tap_name, remote_iface, &user_mac, - ETH_TUNTAP_TYPE_TAP, persist); + ETH_TUNTAP_TYPE_TAP, persist, mac_pair); leave: if (ret == -1) { diff --git a/drivers/net/tap/rte_eth_tap.h b/drivers/net/tap/rte_eth_tap.h index ce4322ad04..5a33698f76 100644 --- a/drivers/net/tap/rte_eth_tap.h +++ b/drivers/net/tap/rte_eth_tap.h @@ -72,6 +72,7 @@ struct pmd_internals { char name[RTE_ETH_NAME_MAX_LEN]; /* Internal Tap device name */ int type; /* Type field - TUN|TAP */ int persist; /* 1 if keep link up, else 0 */ + int mac_pair; /* 1 if mac pair enabled, else 0 */ struct rte_ether_addr eth_addr; /* Mac address of the device port */ struct ifreq remote_initial_flags;/* Remote netdevice flags on init */ int remote_if_index; /* remote netdevice IF_INDEX */ -- 2.45.0