diff options
| author | yangwei <[email protected]> | 2023-12-28 14:58:41 +0800 |
|---|---|---|
| committer | yangwei <[email protected]> | 2023-12-29 18:07:05 +0800 |
| commit | 2c6221da3e7238eb6082020f70d04c40c013a971 (patch) | |
| tree | 0e744bbaba033c9db4d4793f4fd2e18b96009c19 | |
| parent | 3b2e595f348fc81a3eae21f8fa6fcfeef3caf4b2 (diff) | |
🐞 fix(context rawpkt info): Fix TSG-18200
按流方向存储历史数据包和元信息,避免重复流量时出现两侧都是ingress的情况
| -rw-r--r-- | include/private/stream_internal.h | 5 | ||||
| -rw-r--r-- | src/dealpkt/plug_support.c | 209 | ||||
| -rw-r--r-- | src/dealpkt/stream_manage.c | 66 | ||||
| -rw-r--r-- | src/packet_io/sendpacket.c | 18 |
4 files changed, 143 insertions, 155 deletions
diff --git a/include/private/stream_internal.h b/include/private/stream_internal.h index 679786f..eee5e8b 100644 --- a/include/private/stream_internal.h +++ b/include/private/stream_internal.h @@ -185,9 +185,8 @@ struct half_tcpstream /* ����ÿ�������������һ����, ����polling entry����ʹ�� */ typedef struct { - const raw_pkt_t *raw_pkt_up; - const raw_pkt_t *raw_pkt_down; - struct rawpkt_metadata* meta[2];// ÿ������metadata������洢��polling_inject_context��, update_raw_pkt��������ʱ����������䵽���ص�rawpkt�� + const raw_pkt_t *raw_pkt_stream_dir[2]; + struct rawpkt_metadata* meta_stream_dir[2];// ÿ������metadata������洢��polling_inject_context��, update_raw_pkt��������ʱ����������䵽���ص�rawpkt�� }polling_inject_context_t; struct streaminfo_private diff --git a/src/dealpkt/plug_support.c b/src/dealpkt/plug_support.c index 2753fc3..29d078d 100644 --- a/src/dealpkt/plug_support.c +++ b/src/dealpkt/plug_support.c @@ -410,14 +410,15 @@ const void *get_rawpkt_from_streaminfo(const struct streaminfo *pstream, int rou {
const struct streaminfo_private *pstream_pr = (const struct streaminfo_private *)pstream;
if(pstream_pr->polling_inject_context == NULL)return NULL;
- switch (route_direction)
- {
- case DIR_ROUTE_UP:
- return pstream_pr->polling_inject_context->raw_pkt_up;
- case DIR_ROUTE_DOWN:
- return pstream_pr->polling_inject_context->raw_pkt_down;
- }
- return NULL;
+ if (pstream_pr->stream_c2s_route_dir == DIR_ROUTE_UP)
+ {
+ return pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_C2S - 1];
+ }
+ else if (pstream_pr->stream_c2s_route_dir == DIR_ROUTE_DOWN)
+ {
+ return pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_S2C - 1];
+ }
+ return NULL;
}
const struct streaminfo *get_streaminfo_from_rawpkt(const void *rawpkt)
@@ -481,10 +482,10 @@ int get_rawpkt_opt_from_streaminfo(const struct streaminfo *pstream, int type, v case RAW_PKT_GET_ROUTE_CTX:
{
void **value = (void **)out_value;
- if(pstream_pr->polling_inject_context->meta[pstream->routedir] != NULL)
+ if(pstream_pr->polling_inject_context->meta_stream_dir[pstream->curdir - 1] != NULL)
{
- *value = (void *)(pstream_pr->polling_inject_context->meta[pstream->routedir]->data);
- ret = pstream_pr->polling_inject_context->meta[pstream->routedir]->sz_data;
+ *value = (void *)(pstream_pr->polling_inject_context->meta_stream_dir[pstream->curdir - 1]->data);
+ ret = pstream_pr->polling_inject_context->meta_stream_dir[pstream->curdir - 1]->sz_data;
}
return ret;
}
@@ -492,9 +493,9 @@ int get_rawpkt_opt_from_streaminfo(const struct streaminfo *pstream, int type, v case RAW_PKT_GET_SID_LIST:
{
void **value = (void **)out_value;
- if(pstream_pr->polling_inject_context->meta[pstream->routedir] != NULL)
+ if(pstream_pr->polling_inject_context->meta_stream_dir[pstream->curdir - 1] != NULL)
{
- *value = (void *)(&pstream_pr->polling_inject_context->meta[pstream->routedir]->raw_sid_list);
+ *value = (void *)(&pstream_pr->polling_inject_context->meta_stream_dir[pstream->curdir - 1]->raw_sid_list);
ret = sizeof(struct segment_id_list);
}
return ret;
@@ -1698,65 +1699,26 @@ int MESA_get_stream_opt(const struct streaminfo *pstream, enum MESA_stream_opt o ret = MESA_get_stream_dup_pkt_stat(pstream, opt_val, opt_val_len);
break;
case MSO_STREAM_C2S_RAWPKT_HDR:
- case MSO_STREAM_S2C_RAWPKT_HDR:
- {
- const raw_pkt_t *rawpkt = NULL;
- if(pstream_pr->stream_c2s_route_dir == DIR_ROUTE_UP)
+ case MSO_STREAM_S2C_RAWPKT_HDR:
{
- if(opt == MSO_STREAM_C2S_RAWPKT_HDR)
+ const raw_pkt_t *rawpkt = NULL;
+ if (opt == MSO_STREAM_C2S_RAWPKT_HDR)
{
- rawpkt=pstream_pr->polling_inject_context->raw_pkt_up;
+ rawpkt = pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_C2S - 1];
}
- else
+ else
{
- rawpkt=pstream_pr->polling_inject_context->raw_pkt_down;
+ rawpkt = pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_S2C - 1];
}
- }
- else
- {
- if(opt == MSO_STREAM_C2S_RAWPKT_HDR)
+ if (rawpkt != NULL)
{
- rawpkt=pstream_pr->polling_inject_context->raw_pkt_down;
+ *((void **)opt_val) = (void *)((const char *)rawpkt->raw_pkt_data + rawpkt->overlay_layer_bytes);
+ *opt_val_len = rawpkt->offset_to_raw_pkt_hdr - rawpkt->overlay_layer_bytes;
}
- else
- {
- rawpkt=pstream_pr->polling_inject_context->raw_pkt_up;
- }
- }
-#if 0
- if ((opt == MSO_STREAM_C2S_RAWPKT_HDR && pstream->curdir == DIR_C2S)
- || (opt == MSO_STREAM_S2C_RAWPKT_HDR && pstream->curdir == DIR_S2C))
- {
- if (pstream->routedir == DIR_ROUTE_UP)
- {
- rawpkt = pstream_pr->polling_inject_context->raw_pkt_up;
- }
- else
- {
- rawpkt = pstream_pr->polling_inject_context->raw_pkt_down;
- }
- }
- else
- {
- if (pstream->routedir == DIR_ROUTE_UP)
- {
- rawpkt = pstream_pr->polling_inject_context->raw_pkt_down;
- }
- else
- {
- rawpkt = pstream_pr->polling_inject_context->raw_pkt_up;
- }
- }
-#endif
- if (rawpkt != NULL)
- {
- *((void **)opt_val) = (void *)((const char *)rawpkt->raw_pkt_data + rawpkt->overlay_layer_bytes);
- *opt_val_len = rawpkt->offset_to_raw_pkt_hdr - rawpkt->overlay_layer_bytes;
- }
- }
- break;
+ }
+ break;
- case MSO_STREAM_C2S_SYN_NUM:
+ case MSO_STREAM_C2S_SYN_NUM:
case MSO_STREAM_S2C_SYN_NUM:
if ((STREAM_TYPE_TCP != pstream->type) || pdetail_pr->flow_stat == NULL || *opt_val_len != sizeof(unsigned int))
{
@@ -1789,55 +1751,48 @@ int MESA_get_stream_opt(const struct streaminfo *pstream, enum MESA_stream_opt o }
break;
- case MSO_STREAM_INBOND_LINK_ID:
- ret=-1;
- if(sapp_global_val->config.packet_io.inbound_route_dir == DIR_ROUTE_UP)
+ case MSO_STREAM_INBOND_LINK_ID:
+ case MSO_STREAM_OUTBOND_LINK_ID:
{
- if(pstream_pr->polling_inject_context->meta[DIR_ROUTE_UP])
- {
- *(unsigned int *)(opt_val)=pstream_pr->polling_inject_context->meta[DIR_ROUTE_UP]->link_id;
- *opt_val_len = sizeof(pstream_pr->polling_inject_context->meta[DIR_ROUTE_UP]->link_id);
- ret=0;
- }
- }
- else
- {
- if(pstream_pr->polling_inject_context->meta[DIR_ROUTE_DOWN])
+ ret = -1;
+ struct rawpkt_metadata *meta = NULL;
+ if (pstream_pr->stream_c2s_route_dir == DIR_ROUTE_UP)
{
- *(unsigned int *)(opt_val)=pstream_pr->polling_inject_context->meta[DIR_ROUTE_DOWN]->link_id;
- *opt_val_len = sizeof(pstream_pr->polling_inject_context->meta[DIR_ROUTE_DOWN]->link_id);
- ret=0;
+ if (opt == MSO_STREAM_OUTBOND_LINK_ID)
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_C2S - 1];
+ }
+ else
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_S2C - 1];
+ }
}
- }
- break;
- case MSO_STREAM_OUTBOND_LINK_ID:
- ret=-1;
- *opt_val_len=0;
- if(sapp_global_val->config.packet_io.inbound_route_dir == DIR_ROUTE_DOWN)
- {
- if(pstream_pr->polling_inject_context->meta[DIR_ROUTE_UP])
+ else
{
- *(unsigned int *)(opt_val)=pstream_pr->polling_inject_context->meta[DIR_ROUTE_UP]->link_id;
- *opt_val_len = sizeof(pstream_pr->polling_inject_context->meta[DIR_ROUTE_UP]->link_id);
- ret=0;
- }
- }
- else
- {
- if(pstream_pr->polling_inject_context->meta[DIR_ROUTE_DOWN])
+ if (opt == MSO_STREAM_OUTBOND_LINK_ID)
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_S2C - 1];
+ }
+ else
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_C2S - 1];
+ }
+ }
+ if (meta)
{
- *(unsigned int *)(opt_val)=pstream_pr->polling_inject_context->meta[DIR_ROUTE_DOWN]->link_id;
- *opt_val_len = sizeof(pstream_pr->polling_inject_context->meta[DIR_ROUTE_DOWN]->link_id);
- ret=0;
+ *(unsigned int *)(opt_val) = meta->link_id;
+ *opt_val_len = sizeof(meta->link_id);
+ ret = 0;
}
- }
- break;
- case MSO_STREAM_C2S_ROUTE_DIRECTION:
+ }
+ break;
+ case MSO_STREAM_C2S_ROUTE_DIRECTION:
{
UCHAR *c2s_route_dir = (UCHAR *)opt_val;
*c2s_route_dir=pstream_pr->stream_c2s_route_dir;
- ret=0;
+ ret=0;
}
+
break;
case MSO_STREAM_APPLEND_SEGMENT_ID_LIST:
{
@@ -1869,32 +1824,44 @@ int MESA_get_stream_opt(const struct streaminfo *pstream, enum MESA_stream_opt o }
break;
}
- case MSO_STREAM_INBOND_ROUTE_CTX:
+ case MSO_STREAM_INBOND_ROUTE_CTX:
+ case MSO_STREAM_OUTBOND_ROUTE_CTX:
{
ret = -1;
*opt_val_len = 0;
- void **value = (void **)opt_val;
- if (pstream_pr->polling_inject_context->meta[DIR_ROUTE_DOWN])
+ void **value = (void **)opt_val;
+ struct rawpkt_metadata *meta = NULL;
+ if (pstream_pr->stream_c2s_route_dir == DIR_ROUTE_UP)
+ {
+ if (opt == MSO_STREAM_OUTBOND_ROUTE_CTX)
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_C2S - 1];
+ }
+ else
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_S2C - 1];
+ }
+ }
+ else
{
- *value = (void *)pstream_pr->polling_inject_context->meta[DIR_ROUTE_DOWN]->data;
- *opt_val_len = (pstream_pr->polling_inject_context->meta[DIR_ROUTE_DOWN]->sz_data);
- ret = (pstream_pr->polling_inject_context->meta[DIR_ROUTE_DOWN]->sz_data);
+ if (opt == MSO_STREAM_OUTBOND_ROUTE_CTX)
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_S2C - 1];
+ }
+ else
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_C2S - 1];
+ }
}
- break;
- }
- case MSO_STREAM_OUTBOND_ROUTE_CTX:
- {
- ret = -1;
- *opt_val_len = 0;
- void **value = (void **)opt_val;
- if (pstream_pr->polling_inject_context->meta[DIR_ROUTE_UP])
+
+ if (meta)
{
- *value = (void *)pstream_pr->polling_inject_context->meta[DIR_ROUTE_UP]->data;
- *opt_val_len = (pstream_pr->polling_inject_context->meta[DIR_ROUTE_UP]->sz_data);
- ret = (pstream_pr->polling_inject_context->meta[DIR_ROUTE_DOWN]->sz_data);
+ *value = (void *)meta->data;
+ *opt_val_len = meta->sz_data;
+ ret = meta->sz_data;
}
- break;
}
+ break;
default:
sapp_runtime_log(RLOG_LV_INFO, "%s,MESA_get_stream_opt() error:unsupport MESA_stream_opt type:%d!\n",printaddr(&pstream->addr, pstream->threadnum), (int)opt);
ret = -1;
diff --git a/src/dealpkt/stream_manage.c b/src/dealpkt/stream_manage.c index 31d1e72..b0b102f 100644 --- a/src/dealpkt/stream_manage.c +++ b/src/dealpkt/stream_manage.c @@ -2494,18 +2494,20 @@ int update_polling_inject_context(int mem_used_type,struct streaminfo_private *p thread_index = pstream_pr->stream_public.threadnum; /* ���浱ǰ��C2S, S2C����ĵ�һ���� */ - if((DIR_ROUTE_DOWN & pstream_pr->stream_public.routedir) == DIR_ROUTE_DOWN){ - if(NULL == pstream_pr->polling_inject_context->raw_pkt_down){ - pstream_pr->polling_inject_context->raw_pkt_down = sapp_raw_pkt_dup(mem_used_type,thread_index, raw_pkt); - pstream_pr->polling_inject_context->meta[1] = dl_io_fun_list.dl_io_get1_rawpkt_meta(raw_pkt, thread_index); - } - }else{ - if(NULL == pstream_pr->polling_inject_context->raw_pkt_up){ - pstream_pr->polling_inject_context->raw_pkt_up = sapp_raw_pkt_dup(mem_used_type,thread_index, raw_pkt); - pstream_pr->polling_inject_context->meta[0] = dl_io_fun_list.dl_io_get1_rawpkt_meta(raw_pkt, thread_index); + if(pstream_pr->stream_public.curdir == DIR_C2S) + { + if(NULL == pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_C2S-1]){ + pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_C2S-1] = sapp_raw_pkt_dup(mem_used_type,thread_index, raw_pkt); + pstream_pr->polling_inject_context->meta_stream_dir[DIR_C2S-1] = dl_io_fun_list.dl_io_get1_rawpkt_meta(raw_pkt, thread_index); } } - + else + { + if(NULL == pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_S2C-1]){ + pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_S2C-1] = sapp_raw_pkt_dup(mem_used_type,thread_index, raw_pkt); + pstream_pr->polling_inject_context->meta_stream_dir[DIR_S2C-1] = dl_io_fun_list.dl_io_get1_rawpkt_meta(raw_pkt, thread_index); + } + } return 0; } @@ -2526,15 +2528,21 @@ int save_polling_inject_context(int mem_used_type, struct streaminfo_private *ps �˴���ÿ������ĵ�һ������������, ������Ƕ���̫���ڴ���, Ҳ��CPU, �������flood������������!! ����������IJ���������private�ṹ��, ��������ԭʼ�� */ - if((DIR_ROUTE_DOWN & pstream_pr->stream_public.routedir) == DIR_ROUTE_DOWN){ - pstream_pr->polling_inject_context->raw_pkt_down = sapp_raw_pkt_dup(mem_used_type, thread_index, raw_pkt); - pstream_pr->polling_inject_context->meta[1] = dl_io_fun_list.dl_io_get1_rawpkt_meta(raw_pkt, thread_index); - }else{ - pstream_pr->polling_inject_context->raw_pkt_up = sapp_raw_pkt_dup(mem_used_type, thread_index, raw_pkt); - pstream_pr->polling_inject_context->meta[0] = dl_io_fun_list.dl_io_get1_rawpkt_meta(raw_pkt, thread_index); - } - - return 0; + if (pstream_pr->stream_public.curdir == DIR_C2S) + { + pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_C2S - 1] = + sapp_raw_pkt_dup(mem_used_type, thread_index, raw_pkt); + pstream_pr->polling_inject_context->meta_stream_dir[DIR_C2S - 1] = + dl_io_fun_list.dl_io_get1_rawpkt_meta(raw_pkt, thread_index); + } + else + { + pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_S2C - 1] = + sapp_raw_pkt_dup(mem_used_type, thread_index, raw_pkt); + pstream_pr->polling_inject_context->meta_stream_dir[DIR_S2C - 1] = + dl_io_fun_list.dl_io_get1_rawpkt_meta(raw_pkt, thread_index); + } + return 0; } static inline void sapp_raw_pkt_free(int mem_used_type, int thread_index, raw_pkt_t *raw_pkt) @@ -2556,22 +2564,22 @@ void free_polling_inject_context(int mem_used_type, struct streaminfo_private *p } thread_index = pstream_pr->stream_public.threadnum; - if(pstream_pr->polling_inject_context->raw_pkt_up){ - sapp_raw_pkt_free(mem_used_type, thread_index, (raw_pkt_t *)pstream_pr->polling_inject_context->raw_pkt_up); + if(pstream_pr->polling_inject_context->raw_pkt_stream_dir[0]){ + sapp_raw_pkt_free(mem_used_type, thread_index, (raw_pkt_t *)pstream_pr->polling_inject_context->raw_pkt_stream_dir[0]); } - if(pstream_pr->polling_inject_context->raw_pkt_down){ - sapp_raw_pkt_free(mem_used_type, thread_index, (raw_pkt_t *)pstream_pr->polling_inject_context->raw_pkt_down); + if(pstream_pr->polling_inject_context->raw_pkt_stream_dir[1]){ + sapp_raw_pkt_free(mem_used_type, thread_index, (raw_pkt_t *)pstream_pr->polling_inject_context->raw_pkt_stream_dir[1]); } - if(pstream_pr->polling_inject_context->meta[0]!=NULL) + if(pstream_pr->polling_inject_context->meta_stream_dir[0]!=NULL) { - dl_io_fun_list.dl_io_free_rawpkt_meta(pstream_pr->polling_inject_context->meta[0], thread_index); - pstream_pr->polling_inject_context->meta[0]=NULL; + dl_io_fun_list.dl_io_free_rawpkt_meta(pstream_pr->polling_inject_context->meta_stream_dir[0], thread_index); + pstream_pr->polling_inject_context->meta_stream_dir[0]=NULL; } - if(pstream_pr->polling_inject_context->meta[1]!=NULL) + if(pstream_pr->polling_inject_context->meta_stream_dir[1]!=NULL) { - dl_io_fun_list.dl_io_free_rawpkt_meta(pstream_pr->polling_inject_context->meta[1], thread_index); - pstream_pr->polling_inject_context->meta[1]=NULL; + dl_io_fun_list.dl_io_free_rawpkt_meta(pstream_pr->polling_inject_context->meta_stream_dir[1], thread_index); + pstream_pr->polling_inject_context->meta_stream_dir[1]=NULL; } sapp_mem_free((sapp_mem_type_t)mem_used_type, thread_index, pstream_pr->polling_inject_context); diff --git a/src/packet_io/sendpacket.c b/src/packet_io/sendpacket.c index c380e15..8abda7c 100644 --- a/src/packet_io/sendpacket.c +++ b/src/packet_io/sendpacket.c @@ -1,3 +1,4 @@ +#include "stream_inc/stream_base.h" #include <MESA_handle_logger.h> #ifdef __cplusplus extern "C" { @@ -2470,6 +2471,18 @@ static raw_pkt_t *update_raw_pkt(struct streaminfo_private *stream_pr, uchar snd } else if (stream_pr->polling_inject_context != NULL) { + if(snd_dir == stream_pr->stream_c2s_route_dir) // if send dir is same as c2s route dir, return c2s raw_pkt + { + inject_raw_pkt = (raw_pkt_t *)stream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_C2S-1]; + *inject_dir_reverse=0; + } + else + { + inject_raw_pkt = (raw_pkt_t *)stream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_S2C-1]; + *inject_dir_reverse=1; + } + +#if 0 if ((DIR_ROUTE_DOWN & snd_dir) == DIR_ROUTE_DOWN) { inject_raw_pkt = (raw_pkt_t *)stream_pr->polling_inject_context->raw_pkt_down; @@ -2498,6 +2511,7 @@ static raw_pkt_t *update_raw_pkt(struct streaminfo_private *stream_pr, uchar snd *inject_dir_reverse = (((snd_dir & DIR_ROUTE_DOWN) == DIR_ROUTE_DOWN) ? 0 : 1); } } +#endif } else ; @@ -2508,8 +2522,8 @@ static raw_pkt_t *update_raw_pkt(struct streaminfo_private *stream_pr, uchar snd if (stream_pr->polling_inject_context != NULL) { - inject_raw_pkt->meta[0]=stream_pr->polling_inject_context->meta[0]; - inject_raw_pkt->meta[1]=stream_pr->polling_inject_context->meta[1]; + inject_raw_pkt->meta[0]=stream_pr->polling_inject_context->meta_stream_dir[0]; + inject_raw_pkt->meta[1]=stream_pr->polling_inject_context->meta_stream_dir[1]; } return inject_raw_pkt; |
