From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 3B1231B239 for ; Thu, 21 Dec 2017 11:19:55 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Dec 2017 02:19:55 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.45,435,1508828400"; d="scan'208";a="4291235" Received: from unknown (HELO localhost.localdomain) ([10.224.122.203]) by fmsmga008.fm.intel.com with ESMTP; 21 Dec 2017 02:19:53 -0800 From: Vipin Varghese To: dev@dpdk.org Cc: ferruh.yigit@intel.com, deepak.k.jain@intel.com, amol.patel@intel.com, Vipin Varghese Date: Thu, 21 Dec 2017 21:31:00 +0530 Message-Id: <1513872060-4758-1-git-send-email-vipin.varghese@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1512071396-10653-1-git-send-email-vipin.varghese@intel.com> References: <1512071396-10653-1-git-send-email-vipin.varghese@intel.com> Subject: [dpdk-dev] [PATCH v2] net/tap: allow user mac to be passed as args X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Dec 2017 10:19:56 -0000 Added fixes for user TAP user MAC 1) user format to RTE_PMD_REGISTER_PARAM_STRING 2) TAP to the RTE_LOG in absence of dynamic RTE_LOG 3) Boundary case for MAC string added --------------------------------------------------------------- Other Details: 1) not to extract "string to mac" conversion to its own function 2) set_mac_type does not take any pmd or device name 3) Segault for boundary cases 'mac="01:01:01:01:01:01', not found 4) Added user MAC format string Signed-off-by: Vipin Varghese --- drivers/net/tap/rte_eth_tap.c | 80 ++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index 0c53458..85c12af 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -81,6 +81,11 @@ #define FLOWER_KERNEL_VERSION KERNEL_VERSION(4, 2, 0) #define FLOWER_VLAN_KERNEL_VERSION KERNEL_VERSION(4, 9, 0) +#define MAC_STRING_NULL (0) +#define MAC_STRING_FIXED (1) +#define MAC_STRING_USER (2) +#define ETH_TAP_USER_MAC_FMT ("xx:xx:xx:xx:xx:xx") + static unsigned char user_mac[ETHER_ADDR_LEN]; static struct rte_vdev_driver pmd_tap_drv; @@ -1293,17 +1298,18 @@ enum ioctl_mode { pmd->txq[i].fd = -1; } - if (fixed_mac_type == 1) { + if (fixed_mac_type == MAC_STRING_FIXED) { /* fixed mac = 00:64:74:61:70: */ static int iface_idx; char mac[ETHER_ADDR_LEN] = "\0dtap"; mac[ETHER_ADDR_LEN - 1] = iface_idx++; rte_memcpy(&pmd->eth_addr, mac, ETHER_ADDR_LEN); - } else if (fixed_mac_type == 2) { - /* user mac is recieved */ + } else if (fixed_mac_type == MAC_STRING_USER) { + /* user mac is received */ RTE_LOG(INFO, PMD, - "Using user MAC (%02x:%02x:%02x:%02x:%02x:%02x)\n", + "%s; Using user MAC (%02x:%02x:%02x:%02x:%02x:%02x) argument\n", + pmd->name, user_mac[0], user_mac[1], user_mac[2], user_mac[3], user_mac[4], user_mac[5]); rte_memcpy(&pmd->eth_addr, user_mac, ETHER_ADDR_LEN); @@ -1476,53 +1482,49 @@ enum ioctl_mode { } static int -set_mac_type(const char *key __rte_unused, - const char *value, - void *extra_args) +set_mac_type(const char *key __rte_unused, const char *value, void *extra_args) { - char macTemp[20], *macByte = NULL; + char mac_temp[20] = {0}, *mac_byte = NULL; unsigned int index = 0; if (value) { + RTE_LOG(DEBUG, PMD, "TAP user MAC (%s) to set.\n", value); + if (!strncasecmp(ETH_TAP_MAC_FIXED, value, strlen(ETH_TAP_MAC_FIXED))) { - *(int *)extra_args = 1; + *(int *)extra_args = MAC_STRING_FIXED; } else { - RTE_LOG(INFO, PMD, "User shared MAC param (%s)\n", - value); - /* desired format aa:bb:cc:dd:ee:ff:11 */ if (strlen(value) == 17) { - strncpy(macTemp, value, 18); - - macByte = strtok(macTemp, ":"); - while ((macByte != NULL) && - (strspn(macByte, "0123456789ABCDEFabcdef")) && - (strspn((macByte + 1), "0123456789ABCDEFabcdef")) && - (strlen(macByte) == 2)) { - user_mac[index] = strtoul(macByte, NULL, 16); - macByte = strtok(NULL, ":"); + strncpy(mac_temp, value, 18); + mac_temp[19] = "\0"; + mac_byte = strtok(mac_temp, ":"); + + while ((mac_byte != NULL) && + (strspn(mac_byte, "0123456789ABCDEFabcdef")) && + (strspn((mac_byte + 1), "0123456789ABCDEFabcdef")) && + (strlen(mac_byte) == 2)) { + user_mac[index] = strtoul(mac_byte, NULL, 16); + mac_byte = strtok(NULL, ":"); index += 1; } - if (index != 6) { - RTE_LOG(ERR, PMD, " failure in MAC value (%s) at %u\n", - macByte, index + 1); - return -1; - } + if (index != 6) + goto error; - RTE_LOG(DEBUG, PMD, " User MAC (%s) considered\n", - value); - *(int *)extra_args = 2; - } else { - RTE_LOG(ERR, PMD, " Mismatch on format for (%s)\n", - value); - return -1; - } + *(int *)extra_args = MAC_STRING_USER; + } else + goto error; } + RTE_LOG(DEBUG, PMD, "TAP user MAC (%s) considered\n", value); } return 0; + +error: + RTE_LOG(ERR, PMD, "TAP user MAC (%s) is not in format (%s)\n", + value, ETH_TAP_USER_MAC_FMT); + return -1; } /* Open a TAP interface device. @@ -1536,7 +1538,7 @@ enum ioctl_mode { int speed; char tap_name[RTE_ETH_NAME_MAX_LEN]; char remote_iface[RTE_ETH_NAME_MAX_LEN]; - int fixed_mac_type = 0; + int fixed_mac_type = MAC_STRING_NULL; name = rte_vdev_device_name(dev); params = rte_vdev_device_args(dev); @@ -1656,7 +1658,7 @@ enum ioctl_mode { RTE_PMD_REGISTER_VDEV(net_tap, pmd_tap_drv); RTE_PMD_REGISTER_ALIAS(net_tap, eth_tap); RTE_PMD_REGISTER_PARAM_STRING(net_tap, - ETH_TAP_IFACE_ARG "= " - ETH_TAP_SPEED_ARG "= " - ETH_TAP_MAC_ARG "=" ETH_TAP_MAC_FIXED " " - ETH_TAP_REMOTE_ARG "="); + ETH_TAP_IFACE_ARG "= " + ETH_TAP_SPEED_ARG "= " + ETH_TAP_MAC_ARG "=" ETH_TAP_MAC_FIXED "|" ETH_TAP_USER_MAC_FMT " " + ETH_TAP_REMOTE_ARG "="); -- 1.9.1