🦄 refactor(lpi plus): update api in lpi_plus.h
This commit is contained in:
@@ -5,12 +5,12 @@
|
|||||||
#define MAX_APPID_NUM 8
|
#define MAX_APPID_NUM 8
|
||||||
#define LPIP_APPID_MESSAGE_TOPIC "TOPIC_LPIP_APPID"
|
#define LPIP_APPID_MESSAGE_TOPIC "TOPIC_LPIP_APPID"
|
||||||
|
|
||||||
struct appid_message
|
struct lpi_plus_appid_message
|
||||||
{
|
{
|
||||||
struct session *sess;
|
struct session *sess;
|
||||||
uint32_t appid_num;
|
uint32_t appid_num;
|
||||||
int32_t appid[MAX_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);
|
const char *lpi_plus_appid2name(struct lpi_plus *lpip, int appid);
|
||||||
@@ -521,7 +521,7 @@ lpi_module_t* lpi_plus_extended_guess(struct lpi_plus_detect_context *ctx, lpi_p
|
|||||||
}
|
}
|
||||||
|
|
||||||
//SMTP
|
//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)) &&
|
if ((((payload_sz >= 4 && (memcmp(payload, "220-", 4) == 0)) || memcmp(payload, "220 ", 4) == 0)) &&
|
||||||
(((payload_sz >= 7 && (memmem(payload, payload_sz, " ESMTP ", 7) != NULL)) ||
|
(((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 (
|
if (
|
||||||
(payload_sz >= 4) &&
|
(payload_sz >= 4) &&
|
||||||
|
|||||||
@@ -21,11 +21,9 @@ struct ovpn_ctx
|
|||||||
|
|
||||||
struct lpi_plus_detect_context
|
struct lpi_plus_detect_context
|
||||||
{
|
{
|
||||||
unsigned int detected_pkt_cnt;
|
|
||||||
unsigned short detected_s2c_pkt;
|
unsigned short detected_s2c_pkt;
|
||||||
unsigned short detected_c2s_pkt;
|
unsigned short detected_c2s_pkt;
|
||||||
unsigned char current_is_c2s_flow;
|
unsigned char current_is_c2s_flow;
|
||||||
unsigned char stop_detect;
|
|
||||||
lpi_data_t lpi_data; // lpi API
|
lpi_data_t lpi_data; // lpi API
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -47,10 +47,13 @@ struct lpi_plus
|
|||||||
struct lpi_plus_mapper *mapper;
|
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 appid[MAX_APPID_NUM];
|
||||||
|
int packet_sequence[MAX_APPID_NUM];
|
||||||
size_t appid_num;
|
size_t appid_num;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -87,15 +90,15 @@ static void lpi_plus_get_host_order_port(struct session *sess __unused, unsigned
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: fill packet sequence
|
static struct lpi_plus_appid_message *lpi_plus_message_new(struct session *sess, int *id_array, int *packet_sequence_array, size_t id_num)
|
||||||
static struct appid_message *lpi_plus_message_new(struct session *sess, int *id_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->sess=sess;
|
||||||
result->appid_num=id_num;
|
result->appid_num=id_num;
|
||||||
for(unsigned int i=0; i<result->appid_num; i++)
|
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;
|
return result;
|
||||||
@@ -216,7 +219,6 @@ void lpi_plus_context_update(struct session *sess, struct lpi_plus_detect_contex
|
|||||||
l4_proto = IPPROTO_UDP;
|
l4_proto = IPPROTO_UDP;
|
||||||
}
|
}
|
||||||
int cur_pkt_dir = session_get_flow_type(sess);
|
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++);
|
(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);
|
ctx->current_is_c2s_flow = ((cur_pkt_dir == FLOW_TYPE_C2S) ? 1 : 0);
|
||||||
uint32_t dir = 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));
|
lpi_module_t *plpi_mod=lpi_guess_protocol(&(ctx->lpi_data));
|
||||||
if(plpi_mod==NULL)return 0;
|
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);
|
lpi_module_t *extend_result = lpi_plus_extended_guess(ctx, plpi_mod->protocol, payload, payload_len);
|
||||||
if (extend_result)plpi_mod=extend_result;
|
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_RTP
|
||||||
&& plpi_mod->protocol != LPI_PROTO_UDP_RTCP))
|
&& plpi_mod->protocol != LPI_PROTO_UDP_RTCP))
|
||||||
{
|
{
|
||||||
ctx->stop_detect=1;
|
if(stop_detect!=NULL)*stop_detect=1;
|
||||||
}
|
}
|
||||||
return new_appid;
|
return new_appid;
|
||||||
}
|
}
|
||||||
@@ -290,24 +293,27 @@ static void lpi_plus_on_session(struct session *sess, enum session_state state,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
struct lpi_plus *env=(struct lpi_plus *)args;
|
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);
|
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(exdata==NULL)
|
if(lpip_sess_ctx==NULL)
|
||||||
{
|
{
|
||||||
exdata= CALLOC(struct lpi_plus_exdata, 1);
|
lpip_sess_ctx= CALLOC(struct lpi_plus_per_session_ctx, 1);
|
||||||
session_set_exdata(sess, env->lpip_session_exdata_idx, exdata);
|
session_set_exdata(sess, env->lpip_session_exdata_idx, lpip_sess_ctx);
|
||||||
}
|
}
|
||||||
if(exdata->ctx.stop_detect==1)return;
|
if(lpip_sess_ctx->stop_detect==1)return;
|
||||||
if(exdata->ctx.detected_pkt_cnt>=env->max_pkts)return;
|
if(lpip_sess_ctx->detected_pkt_cnt>=env->max_pkts)return;
|
||||||
|
|
||||||
uint16_t payload_len=packet_get_payload_len(pkt);
|
uint16_t payload_len=packet_get_payload_len(pkt);
|
||||||
const char *payload=packet_get_payload_data(pkt);
|
const char *payload=packet_get_payload_data(pkt);
|
||||||
if (payload!=NULL && payload_len>0)//detect packet with payload only
|
if (payload!=NULL && payload_len>0)//detect packet with payload only
|
||||||
{
|
{
|
||||||
lpi_plus_context_update(sess, &exdata->ctx, payload, payload_len);
|
if(lpip_sess_ctx->detector_ctx==NULL)lpip_sess_ctx->detector_ctx=CALLOC(struct lpi_plus_detect_context, 1);
|
||||||
int appid=lpi_plus_detect(&exdata->ctx, env->mapper, payload, payload_len);
|
lpi_plus_context_update(sess, lpip_sess_ctx->detector_ctx, payload, payload_len);
|
||||||
if(appid>0 && lpi_plus_appid_update(exdata->appid, &(exdata->appid_num), appid))
|
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),
|
if(0 > mq_runtime_publish_message(module_manager_get_mq_runtime(env->mod_mgr),
|
||||||
env->topic_appid,
|
env->topic_appid,
|
||||||
msg))FREE(msg);
|
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)
|
static void lpi_plus_exdata_free(int idx __unused, void *ex_ptr, void *arg __unused)
|
||||||
{
|
{
|
||||||
if(ex_ptr==NULL)return;
|
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);
|
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 *on_msg_cb_arg,
|
||||||
void *dispatch_arg __unused)
|
void *dispatch_arg __unused)
|
||||||
{
|
{
|
||||||
on_appid_callback *appid_cb = (on_appid_callback *)on_msg_cb;
|
lpi_plus_on_appid_callback *appid_cb = (lpi_plus_on_appid_callback *)on_msg_cb;
|
||||||
struct appid_message *appid_msg=(struct appid_message *)msg;
|
struct lpi_plus_appid_message *appid_msg=(struct lpi_plus_appid_message *)msg;
|
||||||
appid_cb(appid_msg->sess, appid_msg->appid, appid_msg->appid_num, on_msg_cb_arg);
|
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;
|
if(lpip==NULL)return -1;
|
||||||
struct module_manager *mod_mgr=lpip->mod_mgr;
|
struct module_manager *mod_mgr=lpip->mod_mgr;
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ extern "C"
|
|||||||
struct lpi_plus;
|
struct lpi_plus;
|
||||||
struct lpi_plus *module_to_lpi_plus(struct module *mod);
|
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);
|
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, on_appid_callback *cb, void *args);
|
int lpi_plus_appid_subscribe(struct lpi_plus *lpip, lpi_plus_on_appid_callback *cb, void *args);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
if(sess==NULL || appid==NULL || args==NULL)return;
|
||||||
struct test_lpip_env *env = (struct test_lpip_env *)args;
|
struct test_lpip_env *env = (struct test_lpip_env *)args;
|
||||||
|
|||||||
Reference in New Issue
Block a user