common code: KW fixes for common code
[samplevnf.git] / common / VIL / l2l3_stack / lib_arp.c
index 42a619d..39a740d 100644 (file)
@@ -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),