X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=common%2FVIL%2Fpipeline_common%2Fpipeline_common_fe.c;h=6fc6109c53a6744b346a70b312ce97ac4507df27;hb=HEAD;hp=7d362a5526ea086220ff97501dfa66aacc290d5a;hpb=75d272f80206aa886776a0a30e5547f470ce0d62;p=samplevnf.git diff --git a/common/VIL/pipeline_common/pipeline_common_fe.c b/common/VIL/pipeline_common/pipeline_common_fe.c index 7d362a55..6fc6109c 100644 --- a/common/VIL/pipeline_common/pipeline_common_fe.c +++ b/common/VIL/pipeline_common/pipeline_common_fe.c @@ -33,6 +33,9 @@ #include "pipeline_common_fe.h" #include "interface.h" #include "lib_arp.h" +#include "gateway.h" + +void app_run_file(cmdline_parse_ctx_t *ctx, const char *file_name); int app_pipeline_ping(struct app_params *app, @@ -541,52 +544,75 @@ app_link_down(struct app_params *app, */ struct cmd_routeadd_config_result { cmdline_fixed_string_t routeadd_string; + cmdline_fixed_string_t type_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) +int app_routeadd_config_ipv4(__attribute__((unused)) 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); + uint32_t i = 0; + if (port_id >= gw_get_num_ports()) { + printf("Max ports allowed is %d\n", gw_get_num_ports()); return 1; } - printf("port id:%d ip: %x mask:%x", port_id, ip, mask); + printf("port id:%d ip: %x mask:%x\n", port_id, ip, mask); + + struct route_table_entry *lentry = NULL; + + /* Check for matching entry */ + for(i = 0 ; i< p_route_data[port_id]->route_ent_cnt; i++) { + + lentry = &p_route_data[port_id]->route_table[i]; + + /* Entry already exists? */ + if(mask == 0) { + if(lentry->nh == ip) + return 1; + } else { + if( lentry->nh_mask == (ip & mask)) + return 1; + } + } + if(i < MAX_ROUTE_ENTRY_SIZE) { + + lentry = &p_route_data[port_id]->route_table[i]; - 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; + p_route_data[port_id]->route_ent_cnt++; lentry->mask = mask; lentry->port = port_id; lentry->nh = ip; - lentry->nh_mask = ip & mask; + lentry->nh_mask = (ip & mask); + /* Set the VNF Gateway flag */ + vnf_gateway = 1; + return 0; + } else { + + printf("Error: Number of entries more than supported\n"); + return 1; + } - 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 app_routeadd_config_ipv6(__attribute__((unused)) 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); + if (port_id >= gw_get_num_ports()) { + printf("Max ports allowed is %d\n", gw_get_num_ports()); return 1; } @@ -594,25 +620,72 @@ uint8_t ipv6[], uint32_t depth) 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("ipv6 address: "); + for(i = 0; i < IPV6_ADD_SIZE; i++) + printf("%02x ", ipv6[i]); printf("\n"); + struct nd_route_table_entry *lentry = NULL; + int k; + uint8_t netmask_ipv6[16], netip_nd[16], netip_in[16]; + uint8_t depthflags = 0, depthflags1 = 0; - lib_nd_route_table[port_id].depth = depth; - lib_nd_route_table[port_id].port = port_id; + i = 0; - printf("num ports :%d\n", nd_route_tbl_index); + /* Check for matching entry */ + for(i = 0 ; i< p_nd_route_data[port_id]->nd_route_ent_cnt; i++) { - return 0; + lentry = &p_nd_route_data[port_id]->nd_route_table[i]; + + memset(netmask_ipv6, 0, sizeof(netmask_ipv6)); + memset(netip_nd, 0, sizeof(netip_nd)); + memset(netip_in, 0, sizeof(netip_in)); + + /* Create netmask from depth */ + convert_prefixlen_to_netmask_ipv6(lentry->depth, netmask_ipv6); + + for (k = 0; k < 16; k++) { + if (lentry->nhipv6[k] & netmask_ipv6[k]) { + depthflags++; + netip_nd[k] = lentry->nhipv6[k]; + } + + if (ipv6[k] & netmask_ipv6[k]) { + depthflags1++; + netip_in[k] = ipv6[k]; + } + } + + if ((depthflags == depthflags1) + && (memcmp(netip_nd, netip_in, sizeof(netip_nd)) == 0)) { + /* Route already exists */ + printf("Route already exists \n"); + return 1; + } + } + + if(i < MAX_ND_ROUTE_ENTRY_SIZE) { + + lentry = &p_nd_route_data[port_id]->nd_route_table[i]; + + rte_mov16(lentry->nhipv6, ipv6); + + lentry->depth = depth; + lentry->port = port_id; + p_nd_route_data[port_id]->nd_route_ent_cnt++; + /* Set the VNF Gateway flag */ + vnf_gateway = 1; + + return 0; + } else { + + printf("Error: Number of entries more than supported\n"); + return 1; + } } /* - * cmd handler for handling route add entry at runtime. + * cmd handler for handling route abj entry at runtime. * the same handle takes care of both ipv4 & ipv6 */ static void @@ -626,18 +699,33 @@ cmd_routeadd_parsed( int status; uint32_t port_id = params->port_id; - uint32_t i, ip, depth, mask; + uint32_t i, ip = 0, depth = 0, mask = 0; uint8_t ipv6[16]; + + printf("Adding route for %s \n", params->type_string); + 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 { + + if(strcmp(params->type_string, "net") == 0) + { + mask = strtoul(params->depth, NULL, 16); + } else { + mask = 0xffffffff; + } + + printf("nhip:0x%08x 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]); + if(strcmp(params->type_string, "net") == 0) + { + depth = atoi(params->depth); + } else { + depth = 64; + } + + for (i=0; i < 16; i++) + printf("%02x ", ipv6[i]); printf("\n port_id:%d depth:%d \n", port_id, depth); } @@ -657,6 +745,14 @@ cmdline_parse_token_string_t cmd_routeadd_config_string = TOKEN_STRING_INITIALIZER(struct cmd_routeadd_config_result, routeadd_string, "routeadd"); +cmdline_parse_token_string_t cmd_routeadd_net_string = + TOKEN_STRING_INITIALIZER(struct cmd_routeadd_config_result, type_string, + "net"); + +cmdline_parse_token_string_t cmd_routeadd_host_string = + TOKEN_STRING_INITIALIZER(struct cmd_routeadd_config_result, type_string, + "host"); + cmdline_parse_token_num_t cmd_routeadd_config_port_id = TOKEN_NUM_INITIALIZER(struct cmd_routeadd_config_result, port_id, UINT32); @@ -666,15 +762,29 @@ cmdline_parse_token_ipaddr_t cmd_routeadd_config_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 = { +cmdline_parse_inst_t cmd_routeadd_net = { .f = cmd_routeadd_parsed, .data = NULL, - .help_str = "Add Route entry", + .help_str = "Add Route entry for gateway", .tokens = { (void *) &cmd_routeadd_config_string, + (void *) &cmd_routeadd_net_string, (void *) &cmd_routeadd_config_port_id, - (void *) &cmd_routeadd_config_ip, - (void *) &cmd_routeadd_config_depth_string, + (void *) &cmd_routeadd_config_ip, + (void *) &cmd_routeadd_config_depth_string, + NULL, + }, +}; + +cmdline_parse_inst_t cmd_routeadd_host = { + .f = cmd_routeadd_parsed, + .data = NULL, + .help_str = "Add Route entry for host", + .tokens = { + (void *) &cmd_routeadd_config_string, + (void *) &cmd_routeadd_host_string, + (void *) &cmd_routeadd_config_port_id, + (void *) &cmd_routeadd_config_ip, NULL, }, }; @@ -1469,7 +1579,7 @@ static cmdline_parse_inst_t cmd_quit = { * run */ -static void +void app_run_file( cmdline_parse_ctx_t *ctx, const char *file_name) @@ -1525,7 +1635,8 @@ 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_routeadd_net, + (cmdline_parse_inst_t *) &cmd_routeadd_host, (cmdline_parse_inst_t *) &cmd_link_config, (cmdline_parse_inst_t *) &cmd_link_up,