summaryrefslogtreecommitdiffstats
path: root/src/plugins/srv6-mobile
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/srv6-mobile')
-rw-r--r--src/plugins/srv6-mobile/node.c63
-rw-r--r--src/plugins/srv6-mobile/test/test_srv6_mobile.py2
2 files changed, 31 insertions, 34 deletions
diff --git a/src/plugins/srv6-mobile/node.c b/src/plugins/srv6-mobile/node.c
index d79ad707232..fd11c07e8a7 100644
--- a/src/plugins/srv6-mobile/node.c
+++ b/src/plugins/srv6-mobile/node.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019 Arrcus Inc and/or its affiliates.
+ * Copyright (c) 2020 Arrcus Inc and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
@@ -1324,7 +1324,6 @@ VLIB_NODE_FN (srv6_end_m_gtp6_e) (vlib_main_t * vm,
u8 ie_buf[GTPU_IE_MAX_SIZ];
index = ls0->localsid_prefix_len;
- index += 8;
offset = index / 8;
shift = index % 8;
@@ -1332,23 +1331,26 @@ VLIB_NODE_FN (srv6_end_m_gtp6_e) (vlib_main_t * vm,
if (PREDICT_TRUE (shift == 0))
{
+ qfi = dst0.as_u8[offset];
+
if (gtpu_type == GTPU_TYPE_ECHO_REQUEST
|| gtpu_type == GTPU_TYPE_ECHO_REPLY
|| gtpu_type == GTPU_TYPE_ERROR_INDICATION)
{
- clib_memcpy_fast (&seq, &dst0.as_u8[offset], 2);
+ clib_memcpy_fast (&seq, &dst0.as_u8[offset + 1], 2);
}
else
{
- clib_memcpy_fast (teid8p, &dst0.as_u8[offset], 4);
+ clib_memcpy_fast (teid8p, &dst0.as_u8[offset + 1], 4);
}
-
- qfi = dst0.as_u8[offset + 4];
}
else
{
u8 *sp;
+ qfi |= dst0.as_u8[offset] << shift;
+ qfi |= dst0.as_u8[offset + 1] >> (8 - shift);
+
if (gtpu_type == GTPU_TYPE_ECHO_REQUEST
|| gtpu_type == GTPU_TYPE_ECHO_REPLY
|| gtpu_type == GTPU_TYPE_ERROR_INDICATION)
@@ -1356,24 +1358,21 @@ VLIB_NODE_FN (srv6_end_m_gtp6_e) (vlib_main_t * vm,
sp = (u8 *) & seq;
for (index = 0; index < 2; index++)
{
- sp[index] = dst0.as_u8[offset + index] << shift;
+ sp[index] = dst0.as_u8[offset + index + 1] << shift;
sp[index] |=
- dst0.as_u8[offset + index + 1] >> (8 - shift);
+ dst0.as_u8[offset + index + 2] >> (8 - shift);
}
}
else
{
for (index = 0; index < 4; index++)
{
- *teid8p = dst0.as_u8[offset + index] << shift;
+ *teid8p = dst0.as_u8[offset + index + 1] << shift;
*teid8p |=
- dst0.as_u8[offset + index + 1] >> (8 - shift);
+ dst0.as_u8[offset + index + 2] >> (8 - shift);
teid8p++;
}
}
-
- qfi |= dst0.as_u8[offset + 4] << shift;
- qfi |= dst0.as_u8[offset + 5] >> (8 - shift);
}
if (qfi)
@@ -1688,18 +1687,17 @@ VLIB_NODE_FN (srv6_end_m_gtp6_d) (vlib_main_t * vm,
offset = ls_param->sr_prefixlen / 8;
shift = ls_param->sr_prefixlen % 8;
- offset += 1;
if (PREDICT_TRUE (shift == 0))
{
if (gtpu_type == GTPU_TYPE_ECHO_REQUEST
|| gtpu_type == GTPU_TYPE_ECHO_REPLY
|| gtpu_type == GTPU_TYPE_ERROR_INDICATION)
{
- clib_memcpy_fast (&seg0.as_u8[offset], seqp, 2);
+ clib_memcpy_fast (&seg0.as_u8[offset + 1], seqp, 2);
}
else
{
- clib_memcpy_fast (&seg0.as_u8[offset], teidp, 4);
+ clib_memcpy_fast (&seg0.as_u8[offset + 1], teidp, 4);
}
if (qfip)
@@ -1713,7 +1711,7 @@ VLIB_NODE_FN (srv6_end_m_gtp6_d) (vlib_main_t * vm,
qfi |= SRV6_PDU_SESSION_U_BIT_MASK;
}
- seg0.as_u8[offset + 4] = qfi;
+ seg0.as_u8[offset] = qfi;
}
}
else
@@ -1726,8 +1724,8 @@ VLIB_NODE_FN (srv6_end_m_gtp6_d) (vlib_main_t * vm,
{
for (idx = 0; idx < 2; idx++)
{
- seg0.as_u8[offset + idx] |= seqp[idx] >> shift;
- seg0.as_u8[offset + idx + 1] |=
+ seg0.as_u8[offset + idx + 1] |= seqp[idx] >> shift;
+ seg0.as_u8[offset + idx + 2] |=
seqp[idx] << (8 - shift);
}
}
@@ -1735,8 +1733,8 @@ VLIB_NODE_FN (srv6_end_m_gtp6_d) (vlib_main_t * vm,
{
for (idx = 0; idx < 4; idx++)
{
- seg0.as_u8[offset + idx] |= teidp[idx] >> shift;
- seg0.as_u8[offset + idx + 1] |=
+ seg0.as_u8[offset + idx + 1] |= teidp[idx] >> shift;
+ seg0.as_u8[offset + idx + 2] |=
teidp[idx] << (8 - shift);
}
}
@@ -1752,8 +1750,8 @@ VLIB_NODE_FN (srv6_end_m_gtp6_d) (vlib_main_t * vm,
qfi |= SRV6_PDU_SESSION_U_BIT_MASK;
}
- seg0.as_u8[offset + 4] |= qfi >> shift;
- seg0.as_u8[offset + 5] |= qfi << (8 - shift);
+ seg0.as_u8[offset] |= qfi >> shift;
+ seg0.as_u8[offset + 1] |= qfi << (8 - shift);
}
}
@@ -2192,18 +2190,17 @@ VLIB_NODE_FN (srv6_end_m_gtp6_d_di) (vlib_main_t * vm,
offset = ls_param->sr_prefixlen / 8;
shift = ls_param->sr_prefixlen % 8;
- offset += 1;
if (PREDICT_TRUE (shift == 0))
{
if (gtpu_type == GTPU_TYPE_ECHO_REQUEST
|| gtpu_type == GTPU_TYPE_ECHO_REPLY
|| gtpu_type == GTPU_TYPE_ERROR_INDICATION)
{
- clib_memcpy_fast (&seg0.as_u8[offset], seqp, 2);
+ clib_memcpy_fast (&seg0.as_u8[offset + 1], seqp, 2);
}
else
{
- clib_memcpy_fast (&seg0.as_u8[offset], teidp, 4);
+ clib_memcpy_fast (&seg0.as_u8[offset + 1], teidp, 4);
}
if (qfip)
@@ -2217,7 +2214,7 @@ VLIB_NODE_FN (srv6_end_m_gtp6_d_di) (vlib_main_t * vm,
qfi |= SRV6_PDU_SESSION_U_BIT_MASK;
}
- seg0.as_u8[offset + 4] = qfi;
+ seg0.as_u8[offset] = qfi;
}
}
else
@@ -2230,8 +2227,8 @@ VLIB_NODE_FN (srv6_end_m_gtp6_d_di) (vlib_main_t * vm,
{
for (idx = 0; idx < 2; idx++)
{
- seg0.as_u8[offset + idx] |= seqp[idx] >> shift;
- seg0.as_u8[offset + idx + 1] |=
+ seg0.as_u8[offset + idx + 1] |= seqp[idx] >> shift;
+ seg0.as_u8[offset + idx + 2] |=
seqp[idx] << (8 - shift);
}
}
@@ -2239,8 +2236,8 @@ VLIB_NODE_FN (srv6_end_m_gtp6_d_di) (vlib_main_t * vm,
{
for (idx = 0; idx < 4; idx++)
{
- seg0.as_u8[offset + idx] |= teidp[idx] >> shift;
- seg0.as_u8[offset + idx + 1] |=
+ seg0.as_u8[offset + idx + 1] |= teidp[idx] >> shift;
+ seg0.as_u8[offset + idx + 2] |=
teidp[idx] << (8 - shift);
}
}
@@ -2256,8 +2253,8 @@ VLIB_NODE_FN (srv6_end_m_gtp6_d_di) (vlib_main_t * vm,
qfi |= SRV6_PDU_SESSION_U_BIT_MASK;
}
- seg0.as_u8[offset + 4] |= qfi >> shift;
- seg0.as_u8[offset + 5] |= qfi << (8 - shift);
+ seg0.as_u8[offset] |= qfi >> shift;
+ seg0.as_u8[offset + 1] |= qfi << (8 - shift);
}
}
diff --git a/src/plugins/srv6-mobile/test/test_srv6_mobile.py b/src/plugins/srv6-mobile/test/test_srv6_mobile.py
index fb1abf98e0f..a695c9d7115 100644
--- a/src/plugins/srv6-mobile/test/test_srv6_mobile.py
+++ b/src/plugins/srv6-mobile/test/test_srv6_mobile.py
@@ -203,7 +203,7 @@ class TestSRv6EndMGTP6E(VppTestCase):
raise
def create_packets(self, inner):
- # 64bit prefix + 32bit TEID + 8bit QFI + 24bit
+ # 64bit prefix + 8bit QFI + 32bit TEID + 24bit
dst = b'\xaa' * 8 + b'\x00' + \
b'\xbb' * 4 + b'\x00' * 3
ip6_dst = IPv6Address(dst)