Temp Fix for vFW perf issue 95/59295/1
authorDeepak S <deepak.s@linux.intel.com>
Sat, 2 Jun 2018 22:06:25 +0000 (03:36 +0530)
committerDeepak S <deepak.s@linux.intel.com>
Fri, 29 Jun 2018 12:17:56 +0000 (17:47 +0530)
Change-Id: I324fcac7a65c0d221d5d422f419deb9c0f864172
Signed-off-by: Deepak S <deepak.s@linux.intel.com>
VNFs/vFW/pipeline/pipeline_vfw_be.c
common/VIL/gateway/gateway.c
common/VIL/gateway/gateway.h
common/VIL/l2l3_stack/lib_arp.c

index 71fd5cd..23e2aa0 100644 (file)
@@ -1163,7 +1163,13 @@ static void vfw_fwd_pkts_ipv4(struct rte_mbuf **pkts, uint64_t *pkts_mask,
                src_phy_port = pkt->port;
                uint32_t dst_phy_port = INVALID_DESTIF;
 
-               if(is_gateway()){
+               if(is_phy_port_privte(src_phy_port))
+                   dst_phy_port = prv_to_pub_map[src_phy_port];
+               else
+                   dst_phy_port = pub_to_prv_map[src_phy_port];
+
+
+               if(likely(is_gateway())){
                        struct ipv4_hdr *ipv4hdr = (struct ipv4_hdr *)
                                RTE_MBUF_METADATA_UINT32_PTR(pkt, IP_START);
 
@@ -1174,13 +1180,13 @@ static void vfw_fwd_pkts_ipv4(struct rte_mbuf **pkts, uint64_t *pkts_mask,
                        uint32_t nhip = 0;
                        uint32_t dst_ip_addr = rte_bswap32(ipv4hdr->dst_addr);
 
-                       gw_get_nh_port_ipv4(dst_ip_addr, &dst_phy_port, &nhip);
+                       gw_get_route_nh_port_ipv4(dst_ip_addr, &dst_phy_port, &nhip, dst_phy_port);
 
                        ret_arp_data = get_dest_mac_addr_ipv4(nhip, dst_phy_port, &dst_mac);
 
                        /* Gateway Proc Ends */
 
-                       if (arp_cache_dest_mac_present(dst_phy_port)) {
+                       if (likely(arp_cache_dest_mac_present(dst_phy_port))) {
 
                                ether_addr_copy(&dst_mac, &ehdr->d_addr);
                                ether_addr_copy(get_link_hw_addr(dst_phy_port), &ehdr->s_addr);
@@ -1221,11 +1227,6 @@ static void vfw_fwd_pkts_ipv4(struct rte_mbuf **pkts, uint64_t *pkts_mask,
                        }
                } else {
                        /* IP Pkt forwarding based on  pub/prv mapping */
-                       if(is_phy_port_privte(src_phy_port))
-                               dst_phy_port = prv_to_pub_map[src_phy_port];
-                       else
-                               dst_phy_port = pub_to_prv_map[src_phy_port];
-
                        meta_data_addr->output_port = vfw_pipe->outport_id[dst_phy_port];
 
                        if(VFW_DEBUG) {
index baf22cf..7ec3c68 100644 (file)
@@ -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;
        }
 }
 
index 47a3b8a..2da8ff6 100644 (file)
@@ -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);
 
index d59f4b7..9ea57d7 100644 (file)
@@ -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;
        }