From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mogw0239.ocn.ad.jp (mogw0239.ocn.ad.jp [114.147.58.45]) by dpdk.org (Postfix) with ESMTP id 0715D1B7EF for ; Thu, 8 Feb 2018 16:18:00 +0100 (CET) Received: from mf-smf-ucb032c1 (mf-smf-ucb032c1.ocn.ad.jp [153.153.66.203]) by mogw0239.ocn.ad.jp (Postfix) with ESMTP id 9308E202CB; Fri, 9 Feb 2018 00:17:58 +0900 (JST) Received: from ntt.pod01.mv-mta-ucb027 ([153.149.142.101]) by mf-smf-ucb032c1 with ESMTP id jnxWe7FMlSqZKjnxWeQY6j; Fri, 09 Feb 2018 00:17:58 +0900 Received: from smtp.ocn.ne.jp ([153.149.227.135]) by ntt.pod01.mv-mta-ucb027 with id 8FHy1x0072vuoep01FHyLG; Thu, 08 Feb 2018 15:17:58 +0000 Received: from localhost.localdomain (p6533091-ipngn12202marunouchi.tokyo.ocn.ne.jp [118.22.120.91]) by smtp.ocn.ne.jp (Postfix) with ESMTPA; Fri, 9 Feb 2018 00:17:58 +0900 (JST) From: ogawa.yasufumi@lab.ntt.co.jp To: ferruh.yigit@intel.com, spp@dpdk.org Cc: "ogawa.yasufumi@lab.ntt.co.jp" Date: Fri, 9 Feb 2018 00:17:52 +0900 Message-Id: <1518103072-4559-3-git-send-email-ogawa.yasufumi@lab.ntt.co.jp> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1518103072-4559-1-git-send-email-ogawa.yasufumi@lab.ntt.co.jp> References: <1518103072-4559-1-git-send-email-ogawa.yasufumi@lab.ntt.co.jp> Subject: [spp] [PATCH 3/3] spp_vm: enable to patch ports with resource ID X-BeenThere: spp@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Soft Patch Panel List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 08 Feb 2018 15:18:00 -0000 From: "ogawa.yasufumi@lab.ntt.co.jp" From: Yasufumi Ogawa This patch is same as commit e338799 for spp_nfv. It enables users to patch ports with a combination of port type and number to identify resources as following. spp> sec 1;patch phy:0 ring:0 Signed-off-by: Yasufumi Ogawa --- src/vm/main.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/src/vm/main.c b/src/vm/main.c index c9f1571..52f381f 100644 --- a/src/vm/main.c +++ b/src/vm/main.c @@ -49,6 +49,47 @@ static struct port_map port_map[RTE_MAX_ETHPORTS]; static struct port ports_fwd_array[RTE_MAX_ETHPORTS]; +/* It is used to convert port name from string type to enum */ +struct porttype_map { + const char *port_name; + enum port_type port_type; +}; + +struct porttype_map portmap[] = { + { .port_name = "phy", .port_type = PHY, }, + { .port_name = "ring", .port_type = RING, }, + { .port_name = "vhost", .port_type = VHOST, }, + { .port_name = NULL, .port_type = UNDEF, }, +}; + +/* Return a type of port as a enum member of porttype_map structure. */ +static enum port_type get_port_type(char *portname) +{ + for (int i = 0; portmap[i].port_name != NULL; i++) { + const char *port_name = portmap[i].port_name; + if (strncmp(portname, port_name, strlen(port_name)) == 0) + return portmap[i].port_type; + } + return UNDEF; +} + +/* + * Split a token into words with given separator and return the number of + * splitted words. + */ +static int spp_split(char *splitted_words[], char *token, const char *sep) +{ + int cnt = 0; + splitted_words[cnt] = strtok(token, sep); + while (splitted_words[cnt] != NULL) { + RTE_LOG(DEBUG, APP, "token %d = %s\n", + cnt, splitted_words[cnt]); + cnt++; + splitted_words[cnt] = strtok(NULL, sep); + } + return cnt; +} + static void forward(void) { @@ -406,7 +447,8 @@ parse_command(char *str) i = sprintf(str, "Client ID %d Running\n", client_id); else i = sprintf(str, "Client ID %d Idling\n", client_id); - print_active_ports(str + i, client_id, ports_fwd_array, port_map); + print_active_ports( + str+i, client_id, ports_fwd_array, port_map); } else if (!strcmp(token_list[0], "_get_client_id")) { memset(str, '\0', MSG_SIZE); @@ -452,10 +494,43 @@ parse_command(char *str) if (max_token <= 2) return 0; - if (spp_atoi(token_list[1], &in_port) < 0) - return 0; - - if (spp_atoi(token_list[2], &out_port) < 0) + if (spp_atoi(token_list[1], &in_port) < 0) { + char *param_list[MAX_PARAMETER] = { 0 }; + int param_count = spp_split( + param_list, token_list[1], ":"); + if (param_count == 2) { + int in_port_id; + if (spp_atoi( + param_list[1], &in_port_id) < 0) + return 0; + in_port = find_port_id( + in_port_id, + get_port_type(param_list[0])); + } else { + return 0; + } + } + + if (spp_atoi(token_list[2], &out_port) < 0) { + char *param_list[MAX_PARAMETER] = { 0 }; + int param_count = spp_split( + param_list, + token_list[2], ":"); + if (param_count == 2) { + int out_port_id; + if (spp_atoi( + param_list[1], + &out_port_id) < 0) + return 0; + out_port = find_port_id( + out_port_id, + get_port_type(param_list[0])); + } else { + return 0; + } + } + + if (in_port < 0 || out_port < 0) return 0; add_patch(in_port, out_port); -- 2.7.4