From 0b9315e16642bc554427d47f20ee9ba8590fe625 Mon Sep 17 00:00:00 2001
From: Deepak S <deepak.s@linux.intel.com>
Date: Sun, 3 Jun 2018 03:36:25 +0530
Subject: Temp Fix for vFW perf issue

Change-Id: I324fcac7a65c0d221d5d422f419deb9c0f864172
Signed-off-by: Deepak S <deepak.s@linux.intel.com>
---
 common/VIL/gateway/gateway.c    | 21 ++++---------------
 common/VIL/gateway/gateway.h    | 46 +++++++++++++++++++++++++++++++++++++----
 common/VIL/l2l3_stack/lib_arp.c | 10 +--------
 3 files changed, 47 insertions(+), 30 deletions(-)

(limited to 'common')

diff --git a/common/VIL/gateway/gateway.c b/common/VIL/gateway/gateway.c
index baf22cf5..7ec3c68f 100644
--- a/common/VIL/gateway/gateway.c
+++ b/common/VIL/gateway/gateway.c
@@ -122,29 +122,16 @@ uint32_t is_gateway(void)
  */
 
 void gw_get_nh_port_ipv4(uint32_t dst_ip_addr,
-				uint32_t *dst_port, uint32_t *nhip)
+			 uint32_t *dst_port, uint32_t *nhip)
 {
-	int i;
 	uint32_t j;
 
 	*nhip = 0;
 	*dst_port = 0xff;
 
-	for(j = 0; j < gw_get_num_ports(); j++){
-
-		for (i = 0; i < p_route_data[j]->route_ent_cnt; i++) {
-
-			if ((p_route_data[j]->route_table[i].nh_mask) ==
-					(dst_ip_addr &
-					 p_route_data[j]->route_table[i].mask)) {
-
-				*dst_port = p_route_data[j]->route_table[i].port;
-				*nhip =  p_route_data[j]->route_table[i].nh;
-
-				lib_arp_nh_found++;
-				return;
-			}
-		}
+	for(j = 0; j < num_out_ports; j++) {
+           if (gw_get_route_nh_port_ipv4(dst_ip_addr, dst_port, nhip, j))
+               return;
 	}
 }
 
diff --git a/common/VIL/gateway/gateway.h b/common/VIL/gateway/gateway.h
index 47a3b8a7..2da8ff64 100644
--- a/common/VIL/gateway/gateway.h
+++ b/common/VIL/gateway/gateway.h
@@ -68,17 +68,17 @@ struct route_table_entry {
 struct route_data {
 	struct route_table_entry route_table[MAX_ROUTE_ENTRY_SIZE];
 	uint8_t route_ent_cnt;
-};
+}__rte_cache_aligned;
 
 /**
  * A structure for Route table entires of IPv6
  *
  */
 struct nd_route_table_entry {
+	uint32_t port;		/**< Port */
 	uint8_t nhipv6[16];	/**< next hop Ipv6 */
 	uint8_t depth;		/**< Depth */
-	uint32_t port;		/**< Port */
-};
+}__rte_cache_aligned;
 
 /**
  * Routing table for IPv6
@@ -87,7 +87,7 @@ struct nd_route_table_entry {
 struct nd_route_data {
 	struct nd_route_table_entry nd_route_table[MAX_ND_ROUTE_ENTRY_SIZE];
 	uint8_t nd_route_ent_cnt;
-};
+}__rte_cache_aligned;
 
 extern void gw_init(uint32_t num_ports);
 
@@ -95,6 +95,44 @@ extern uint32_t gw_get_num_ports(void);
 
 extern uint32_t is_gateway(void);
 
+/**
+ * Get the route next hop ip address and port number for IPv4
+ * @param dst_ip_addr
+ *  Destination IPv4 address
+ * @param dst_port
+ *  A pointer to destination port
+ * @param nhip
+ *  A pointer to next hop ip address
+ */
+
+static inline int gw_get_route_nh_port_ipv4(uint32_t dst_ip_addr,
+			 uint32_t *dst_port, uint32_t *nhip, uint32_t nport)
+{
+	int i = 0;
+	uint32_t j = nport;
+
+	while(likely(i < p_route_data[j]->route_ent_cnt)) {
+	     if (likely((p_route_data[j]->route_table[i].nh_mask) ==
+			(dst_ip_addr &
+			 p_route_data[j]->route_table[i].mask))) {
+
+	          *dst_port = p_route_data[j]->route_table[i].port;
+		  *nhip =  p_route_data[j]->route_table[i].nh;
+
+#ifdef ARPICMP_DEBUG
+		  lib_arp_nh_found++;
+#endif
+		  return 1;
+	     }
+             i++;
+	}
+
+       *nhip = 0;
+       *dst_port = 0xff;
+       return 0;
+}
+
+
 extern void gw_get_nh_port_ipv4(uint32_t dst_ip_addr,
 					uint32_t *dst_port, uint32_t *nhip);
 
diff --git a/common/VIL/l2l3_stack/lib_arp.c b/common/VIL/l2l3_stack/lib_arp.c
index d59f4b79..9ea57d77 100644
--- a/common/VIL/l2l3_stack/lib_arp.c
+++ b/common/VIL/l2l3_stack/lib_arp.c
@@ -294,20 +294,12 @@ 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)) {
-		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);
+	if (likely(arp_cache_dest_mac_present(phy_port))) {
 		return &arp_entry_data_default;
 	}
 
-- 
cgit