diff options
Diffstat (limited to 'common/VIL/l2l3_stack/lib_arp.c')
-rw-r--r-- | common/VIL/l2l3_stack/lib_arp.c | 93 |
1 files changed, 71 insertions, 22 deletions
diff --git a/common/VIL/l2l3_stack/lib_arp.c b/common/VIL/l2l3_stack/lib_arp.c index 42a619d7..39a740dd 100644 --- a/common/VIL/l2l3_stack/lib_arp.c +++ b/common/VIL/l2l3_stack/lib_arp.c @@ -294,13 +294,20 @@ struct arp_entry_data *get_dest_mac_addr_ipv4(const uint32_t nhip, uint32_t phy_port, struct ether_addr *hw_addr) { struct arp_entry_data *ret_arp_data = NULL; + struct ether_addr *x; uint8_t index; /* as part of optimization we store mac address in cache * & thus can be sent without having to retrieve */ if (arp_cache_dest_mac_present(phy_port)) { - ether_addr_copy(get_local_cache_hw_addr(phy_port, nhip), hw_addr); + x = get_local_cache_hw_addr(phy_port, nhip); + if (!x) { + printf("local copy of address not stored\n"); + return NULL; + } + + ether_addr_copy(x, hw_addr); return &arp_entry_data_default; } @@ -352,11 +359,17 @@ struct nd_entry_data *get_dest_mac_addr_ipv6(uint8_t nhipv6[], struct nd_entry_data *ret_nd_data = NULL; struct nd_key_ipv6 tmp_nd_key; + struct ether_addr *addr; tmp_nd_key.port_id = phy_port; if (nd_cache_dest_mac_present(phy_port)) { - ether_addr_copy(get_nd_local_link_hw_addr( - (uint8_t)phy_port, nhipv6), hw_addr); + addr = get_nd_local_link_hw_addr((uint8_t)phy_port, nhipv6); + if (!addr) { + printf("local copy not stored\n"); + return NULL; + } + + ether_addr_copy(addr, hw_addr); return &nd_entry_data_default; } @@ -743,6 +756,7 @@ struct arp_entry_data *retrieve_arp_entry(struct arp_key_ipv4 arp_key, uint8_t m struct nd_entry_data *retrieve_nd_entry(struct nd_key_ipv6 nd_key, uint8_t mode) { struct nd_entry_data *ret_nd_data = NULL; + l2_phy_interface_t *port; nd_key.filler1 = 0; nd_key.filler2 = 0; nd_key.filler3 = 0; @@ -822,7 +836,14 @@ struct nd_entry_data *retrieve_nd_entry(struct nd_key_ipv6 nd_key, uint8_t mode) ret_nd_data->timer_key = callback_key; /* send nd request */ - request_nd(callback_key->ipv6, ifm_get_port(callback_key->port_id)); + port = ifm_get_port(callback_key->port_id); + if (!port) { + printf("port returned is NULL inside retrieve_nd_entry\n"); + rte_rwlock_write_unlock(&ret_nd_data->queue_lock); + return NULL; + } + + request_nd(callback_key->ipv6, port); rte_rwlock_write_unlock(&ret_nd_data->queue_lock); } else { if (ret_nd_data && @@ -849,7 +870,14 @@ struct nd_entry_data *retrieve_nd_entry(struct nd_key_ipv6 nd_key, uint8_t mode) ret_nd_data->timer_key = callback_key; /* send nd request */ - request_nd(callback_key->ipv6, ifm_get_port(callback_key->port_id)); + port = ifm_get_port(callback_key->port_id); + if (!port) { + printf("port returned is NULL inside retrieve_nd_entry\n"); + rte_rwlock_write_unlock(&ret_nd_data->queue_lock); + return NULL; + } + + request_nd(callback_key->ipv6, port); rte_rwlock_write_unlock(&ret_nd_data->queue_lock); } } @@ -911,7 +939,7 @@ void print_arp_table(void) lib_arp_populate_called, lib_arp_delete_called, lib_arp_duplicate_found); - printf("ARP table key len is %lu\n", sizeof(struct arp_key_ipv4)); + printf("ARP table key len is %d\n", (uint32_t) sizeof(struct arp_key_ipv4)); } /* ND IPv6 */ @@ -974,7 +1002,7 @@ void print_nd_table(void) lib_nd_nd_entry_found, lib_nd_no_arp_entry_found, lib_nd_populate_called, lib_nd_delete_called, lib_nd_duplicate_found); - printf("ND table key len is %lu\n\n", sizeof(struct nd_key_ipv6)); + printf("ND table key len is %d\n\n", (uint32_t) sizeof(struct nd_key_ipv6)); } void remove_arp_entry(struct arp_entry_data *ret_arp_data, void *arg) @@ -1052,7 +1080,7 @@ arp_send_buffered_pkts(struct arp_entry_data *ret_arp_data, int i; - if (!hw_addr || !ret_arp_data) + if (!hw_addr || !ret_arp_data || !port) return; rte_rwlock_write_lock(&ret_arp_data->queue_lock); @@ -1097,7 +1125,7 @@ nd_send_buffered_pkts(struct nd_entry_data *ret_nd_data, uint8_t *eth_dest, *eth_src; int i; - if (!hw_addr || !ret_nd_data) + if (!hw_addr || !ret_nd_data || !port) return; rte_rwlock_write_lock(&ret_nd_data->queue_lock); @@ -1193,8 +1221,8 @@ populate_arp_entry(const struct ether_addr *hw_addr, uint32_t ipaddr, } else { rte_rwlock_write_lock(&new_arp_data->queue_lock); ether_addr_copy(hw_addr, &new_arp_data->eth_addr); - if ((new_arp_data->status == INCOMPLETE) || - (new_arp_data->status == PROBE)) { + if (new_arp_data && ((new_arp_data->status == INCOMPLETE) || + (new_arp_data->status == PROBE))) { new_arp_data->status = COMPLETE; new_arp_data->mode = mode; new_arp_data->n_confirmed = rte_rdtsc(); @@ -1295,6 +1323,7 @@ void populate_nd_entry(const struct ether_addr *hw_addr, uint8_t ipv6[], uint8_t i, val = 0; struct nd_key_ipv6 nd_key; nd_key.port_id = portid; + l2_phy_interface_t *port; for (i = 0; i < ND_IPV6_ADDR_SIZE; i++) { nd_key.ipv6[i] = ipv6[i]; @@ -1342,8 +1371,10 @@ void populate_nd_entry(const struct ether_addr *hw_addr, uint8_t ipv6[], if (new_nd_data->status == STALE) { new_nd_data->retry_count = 0; // Reset new_nd_data->status = PROBE; - request_nd(new_nd_data->ipv6, - ifm_get_port(new_nd_data->port)); + port = ifm_get_port(new_nd_data->port); + + if (port) + request_nd(new_nd_data->ipv6, port); if (rte_timer_reset(new_nd_data->timer, (arp_timeout * rte_get_tsc_hz()), @@ -1360,8 +1391,8 @@ void populate_nd_entry(const struct ether_addr *hw_addr, uint8_t ipv6[], } else { rte_rwlock_write_lock(&new_nd_data->queue_lock); ether_addr_copy(hw_addr, &new_nd_data->eth_addr); - if ((new_nd_data->status == INCOMPLETE) || - (new_nd_data->status == PROBE)) { + if (new_nd_data && ((new_nd_data->status == INCOMPLETE) || + (new_nd_data->status == PROBE))) { new_nd_data->status = COMPLETE; new_nd_data->mode = mode; new_nd_data->n_confirmed = rte_rdtsc(); @@ -2092,6 +2123,12 @@ static int arp_parse_args(struct pipeline_params *params) RTE_SET_USED(nd_route_tbl_present); RTE_SET_USED(arp_route_tbl_present); for (numArg = 0; numArg < params->n_args; numArg++) { + + if(strlen(params->args_value[numArg]) > PIPELINE_MAX_ARGS) { + /* KW Fix */ + printf("WARNING: Non-Null terminated Parameter not processed\n"); + continue; + } char *arg_name = params->args_name[numArg]; char *arg_value = params->args_value[numArg]; @@ -2192,12 +2229,15 @@ static int arp_parse_args(struct pipeline_params *params) tx_phy_port_num, txport); if ((rxport >= PIPELINE_MAX_PORT_IN) || - (txport >= PIPELINE_MAX_PORT_IN) || - (in_port_dir_a[rxport] != 1)) { + (txport >= PIPELINE_MAX_PORT_IN)) { printf - ("CG-NAPT parse error - incorrect prv-pub translation. Rx %d, Tx %d, Rx Dir %d\n", - rxport, txport, - in_port_dir_a[rxport]); + ("CG-NAPT parse error - incorrect prv-pub translation. Rx %d, Tx %d\n", + rxport, txport); + return -1; + } + + if (in_port_dir_a[rxport] != 1) { + printf("CG-NAPT parse error - incorrect rx_port supplied\n"); return -1; } @@ -2271,6 +2311,10 @@ static int arp_parse_args(struct pipeline_params *params) } tx_port_str[k] = '\0'; tx_port = strtoul(tx_port_str, NULL, 16); //atoi(tx_port_str); + if (tx_port > MAX_ROUTE_ENTRY_SIZE) { + printf("tx_port is greater than route entry max size\n"); + continue; + } k++; l = 0; @@ -2710,6 +2754,7 @@ void nd_timer_callback(struct rte_timer *timer, void *arg) int j; struct nd_entry_data *ret_nd_data = NULL; uint64_t now; + l2_phy_interface_t *port; nd_key.port_id = timer_key->port_id; nd_key.filler1 = 0; @@ -2755,9 +2800,13 @@ void nd_timer_callback(struct rte_timer *timer, void *arg) "TIMER STARTED FOR %u seconds\n", ARP_TIMER_EXPIRY); } + port = ifm_get_port(ret_nd_data->port); + if (!port) { + printf("port is NULL in nd_timer_callback\n"); + return; + } - request_nd(ret_nd_data->ipv6, - ifm_get_port(ret_nd_data->port)); + request_nd(ret_nd_data->ipv6, port); if (rte_timer_reset(ret_nd_data->timer, (PROBE_TIME * rte_get_tsc_hz()/ 1000), |