diff options
Diffstat (limited to 'VNFs/vCGNAPT/pipeline')
-rw-r--r-- | VNFs/vCGNAPT/pipeline/pipeline_cgnapt.c | 226 | ||||
-rw-r--r-- | VNFs/vCGNAPT/pipeline/pipeline_cgnapt.h | 8 | ||||
-rw-r--r-- | VNFs/vCGNAPT/pipeline/pipeline_cgnapt_be.c | 486 | ||||
-rw-r--r-- | VNFs/vCGNAPT/pipeline/pipeline_cgnapt_be.h | 8 | ||||
-rw-r--r-- | VNFs/vCGNAPT/pipeline/pipeline_cgnapt_common.h | 4 |
5 files changed, 449 insertions, 283 deletions
diff --git a/VNFs/vCGNAPT/pipeline/pipeline_cgnapt.c b/VNFs/vCGNAPT/pipeline/pipeline_cgnapt.c index fb0b95d1..0c6bf48d 100644 --- a/VNFs/vCGNAPT/pipeline/pipeline_cgnapt.c +++ b/VNFs/vCGNAPT/pipeline/pipeline_cgnapt.c @@ -29,6 +29,12 @@ #include <cmdline_parse_string.h> #include <cmdline_parse_ipaddr.h> #include <cmdline_parse_etheraddr.h> +#include <cmdline_rdline.h> +#include <cmdline_socket.h> +#include <cmdline.h> + +#include <fcntl.h> +#include <unistd.h> #include "app.h" #include "pipeline_common_fe.h" @@ -40,6 +46,8 @@ #include "cgnapt_pcp_fe.h" #endif +#define MAX_BUF_SIZE 2048 + /** * A structure defining the CG-NAPT entry that is stored on * front end. @@ -66,6 +74,12 @@ struct pipeline_cgnapt_t { }; +int nat_load_handler(struct mg_connection *conn, __rte_unused void *cbdata); +int nat_handler(struct mg_connection *conn, __rte_unused void *cbdata); +uint32_t rules_loaded = 0; +extern struct cmdline *pipe_cl; +struct app_params *myapp; + /** * Init function for CG-NAPT FE. * @@ -1405,7 +1419,8 @@ cmd_cgnapt_stats_parsed( __rte_unused struct cmdline *cl, __rte_unused void *data) { - all_cgnapt_stats(); + char buf[2048]; + all_cgnapt_stats(&buf[0]); } static cmdline_parse_token_string_t cmd_cgnapt_stats_p_string = @@ -1457,7 +1472,8 @@ cmd_cgnapt_clear_stats_parsed( __rte_unused struct cmdline *cl, __rte_unused void *data) { - all_cgnapt_clear_stats(); + char buf[2048]; + all_cgnapt_clear_stats(&buf[0]); } static cmdline_parse_token_string_t cmd_cgnapt_clear_stats_p_string = @@ -1475,6 +1491,212 @@ static cmdline_parse_token_string_t cmd_cgnapt_clear_stats_stats_string = TOKEN_STRING_INITIALIZER(struct cmd_cgnapt_clear_stats_result, stats_string, "stats"); +int cgnapt_stats_handler(struct mg_connection *conn, void *cbdata) +{ + uint32_t num_links = 0, len = 0; + char buf[1024]; + const struct mg_request_info *ri = mg_get_request_info(conn); + struct app_params *app = myapp; + int i; + + if (!strcmp(ri->request_method, "GET")) { + all_cgnapt_stats(&buf[0]); + mg_printf(conn, "%s\n", &buf[0]); + return 1; + } + + if (strcmp(ri->request_method, "POST")) { + mg_printf(conn, + "HTTP/1.1 405 Method Not Allowed\r\nConnection: close\r\n"); + mg_printf(conn, "Content-Type: text/plain\r\n\r\n"); + mg_printf(conn, + "%s method not allowed in the GET handler\n", + ri->request_method); + } + + all_cgnapt_clear_stats(&buf[0]); + mg_printf(conn, "%s\n", &buf[0]); + return 1; + +} + +int cgnapt_cmd_ver_handler(struct mg_connection *conn, void *cbdata) +{ + const struct mg_request_info *req_info = mg_get_request_info(conn); + + mg_printf(conn, + "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: " + "close\r\n\r\n"); + mg_printf(conn, "<html><body>"); + mg_printf(conn, "<p>Command Passed</p>"); + mg_printf(conn, "</body></html>\n"); + + return 1; +} + +/* + * loadrules + */ + +/** + * Open file and process all commands in the file. + * + * @param ctx + * A pointer to the CLI context + * @param file_name + * A pointer to the file to process. + * + */ +static void cgnapt_loadrules_file(cmdline_parse_ctx_t *ctx, const char *file_name) +{ + struct cmdline *file_cl; + int fd; + + fd = open(file_name, O_RDONLY); + if (fd < 0) { + printf("Cannot open file \"%s\"\n", file_name); + return; + } + + file_cl = cmdline_new(ctx, "", fd, 1); + cmdline_interact(file_cl); + close(fd); +} + + +int nat_handler(struct mg_connection *conn, __rte_unused void *cbdata) +{ + + const struct mg_request_info *req_info = mg_get_request_info(conn); + if (strcmp(req_info->request_method, "GET")) { + mg_printf(conn, "Only GET method allowed"); + return 1; + } + + mg_printf(conn, + "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: " + "close\r\n\r\n"); + mg_printf(conn, "<html><body>"); + mg_printf(conn, "<h2> These are the methods that are supported </h2>"); + mg_printf(conn, "<h3> /load </h3>"); + mg_printf(conn, "<html><body>"); + + mg_printf(conn, "</body></html>\n"); + + return 1; +} + +static int nat_field_found(const char *key, + const char *filename, + char *path, + size_t pathlen, + void *user_data) +{ + struct mg_connection *conn = (struct mg_connection *)user_data; + + mg_printf(conn, "\r\n\r\n%s:\r\n", key); + mg_printf(conn, "Inside vfw_field_found %s \n", filename); + + if (filename && *filename) { + snprintf(path, pathlen, "/tmp/%s", filename); + struct app_params *app = myapp; + int status; + int fd; + + mg_printf(conn, "path: %s\n", path); + + /* Make sure the file exists before clearing rules and actions */ + fd = open(path, O_RDONLY); + if (fd < 0) { + mg_printf(conn, "Cannot open file \"%s\"\n", filename); + return FORM_FIELD_STORAGE_GET; + } + + close(fd); + return FORM_FIELD_STORAGE_STORE; + } + + return FORM_FIELD_STORAGE_GET; +} + +static int nat_field_get(const char *key, const char *value, size_t valuelen, + void *user_data) +{ + struct mg_connection *conn = (struct mg_connection *)user_data; + + if (key[0]) { + mg_printf(conn, "%s = ", key); + } + mg_write(conn, value, valuelen); + + return 0; +} + +static int nat_field_stored(const char *path, long long file_size, + void *user_data) +{ + struct mg_connection *conn = (struct mg_connection *)user_data; + int status; + + mg_printf(conn, + "stored as %s (%lu bytes)\r\n\r\n", + path, + (unsigned long)file_size); + + /* Process commands in script file */ + cgnapt_loadrules_file(pipe_cl->ctx, path); + rules_loaded = 1; + + return 0; +} + +int nat_load_handler(struct mg_connection *conn, __rte_unused void *cbdata) +{ + /* Handler may access the request info using mg_get_request_info */ + int ret; + const struct mg_request_info *req_info = mg_get_request_info(conn); + struct mg_form_data_handler fdh = {nat_field_found, nat_field_get, + nat_field_stored, 0}; + + /* It would be possible to check the request info here before calling + * mg_handle_form_request. */ + (void)req_info; + + mg_printf(conn, + "HTTP/1.1 200 OK\r\nContent-Type: " + "text/plain\r\nConnection: close\r\n\r\n"); + + if (!strcmp(req_info->request_method, "GET")) { + mg_printf(conn, "Rule file is %s\n", rules_loaded? "LOADED":"NOT LOADED"); + } + + if (strcmp(req_info->request_method, "PUT")) { + mg_printf(conn, "Only PUT method allowed"); + return 1; + } + + fdh.user_data = (void *)conn; + + /* Call the form handler */ + mg_printf(conn, "Form data:"); + ret = mg_handle_form_request(conn, &fdh); + mg_printf(conn, "\r\n%i fields found", ret); + + return 1; +} + +void rest_api_cgnapt_init(struct mg_context *ctx, struct app_params *app) +{ + myapp = app; + + /* vCGNAPT commands */ + mg_set_request_handler(ctx, "/vnf/config/nat", nat_handler, 0); + mg_set_request_handler(ctx, "/vnf/config/nat/load", nat_load_handler, 0); + mg_set_request_handler(ctx, "/vnf/status", cgnapt_cmd_ver_handler, 0); + mg_set_request_handler(ctx, "/vnf/stats", cgnapt_stats_handler, 0); + +} + static cmdline_parse_inst_t cmd_clear_stats = { .f = cmd_cgnapt_clear_stats_parsed, .data = NULL, diff --git a/VNFs/vCGNAPT/pipeline/pipeline_cgnapt.h b/VNFs/vCGNAPT/pipeline/pipeline_cgnapt.h index 5491648a..6497de27 100644 --- a/VNFs/vCGNAPT/pipeline/pipeline_cgnapt.h +++ b/VNFs/vCGNAPT/pipeline/pipeline_cgnapt.h @@ -28,6 +28,8 @@ #include "pipeline.h" #include "pipeline_cgnapt_common.h" +#include <civetweb.h> +#include <json/json.h> /** * Add NAPT rule to the NAPT rule table. @@ -129,6 +131,12 @@ int app_pipeline_cgnapt_nsp_del_entry(struct app_params *app, uint32_t pipeline_id, struct pipeline_cgnapt_nsp_t *nsp); +#ifdef REST_API_SUPPORT +/* REST api's are defined here */ +int cgnapt_cmd_ver_handler(struct mg_connection *conn, void *cbdata); +int cgnapt_stats_handler(struct mg_connection *conn, void *cbdata); +void rest_api_cgnapt_init(struct mg_context *ctx, struct app_params *app); +#endif /* * Pipeline type diff --git a/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_be.c b/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_be.c index eb0aca96..7758c5b3 100644 --- a/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_be.c +++ b/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_be.c @@ -64,6 +64,7 @@ #include "vnf_common.h" #include "lib_sip_alg.h" #include "lib_icmpv6.h" +#include "gateway.h" #include "pipeline_common_fe.h" #ifdef CT_CGNAT @@ -177,21 +178,6 @@ uint8_t well_known_prefix[16] = { 0x00, 0x00, 0x00, 0x00 }; -static uint32_t local_get_nh_ipv4( - uint32_t ip, - uint32_t *port, - uint32_t *nhip, - struct pipeline_cgnapt *p_nat); -static void do_local_nh_ipv4_cache( - uint32_t dest_if, - struct pipeline_cgnapt *p_nat); - -static uint32_t local_get_nh_ipv6( - uint8_t *ip, - uint32_t *port, - uint8_t nhip[], - struct pipeline_cgnapt *p_nat); - static uint8_t check_arp_icmp( struct rte_mbuf *pkt, uint64_t pkt_mask, @@ -219,123 +205,6 @@ uint64_t nextPowerOf2(uint64_t n) return n; } -void remove_local_cache(uint8_t port) -{ - link_hw_laddr_valid[port] = 0; -} - -/** - * Function to get IPv4-IP NH from thread local array - * - * @params ip - * IPv4 - IP - * @params port - * NH port number - * @params nhip - * NHIP of IPv4 type - * @params p_nat - * CGNAPT pipeline ptr - * - * @return - * 1 on success, 0 for failure - */ - -static uint32_t local_get_nh_ipv4( - uint32_t ip, - uint32_t *port, - uint32_t *nhip, - struct pipeline_cgnapt *p_nat) -{ - int i; - for (i = 0; i < p_nat->local_lib_arp_route_ent_cnt; i++) { - if (((p_nat->local_lib_arp_route_table[i].ip & - p_nat->local_lib_arp_route_table[i].mask) == - (ip & p_nat->local_lib_arp_route_table[i].mask))) { - *port = p_nat->local_lib_arp_route_table[i].port; - - *nhip = p_nat->local_lib_arp_route_table[i].nh; - return 1; - } - } - return 0; -} - -/** - * Function to make local copy for NH of type IPv4 - * - * @params dest_if - * Physical port number - * @params p_nat - * CGNAPT pipeline ptr - * - */ - -static void do_local_nh_ipv4_cache( - uint32_t dest_if, - struct pipeline_cgnapt *p_nat) -{ - return; -} - - -/** - * Function to get IPv6-IP NH from thread local array - * - * @params ip - * Pointer to starting addr of IPv6 - * @params port - * NH port number - * @params nhip - * NHIP of IPv6 type - * @params p_nat - * CGNAPT pipeline ptr - * - * @return - * 1 on success, 0 for failure - */ - -static uint32_t local_get_nh_ipv6( - uint8_t *ip, - uint32_t *port, - uint8_t nhip[], - struct pipeline_cgnapt *p_nat) -{ - int i = 0; - uint8_t netmask_ipv6[16]; - uint8_t k = 0, l = 0, depthflags = 0, depthflags1 = 0; - - for (i = 0; i < p_nat->local_lib_nd_route_ent_cnt; i++) { - - convert_prefixlen_to_netmask_ipv6( - p_nat->local_lib_nd_route_table[i].depth, - netmask_ipv6); - - for (k = 0; k < 16; k++) - if (p_nat->local_lib_nd_route_table[i].ipv6[k] & - netmask_ipv6[k]) - depthflags++; - - for (l = 0; l < 16; l++) - if (ip[l] & netmask_ipv6[l]) - depthflags1++; - - int j = 0; - if (depthflags == depthflags1) { - *port = p_nat->local_lib_nd_route_table[i].port; - - for (j = 0; j < 16; j++) - nhip[j] = p_nat->local_lib_nd_route_table[i]. - nhipv6[j]; - return 1; - } - - depthflags = 0; - depthflags1 = 0; - } - return 0; -} - - #ifdef SIP_ALG /* Commented code may be required for future usage, Please keep it*/ #if 0 @@ -2078,7 +1947,7 @@ static int cgnapt_in_port_ah_mix(struct rte_pipeline *rte_p, uint8_t nh_ipv6[16]; uint32_t nhip = 0; - uint32_t dest_if = 0xff; + uint32_t dest_if = INVALID_DESTIF; uint32_t ret; uint16_t *outport_id = @@ -2091,52 +1960,54 @@ static int cgnapt_in_port_ah_mix(struct rte_pipeline *rte_p, && rte_be_to_cpu_16(*dst_port) == 53) { p_nat->invalid_packets |= 1LLU << pkt_index; p_nat->naptDroppedPktCount++; - #ifdef CGNAPT_DEBUGGING +#ifdef CGNAPT_DEBUGGING p_nat->naptDroppedPktCount6++; - #endif +#endif continue; } dest_address = rte_bswap32(*dst_addr); - ret = local_get_nh_ipv4(dest_address, &dest_if, - &nhip, p_nat); - if (!ret) { - dest_if = get_prv_to_pub_port(&dest_address, - IP_VERSION_4); - if (dest_if == INVALID_DESTIF) { - p_nat->invalid_packets |= - 1LLU << pkt_index; - p_nat->naptDroppedPktCount++; - #ifdef CGNAPT_DEBUGGING - p_nat->naptDroppedPktCount6++; - #endif - continue; - } - do_local_nh_ipv4_cache(dest_if, p_nat); - } + /* Gateway Proc Starts */ - *outport_id = p_nat->outport_id[dest_if]; - struct arp_entry_data *ret_arp_data; - ret_arp_data = get_dest_mac_addr_port(dest_address, - &dest_if, (struct ether_addr *)eth_dest); + struct arp_entry_data *ret_arp_data = NULL; + uint32_t src_phy_port = *src_port; - if (unlikely(ret_arp_data == NULL)) { + gw_get_nh_port_ipv4(dest_address, + &dest_if, &nhip); - #ifdef CGNAPT_DEBUGGING - printf("%s: NHIP Not Found, nhip: %x, " - "outport_id: %d\n", __func__, nhip, - *outport_id); - #endif - /* Drop the pkt */ - p_nat->invalid_packets |= pkt_mask; + if (dest_if == INVALID_DESTIF) { + p_nat->invalid_packets |= + 1LLU << pkt_index; p_nat->naptDroppedPktCount++; - - #ifdef CGNAPT_DEBUGGING - p_nat->naptDroppedPktCount4++; - #endif +#ifdef CGNAPT_DEBUGGING + p_nat->naptDroppedPktCount6++; +#endif continue; } + *outport_id = p_nat->outport_id[dest_if]; + + ret_arp_data = get_dest_mac_addr_ipv4(nhip, dest_if, &hw_addr); + + if (unlikely(ret_arp_data == NULL)) { + + #ifdef CGNAPT_DEBUGGING + printf("%s: NHIP Not Found, nhip: %x, " + "outport_id: %d\n", __func__, nhip, + *outport_id); + #endif + /* Drop the pkt */ + p_nat->invalid_packets |= pkt_mask; + p_nat->naptDroppedPktCount++; + + #ifdef CGNAPT_DEBUGGING + p_nat->naptDroppedPktCount4++; + #endif + continue; + } + + /* Gateway Proc Ends */ + if (ret_arp_data->status == COMPLETE) { if (ret_arp_data->num_pkts) { @@ -2267,21 +2138,28 @@ static int cgnapt_in_port_ah_mix(struct rte_pipeline *rte_p, &entry->data.u.prv_ipv6[0], 16); memset(nh_ipv6, 0, 16); struct nd_entry_data *ret_nd_data = NULL; - ret_nd_data = get_dest_mac_address_ipv6_port((uint8_t *) - &dst_addr[0], &dest_if, - &hw_addr, &nh_ipv6[0]); + + dest_if = INVALID_DESTIF; + + uint32_t src_phy_port = pkts[pkt_index]->port; + + gw_get_nh_port_ipv6((uint8_t *) &dst_addr[0], + &dest_if, &nh_ipv6[0]); + + ret_nd_data = get_dest_mac_addr_ipv6(&nh_ipv6[0], + dest_if, &hw_addr); *outport_id = p_nat->outport_id[dest_if]; if (nd_cache_dest_mac_present(dest_if)) { ether_addr_copy(get_link_hw_addr(dest_if), - (struct ether_addr *)eth_src); + (struct ether_addr *)eth_src); update_nhip_access(dest_if); if (unlikely(ret_nd_data && ret_nd_data->num_pkts)) { p_nat->naptedPktCount += ret_nd_data->num_pkts; nd_send_buffered_pkts(ret_nd_data, - (struct ether_addr *)eth_dest, - *outport_id); + (struct ether_addr *)eth_dest, + *outport_id); } } else { if (unlikely(ret_nd_data == NULL)) { @@ -2335,46 +2213,49 @@ static int cgnapt_in_port_ah_mix(struct rte_pipeline *rte_p, } else { *dst_addr = rte_bswap32(entry->data.u.prv_ip); dest_address = entry->data.u.prv_ip; - ret = local_get_nh_ipv4(dest_address, &dest_if, - &nhip, p_nat); - if (!ret) { - dest_if = get_pub_to_prv_port( - &dest_address, IP_VERSION_4); + /* Gateway Proc Starts */ + + struct arp_entry_data *ret_arp_data = NULL; + dest_if = INVALID_DESTIF; + uint32_t src_phy_port = *src_port; + + gw_get_nh_port_ipv4(dest_address, + &dest_if, &nhip); + if (dest_if == INVALID_DESTIF) { p_nat->invalid_packets |= 1LLU << pkt_index; p_nat->naptDroppedPktCount++; - #ifdef CGNAPT_DEBUGGING +#ifdef CGNAPT_DEBUGGING p_nat->naptDroppedPktCount6++; - #endif +#endif continue; } - do_local_nh_ipv4_cache(dest_if, p_nat); - }; *outport_id = p_nat->outport_id[dest_if]; - struct arp_entry_data *ret_arp_data; - ret_arp_data = get_dest_mac_addr_port(dest_address, - &dest_if, (struct ether_addr *)eth_dest); + + ret_arp_data = get_dest_mac_addr_ipv4(nhip, + dest_if, (struct ether_addr *)eth_dest); if (unlikely(ret_arp_data == NULL)) { - #ifdef CGNAPT_DEBUGGING +#ifdef CGNAPT_DEBUGGING printf("%s: NHIP Not Found, nhip: %x, " - "outport_id: %d\n", __func__, nhip, - *outport_id); - #endif - + "outport_id: %d\n", __func__, nhip, + *outport_id); +#endif /* Drop the pkt */ p_nat->invalid_packets |= pkt_mask; p_nat->naptDroppedPktCount++; - #ifdef CGNAPT_DEBUGGING +#ifdef CGNAPT_DEBUGGING p_nat->naptDroppedPktCount4++; - #endif +#endif continue; } + /* Gateway Proc Ends */ + if (ret_arp_data->status == COMPLETE) { if (ret_arp_data->num_pkts) { @@ -3713,7 +3594,7 @@ pkt_work_cgnapt_ipv4_prv( uint8_t protocol = RTE_MBUF_METADATA_UINT8(pkt, PROT_OFST_IP4); - uint32_t dest_if = 0xff; /* Added for Multiport */ + uint32_t dest_if = INVALID_DESTIF; /* Added for Multiport */ uint16_t *outport_id = RTE_MBUF_METADATA_UINT16_PTR(pkt, cgnapt_meta_offset); @@ -3822,7 +3703,6 @@ pkt_work_cgnapt_ipv4_prv( if (entry->data.ttl == NAPT_ENTRY_STALE) entry->data.ttl = NAPT_ENTRY_VALID; - struct ether_addr hw_addr; uint32_t dest_address = 0; /* Egress */ @@ -3840,8 +3720,14 @@ pkt_work_cgnapt_ipv4_prv( dest_address = rte_bswap32(*dst_addr); uint32_t nhip = 0; struct arp_entry_data *ret_arp_data = NULL; - ret_arp_data = get_dest_mac_addr_port(dest_address, - &dest_if, (struct ether_addr *)eth_dest); + + uint32_t src_phy_port = *src_port; + + gw_get_nh_port_ipv4(dest_address, &dest_if, &nhip); + + ret_arp_data = get_dest_mac_addr_ipv4(nhip, dest_if, + (struct ether_addr *)eth_dest); + *outport_id = p_nat->outport_id[dest_if]; if (arp_cache_dest_mac_present(dest_if)) { @@ -3850,7 +3736,7 @@ pkt_work_cgnapt_ipv4_prv( if (unlikely(ret_arp_data && ret_arp_data->num_pkts)) { p_nat->naptedPktCount += ret_arp_data->num_pkts; arp_send_buffered_pkts(ret_arp_data, - (struct ether_addr *)eth_dest, *outport_id); + (struct ether_addr *)eth_dest, *outport_id); } } else { @@ -4083,7 +3969,7 @@ pkt_work_cgnapt_ipv4_pub( uint8_t protocol = RTE_MBUF_METADATA_UINT8(pkt, PROT_OFST_IP4); - uint32_t dest_if = 0xff; /* Added for Multiport */ + uint32_t dest_if = INVALID_DESTIF; /* Added for Multiport */ uint16_t *outport_id = RTE_MBUF_METADATA_UINT16_PTR(pkt, cgnapt_meta_offset); @@ -4166,7 +4052,6 @@ pkt_work_cgnapt_ipv4_pub( if (entry->data.ttl == NAPT_ENTRY_STALE) entry->data.ttl = NAPT_ENTRY_VALID; - struct ether_addr hw_addr; uint32_t dest_address = 0; /* Multiport Changes */ @@ -4188,8 +4073,13 @@ pkt_work_cgnapt_ipv4_pub( dest_address = entry->data.u.prv_ip; struct arp_entry_data *ret_arp_data = NULL; - ret_arp_data = get_dest_mac_addr_port(dest_address, - &dest_if, (struct ether_addr *)eth_dest); + + uint32_t src_phy_port = *src_port; + + gw_get_nh_port_ipv4(dest_address, &dest_if, &nhip); + + ret_arp_data = get_dest_mac_addr_ipv4(nhip, dest_if, + (struct ether_addr *)eth_dest); *outport_id = p_nat->outport_id[dest_if]; if (arp_cache_dest_mac_present(dest_if)) { @@ -4441,7 +4331,7 @@ pkt4_work_cgnapt_ipv4_prv( __rte_unused void *arg, struct pipeline_cgnapt *p_nat) { - uint32_t dest_if = 0xff; /* Added for Multiport */ + uint32_t dest_if = INVALID_DESTIF; /* Added for Multiport */ struct rte_mbuf *pkt; uint8_t i; uint8_t pkt_num; @@ -4602,7 +4492,6 @@ pkt4_work_cgnapt_ipv4_prv( if (entry->data.ttl == NAPT_ENTRY_STALE) entry->data.ttl = NAPT_ENTRY_VALID; - struct ether_addr hw_addr; uint32_t dest_address = 0; /*Multiport Changes */ uint32_t nhip = 0; @@ -4626,9 +4515,15 @@ pkt4_work_cgnapt_ipv4_prv( dest_address = rte_bswap32(*dst_addr); struct arp_entry_data *ret_arp_data = NULL; uint64_t start, end; - ret_arp_data = get_dest_mac_addr_port(dest_address, - &dest_if, (struct ether_addr *)eth_dest); + uint32_t src_phy_port = *src_port; + + gw_get_nh_port_ipv4(dest_address, &dest_if, &nhip); + + ret_arp_data = get_dest_mac_addr_ipv4(nhip, dest_if, + (struct ether_addr *)eth_dest); + *outport_id = p_nat->outport_id[dest_if]; + if (arp_cache_dest_mac_present(dest_if)) { ether_addr_copy(get_link_hw_addr(dest_if), (struct ether_addr *)eth_src); @@ -4882,7 +4777,7 @@ pkt4_work_cgnapt_ipv4_pub( uint8_t protocol = RTE_MBUF_METADATA_UINT8(pkt, PROT_OFST_IP4); - uint32_t dest_if = 0xff; /* Added for Multiport */ + uint32_t dest_if = INVALID_DESTIF; /* Added for Multiport */ uint16_t *outport_id = RTE_MBUF_METADATA_UINT16_PTR(pkt, cgnapt_meta_offset); @@ -4971,7 +4866,6 @@ pkt4_work_cgnapt_ipv4_pub( if (entry->data.ttl == NAPT_ENTRY_STALE) entry->data.ttl = NAPT_ENTRY_VALID; - struct ether_addr hw_addr; uint32_t dest_address = 0; /* Multiport Changes */ uint32_t nhip = 0; @@ -4991,23 +4885,29 @@ pkt4_work_cgnapt_ipv4_pub( } dest_address = entry->data.u.prv_ip; struct arp_entry_data *ret_arp_data = NULL; - ret_arp_data = get_dest_mac_addr_port(dest_address, - &dest_if, (struct ether_addr *)eth_dest); + uint32_t src_phy_port = *src_port; + + gw_get_nh_port_ipv4(dest_address, &dest_if, &nhip); + + ret_arp_data = get_dest_mac_addr_ipv4(nhip, dest_if, + (struct ether_addr *)eth_dest); + *outport_id = p_nat->outport_id[dest_if]; - if (arp_cache_dest_mac_present(dest_if)) { - ether_addr_copy(get_link_hw_addr(dest_if), (struct ether_addr *)eth_src); - update_nhip_access(dest_if); + if (arp_cache_dest_mac_present(dest_if)) { + ether_addr_copy(get_link_hw_addr(dest_if), + (struct ether_addr *)eth_src); + update_nhip_access(dest_if); - if (ret_arp_data && ret_arp_data->num_pkts) { - p_nat->naptedPktCount += ret_arp_data->num_pkts; - arp_send_buffered_pkts(ret_arp_data, - (struct ether_addr *)eth_dest, *outport_id); - } + if (ret_arp_data && ret_arp_data->num_pkts) { + p_nat->naptedPktCount += ret_arp_data->num_pkts; + arp_send_buffered_pkts(ret_arp_data, + (struct ether_addr *)eth_dest, *outport_id); + } - } else { + } else { - if (unlikely(ret_arp_data == NULL)) { + if (unlikely(ret_arp_data == NULL)) { #ifdef CGNAPT_DEBUGGING printf("%s: NHIP Not Found, nhip: %x, " @@ -6058,7 +5958,6 @@ pkt_work_cgnapt_ipv6_prv( struct ipv6_hdr ipv6_hdr; - struct ether_addr hw_addr; uint32_t dest_address = 0; uint32_t nhip = 0; /* Egress */ @@ -6164,9 +6063,16 @@ pkt_work_cgnapt_ipv6_prv( #endif struct arp_entry_data *ret_arp_data; - ret_arp_data = get_dest_mac_addr_port(dest_address, - &dest_if, (struct ether_addr *)eth_dest); + + uint32_t src_phy_port = *src_port; + + gw_get_nh_port_ipv4(dest_address, &dest_if, &nhip); + + ret_arp_data = get_dest_mac_addr_ipv4(nhip, dest_if, + (struct ether_addr *)eth_dest); + *outport_id = p_nat->outport_id[dest_if]; + if (arp_cache_dest_mac_present(dest_if)) { ether_addr_copy(get_link_hw_addr(dest_if), (struct ether_addr *)eth_src); @@ -6342,11 +6248,16 @@ pkt_work_cgnapt_ipv6_pub( memset(nh_ipv6, 0, 16); struct nd_entry_data *ret_nd_data = NULL; - ret_nd_data = get_dest_mac_address_ipv6_port( - &dest_addr_ipv6[0], - &dest_if, - (struct ether_addr *)eth_dest, - &nh_ipv6[0]); + + dest_if = INVALID_DESTIF; + + uint32_t src_phy_port = pkt->port; + + gw_get_nh_port_ipv6((uint8_t *) &dest_addr_ipv6[0], + &dest_if, &nh_ipv6[0]); + + ret_nd_data = get_dest_mac_addr_ipv6(&nh_ipv6[0], + dest_if, (struct ether_addr *)eth_dest); *outport_id = p_nat->outport_id[dest_if]; @@ -6536,7 +6447,6 @@ pkt4_work_cgnapt_ipv6_prv( p_nat->entries[pkt_num] = &(entry->head); struct ipv6_hdr ipv6_hdr; - struct ether_addr hw_addr; uint32_t dest_address = 0; uint8_t nh_ipv6[16]; uint32_t nhip = 0; @@ -6645,15 +6555,18 @@ pkt4_work_cgnapt_ipv6_prv( { struct arp_entry_data *ret_arp_data; - ret_arp_data = get_dest_mac_addr_port(dest_address, - &dest_if, (struct ether_addr *)eth_dest); + uint32_t src_phy_port = *src_port; + + gw_get_nh_port_ipv4(dest_address, &dest_if, &nhip); + + ret_arp_data = get_dest_mac_addr_ipv4(nhip, dest_if, + (struct ether_addr *)eth_dest); *outport_id = p_nat->outport_id[dest_if]; if (arp_cache_dest_mac_present(dest_if)) { ether_addr_copy(get_link_hw_addr(dest_if), (struct ether_addr *)eth_src); update_nhip_access(dest_if); - if (unlikely(ret_arp_data && ret_arp_data->num_pkts)) { p_nat->naptedPktCount += ret_arp_data->num_pkts; arp_send_buffered_pkts(ret_arp_data, @@ -6846,10 +6759,15 @@ pkt4_work_cgnapt_ipv6_pub( memset(nh_ipv6, 0, 16); struct nd_entry_data *ret_nd_data = NULL; - ret_nd_data = get_dest_mac_address_ipv6_port - (&dest_addr_ipv6[0], &dest_if, - (struct ether_addr *)eth_dest, &nh_ipv6[0]); + dest_if = INVALID_DESTIF; + + uint32_t src_phy_port = pkt->port; + gw_get_nh_port_ipv6((uint8_t *) &dest_addr_ipv6[0], + &dest_if, &nh_ipv6[0]); + + ret_nd_data = get_dest_mac_addr_ipv6(&nh_ipv6[0], + dest_if, (struct ether_addr *)eth_dest); *outport_id = p_nat->outport_id[dest_if]; if (nd_cache_dest_mac_present(dest_if)) { @@ -10551,9 +10469,9 @@ void *pipeline_cgnapt_msg_req_ver_handler(__rte_unused struct pipeline *p, * Function to show CGNAPT stats * */ -void all_cgnapt_stats(void) +void all_cgnapt_stats(char *buf) { - int i; + int i, len = 0; struct pipeline_cgnapt *p_nat; uint64_t receivedPktCount = 0; uint64_t missedPktCount = 0; @@ -10563,7 +10481,7 @@ void all_cgnapt_stats(void) uint64_t enaptedPktCount = 0; uint64_t arpicmpPktCount = 0; - printf("\nCG-NAPT Packet Stats:\n"); + len += sprintf(buf + len, "\nCG-NAPT Packet Stats:\n"); for (i = 0; i < n_cgnapt_pipeline; i++) { p_nat = all_pipeline_cgnapt[i]; @@ -10575,6 +10493,16 @@ void all_cgnapt_stats(void) enaptedPktCount += p_nat->enaptedPktCount; arpicmpPktCount += p_nat->arpicmpPktCount; + len += sprintf(buf + len, "pipeline %d stats:\n", p_nat->pipeline_num); + len += sprintf(buf + len, "Received %" PRIu64 ",", p_nat->receivedPktCount); + len += sprintf(buf + len, "Missed %" PRIu64 ",", p_nat->missedPktCount); + len += sprintf(buf + len, "Dropped %" PRIu64 ",", p_nat->naptDroppedPktCount); + len += sprintf(buf + len, "Translated %" PRIu64 ",", p_nat->naptedPktCount); + len += sprintf(buf + len, "ingress %" PRIu64 ",", p_nat->inaptedPktCount); + len += sprintf(buf + len, "egress %" PRIu64 "\n", p_nat->enaptedPktCount); + len += sprintf(buf + len, "arpicmp pkts %" PRIu64 "\n", p_nat->arpicmpPktCount); + + printf("\nCG-NAPT Packet Stats:\n"); printf("pipeline %d stats:\n", p_nat->pipeline_num); printf("Received %" PRIu64 ",", p_nat->receivedPktCount); printf("Missed %" PRIu64 ",", p_nat->missedPktCount); @@ -10585,33 +10513,34 @@ void all_cgnapt_stats(void) printf("arpicmp pkts %" PRIu64 "\n", p_nat->arpicmpPktCount); + #ifdef CGNAPT_DEBUGGING - printf("\n Drop detail 1:%" PRIu64 ",", + len += sprintf(buf + len, "\n Drop detail 1:%" PRIu64 ",", p_nat->naptDroppedPktCount1); - printf("\n Drop detail 2:%" PRIu64 ",", + len += sprintf(buf + len, "\n Drop detail 2:%" PRIu64 ",", p_nat->naptDroppedPktCount2); - printf("\n Drop detail 3:%" PRIu64 ",", + len += sprintf(buf + len, "\n Drop detail 3:%" PRIu64 ",", p_nat->naptDroppedPktCount3); - printf("\n Drop detail 4:%" PRIu64 ",", + len += sprintf(buf + len, "\n Drop detail 4:%" PRIu64 ",", p_nat->naptDroppedPktCount4); - printf("\n Drop detail 5:%" PRIu64 ",", + len += sprintf(buf + len, "\n Drop detail 5:%" PRIu64 ",", p_nat->naptDroppedPktCount5); - printf("\n Drop detail 6:%" PRIu64 "", + len += sprintf(buf + len, "\n Drop detail 6:%" PRIu64 "", p_nat->naptDroppedPktCount6); - printf("\nPkt_miss: %" PRIu64 " %" PRIu64 "", + len += sprintf(buf + len, "\nPkt_miss: %" PRIu64 " %" PRIu64 "", p_nat->missedpktcount1, p_nat->missedpktcount2); - printf("\nPkt_miss: %" PRIu64 " %" PRIu64 "", + len += sprintf(buf + len, "\nPkt_miss: %" PRIu64 " %" PRIu64 "", p_nat->missedpktcount3, p_nat->missedpktcount4); - printf("\nPkt_miss: %" PRIu64 " %" PRIu64 "", + len += sprintf(buf + len, "\nPkt_miss: %" PRIu64 " %" PRIu64 "", p_nat->missedpktcount5, p_nat->missedpktcount6); - printf("\nPkt_miss: %" PRIu64 " %" PRIu64 "", + len += sprintf(buf + len, "\nPkt_miss: %" PRIu64 " %" PRIu64 "", p_nat->missedpktcount7, p_nat->missedpktcount8); - printf("\nPkt_miss: %" PRIu64 " %" PRIu64 "", + len += sprintf(buf + len, "\nPkt_miss: %" PRIu64 " %" PRIu64 "", p_nat->missedpktcount9, p_nat->missedpktcount10); @@ -10619,7 +10548,16 @@ void all_cgnapt_stats(void) } - printf("\nTotal pipeline stats:\n"); + len += sprintf(buf + len, "\nTotal pipeline stats:\n"); + len += sprintf(buf + len, "Received %" PRIu64 ",", receivedPktCount); + len += sprintf(buf + len, "Missed %" PRIu64 ",", missedPktCount); + len += sprintf(buf + len, "Dropped %" PRIu64 ",", naptDroppedPktCount); + len += sprintf(buf + len, "Translated %" PRIu64 ",", naptedPktCount); + len += sprintf(buf + len, "ingress %" PRIu64 ",", inaptedPktCount); + len += sprintf(buf + len, "egress %" PRIu64 "\n", enaptedPktCount); + len += sprintf(buf + len, "arpicmp pkts %" PRIu64 "\n", arpicmpPktCount); + + printf("\nTotal pipeline stats:\n"); printf("Received %" PRIu64 ",", receivedPktCount); printf("Missed %" PRIu64 ",", missedPktCount); printf("Dropped %" PRIu64 ",", naptDroppedPktCount); @@ -10627,24 +10565,27 @@ void all_cgnapt_stats(void) printf("ingress %" PRIu64 ",", inaptedPktCount); printf("egress %" PRIu64 "\n", enaptedPktCount); printf("arpicmp pkts %" PRIu64 "\n", arpicmpPktCount); + + if (!rest_api_supported()) + printf("%s\n", buf); } -void all_cgnapt_clear_stats(void) +void all_cgnapt_clear_stats(char *buf) { - int i; + int i, len = 0; struct pipeline_cgnapt *p_nat; - printf("\nCG-NAPT Packet Stats:\n"); + len += sprintf(buf + len, "\nCG-NAPT Packet Stats:\n"); for (i = 0; i < n_cgnapt_pipeline; i++) { p_nat = all_pipeline_cgnapt[i]; - printf("pipeline %d stats:\n", p_nat->pipeline_num); - printf("Received %" PRIu64 ",", p_nat->receivedPktCount); - printf("Missed %" PRIu64 ",", p_nat->missedPktCount); - printf("Dropped %" PRIu64 ",", p_nat->naptDroppedPktCount); - printf("Translated %" PRIu64 ",", p_nat->naptedPktCount); - printf("ingress %" PRIu64 ",", p_nat->inaptedPktCount); - printf("egress %" PRIu64 "\n", p_nat->enaptedPktCount); - printf("arpicmp pkts %" PRIu64 "\n", p_nat->arpicmpPktCount); + len += sprintf(buf + len, "pipeline %d stats:\n", p_nat->pipeline_num); + len += sprintf(buf + len, "Received %" PRIu64 ",", p_nat->receivedPktCount); + len += sprintf(buf + len, "Missed %" PRIu64 ",", p_nat->missedPktCount); + len += sprintf(buf + len, "Dropped %" PRIu64 ",", p_nat->naptDroppedPktCount); + len += sprintf(buf + len, "Translated %" PRIu64 ",", p_nat->naptedPktCount); + len += sprintf(buf + len, "ingress %" PRIu64 ",", p_nat->inaptedPktCount); + len += sprintf(buf + len, "egress %" PRIu64 "\n", p_nat->enaptedPktCount); + len += sprintf(buf + len, "arpicmp pkts %" PRIu64 "\n", p_nat->arpicmpPktCount); p_nat->receivedPktCount = 0; p_nat->missedPktCount = 0; @@ -10655,38 +10596,41 @@ void all_cgnapt_clear_stats(void) p_nat->arpicmpPktCount = 0; #ifdef CGNAPT_DEBUGGING - printf("\n Drop detail 1:%" PRIu64 ",", + len += sprintf(buf + len, "\n Drop detail 1:%" PRIu64 ",", p_nat->naptDroppedPktCount1); - printf("\n Drop detail 2:%" PRIu64 ",", + len += sprintf(buf + len, "\n Drop detail 2:%" PRIu64 ",", p_nat->naptDroppedPktCount2); - printf("\n Drop detail 3:%" PRIu64 ",", + len += sprintf(buf + len, "\n Drop detail 3:%" PRIu64 ",", p_nat->naptDroppedPktCount3); - printf("\n Drop detail 4:%" PRIu64 ",", + len += sprintf(buf + len, "\n Drop detail 4:%" PRIu64 ",", p_nat->naptDroppedPktCount4); - printf("\n Drop detail 5:%" PRIu64 ",", + len += sprintf(buf + len, "\n Drop detail 5:%" PRIu64 ",", p_nat->naptDroppedPktCount5); - printf("\n Drop detail 6:%" PRIu64 "", + len += sprintf(buf + len, "\n Drop detail 6:%" PRIu64 "", p_nat->naptDroppedPktCount6); - printf("\nPkt_miss: %" PRIu64 " %" PRIu64 "", + len += sprintf(buf + len, "\nPkt_miss: %" PRIu64 " %" PRIu64 "", p_nat->missedpktcount1, p_nat->missedpktcount2); - printf("\nPkt_miss: %" PRIu64 " %" PRIu64 "", + len += sprintf(buf + len, "\nPkt_miss: %" PRIu64 " %" PRIu64 "", p_nat->missedpktcount3, p_nat->missedpktcount4); - printf("\nPkt_miss: %" PRIu64 " %" PRIu64 "", + len += sprintf(buf + len, "\nPkt_miss: %" PRIu64 " %" PRIu64 "", p_nat->missedpktcount5, p_nat->missedpktcount6); - printf("\nPkt_miss: %" PRIu64 " %" PRIu64 "", + len += sprintf(buf + len, "\nPkt_miss: %" PRIu64 " %" PRIu64 "", p_nat->missedpktcount7, p_nat->missedpktcount8); - printf("\nPkt_miss: %" PRIu64 " %" PRIu64 "", + len += sprintf(buf + len, "\nPkt_miss: %" PRIu64 " %" PRIu64 "", p_nat->missedpktcount9, p_nat->missedpktcount10); #endif } + + if (!rest_api_supported()) + printf("%s\n", buf); } /** diff --git a/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_be.h b/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_be.h index 943d0fc7..7fde0c5a 100644 --- a/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_be.h +++ b/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_be.h @@ -418,14 +418,6 @@ struct pipeline_cgnapt { uint8_t vnf_set; /* to identify as separate LB-CGNAPT set */ - /* Local ARP & ND Tables */ - struct lib_arp_route_table_entry - local_lib_arp_route_table[MAX_ARP_RT_ENTRY]; - uint8_t local_lib_arp_route_ent_cnt; - struct lib_nd_route_table_entry - local_lib_nd_route_table[MAX_ND_RT_ENTRY]; - uint8_t local_lib_nd_route_ent_cnt; - /* For internal debugging purpose */ #ifdef CGNAPT_TIMING_INST uint64_t in_port_exit_timestamp; diff --git a/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_common.h b/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_common.h index 4f4253cd..a7cd88a4 100644 --- a/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_common.h +++ b/VNFs/vCGNAPT/pipeline/pipeline_cgnapt_common.h @@ -265,7 +265,7 @@ struct pipeline_cgnapt_entry_dbg_msg_req { extern struct pipeline_be_ops pipeline_cgnapt_be_ops; void print_num_ip_clients(void); -void all_cgnapt_stats(void); -void all_cgnapt_clear_stats(void); +void all_cgnapt_stats(char *); +void all_cgnapt_clear_stats(char *); void print_static_cgnapt_entries(void); #endif |