diff options
| author | yangwei <[email protected]> | 2024-11-06 16:34:26 +0800 |
|---|---|---|
| committer | yangwei <[email protected]> | 2024-11-06 16:34:26 +0800 |
| commit | 99a68d5c9efe500ab339165a2af515a0a7355ada (patch) | |
| tree | 7fea92c2eb0ea5dff7b9a23f4613e7941bf239bb | |
| parent | 526c110868cec72677660fcc75dfa15dbb43fff0 (diff) | |
🦄 refactor(lpi plus): update api in lpi_plus.h
| -rw-r--r-- | decoders/lpi_plus/lpi_plus_internal.h | 4 | ||||
| -rw-r--r-- | decoders/lpi_plus/lpip_extend.c | 4 | ||||
| -rw-r--r-- | decoders/lpi_plus/lpip_extend.h | 2 | ||||
| -rw-r--r-- | decoders/lpi_plus/lpip_module.c | 54 | ||||
| -rw-r--r-- | include/stellar/lpi_plus.h | 4 | ||||
| -rw-r--r-- | test/lpi_plus/gtest_lpip_module.c | 2 |
6 files changed, 38 insertions, 32 deletions
diff --git a/decoders/lpi_plus/lpi_plus_internal.h b/decoders/lpi_plus/lpi_plus_internal.h index 87136bf..8536dc3 100644 --- a/decoders/lpi_plus/lpi_plus_internal.h +++ b/decoders/lpi_plus/lpi_plus_internal.h @@ -5,12 +5,12 @@ #define MAX_APPID_NUM 8 #define LPIP_APPID_MESSAGE_TOPIC "TOPIC_LPIP_APPID" -struct appid_message +struct lpi_plus_appid_message { struct session *sess; uint32_t appid_num; int32_t appid[MAX_APPID_NUM]; - uint32_t packet_sequence[MAX_APPID_NUM]; + int32_t packet_sequence[MAX_APPID_NUM]; }; const char *lpi_plus_appid2name(struct lpi_plus *lpip, int appid);
\ No newline at end of file diff --git a/decoders/lpi_plus/lpip_extend.c b/decoders/lpi_plus/lpip_extend.c index 334e557..372c7dd 100644 --- a/decoders/lpi_plus/lpip_extend.c +++ b/decoders/lpi_plus/lpip_extend.c @@ -521,7 +521,7 @@ lpi_module_t* lpi_plus_extended_guess(struct lpi_plus_detect_context *ctx, lpi_p } //SMTP - if (lpi_proto == LPI_PROTO_FTP_CONTROL && ctx->detected_pkt_cnt == 1 && ctx->current_is_c2s_flow==0) + if (lpi_proto == LPI_PROTO_FTP_CONTROL && (ctx->detected_c2s_pkt+ctx->detected_s2c_pkt) == 1 && ctx->current_is_c2s_flow==0) { if ((((payload_sz >= 4 && (memcmp(payload, "220-", 4) == 0)) || memcmp(payload, "220 ", 4) == 0)) && (((payload_sz >= 7 && (memmem(payload, payload_sz, " ESMTP ", 7) != NULL)) || @@ -536,7 +536,7 @@ lpi_module_t* lpi_plus_extended_guess(struct lpi_plus_detect_context *ctx, lpi_p } } - if (lpi_proto == LPI_PROTO_SMTP && ctx->detected_pkt_cnt == 1 && ctx->current_is_c2s_flow==0) + if (lpi_proto == LPI_PROTO_SMTP && (ctx->detected_c2s_pkt+ctx->detected_s2c_pkt) == 1 && ctx->current_is_c2s_flow==0) { if ( (payload_sz >= 4) && diff --git a/decoders/lpi_plus/lpip_extend.h b/decoders/lpi_plus/lpip_extend.h index 0715c00..a9d37bf 100644 --- a/decoders/lpi_plus/lpip_extend.h +++ b/decoders/lpi_plus/lpip_extend.h @@ -21,11 +21,9 @@ struct ovpn_ctx struct lpi_plus_detect_context { - unsigned int detected_pkt_cnt; unsigned short detected_s2c_pkt; unsigned short detected_c2s_pkt; unsigned char current_is_c2s_flow; - unsigned char stop_detect; lpi_data_t lpi_data; // lpi API union { diff --git a/decoders/lpi_plus/lpip_module.c b/decoders/lpi_plus/lpip_module.c index 1d254c6..171b586 100644 --- a/decoders/lpi_plus/lpip_module.c +++ b/decoders/lpi_plus/lpip_module.c @@ -47,10 +47,13 @@ struct lpi_plus struct lpi_plus_mapper *mapper; }; -struct lpi_plus_exdata +struct lpi_plus_per_session_ctx { - struct lpi_plus_detect_context ctx; + unsigned int detected_pkt_cnt; + int stop_detect; + struct lpi_plus_detect_context *detector_ctx; int appid[MAX_APPID_NUM]; + int packet_sequence[MAX_APPID_NUM]; size_t appid_num; }; @@ -87,15 +90,15 @@ static void lpi_plus_get_host_order_port(struct session *sess __unused, unsigned return; } -//TODO: fill packet sequence -static struct appid_message *lpi_plus_message_new(struct session *sess, int *id_array, size_t id_num) +static struct lpi_plus_appid_message *lpi_plus_message_new(struct session *sess, int *id_array, int *packet_sequence_array, size_t id_num) { - struct appid_message *result=CALLOC(struct appid_message, 1); + struct lpi_plus_appid_message *result=CALLOC(struct lpi_plus_appid_message, 1); result->sess=sess; result->appid_num=id_num; for(unsigned int i=0; i<result->appid_num; i++) { - result->appid[i]=(int)(id_array[i]); + result->appid[i]=id_array[i]; + result->packet_sequence[i]=packet_sequence_array[i]; } return result; @@ -216,7 +219,6 @@ void lpi_plus_context_update(struct session *sess, struct lpi_plus_detect_contex l4_proto = IPPROTO_UDP; } int cur_pkt_dir = session_get_flow_type(sess); - ctx->detected_pkt_cnt++; (cur_pkt_dir == FLOW_TYPE_C2S) ? (ctx->detected_c2s_pkt++) : (ctx->detected_s2c_pkt++); ctx->current_is_c2s_flow = ((cur_pkt_dir == FLOW_TYPE_C2S) ? 1 : 0); uint32_t dir = 0; @@ -258,10 +260,11 @@ void lpi_plus_context_update(struct session *sess, struct lpi_plus_detect_contex } -static int lpi_plus_detect(struct lpi_plus_detect_context *ctx, struct lpi_plus_mapper *mapper, const char *payload, size_t payload_len) +static int lpi_plus_detect(struct lpi_plus_detect_context *ctx, struct lpi_plus_mapper *mapper, const char *payload, size_t payload_len, int *stop_detect) { lpi_module_t *plpi_mod=lpi_guess_protocol(&(ctx->lpi_data)); if(plpi_mod==NULL)return 0; + if(stop_detect!=NULL)*stop_detect=0; lpi_module_t *extend_result = lpi_plus_extended_guess(ctx, plpi_mod->protocol, payload, payload_len); if (extend_result)plpi_mod=extend_result; @@ -277,7 +280,7 @@ static int lpi_plus_detect(struct lpi_plus_detect_context *ctx, struct lpi_plus_ && plpi_mod->protocol != LPI_PROTO_UDP_RTP && plpi_mod->protocol != LPI_PROTO_UDP_RTCP)) { - ctx->stop_detect=1; + if(stop_detect!=NULL)*stop_detect=1; } return new_appid; } @@ -290,24 +293,27 @@ static void lpi_plus_on_session(struct session *sess, enum session_state state, return; } struct lpi_plus *env=(struct lpi_plus *)args; - struct lpi_plus_exdata *exdata = (struct lpi_plus_exdata *)session_get_exdata(sess, env->lpip_session_exdata_idx); - if(exdata==NULL) + struct lpi_plus_per_session_ctx *lpip_sess_ctx = (struct lpi_plus_per_session_ctx *)session_get_exdata(sess, env->lpip_session_exdata_idx); + if(lpip_sess_ctx==NULL) { - exdata= CALLOC(struct lpi_plus_exdata, 1); - session_set_exdata(sess, env->lpip_session_exdata_idx, exdata); + lpip_sess_ctx= CALLOC(struct lpi_plus_per_session_ctx, 1); + session_set_exdata(sess, env->lpip_session_exdata_idx, lpip_sess_ctx); } - if(exdata->ctx.stop_detect==1)return; - if(exdata->ctx.detected_pkt_cnt>=env->max_pkts)return; + if(lpip_sess_ctx->stop_detect==1)return; + if(lpip_sess_ctx->detected_pkt_cnt>=env->max_pkts)return; uint16_t payload_len=packet_get_payload_len(pkt); const char *payload=packet_get_payload_data(pkt); if (payload!=NULL && payload_len>0)//detect packet with payload only { - lpi_plus_context_update(sess, &exdata->ctx, payload, payload_len); - int appid=lpi_plus_detect(&exdata->ctx, env->mapper, payload, payload_len); - if(appid>0 && lpi_plus_appid_update(exdata->appid, &(exdata->appid_num), appid)) + if(lpip_sess_ctx->detector_ctx==NULL)lpip_sess_ctx->detector_ctx=CALLOC(struct lpi_plus_detect_context, 1); + lpi_plus_context_update(sess, lpip_sess_ctx->detector_ctx, payload, payload_len); + int appid=lpi_plus_detect(lpip_sess_ctx->detector_ctx, env->mapper, payload, payload_len, &lpip_sess_ctx->stop_detect); + lpip_sess_ctx->detected_pkt_cnt+=1; + if(appid>0 && lpi_plus_appid_update(lpip_sess_ctx->appid, &(lpip_sess_ctx->appid_num), appid)) { - struct appid_message *msg=lpi_plus_message_new(sess, exdata->appid, exdata->appid_num); + lpip_sess_ctx->packet_sequence[lpip_sess_ctx->appid_num-1]=lpip_sess_ctx->detected_pkt_cnt; + struct lpi_plus_appid_message *msg=lpi_plus_message_new(sess, lpip_sess_ctx->appid, lpip_sess_ctx->packet_sequence, lpip_sess_ctx->appid_num); if(0 > mq_runtime_publish_message(module_manager_get_mq_runtime(env->mod_mgr), env->topic_appid, msg))FREE(msg); @@ -319,6 +325,8 @@ static void lpi_plus_on_session(struct session *sess, enum session_state state, static void lpi_plus_exdata_free(int idx __unused, void *ex_ptr, void *arg __unused) { if(ex_ptr==NULL)return; + struct lpi_plus_per_session_ctx *lpip_sess_ctx=(struct lpi_plus_per_session_ctx *)ex_ptr; + if(lpip_sess_ctx->detector_ctx)FREE(lpip_sess_ctx->detector_ctx); FREE(ex_ptr); } @@ -350,12 +358,12 @@ static void lpi_plus_appid_on_msg_dispatch(int topic_id __unused, void *on_msg_cb_arg, void *dispatch_arg __unused) { - on_appid_callback *appid_cb = (on_appid_callback *)on_msg_cb; - struct appid_message *appid_msg=(struct appid_message *)msg; - appid_cb(appid_msg->sess, appid_msg->appid, appid_msg->appid_num, on_msg_cb_arg); + lpi_plus_on_appid_callback *appid_cb = (lpi_plus_on_appid_callback *)on_msg_cb; + struct lpi_plus_appid_message *appid_msg=(struct lpi_plus_appid_message *)msg; + appid_cb(appid_msg->sess, appid_msg->appid, appid_msg->packet_sequence, appid_msg->appid_num, on_msg_cb_arg); } -int lpi_plus_appid_subscribe(struct lpi_plus *lpip, on_appid_callback *cb, void *args) +int lpi_plus_appid_subscribe(struct lpi_plus *lpip, lpi_plus_on_appid_callback *cb, void *args) { if(lpip==NULL)return -1; struct module_manager *mod_mgr=lpip->mod_mgr; diff --git a/include/stellar/lpi_plus.h b/include/stellar/lpi_plus.h index 0e624fb..cfb99c5 100644 --- a/include/stellar/lpi_plus.h +++ b/include/stellar/lpi_plus.h @@ -13,8 +13,8 @@ extern "C" struct lpi_plus; struct lpi_plus *module_to_lpi_plus(struct module *mod); -typedef void on_appid_callback(struct session *sess, int appid[], size_t appid_num, void *args); -int lpi_plus_appid_subscribe(struct lpi_plus *lpip, on_appid_callback *cb, void *args); +typedef void lpi_plus_on_appid_callback(struct session *sess, int appid[], int packet_sequence[], size_t appid_num, void *args); +int lpi_plus_appid_subscribe(struct lpi_plus *lpip, lpi_plus_on_appid_callback *cb, void *args); #ifdef __cplusplus } diff --git a/test/lpi_plus/gtest_lpip_module.c b/test/lpi_plus/gtest_lpip_module.c index 33dbb76..c6998dc 100644 --- a/test/lpi_plus/gtest_lpip_module.c +++ b/test/lpi_plus/gtest_lpip_module.c @@ -111,7 +111,7 @@ static void gtest_lpip_exdata_free(int idx __attribute__((unused)), void *ex_ptr } -static void gtest_lpip_on_appid_msg(struct session *sess, int appid[], size_t appid_num, void *args) +static void gtest_lpip_on_appid_msg(struct session *sess, int appid[], int packet_sequence[],size_t appid_num, void *args) { if(sess==NULL || appid==NULL || args==NULL)return; struct test_lpip_env *env = (struct test_lpip_env *)args; |
