summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2023-05-06 10:41:30 +0800
committerluwenpeng <[email protected]>2023-05-06 11:06:41 +0800
commitbd899c08f1f5854b6c899fe61c7fd861e3100b53 (patch)
tree540ce21724b906b8f91b1c1656701fd2b45a4397
parent1577f489c9cdc547a8d4d10bf14a73a1b0a5069a (diff)
SCE支持动态更新sid list; SCE存储raw packet/decrypted packet共计4个方向的metadata
-rw-r--r--platform/include/sce.h3
-rw-r--r--platform/src/packet_io.cpp117
-rw-r--r--platform/src/sce.cpp29
-rw-r--r--test/CMakeLists.txt10
-rw-r--r--test/gtest_mix_pkt_stee_forward.cpp124
-rw-r--r--test/test_data/conf/sce.conf7
-rw-r--r--test/test_data/log/test_mix_pkt_stee_forward_ok.fs223
-rw-r--r--test/test_data/resource/mix_pkt_stee_forward.json25
8 files changed, 309 insertions, 29 deletions
diff --git a/platform/include/sce.h b/platform/include/sce.h
index 5dbb1de..1a5a4af 100644
--- a/platform/include/sce.h
+++ b/platform/include/sce.h
@@ -58,6 +58,7 @@ struct metadata
struct metadata *metadata_new();
int metadata_is_empty(struct metadata *meta);
+void metadata_shallow_copy(struct metadata *dst, struct metadata *src);
void metadata_deep_copy(struct metadata *dst, struct metadata *src);
void metadata_free(struct metadata *meta);
@@ -73,6 +74,8 @@ struct session_ctx
struct addr_tuple4 inner_tuple4;
struct fixed_num_array rule_ids;
+ struct metadata *decrypted_meta_i2e;
+ struct metadata *decrypted_meta_e2i;
struct metadata *raw_meta_i2e;
struct metadata *raw_meta_e2i;
struct metadata *ctrl_meta;
diff --git a/platform/src/packet_io.cpp b/platform/src/packet_io.cpp
index ad37240..b9a3657 100644
--- a/platform/src/packet_io.cpp
+++ b/platform/src/packet_io.cpp
@@ -185,6 +185,92 @@ int mbuff_set_metadata(marsio_buff_t *tx_buff, struct metadata *meta)
return 0;
}
+static void update_session_by_metadata(struct session_ctx *ctx, struct metadata *meta)
+{
+ struct metadata *dst_meta_i2e = NULL;
+ struct metadata *dst_meta_e2i = NULL;
+
+ if (meta->is_decrypted)
+ {
+ dst_meta_i2e = ctx->decrypted_meta_i2e;
+ dst_meta_e2i = ctx->decrypted_meta_e2i;
+ }
+ else
+ {
+ dst_meta_i2e = ctx->raw_meta_i2e;
+ dst_meta_e2i = ctx->raw_meta_e2i;
+ }
+
+ if (meta->is_e2i_dir)
+ {
+ // first packet update metadata
+ if (metadata_is_empty(dst_meta_e2i))
+ {
+ metadata_shallow_copy(dst_meta_e2i, meta);
+ }
+ else
+ {
+ // next packet only update sids
+ sids_copy(&dst_meta_e2i->sids, &meta->sids);
+ }
+ }
+ else
+ {
+ // first packet update metadata
+ if (metadata_is_empty(dst_meta_i2e))
+ {
+ metadata_shallow_copy(dst_meta_i2e, meta);
+ }
+ else
+ {
+ // next packet only update sids
+ sids_copy(&dst_meta_i2e->sids, &meta->sids);
+ }
+ }
+}
+
+static void update_metadata_by_session(struct session_ctx *ctx, struct metadata *meta)
+{
+ struct sids *sids = NULL;
+ struct route_ctx *route_ctx = NULL;
+
+ meta->session_id = ctx->session_id;
+
+ if (meta->is_e2i_dir)
+ {
+ if (meta->is_decrypted)
+ {
+ sids = &ctx->decrypted_meta_e2i->sids;
+ route_ctx = &ctx->decrypted_meta_e2i->route_ctx;
+ }
+ else
+ {
+ sids = &ctx->raw_meta_e2i->sids;
+ route_ctx = &ctx->raw_meta_e2i->route_ctx;
+ }
+ }
+ else
+ {
+ if (meta->is_decrypted)
+ {
+ sids = &ctx->decrypted_meta_i2e->sids;
+ route_ctx = &ctx->decrypted_meta_i2e->route_ctx;
+ }
+ else
+ {
+ sids = &ctx->raw_meta_i2e->sids;
+ route_ctx = &ctx->raw_meta_i2e->route_ctx;
+ }
+ }
+
+ sids_copy(&meta->sids, sids);
+ route_ctx_copy(&meta->route_ctx, route_ctx);
+}
+
+/******************************************************************************
+ * keepalive
+ ******************************************************************************/
+
// return 0 : not keepalive packet
// return 1 : is keepalive packet
static int is_downlink_keepalive_packet(marsio_buff_t *rx_buff)
@@ -902,13 +988,13 @@ static void handle_raw_packet(marsio_buff_t *rx_buff, struct thread_ctx *thread_
// bypass_traffic:3 bypass decrypted traffic
if (unlikely(thread_ctx->ref_io->config.bypass_traffic == 2 && meta.is_decrypted == 0))
{
- LOG_DEBUG("%s: session %lu bypass, enable raw traffic bypass !!!", LOG_TAG_PKTIO);
+ LOG_DEBUG("%s: session %lu bypass, enable raw traffic bypass !!!", LOG_TAG_PKTIO, meta.session_id);
goto error_bypass;
}
if (unlikely(thread_ctx->ref_io->config.bypass_traffic == 3 && meta.is_decrypted == 1))
{
- LOG_DEBUG("%s: session %lu bypass, enable decrypted traffic bypass !!!", LOG_TAG_PKTIO);
+ LOG_DEBUG("%s: session %lu bypass, enable decrypted traffic bypass !!!", LOG_TAG_PKTIO, meta.session_id);
goto error_bypass;
}
@@ -919,20 +1005,7 @@ static void handle_raw_packet(marsio_buff_t *rx_buff, struct thread_ctx *thread_
goto error_bypass;
}
- if (meta.is_e2i_dir)
- {
- if (metadata_is_empty(session_ctx->raw_meta_e2i))
- {
- metadata_deep_copy(session_ctx->raw_meta_e2i, &meta);
- }
- }
- else
- {
- if (metadata_is_empty(session_ctx->raw_meta_i2e))
- {
- metadata_deep_copy(session_ctx->raw_meta_i2e, &meta);
- }
- }
+ update_session_by_metadata(session_ctx, &meta);
if (meta.is_decrypted == 1)
{
@@ -988,17 +1061,7 @@ static void handle_inject_packet(marsio_buff_t *rx_buff, struct thread_ctx *thre
goto error_block;
}
- meta.session_id = session_ctx->session_id;
- if (meta.is_e2i_dir)
- {
- sids_copy(&meta.sids, &session_ctx->raw_meta_e2i->sids);
- route_ctx_copy(&meta.route_ctx, &session_ctx->raw_meta_e2i->route_ctx);
- }
- else
- {
- sids_copy(&meta.sids, &session_ctx->raw_meta_i2e->sids);
- route_ctx_copy(&meta.route_ctx, &session_ctx->raw_meta_i2e->route_ctx);
- }
+ update_metadata_by_session(session_ctx, &meta);
if (meta.is_decrypted == 1)
{
diff --git a/platform/src/sce.cpp b/platform/src/sce.cpp
index 0d25511..439b84b 100644
--- a/platform/src/sce.cpp
+++ b/platform/src/sce.cpp
@@ -28,6 +28,21 @@ int metadata_is_empty(struct metadata *meta)
}
}
+void metadata_shallow_copy(struct metadata *dst, struct metadata *src)
+{
+ dst->write_ref++;
+ dst->session_id = src->session_id;
+ dst->raw_data = NULL;
+ dst->raw_len = 0;
+ dst->l7offset = src->l7offset;
+ dst->is_e2i_dir = src->is_e2i_dir;
+ dst->is_ctrl_pkt = src->is_ctrl_pkt;
+ dst->is_decrypted = src->is_decrypted;
+
+ sids_copy(&dst->sids, &src->sids);
+ route_ctx_copy(&dst->route_ctx, &src->route_ctx);
+}
+
void metadata_deep_copy(struct metadata *dst, struct metadata *src)
{
dst->write_ref++;
@@ -70,6 +85,8 @@ struct session_ctx *session_ctx_new()
fixed_num_array_init(&session_ctx->rule_ids);
+ session_ctx->decrypted_meta_i2e = metadata_new();
+ session_ctx->decrypted_meta_e2i = metadata_new();
session_ctx->raw_meta_i2e = metadata_new();
session_ctx->raw_meta_e2i = metadata_new();
session_ctx->ctrl_meta = metadata_new();
@@ -81,6 +98,18 @@ void session_ctx_free(struct session_ctx *session_ctx)
{
if (session_ctx)
{
+ if (session_ctx->decrypted_meta_i2e)
+ {
+ metadata_free(session_ctx->decrypted_meta_i2e);
+ session_ctx->decrypted_meta_i2e = NULL;
+ }
+
+ if (session_ctx->decrypted_meta_e2i)
+ {
+ metadata_free(session_ctx->decrypted_meta_e2i);
+ session_ctx->decrypted_meta_e2i = NULL;
+ }
+
if (session_ctx->raw_meta_i2e)
{
metadata_free(session_ctx->raw_meta_i2e);
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index b2ea43f..c29cfa0 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -121,6 +121,15 @@ target_include_directories(gtest_raw_pkt_error_bypass PUBLIC ${CMAKE_SOURCE_DIR}
target_link_libraries(gtest_raw_pkt_error_bypass temp_platform gtest)
###############################################################################
+# gtest_mix_pkt_stee_forward
+###############################################################################
+
+add_executable(gtest_mix_pkt_stee_forward gtest_mix_pkt_stee_forward.cpp)
+target_include_directories(gtest_mix_pkt_stee_forward PUBLIC ${CMAKE_SOURCE_DIR}/common/include)
+target_include_directories(gtest_mix_pkt_stee_forward PUBLIC ${CMAKE_SOURCE_DIR}/platform/include)
+target_link_libraries(gtest_mix_pkt_stee_forward temp_platform gtest)
+
+###############################################################################
# gtest_discover_tests
###############################################################################
@@ -140,6 +149,7 @@ gtest_discover_tests(gtest_raw_pkt_mirr_forward)
gtest_discover_tests(gtest_raw_pkt_mirr_rx_drop)
gtest_discover_tests(gtest_raw_pkt_error_bypass)
+gtest_discover_tests(gtest_mix_pkt_stee_forward)
file(COPY ./test_data/log/ DESTINATION ./log/)
file(COPY ./test_data/conf/ DESTINATION ./conf/)
diff --git a/test/gtest_mix_pkt_stee_forward.cpp b/test/gtest_mix_pkt_stee_forward.cpp
new file mode 100644
index 0000000..37eed7c
--- /dev/null
+++ b/test/gtest_mix_pkt_stee_forward.cpp
@@ -0,0 +1,124 @@
+#include "gtest_utils.h"
+
+// 147 bytes
+static u_char ctrl_pkt_active_for_raw_pkt[] = {
+ // Eth + IPv4 + TCP
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0xab, 0x76, 0x23, 0x40, 0x00, 0x7d, 0x06, 0x67, 0x66, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0e, 0x1e, 0x47, 0x34, 0x32, 0xb9, 0x50, 0x18,
+ 0x04, 0x88, 0x7a, 0xe8, 0x00, 0x00,
+ // msg payload
+ 0x85, 0xA5, 0x74, 0x73, 0x79, 0x6E, 0x63, 0xA3, 0x32, 0x2E, 0x30, 0xAA, 0x73, 0x65, 0x73, 0x73,
+ 0x69, 0x6F, 0x6E, 0x5F, 0x69, 0x64, 0xCF, 0x04, 0x08, 0x02, 0x1B, 0x68, 0x4C, 0x03, 0xE9, 0xA5,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0xA6, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0xA6, 0x6D, 0x65, 0x74,
+ 0x68, 0x6F, 0x64, 0xAD, 0x70, 0x6F, 0x6C, 0x69, 0x63, 0x79, 0x5F, 0x75, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0xA6, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x81, 0xA3, 0x73, 0x63, 0x65, 0x81, 0xA8, 0x72,
+ 0x75, 0x6C, 0x65, 0x5F, 0x69, 0x64, 0x73, 0x91, 0xCE, 0x00, 0x0F, 0x2F, 0x7F};
+
+// 147 bytes
+static u_char ctrl_pkt_active_for_decrypted_pkt[] = {
+ // Eth + IPv4 + TCP
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0xab, 0x76, 0x23, 0x40, 0x00, 0x7d, 0x06, 0x67, 0x66, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0e, 0x1e, 0x47, 0x34, 0x32, 0xb9, 0x50, 0x18,
+ 0x04, 0x88, 0x7a, 0xe8, 0x00, 0x00,
+ // msg payload
+ 0x85, 0xA5, 0x74, 0x73, 0x79, 0x6E, 0x63, 0xA3, 0x32, 0x2E, 0x30, 0xAA, 0x73, 0x65, 0x73, 0x73,
+ 0x69, 0x6F, 0x6E, 0x5F, 0x69, 0x64, 0xCF, 0x04, 0x08, 0x02, 0x1B, 0x68, 0x4C, 0x03, 0xE9, 0xA5,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0xA6, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0xA6, 0x6D, 0x65, 0x74,
+ 0x68, 0x6F, 0x64, 0xAD, 0x70, 0x6F, 0x6C, 0x69, 0x63, 0x79, 0x5F, 0x75, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0xA6, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x81, 0xA3, 0x73, 0x63, 0x65, 0x81, 0xA8, 0x72,
+ 0x75, 0x6C, 0x65, 0x5F, 0x69, 0x64, 0x73, 0x91, 0xCE, 0x00, 0x0F, 0x2F, 0x80};
+
+// 145 bytes
+static u_char raw_pkt[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x83, 0x46, 0x1f, 0x40, 0x00, 0x40, 0x06, 0xd4, 0x92, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0d, 0xcf, 0x47, 0x34, 0x32, 0xb9, 0x80, 0x18,
+ 0xfa, 0xf0, 0xad, 0xf4, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x45, 0xfc, 0x39, 0x3d, 0xc1, 0x1f,
+ 0x8d, 0x76, 0x47, 0x45, 0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31,
+ 0x0d, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x0d, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67,
+ 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x63, 0x75, 0x72, 0x6c, 0x2f, 0x37, 0x2e, 0x36, 0x31, 0x2e, 0x31,
+ 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x2a, 0x2f, 0x2a, 0x0d, 0x0a, 0x0d,
+ 0x0a};
+
+// 145 bytes
+static u_char decrypted_pkt[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x83, 0x46, 0x1f, 0x40, 0x00, 0x40, 0x06, 0xd4, 0x92, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0d, 0xcf, 0x47, 0x34, 0x32, 0xb9, 0x80, 0x18,
+ 0xfa, 0xf0, 0xad, 0xf4, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x45, 0xfc, 0x39, 0x3d, 0xc1, 0x1f,
+ 0x8d, 0x76, 0x47, 0x45, 0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31,
+ 0x0d, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x0d, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67,
+ 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x63, 0x75, 0x72, 0x6c, 0x2f, 0x37, 0x2e, 0x36, 0x31, 0x2e, 0x31,
+ 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x2a, 0x2f, 0x2a, 0x0d, 0x0a, 0x0d,
+ 0x0a};
+
+TEST(PACKET_IO, MIX_PKT_STEE_FORWARD)
+{
+ marsio_buff_t *tx_mbuf1 = NULL;
+ marsio_buff_t *tx_mbuf2 = NULL;
+ marsio_buff_t *tx_mbuf3 = NULL;
+ marsio_buff_t *tx_mbuf4 = NULL;
+
+ marsio_buff_t *dup_mbuf1 = NULL;
+ marsio_buff_t *dup_mbuf2 = NULL;
+ marsio_buff_t *dup_mbuf3 = NULL;
+ marsio_buff_t *dup_mbuf4 = NULL;
+
+ struct gtest_frame *gtest_frame = NULL;
+ struct mr_instance *mr_instance = NULL;
+
+ // build ctrl packet for raw packet
+ build_mbuf_for_ctrl_pkt(tx_mbuf1, ctrl_pkt_active_for_raw_pkt, sizeof(ctrl_pkt_active_for_raw_pkt), 290484492702581737, 54);
+ // build raw packet
+ build_mbuf_for_raw_pkt(tx_mbuf2, raw_pkt, sizeof(raw_pkt), 290484492702581737, 0);
+ dup_mbuf1 = marsio_mbuff_dup(tx_mbuf1);
+ dup_mbuf2 = marsio_mbuff_dup(tx_mbuf2);
+
+ // build ctrl packet for decrypted packet
+ build_mbuf_for_ctrl_pkt(tx_mbuf3, ctrl_pkt_active_for_decrypted_pkt, sizeof(ctrl_pkt_active_for_decrypted_pkt), 290484492702581737, 54);
+ // build decrypted packet
+ build_mbuf_for_raw_pkt(tx_mbuf4, decrypted_pkt, sizeof(decrypted_pkt), 290484492702581737, 1);
+ dup_mbuf3 = marsio_mbuff_dup(tx_mbuf3);
+ dup_mbuf4 = marsio_mbuff_dup(tx_mbuf4);
+
+ gtest_frame = gtest_frame_new("mix_pkt_stee_forward.json", "mix_pkt_stee_forward");
+ mr_instance = packet_io_get_mr_instance(gtest_frame->sce_ctx->io);
+
+ // recv ctrl packet of raw packet from nf
+ // send ctrl packet of raw packet to nf
+ gtest_frame_run(gtest_frame, tx_mbuf1, dup_mbuf1, 1);
+ // recv ctrl packet of decrypted packet from nf
+ // send ctrl packet of decrypted packet to nf
+ gtest_frame_run(gtest_frame, tx_mbuf3, dup_mbuf3, 1);
+ // recv raw packet from nf
+ // send vxlan packet to sf
+ marsio_set_recv_mbuff(mr_instance, tx_mbuf2);
+ EXPECT_TRUE(packet_io_thread_polling_nf(gtest_frame->sce_ctx->io, &gtest_frame->sce_ctx->work_threads[0]) == 1);
+ EXPECT_TRUE(mbuff_cmp_payload(dup_mbuf2, marsio_get_send_mbuff(mr_instance)) == 0);
+ // recv decrypted packet from nf
+ // send vxlan packet to sf
+ marsio_set_recv_mbuff(mr_instance, tx_mbuf4);
+ EXPECT_TRUE(packet_io_thread_polling_nf(gtest_frame->sce_ctx->io, &gtest_frame->sce_ctx->work_threads[0]) == 1);
+ EXPECT_TRUE(mbuff_cmp_payload(dup_mbuf4, marsio_get_send_mbuff(mr_instance)) == 0);
+
+ gtest_frame_log(gtest_frame);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf1, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf2, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf3, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf4, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &dup_mbuf1, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &dup_mbuf2, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &dup_mbuf3, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &dup_mbuf4, 1, 0, 0);
+ gtest_frame_free(gtest_frame);
+}
+
+int main(int argc, char **argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+} \ No newline at end of file
diff --git a/test/test_data/conf/sce.conf b/test/test_data/conf/sce.conf
index 4657e47..2ec3e40 100644
--- a/test/test_data/conf/sce.conf
+++ b/test/test_data/conf/sce.conf
@@ -39,8 +39,11 @@ redis_port_range=6379
max_chaining_size=32
[packet_io]
-# bypass_all_traffic:1 NF2NF and SF2SF
-bypass_all_traffic=0
+# bypass_traffic:0 disable
+# bypass_traffic:1 bypass all traffic
+# bypass_traffic:2 bypass raw traffic
+# bypass_traffic:3 bypass decrypted traffic
+bypass_traffic=0
rx_burst_max=128
app_symbol=sce
dev_endpoint=eth_sf_endpoint
diff --git a/test/test_data/log/test_mix_pkt_stee_forward_ok.fs2 b/test/test_data/log/test_mix_pkt_stee_forward_ok.fs2
new file mode 100644
index 0000000..d52d121
--- /dev/null
+++ b/test/test_data/log/test_mix_pkt_stee_forward_ok.fs2
@@ -0,0 +1,23 @@
+============================================================Fri May 5 11:08:21 2023============================================================
+ nf_rx_pkt nf_rx_B nf_tx_pkt nf_tx_B endp_rx_pkt endp_rx_B endp_tx_pkt endp_tx_B
+sum 4 584 2 294 0 0 2 390
+speed/s 0 0 0 0 0 0 0 0
+ kee_d_rx_pkt kee_d_rx_B kee_d_tx_pkt kee_d_tx_B kee_u_rx_pkt kee_u_rx_B kee_u_rxdop_pkt kee_u_rxdop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ mirr_bypass_pkt mirr_bypass_B mirr_block_pkt mirr_block_B mirr_rxdop_pkt mirr_rxdop_B mirro_tx_pkt mirro_tx_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ stee_bypass_pkt stee_bypass_B stee_block_pkt stee_block_B stee_rx_pkt stee_rx_B stee_tx_pkt stee_tx_B
+sum 0 0 0 0 0 0 2 290
+speed/s 0 0 0 0 0 0 0 0
+ miss_sess_pkt miss_sess_B err_bypass_pkt err_bypass_B err_block_pkt err_block_B endp_drop_pkt endp_drop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_rx_pkt ctrl_rx_B ctrl_tx_pkt ctrl_tx_B ctrl_opening ctrl_active ctrl_closing ctrl_resetall
+sum 2 294 2 294 0 2 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_error session_num session_logs sf_active sf_inactive
+sum 0 1 0 2 0
+speed/s 0 0 0 0 0
+________________________________________________________________________________________________________________________________________________
diff --git a/test/test_data/resource/mix_pkt_stee_forward.json b/test/test_data/resource/mix_pkt_stee_forward.json
new file mode 100644
index 0000000..19e47a9
--- /dev/null
+++ b/test/test_data/resource/mix_pkt_stee_forward.json
@@ -0,0 +1,25 @@
+{
+ "plugin_table": [
+ {
+ "table_name": "SERVICE_FUNCTION_PROFILE",
+ "table_content": [
+ "1\tdevice_group_a\t1\t{\"method\":\"vxlan_g\",\"dest_ip\":\"1.1.1.1\"}\t{\"method\":\"none\"}\t1\t1",
+ "2\tdevice_group_a\t1\t{\"method\":\"vxlan_g\",\"dest_ip\":\"2.2.2.2\"}\t{\"method\":\"none\"}\t1\t1"
+ ]
+ },
+ {
+ "table_name": "SERVICE_FUNCTION_FORWARDER_PROFILE",
+ "table_content": [
+ "1\t1\thash-int-ip\tglobal\tbypass\tnull\t[1]\t1",
+ "2\t1\thash-ext-ip\tglobal\tbypass\tnull\t[1]\t1"
+ ]
+ },
+ {
+ "table_name": "SERVICE_CHAINING_COMPILE",
+ "table_content": [
+ "995199\t0\t2\t1\t1\t{}\t{\"vsys_id\":1,\"targeted_traffic\":\"raw\",\"sff_profiles\":[1]}\t1\t2",
+ "995200\t0\t2\t1\t1\t{}\t{\"vsys_id\":1,\"targeted_traffic\":\"decrypted\",\"sff_profiles\":[2]}\t1\t2"
+ ]
+ }
+ ]
+} \ No newline at end of file