aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/dpo
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/dpo')
-rw-r--r--src/vnet/dpo/mpls_disposition.c74
1 files changed, 54 insertions, 20 deletions
diff --git a/src/vnet/dpo/mpls_disposition.c b/src/vnet/dpo/mpls_disposition.c
index 5dc33fcfdbd..77429de4116 100644
--- a/src/vnet/dpo/mpls_disposition.c
+++ b/src/vnet/dpo/mpls_disposition.c
@@ -13,7 +13,8 @@
* limitations under the License.
*/
-#include <vnet/ip/ip.h>
+#include <vnet/ip/ip4_input.h>
+#include <vnet/ip/ip6_input.h>
#include <vnet/dpo/mpls_disposition.h>
#include <vnet/mpls/mpls.h>
@@ -115,6 +116,9 @@ typedef struct mpls_label_disposition_trace_t_
index_t mdd;
} mpls_label_disposition_trace_t;
+extern vlib_node_registration_t ip4_mpls_label_disposition_node;
+extern vlib_node_registration_t ip6_mpls_label_disposition_node;
+
always_inline uword
mpls_label_disposition_inline (vlib_main_t * vm,
vlib_node_runtime_t * node,
@@ -123,6 +127,12 @@ mpls_label_disposition_inline (vlib_main_t * vm,
u8 payload_is_ip6)
{
u32 n_left_from, next_index, * from, * to_next;
+ vlib_node_runtime_t *error_node;
+
+ if (payload_is_ip4)
+ error_node = vlib_node_get_runtime (vm, ip4_mpls_label_disposition_node.index);
+ else
+ error_node = vlib_node_get_runtime (vm, ip6_mpls_label_disposition_node.index);
from = vlib_frame_vector_args (from_frame);
n_left_from = from_frame->n_vectors;
@@ -173,21 +183,39 @@ mpls_label_disposition_inline (vlib_main_t * vm,
mdd0 = mpls_disp_dpo_get(mddi0);
mdd1 = mpls_disp_dpo_get(mddi1);
+ next0 = mdd0->mdd_dpo.dpoi_next_node;
+ next1 = mdd1->mdd_dpo.dpoi_next_node;
+
if (payload_is_ip4)
{
+ ip4_header_t *ip0, *ip1;
+
+ ip0 = vlib_buffer_get_current (b0);
+ ip1 = vlib_buffer_get_current (b1);
+
/*
- * decrement the TTL on ingress to the LSP
+ * IPv4 input checks on the exposed IP header
+ * including checksum
*/
+ ip4_input_check_x2 (vm, error_node,
+ b0, b1, ip0, ip1,
+ &next0, &next1, 1);
}
else if (payload_is_ip6)
{
+ ip6_header_t *ip0, *ip1;
+
+ ip0 = vlib_buffer_get_current (b0);
+ ip1 = vlib_buffer_get_current (b1);
+
/*
- * decrement the TTL on ingress to the LSP
+ * IPv6 input checks on the exposed IP header
*/
+ ip6_input_check_x2 (vm, error_node,
+ b0, b1, ip0, ip1,
+ &next0, &next1);
}
-
- next0 = mdd0->mdd_dpo.dpoi_next_node;
- next1 = mdd1->mdd_dpo.dpoi_next_node;
+
vnet_buffer(b0)->ip.adj_index[VLIB_TX] = mdd0->mdd_dpo.dpoi_index;
vnet_buffer(b1)->ip.adj_index[VLIB_TX] = mdd1->mdd_dpo.dpoi_index;
vnet_buffer(b0)->ip.rpf_id = mdd0->mdd_rpf_id;
@@ -231,24 +259,32 @@ mpls_label_disposition_inline (vlib_main_t * vm,
/* dst lookup was done by ip4 lookup */
mddi0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
mdd0 = mpls_disp_dpo_get(mddi0);
+ next0 = mdd0->mdd_dpo.dpoi_next_node;
if (payload_is_ip4)
{
+ ip4_header_t *ip0;
+
+ ip0 = vlib_buffer_get_current (b0);
+
/*
- * decrement the TTL on ingress to the LSP
+ * IPv4 input checks on the exposed IP header
+ * including checksum
*/
+ ip4_input_check_x1 (vm, error_node, b0, ip0, &next0, 1);
}
else if (payload_is_ip6)
{
+ ip6_header_t *ip0;
+
+ ip0 = vlib_buffer_get_current (b0);
+
/*
- * decrement the TTL on ingress to the LSP
+ * IPv6 input checks on the exposed IP header
*/
- }
- else
- {
+ ip6_input_check_x1 (vm, error_node, b0, ip0, &next0);
}
- next0 = mdd0->mdd_dpo.dpoi_next_node;
vnet_buffer(b0)->ip.adj_index[VLIB_TX] = mdd0->mdd_dpo.dpoi_index;
vnet_buffer(b0)->ip.rpf_id = mdd0->mdd_rpf_id;
@@ -294,10 +330,9 @@ VLIB_REGISTER_NODE (ip4_mpls_label_disposition_node) = {
.vector_size = sizeof (u32),
.format_trace = format_mpls_label_disposition_trace,
- .n_next_nodes = 1,
- .next_nodes = {
- [0] = "ip4-drop",
- }
+ .sibling_of = "ip4-input",
+ .n_errors = IP4_N_ERROR,
+ .error_strings = ip4_error_strings,
};
VLIB_NODE_FUNCTION_MULTIARCH (ip4_mpls_label_disposition_node,
ip4_mpls_label_disposition)
@@ -316,10 +351,9 @@ VLIB_REGISTER_NODE (ip6_mpls_label_disposition_node) = {
.vector_size = sizeof (u32),
.format_trace = format_mpls_label_disposition_trace,
- .n_next_nodes = 1,
- .next_nodes = {
- [0] = "ip6-drop",
- }
+ .sibling_of = "ip6-input",
+ .n_errors = IP6_N_ERROR,
+ .error_strings = ip6_error_strings,
};
VLIB_NODE_FUNCTION_MULTIARCH (ip6_mpls_label_disposition_node,
ip6_mpls_label_disposition)