summaryrefslogtreecommitdiffstats
path: root/common/VIL/l2l3_stack/lib_arp.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/VIL/l2l3_stack/lib_arp.c')
-rw-r--r--common/VIL/l2l3_stack/lib_arp.c93
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),