MTRIE Optimisations 2
[vpp.git] / src / vnet / ip / ip4_forward.c
index bbba4b7..ee1703e 100644 (file)
@@ -95,14 +95,10 @@ ip4_lookup_inline (vlib_main_t * vm,
          ip4_fib_mtrie_t *mtrie0, *mtrie1, *mtrie2, *mtrie3;
          ip4_fib_mtrie_leaf_t leaf0, leaf1, leaf2, leaf3;
          ip4_address_t *dst_addr0, *dst_addr1, *dst_addr2, *dst_addr3;
-         __attribute__ ((unused)) u32 pi0, fib_index0, lb_index0,
-           is_tcp_udp0;
-         __attribute__ ((unused)) u32 pi1, fib_index1, lb_index1,
-           is_tcp_udp1;
-         __attribute__ ((unused)) u32 pi2, fib_index2, lb_index2,
-           is_tcp_udp2;
-         __attribute__ ((unused)) u32 pi3, fib_index3, lb_index3,
-           is_tcp_udp3;
+         u32 pi0, fib_index0, lb_index0;
+         u32 pi1, fib_index1, lb_index1;
+         u32 pi2, fib_index2, lb_index2;
+         u32 pi3, fib_index3, lb_index3;
          flow_hash_config_t flow_hash_config0, flow_hash_config1;
          flow_hash_config_t flow_hash_config2, flow_hash_config3;
          u32 hash_c0, hash_c1, hash_c2, hash_c3;
@@ -186,12 +182,10 @@ ip4_lookup_inline (vlib_main_t * vm,
              mtrie2 = &ip4_fib_get (fib_index2)->mtrie;
              mtrie3 = &ip4_fib_get (fib_index3)->mtrie;
 
-             leaf0 = leaf1 = leaf2 = leaf3 = IP4_FIB_MTRIE_LEAF_ROOT;
-
-             leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, dst_addr0, 0);
-             leaf1 = ip4_fib_mtrie_lookup_step (mtrie1, leaf1, dst_addr1, 0);
-             leaf2 = ip4_fib_mtrie_lookup_step (mtrie2, leaf2, dst_addr2, 0);
-             leaf3 = ip4_fib_mtrie_lookup_step (mtrie3, leaf3, dst_addr3, 0);
+             leaf0 = ip4_fib_mtrie_lookup_step_one (mtrie0, dst_addr0);
+             leaf1 = ip4_fib_mtrie_lookup_step_one (mtrie1, dst_addr1);
+             leaf2 = ip4_fib_mtrie_lookup_step_one (mtrie2, dst_addr2);
+             leaf3 = ip4_fib_mtrie_lookup_step_one (mtrie3, dst_addr3);
            }
 
          tcp0 = (void *) (ip0 + 1);
@@ -199,23 +193,6 @@ ip4_lookup_inline (vlib_main_t * vm,
          tcp2 = (void *) (ip2 + 1);
          tcp3 = (void *) (ip3 + 1);
 
-         is_tcp_udp0 = (ip0->protocol == IP_PROTOCOL_TCP
-                        || ip0->protocol == IP_PROTOCOL_UDP);
-         is_tcp_udp1 = (ip1->protocol == IP_PROTOCOL_TCP
-                        || ip1->protocol == IP_PROTOCOL_UDP);
-         is_tcp_udp2 = (ip2->protocol == IP_PROTOCOL_TCP
-                        || ip2->protocol == IP_PROTOCOL_UDP);
-         is_tcp_udp3 = (ip1->protocol == IP_PROTOCOL_TCP
-                        || ip1->protocol == IP_PROTOCOL_UDP);
-
-         if (!lookup_for_responses_to_locally_received_packets)
-           {
-             leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, dst_addr0, 1);
-             leaf1 = ip4_fib_mtrie_lookup_step (mtrie1, leaf1, dst_addr1, 1);
-             leaf2 = ip4_fib_mtrie_lookup_step (mtrie2, leaf2, dst_addr2, 1);
-             leaf3 = ip4_fib_mtrie_lookup_step (mtrie3, leaf3, dst_addr3, 1);
-           }
-
          if (!lookup_for_responses_to_locally_received_packets)
            {
              leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, dst_addr0, 2);
@@ -241,25 +218,13 @@ ip4_lookup_inline (vlib_main_t * vm,
            }
          else
            {
-             /* Handle default route. */
-             leaf0 =
-               (leaf0 ==
-                IP4_FIB_MTRIE_LEAF_EMPTY ? mtrie0->default_leaf : leaf0);
-             leaf1 =
-               (leaf1 ==
-                IP4_FIB_MTRIE_LEAF_EMPTY ? mtrie1->default_leaf : leaf1);
-             leaf2 =
-               (leaf2 ==
-                IP4_FIB_MTRIE_LEAF_EMPTY ? mtrie2->default_leaf : leaf2);
-             leaf3 =
-               (leaf3 ==
-                IP4_FIB_MTRIE_LEAF_EMPTY ? mtrie3->default_leaf : leaf3);
              lb_index0 = ip4_fib_mtrie_leaf_get_adj_index (leaf0);
              lb_index1 = ip4_fib_mtrie_leaf_get_adj_index (leaf1);
              lb_index2 = ip4_fib_mtrie_leaf_get_adj_index (leaf2);
              lb_index3 = ip4_fib_mtrie_leaf_get_adj_index (leaf3);
            }
 
+         ASSERT (lb_index0 && lb_index1 && lb_index2 && lb_index3);
          lb0 = load_balance_get (lb_index0);
          lb1 = load_balance_get (lb_index1);
          lb2 = load_balance_get (lb_index2);
@@ -359,7 +324,7 @@ ip4_lookup_inline (vlib_main_t * vm,
          ip4_fib_mtrie_t *mtrie0;
          ip4_fib_mtrie_leaf_t leaf0;
          ip4_address_t *dst_addr0;
-         __attribute__ ((unused)) u32 pi0, fib_index0, is_tcp_udp0, lbi0;
+         u32 pi0, fib_index0, lbi0;
          flow_hash_config_t flow_hash_config0;
          const dpo_id_t *dpo0;
          u32 hash_c0;
@@ -384,19 +349,11 @@ ip4_lookup_inline (vlib_main_t * vm,
            {
              mtrie0 = &ip4_fib_get (fib_index0)->mtrie;
 
-             leaf0 = IP4_FIB_MTRIE_LEAF_ROOT;
-
-             leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, dst_addr0, 0);
+             leaf0 = ip4_fib_mtrie_lookup_step_one (mtrie0, dst_addr0);
            }
 
          tcp0 = (void *) (ip0 + 1);
 
-         is_tcp_udp0 = (ip0->protocol == IP_PROTOCOL_TCP
-                        || ip0->protocol == IP_PROTOCOL_UDP);
-
-         if (!lookup_for_responses_to_locally_received_packets)
-           leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, dst_addr0, 1);
-
          if (!lookup_for_responses_to_locally_received_packets)
            leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, dst_addr0, 2);
 
@@ -408,12 +365,10 @@ ip4_lookup_inline (vlib_main_t * vm,
          else
            {
              /* Handle default route. */
-             leaf0 =
-               (leaf0 ==
-                IP4_FIB_MTRIE_LEAF_EMPTY ? mtrie0->default_leaf : leaf0);
              lbi0 = ip4_fib_mtrie_leaf_get_adj_index (leaf0);
            }
 
+         ASSERT (lbi0);
          lb0 = load_balance_get (lbi0);
 
          /* Use flow hash to compute multipath adjacency. */
@@ -1623,12 +1578,8 @@ ip4_local_inline (vlib_main_t * vm,
          mtrie0 = &ip4_fib_get (fib_index0)->mtrie;
          mtrie1 = &ip4_fib_get (fib_index1)->mtrie;
 
-         leaf0 = leaf1 = IP4_FIB_MTRIE_LEAF_ROOT;
-
-         leaf0 =
-           ip4_fib_mtrie_lookup_step (mtrie0, leaf0, &ip0->src_address, 0);
-         leaf1 =
-           ip4_fib_mtrie_lookup_step (mtrie1, leaf1, &ip1->src_address, 0);
+         leaf0 = ip4_fib_mtrie_lookup_step_one (mtrie0, &ip0->src_address);
+         leaf1 = ip4_fib_mtrie_lookup_step_one (mtrie1, &ip1->src_address);
 
          /* Treat IP frag packets as "experimental" protocol for now
             until support of IP frag reassembly is implemented */
@@ -1659,11 +1610,6 @@ ip4_local_inline (vlib_main_t * vm,
          good_tcp_udp0 |= is_udp0 && udp0->checksum == 0;
          good_tcp_udp1 |= is_udp1 && udp1->checksum == 0;
 
-         leaf0 =
-           ip4_fib_mtrie_lookup_step (mtrie0, leaf0, &ip0->src_address, 1);
-         leaf1 =
-           ip4_fib_mtrie_lookup_step (mtrie1, leaf1, &ip1->src_address, 1);
-
          /* Verify UDP length. */
          ip_len0 = clib_net_to_host_u16 (ip0->length);
          ip_len1 = clib_net_to_host_u16 (ip1->length);
@@ -1722,12 +1668,6 @@ ip4_local_inline (vlib_main_t * vm,
            ip4_fib_mtrie_lookup_step (mtrie0, leaf0, &ip0->src_address, 3);
          leaf1 =
            ip4_fib_mtrie_lookup_step (mtrie1, leaf1, &ip1->src_address, 3);
-         leaf0 =
-           (leaf0 ==
-            IP4_FIB_MTRIE_LEAF_EMPTY ? mtrie0->default_leaf : leaf0);
-         leaf1 =
-           (leaf1 ==
-            IP4_FIB_MTRIE_LEAF_EMPTY ? mtrie1->default_leaf : leaf1);
 
          vnet_buffer (p0)->ip.adj_index[VLIB_RX] = lbi0 =
            ip4_fib_mtrie_leaf_get_adj_index (leaf0);
@@ -1831,10 +1771,7 @@ ip4_local_inline (vlib_main_t * vm,
 
          mtrie0 = &ip4_fib_get (fib_index0)->mtrie;
 
-         leaf0 = IP4_FIB_MTRIE_LEAF_ROOT;
-
-         leaf0 =
-           ip4_fib_mtrie_lookup_step (mtrie0, leaf0, &ip0->src_address, 0);
+         leaf0 = ip4_fib_mtrie_lookup_step_one (mtrie0, &ip0->src_address);
 
          /* Treat IP frag packets as "experimental" protocol for now
             until support of IP frag reassembly is implemented */
@@ -1858,9 +1795,6 @@ ip4_local_inline (vlib_main_t * vm,
          /* Don't verify UDP checksum for packets with explicit zero checksum. */
          good_tcp_udp0 |= is_udp0 && udp0->checksum == 0;
 
-         leaf0 =
-           ip4_fib_mtrie_lookup_step (mtrie0, leaf0, &ip0->src_address, 1);
-
          /* Verify UDP length. */
          ip_len0 = clib_net_to_host_u16 (ip0->length);
          udp_len0 = clib_net_to_host_u16 (udp0->length);
@@ -1897,9 +1831,6 @@ ip4_local_inline (vlib_main_t * vm,
 
          leaf0 =
            ip4_fib_mtrie_lookup_step (mtrie0, leaf0, &ip0->src_address, 3);
-         leaf0 =
-           (leaf0 ==
-            IP4_FIB_MTRIE_LEAF_EMPTY ? mtrie0->default_leaf : leaf0);
 
          lbi0 = ip4_fib_mtrie_leaf_get_adj_index (leaf0);
          vnet_buffer (p0)->ip.adj_index[VLIB_TX] = lbi0;
@@ -2453,9 +2384,6 @@ ip4_rewrite_inline (vlib_main_t * vm,
                                              cpu_index, adj_index1);
            }
 
-         /* We should never rewrite a pkt using the MISS adjacency */
-         ASSERT (adj_index0 && adj_index1);
-
          ip0 = vlib_buffer_get_current (p0);
          ip1 = vlib_buffer_get_current (p1);
 
@@ -2643,9 +2571,6 @@ ip4_rewrite_inline (vlib_main_t * vm,
 
          adj_index0 = vnet_buffer (p0)->ip.adj_index[VLIB_TX];
 
-         /* We should never rewrite a pkt using the MISS adjacency */
-         ASSERT (adj_index0);
-
          adj0 = ip_get_adjacency (lm, adj_index0);
 
          ip0 = vlib_buffer_get_current (p0);
@@ -2967,15 +2892,10 @@ ip4_lookup_validate (ip4_address_t * a, u32 fib_index0)
 
   mtrie0 = &ip4_fib_get (fib_index0)->mtrie;
 
-  leaf0 = IP4_FIB_MTRIE_LEAF_ROOT;
-  leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, a, 0);
-  leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, a, 1);
+  leaf0 = ip4_fib_mtrie_lookup_step_one (mtrie0, a);
   leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, a, 2);
   leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, a, 3);
 
-  /* Handle default route. */
-  leaf0 = (leaf0 == IP4_FIB_MTRIE_LEAF_EMPTY ? mtrie0->default_leaf : leaf0);
-
   lbi0 = ip4_fib_mtrie_leaf_get_adj_index (leaf0);
 
   return lbi0 == ip4_fib_table_lookup_lb (ip4_fib_get (fib_index0), a);