bugfix: TSG-21824 filter service chaining rendered service path (RSP)

* 'mirroring block' does not affect RSP
    * 'steering block' terminates RSP

Example:
   Service Function List : A(steering)->B(mirroring block)->C(mirroring)->D(steering block)->E(mirroing)
   Expect RSP            : A->C
This commit is contained in:
luwenpeng
2024-07-12 11:45:10 +08:00
parent a0f1eca0ce
commit 9bd91c3c63

View File

@@ -787,8 +787,6 @@ static int send_ctrl_packet(struct session_ctx *session_ctx, struct thread_ctx *
struct selected_chaining *chaining_raw = session_ctx->chaining_raw; struct selected_chaining *chaining_raw = session_ctx->chaining_raw;
struct selected_chaining *chaining_decrypted = session_ctx->chaining_decrypted; struct selected_chaining *chaining_decrypted = session_ctx->chaining_decrypted;
int thread_index = thread_ctx->thread_index; int thread_index = thread_ctx->thread_index;
int sc_rsp_raw_exist = 0;
int sc_rsp_decrypted_exist = 0;
char *data; char *data;
size_t size; size_t size;
@@ -835,45 +833,39 @@ static int send_ctrl_packet(struct session_ctx *session_ctx, struct thread_ctx *
} }
{ {
mpack_write_cstr(&writer, "sc_rsp_raw");
mpack_build_array(&writer); // sc_rsp_raw begin
for (int i = 0; i < chaining_raw->chaining_used; i++) for (int i = 0; i < chaining_raw->chaining_used; i++)
{ {
struct selected_sf *sf = &(chaining_raw->chaining[i]); struct selected_sf *sf = &(chaining_raw->chaining[i]);
if (sf->sf_action == SESSION_ACTION_FORWARD) if (sf->sf_action == SESSION_ACTION_FORWARD)
{ {
if (sc_rsp_raw_exist == 0)
{
mpack_write_cstr(&writer, "sc_rsp_raw");
mpack_build_array(&writer); // sc_rsp_raw begin
sc_rsp_raw_exist = 1;
}
mpack_write_u64(&writer, sf->sf_profile_id); mpack_write_u64(&writer, sf->sf_profile_id);
} }
if (sf->sf_action == SESSION_ACTION_BLOCK && sf->sff_forward_type == FORWARD_TYPE_STEERING)
{
break;
}
} }
if (sc_rsp_raw_exist == 1) mpack_complete_array(&writer); // sc_rsp_raw end
{
mpack_complete_array(&writer); // sc_rsp_raw end
}
} }
{ {
mpack_write_cstr(&writer, "sc_rsp_decrypted");
mpack_build_array(&writer); // sc_rsp_decrypted begin
for (int i = 0; i < chaining_decrypted->chaining_used; i++) for (int i = 0; i < chaining_decrypted->chaining_used; i++)
{ {
struct selected_sf *sf = &(chaining_decrypted->chaining[i]); struct selected_sf *sf = &(chaining_decrypted->chaining[i]);
if (sf->sf_action == SESSION_ACTION_FORWARD) if (sf->sf_action == SESSION_ACTION_FORWARD)
{ {
if (sc_rsp_decrypted_exist == 0)
{
mpack_write_cstr(&writer, "sc_rsp_decrypted");
mpack_build_array(&writer); // sc_rsp_decrypted begin
sc_rsp_decrypted_exist = 1;
}
mpack_write_u64(&writer, sf->sf_profile_id); mpack_write_u64(&writer, sf->sf_profile_id);
} }
if (sf->sf_action == SESSION_ACTION_BLOCK && sf->sff_forward_type == FORWARD_TYPE_STEERING)
{
break;
}
} }
if (sc_rsp_decrypted_exist == 1) mpack_complete_array(&writer); // sc_rsp_decrypted end
{
mpack_complete_array(&writer); // sc_rsp_decrypted end
}
} }
mpack_complete_map(&writer); // sce value end mpack_complete_map(&writer); // sce value end