From bd018cf07e7d047d50dce2dbcc77922ae0c1ab69 Mon Sep 17 00:00:00 2001 From: Vishwesh M Rudramuni Date: Fri, 21 Jul 2017 04:02:10 +0530 Subject: [common] Adding route entry command to cmdline JIRA: SAMPLEVNF-65 This patch adds routeadd command to cmdline for ipv4 & ipv6 Change-Id: I452b414c1e42b4de74eaea06339db83a0f20e7d8 Signed-off-by: Vishwesh M Rudramuni --- common/VIL/pipeline_common/pipeline_common_fe.c | 145 ++++++++++++++++++++++++ 1 file changed, 145 insertions(+) (limited to 'common') diff --git a/common/VIL/pipeline_common/pipeline_common_fe.c b/common/VIL/pipeline_common/pipeline_common_fe.c index d1fdb37d..7d362a55 100644 --- a/common/VIL/pipeline_common/pipeline_common_fe.c +++ b/common/VIL/pipeline_common/pipeline_common_fe.c @@ -32,6 +32,7 @@ #include "pipeline_common_fe.h" #include "interface.h" +#include "lib_arp.h" int app_pipeline_ping(struct app_params *app, @@ -535,6 +536,149 @@ app_link_down(struct app_params *app, return 0; } +/* + * Route add + */ +struct cmd_routeadd_config_result { + cmdline_fixed_string_t routeadd_string; + uint32_t port_id; + cmdline_ipaddr_t ip; + cmdline_fixed_string_t depth; +}; + +extern struct lib_nd_route_table_entry lib_nd_route_table[MAX_ND_RT_ENTRY]; +extern struct arp_data *p_arp_data; +extern uint32_t nd_route_tbl_index; + +/* + * This implements route add entries for ipv4 + */ +int app_routeadd_config_ipv4(struct app_params *app, uint32_t port_id, +uint32_t ip, uint32_t mask) +{ + if (port_id > MAX_PORTS) { + printf("Max ports allowed is %d\n", MAX_PORTS); + return 1; + } + + printf("port id:%d ip: %x mask:%x", port_id, ip, mask); + + struct lib_arp_route_table_entry *lentry = + &p_arp_data->lib_arp_route_table + [port_id]; + if (!lentry->ip) + p_arp_data->lib_arp_route_ent_cnt++; + lentry->ip = ip; + lentry->mask = mask; + lentry->port = port_id; + lentry->nh = ip; + lentry->nh_mask = ip & mask; + + return 0; +} + +/* + * This implements route add entries for ipv6 + */ +int app_routeadd_config_ipv6(struct app_params *app, uint32_t port_id, +uint8_t ipv6[], uint32_t depth) +{ + int i; + + if (port_id > MAX_ND_RT_ENTRY) { + printf("Max ports allowed is %d\n", MAX_ND_RT_ENTRY); + return 1; + } + + if (port_id >= nd_route_tbl_index) + nd_route_tbl_index++; + + printf("port id:%d depth:%d\n", port_id, depth); + printf("ipv6 address "); + for (i = 0; i < 16; i++) { + lib_nd_route_table[port_id].ipv6[i] = ipv6[i]; + lib_nd_route_table[port_id].nhipv6[i] = ipv6[i]; + printf("%x ", ipv6[i]); + } + printf("\n"); + + + lib_nd_route_table[port_id].depth = depth; + lib_nd_route_table[port_id].port = port_id; + + printf("num ports :%d\n", nd_route_tbl_index); + + return 0; +} + +/* + * cmd handler for handling route add entry at runtime. + * the same handle takes care of both ipv4 & ipv6 + */ +static void +cmd_routeadd_parsed( + void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + void *data) +{ + struct cmd_routeadd_config_result *params = parsed_result; + struct app_params *app = data; + int status; + + uint32_t port_id = params->port_id; + uint32_t i, ip, depth, mask; + uint8_t ipv6[16]; + if (params->ip.family == AF_INET) { + ip = rte_bswap32((uint32_t) params->ip.addr.ipv4.s_addr); + mask = strtoul(params->depth, NULL, 16); + printf("ip:%x mask:%x port_id:%d\n", ip, mask, port_id); + } + else { + memcpy(ipv6, params->ip.addr.ipv6.s6_addr, 16); + depth = atoi(params->depth); + for (i=0;i<16;i++) + printf("%d ", ipv6[i]); + printf("\n port_id:%d depth:%d \n", port_id, depth); + } + + + if (params->ip.family == AF_INET) + status = app_routeadd_config_ipv4(app, port_id, ip, mask); + else + status = app_routeadd_config_ipv6(app, port_id, ipv6, depth); + + if (status) + printf("Command failed\n"); + else + printf("Command Success\n"); +} + +cmdline_parse_token_string_t cmd_routeadd_config_string = + TOKEN_STRING_INITIALIZER(struct cmd_routeadd_config_result, routeadd_string, + "routeadd"); + +cmdline_parse_token_num_t cmd_routeadd_config_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_routeadd_config_result, port_id, UINT32); + +cmdline_parse_token_ipaddr_t cmd_routeadd_config_ip = + TOKEN_IPADDR_INITIALIZER(struct cmd_routeadd_config_result, ip); + +cmdline_parse_token_string_t cmd_routeadd_config_depth_string = + TOKEN_STRING_INITIALIZER(struct cmd_routeadd_config_result, depth, NULL); + +cmdline_parse_inst_t cmd_routeadd = { + .f = cmd_routeadd_parsed, + .data = NULL, + .help_str = "Add Route entry", + .tokens = { + (void *) &cmd_routeadd_config_string, + (void *) &cmd_routeadd_config_port_id, + (void *) &cmd_routeadd_config_ip, + (void *) &cmd_routeadd_config_depth_string, + NULL, + }, +}; + /* * ping */ @@ -1381,6 +1525,7 @@ cmdline_parse_inst_t cmd_run = { static cmdline_parse_ctx_t pipeline_common_cmds[] = { (cmdline_parse_inst_t *) &cmd_quit, (cmdline_parse_inst_t *) &cmd_run, + (cmdline_parse_inst_t *) &cmd_routeadd, (cmdline_parse_inst_t *) &cmd_link_config, (cmdline_parse_inst_t *) &cmd_link_up, -- cgit 1.2.3-korg