重构Packet Parser
This commit is contained in:
@@ -66,6 +66,15 @@ struct packet_io
|
||||
* metadata
|
||||
******************************************************************************/
|
||||
|
||||
void sce_packet_get_innermost_tuple(const struct packet *handler, struct four_tuple *tuple)
|
||||
{
|
||||
memset(tuple, 0, sizeof(struct four_tuple));
|
||||
if (packet_get_innermost_four_tuple(handler, tuple) == -1)
|
||||
{
|
||||
packet_get_innermost_two_tuple(handler, &tuple->two_tuple);
|
||||
}
|
||||
}
|
||||
|
||||
// return 0 : success
|
||||
// return -1 : error
|
||||
int mbuff_get_metadata(marsio_buff_t *rx_buff, struct metadata *meta)
|
||||
@@ -349,14 +358,10 @@ static struct session_ctx *data_packet_search_session(struct session_table *tabl
|
||||
{
|
||||
struct four_tuple inner_addr;
|
||||
struct four_tuple reverse_addr;
|
||||
struct data_packet data_pkt;
|
||||
struct packet data_pkt;
|
||||
|
||||
memset(&inner_addr, 0, sizeof(struct four_tuple));
|
||||
memset(&reverse_addr, 0, sizeof(struct four_tuple));
|
||||
|
||||
data_packet_parse(&data_pkt, (const void *)raw_data, raw_len, 0);
|
||||
|
||||
data_packet_get_innermost_four_tuple(&data_pkt, &inner_addr);
|
||||
packet_parse(&data_pkt, raw_data, raw_len);
|
||||
sce_packet_get_innermost_tuple(&data_pkt, &inner_addr);
|
||||
four_tuple_reverse(&inner_addr, &reverse_addr);
|
||||
|
||||
struct session_node *node = session_table_search_by_id(table, session_id);
|
||||
@@ -368,7 +373,7 @@ static struct session_ctx *data_packet_search_session(struct session_table *tabl
|
||||
struct session_ctx *session_ctx = (struct session_ctx *)node->value;
|
||||
if (memcmp(&session_ctx->inner_tuple4, &inner_addr, sizeof(struct four_tuple)) != 0 && memcmp(&session_ctx->inner_tuple4, &reverse_addr, sizeof(struct four_tuple)) != 0)
|
||||
{
|
||||
char *addr_str = four_tuple_to_string(&inner_addr);
|
||||
char *addr_str = four_tuple_tostring(&inner_addr);
|
||||
LOG_ERROR("%s: unexpected raw packet, session %lu expected address tuple4 is %s, but current packet's address tuple4 is %s, bypass !!!", LOG_TAG_PKTIO, session_ctx->session_id, session_ctx->session_addr, addr_str);
|
||||
free(addr_str);
|
||||
return NULL;
|
||||
@@ -382,18 +387,15 @@ static struct session_ctx *data_packet_search_session(struct session_table *tabl
|
||||
static struct session_ctx *inject_packet_search_session(struct session_table *table, const char *raw_data, int raw_len)
|
||||
{
|
||||
struct four_tuple inner_addr;
|
||||
struct data_packet data_pkt;
|
||||
struct packet data_pkt;
|
||||
|
||||
memset(&inner_addr, 0, sizeof(struct four_tuple));
|
||||
|
||||
data_packet_parse(&data_pkt, (const void *)raw_data, raw_len, 0);
|
||||
|
||||
data_packet_get_innermost_four_tuple(&data_pkt, &inner_addr);
|
||||
packet_parse(&data_pkt, raw_data, raw_len);
|
||||
sce_packet_get_innermost_tuple(&data_pkt, &inner_addr);
|
||||
|
||||
struct session_node *node = session_table_search_by_addr(table, &inner_addr);
|
||||
if (node == NULL)
|
||||
{
|
||||
char *addr_str = four_tuple_to_string(&inner_addr);
|
||||
char *addr_str = four_tuple_tostring(&inner_addr);
|
||||
LOG_ERROR("%s: unexpected inject packet, unable to find session %s from session table, drop !!!", LOG_TAG_PKTIO, addr_str);
|
||||
free(addr_str);
|
||||
return NULL;
|
||||
@@ -878,7 +880,7 @@ static void session_value_free_cb(void *ctx)
|
||||
session_ctx_free(s_ctx);
|
||||
}
|
||||
|
||||
static void handle_policy_mutil_hits(struct policy_enforcer *enforcer, struct session_ctx *session_ctx, struct control_packet *ctrl_pkt, data_packet *data_pkt, int is_e2i_dir)
|
||||
static void handle_policy_mutil_hits(struct policy_enforcer *enforcer, struct session_ctx *session_ctx, struct control_packet *ctrl_pkt, packet *data_pkt, int is_e2i_dir)
|
||||
{
|
||||
for (int i = 0; i < ctrl_pkt->rule_id_num; i++)
|
||||
{
|
||||
@@ -913,21 +915,21 @@ static void handle_session_opening(struct metadata *meta, struct control_packet
|
||||
}
|
||||
#endif
|
||||
|
||||
struct data_packet data_pkt;
|
||||
struct packet data_pkt;
|
||||
struct four_tuple inner_tuple4;
|
||||
const void *payload = data_packet_parse(&data_pkt, (const void *)meta->raw_data, meta->raw_len, meta->session_id);
|
||||
data_packet_get_innermost_four_tuple(&data_pkt, &inner_tuple4);
|
||||
uint16_t real_offset = (char *)payload - meta->raw_data;
|
||||
const char *payload = packet_parse(&data_pkt, meta->raw_data, meta->raw_len);
|
||||
sce_packet_get_innermost_tuple(&data_pkt, &inner_tuple4);
|
||||
uint16_t real_offset = payload - meta->raw_data;
|
||||
if (real_offset != meta->l7offset)
|
||||
{
|
||||
char *addr_str = four_tuple_to_string(&inner_tuple4);
|
||||
char *addr_str = four_tuple_tostring(&inner_tuple4);
|
||||
LOG_ERROR("%s: incorrect dataoffset %d in the control zone of session %lu %s, the expect value is %d", LOG_TAG_PKTIO, meta->l7offset, meta->session_id, addr_str, real_offset);
|
||||
free(addr_str);
|
||||
}
|
||||
|
||||
struct session_ctx *session_ctx = session_ctx_new();
|
||||
session_ctx->session_id = meta->session_id;
|
||||
session_ctx->session_addr = four_tuple_to_string(&inner_tuple4);
|
||||
session_ctx->session_addr = four_tuple_tostring(&inner_tuple4);
|
||||
four_tuple_copy(&session_ctx->inner_tuple4, &inner_tuple4);
|
||||
metadata_deep_copy(session_ctx->ctrl_meta, meta);
|
||||
session_ctx->chainings.chaining_raw = selected_chaining_create(chaining_size, session_ctx->session_id, session_ctx->session_addr);
|
||||
@@ -974,9 +976,9 @@ static void handle_session_active(struct metadata *meta, struct control_packet *
|
||||
{
|
||||
struct session_ctx *session_ctx = (struct session_ctx *)node->value;
|
||||
|
||||
struct data_packet data_pkt;
|
||||
const void *payload = data_packet_parse(&data_pkt, (const void *)meta->raw_data, meta->raw_len, meta->session_id);
|
||||
uint16_t real_offset = (char *)payload - meta->raw_data;
|
||||
struct packet data_pkt;
|
||||
const char *payload = packet_parse(&data_pkt, meta->raw_data, meta->raw_len);
|
||||
uint16_t real_offset = payload - meta->raw_data;
|
||||
if (real_offset != meta->l7offset)
|
||||
{
|
||||
LOG_ERROR("%s: incorrect dataoffset %d in the control zone of session %lu %s, the expect value is %d", LOG_TAG_PKTIO, meta->l7offset, meta->session_id, session_ctx->session_addr, real_offset);
|
||||
|
||||
Reference in New Issue
Block a user