X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip4_forward.c;h=4ba0a73100607b3ecf50974e309816e362b77756;hb=refs%2Fchanges%2F22%2F26322%2F7;hp=aa554eab5fbf5e22d099bbf14d8426d96e9707df;hpb=cbe25aab3be72154f2c706c39eeba6a77f34450f;p=vpp.git diff --git a/src/vnet/ip/ip4_forward.c b/src/vnet/ip/ip4_forward.c index aa554eab5fb..4ba0a731006 100644 --- a/src/vnet/ip/ip4_forward.c +++ b/src/vnet/ip/ip4_forward.c @@ -49,6 +49,7 @@ #include /* for FIB table and entry creation */ #include /* for FIB uRPF check */ #include +#include #include #include #include @@ -56,6 +57,7 @@ #include #include +#include /** @brief IPv4 lookup node. @node ip4-lookup @@ -760,6 +762,7 @@ ip4_add_del_interface_address_internal (vlib_main_t * vm, goto done; ip4_sw_interface_enable_disable (sw_if_index, !is_del); + ip4_mfib_interface_enable_disable (sw_if_index, !is_del); /* intf addr routes are added/deleted on admin up/down */ if (vnet_sw_interface_is_admin_up (vnm, sw_if_index)) @@ -900,20 +903,6 @@ VNET_FEATURE_INIT (ip4_inacl, static) = { .arc_name = "ip4-unicast", .node_name = "ip4-inacl", - .runs_before = VNET_FEATURES ("ip4-source-check-via-rx"), -}; - -VNET_FEATURE_INIT (ip4_source_check_1, static) = -{ - .arc_name = "ip4-unicast", - .node_name = "ip4-source-check-via-rx", - .runs_before = VNET_FEATURES ("ip4-source-check-via-any"), -}; - -VNET_FEATURE_INIT (ip4_source_check_2, static) = -{ - .arc_name = "ip4-unicast", - .node_name = "ip4-source-check-via-any", .runs_before = VNET_FEATURES ("ip4-policer-classify"), }; @@ -1060,6 +1049,7 @@ ip4_sw_interface_add_del (vnet_main_t * vnm, u32 sw_if_index, u32 is_add) ip4_add_del_interface_address(vm, sw_if_index, address, ia->address_length, 1); })); /* *INDENT-ON* */ + ip4_mfib_interface_enable_disable (sw_if_index, 0); } vnet_feature_enable_disable ("ip4-unicast", "ip4-not-enabled", sw_if_index, @@ -1504,8 +1494,8 @@ ip4_local_check_src (vlib_buffer_t * b, ip4_header_t * ip0, * vnet_buffer()->ip.adj_index[VLIB_TX] will be set to the index of the * adjacency for the source address (the remote sender's address) */ - if (PREDICT_FALSE (last_check->first || - (last_check->src.as_u32 != ip0->src_address.as_u32))) + if (PREDICT_TRUE (last_check->src.as_u32 != ip0->src_address.as_u32) || + last_check->first) { mtrie0 = &ip4_fib_get (vnet_buffer (b)->ip.fib_index)->mtrie; leaf0 = ip4_fib_mtrie_lookup_step_one (mtrie0, &ip0->src_address); @@ -1542,6 +1532,7 @@ ip4_local_check_src (vlib_buffer_t * b, ip4_header_t * ip0, last_check->src.as_u32 = ip0->src_address.as_u32; last_check->lbi = lbi0; last_check->error = *error0; + last_check->first = 0; } else { @@ -1549,7 +1540,6 @@ ip4_local_check_src (vlib_buffer_t * b, ip4_header_t * ip0, vnet_buffer (b)->ip.adj_index[VLIB_TX]; vnet_buffer (b)->ip.adj_index[VLIB_TX] = last_check->lbi; *error0 = last_check->error; - last_check->first = 0; } } @@ -1584,7 +1574,7 @@ ip4_local_check_src_x2 (vlib_buffer_t ** b, ip4_header_t ** ip, * vnet_buffer()->ip.adj_index[VLIB_TX] will be set to the index of the * adjacency for the source address (the remote sender's address) */ - if (PREDICT_FALSE (not_last_hit)) + if (PREDICT_TRUE (not_last_hit)) { mtrie[0] = &ip4_fib_get (vnet_buffer (b[0])->ip.fib_index)->mtrie; mtrie[1] = &ip4_fib_get (vnet_buffer (b[1])->ip.fib_index)->mtrie; @@ -1638,6 +1628,7 @@ ip4_local_check_src_x2 (vlib_buffer_t ** b, ip4_header_t ** ip, last_check->src.as_u32 = ip[1]->src_address.as_u32; last_check->lbi = lbi[1]; last_check->error = error[1]; + last_check->first = 0; } else { @@ -1651,7 +1642,6 @@ ip4_local_check_src_x2 (vlib_buffer_t ** b, ip4_header_t ** ip, error[0] = last_check->error; error[1] = last_check->error; - last_check->first = 0; } } @@ -1695,7 +1685,7 @@ ip4_local_inline (vlib_main_t * vm, { u32 *from, n_left_from; vlib_node_runtime_t *error_node = - vlib_node_get_runtime (vm, ip4_input_node.index); + vlib_node_get_runtime (vm, ip4_local_node.index); u16 nexts[VLIB_FRAME_SIZE], *next; vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b; ip4_header_t *ip[2]; @@ -1824,6 +1814,8 @@ VLIB_REGISTER_NODE (ip4_local_node) = .name = "ip4-local", .vector_size = sizeof (u32), .format_trace = format_ip4_forward_next_trace, + .n_errors = IP4_N_ERROR, + .error_strings = ip4_error_strings, .n_next_nodes = IP_LOCAL_N_NEXT, .next_nodes = { @@ -1984,10 +1976,7 @@ ip4_ttl_inc (vlib_buffer_t * b, ip4_header_t * ip) i32 ttl; u32 checksum; if (PREDICT_FALSE (b->flags & VNET_BUFFER_F_LOCALLY_ORIGINATED)) - { - b->flags &= ~VNET_BUFFER_F_LOCALLY_ORIGINATED; - return; - } + return; ttl = ip->ttl; @@ -2010,10 +1999,7 @@ ip4_ttl_and_checksum_check (vlib_buffer_t * b, ip4_header_t * ip, u16 * next, i32 ttl; u32 checksum; if (PREDICT_FALSE (b->flags & VNET_BUFFER_F_LOCALLY_ORIGINATED)) - { - b->flags &= ~VNET_BUFFER_F_LOCALLY_ORIGINATED; - return; - } + return; ttl = ip->ttl;