TSG-13630 tsg-service-chaining-engine使用mrzcpd捕获报文/回注报文
TSG-13685 tsg-service-chaining-engine使用VXLAN封装Steering/Mirroring的Package
This commit is contained in:
15
common/src/ctrl_packet.cpp
Normal file
15
common/src/ctrl_packet.cpp
Normal file
@@ -0,0 +1,15 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "ctrl_packet.h"
|
||||
|
||||
void ctrl_packet_parser_init(struct ctrl_pkt_parser *handler)
|
||||
{
|
||||
memset(handler, 0, sizeof(struct ctrl_pkt_parser));
|
||||
}
|
||||
|
||||
// return 0 : success
|
||||
// return -1 : error
|
||||
int ctrl_packet_parser_parse(struct ctrl_pkt_parser *handler, const void *data, size_t length)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
67
common/src/g_vxlan.cpp
Normal file
67
common/src/g_vxlan.cpp
Normal file
@@ -0,0 +1,67 @@
|
||||
#include <netinet/udp.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <netinet/ether.h>
|
||||
|
||||
#include "g_vxlan.h"
|
||||
|
||||
void g_vxlan_set_packet_dir(struct g_vxlan *hdr, int dir_is_e2i)
|
||||
{
|
||||
hdr->dir_is_e2i = (!!dir_is_e2i);
|
||||
}
|
||||
|
||||
void g_vxlan_set_chain_index(struct g_vxlan *hdr, int chain_index)
|
||||
{
|
||||
hdr->chain_index = (0x1f & chain_index);
|
||||
}
|
||||
|
||||
void g_vxlan_set_traffic_type(struct g_vxlan *hdr, int traffic_is_decrypted)
|
||||
{
|
||||
hdr->traffic_is_decrypted = (!!traffic_is_decrypted);
|
||||
}
|
||||
|
||||
int g_vxlan_get_packet_dir(struct g_vxlan *hdr)
|
||||
{
|
||||
return (!!hdr->dir_is_e2i);
|
||||
}
|
||||
|
||||
int g_vxlan_get_chain_index(struct g_vxlan *hdr)
|
||||
{
|
||||
return hdr->chain_index;
|
||||
}
|
||||
|
||||
int g_vxlan_get_traffic_type(struct g_vxlan *hdr)
|
||||
{
|
||||
return (!!hdr->traffic_is_decrypted);
|
||||
}
|
||||
|
||||
// return 0 : success
|
||||
// return -1 : error
|
||||
int g_vxlan_decode(struct g_vxlan **g_vxlan_hdr, const char *raw_data, int raw_len)
|
||||
{
|
||||
if (raw_len <= (int)(sizeof(struct ethhdr) + sizeof(struct ip) + sizeof(struct udphdr) + sizeof(struct g_vxlan)))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct ethhdr *eth_hdr = (struct ethhdr *)raw_data;
|
||||
if (eth_hdr->h_proto != htons(ETH_P_IP))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct ip *ip_hdr = (struct ip *)((char *)eth_hdr + sizeof(struct ethhdr));
|
||||
if (ip_hdr->ip_p != IPPROTO_UDP)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct udphdr *udp_hdr = (struct udphdr *)((char *)ip_hdr + sizeof(struct ip));
|
||||
if (udp_hdr->uh_dport != htons(4789))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
*g_vxlan_hdr = (struct g_vxlan *)((char *)udp_hdr + sizeof(struct udphdr));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -12,16 +12,21 @@
|
||||
#include <linux/ppp_defs.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "utils.h"
|
||||
#include "uthash.h"
|
||||
#include "addr_tuple4.h"
|
||||
#include "raw_packet.h"
|
||||
|
||||
#define LOG_TAG "RAW_PACKET_PARSER"
|
||||
|
||||
/******************************************************************************
|
||||
* Protocol Struct
|
||||
* Struct
|
||||
******************************************************************************/
|
||||
|
||||
enum parse_status
|
||||
{
|
||||
PARSE_STATUS_CONTINUE,
|
||||
PARSE_STATUS_STOP
|
||||
};
|
||||
|
||||
struct vlan_hdr
|
||||
{
|
||||
uint16_t vlan_cfi;
|
||||
@@ -58,38 +63,13 @@ struct gtp_hdr
|
||||
#define GTP_HDR_FLAG_SEQ_NUM (0x02)
|
||||
#define GTP_HDR_FLAG_NEXT_EXT_HDR (0x04)
|
||||
|
||||
/******************************************************************************
|
||||
* Parser Struct
|
||||
******************************************************************************/
|
||||
|
||||
static uint64_t packet_trace_id = 0;
|
||||
|
||||
struct layer_result
|
||||
{
|
||||
uint16_t offset;
|
||||
enum layer_type type;
|
||||
};
|
||||
|
||||
struct layer_result_array
|
||||
{
|
||||
struct layer_result *layers;
|
||||
uint16_t layers_used;
|
||||
uint16_t layers_size;
|
||||
};
|
||||
|
||||
struct raw_pkt_parser
|
||||
{
|
||||
enum layer_type expect_type;
|
||||
struct layer_result_array results;
|
||||
|
||||
const void *ptr_pkt_start;
|
||||
uint64_t pkt_trace_id;
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Static API
|
||||
******************************************************************************/
|
||||
|
||||
static int raw_packet_parser_push(struct raw_pkt_parser *handler, enum layer_type type, uint16_t offset);
|
||||
static enum parse_status raw_packet_parser_status(struct raw_pkt_parser *handler, const void *data, enum layer_type this_type);
|
||||
|
||||
static const char *ldbc_method_to_string(enum ldbc_method ldbc_method);
|
||||
|
||||
// parser utils
|
||||
@@ -115,82 +95,21 @@ static const void *parse_mpls(struct raw_pkt_parser *handler, const void *data,
|
||||
* Public API
|
||||
******************************************************************************/
|
||||
|
||||
struct raw_pkt_parser *raw_packet_parser_create(enum layer_type expect_type, uint16_t expect_results_num)
|
||||
void raw_packet_parser_init(struct raw_pkt_parser *handler, uint64_t pkt_trace_id, enum layer_type expect_type, uint16_t expect_results_num)
|
||||
{
|
||||
struct raw_pkt_parser *handler = (struct raw_pkt_parser *)calloc(1, sizeof(struct raw_pkt_parser));
|
||||
assert(handler);
|
||||
memset(handler, 0, sizeof(struct raw_pkt_parser));
|
||||
|
||||
handler->expect_type = expect_type;
|
||||
handler->results.layers = (struct layer_result *)calloc(expect_results_num, sizeof(struct layer_result));
|
||||
assert(handler->results.layers);
|
||||
handler->results.layers_used = 0;
|
||||
handler->results.layers_size = expect_results_num;
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
void raw_packet_parser_destory(struct raw_pkt_parser *handler)
|
||||
{
|
||||
if (handler)
|
||||
{
|
||||
if (handler->results.layers)
|
||||
{
|
||||
free(handler->results.layers);
|
||||
handler->results.layers = NULL;
|
||||
}
|
||||
|
||||
free(handler);
|
||||
handler = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// return 0 : success
|
||||
// return -ENOMEM : error
|
||||
int raw_packet_parser_push(struct raw_pkt_parser *handler, enum layer_type type, uint16_t offset)
|
||||
{
|
||||
struct layer_result_array *result = &handler->results;
|
||||
|
||||
if (result->layers_used >= result->layers_size)
|
||||
{
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
result->layers[result->layers_used].offset = offset;
|
||||
result->layers[result->layers_used].type = type;
|
||||
result->layers_used++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// return PARSE_STATUS_CONTINUE
|
||||
// return PARSE_STATUS_STOP
|
||||
enum parse_status raw_packet_parser_status(struct raw_pkt_parser *handler, const void *data, enum layer_type this_type)
|
||||
{
|
||||
/*
|
||||
* only when this_type & handler->expect_type is true,
|
||||
* the information of the current layer will be recorded in results.
|
||||
*/
|
||||
if (!(this_type & handler->expect_type))
|
||||
{
|
||||
return PARSE_STATUS_CONTINUE;
|
||||
}
|
||||
|
||||
uint16_t offset = (uintptr_t)data - (uintptr_t)(handler->ptr_pkt_start);
|
||||
if (raw_packet_parser_push(handler, this_type, offset) < 0)
|
||||
{
|
||||
return PARSE_STATUS_STOP;
|
||||
}
|
||||
else
|
||||
{
|
||||
return PARSE_STATUS_CONTINUE;
|
||||
}
|
||||
handler->results.layers_size = MIN(expect_results_num, (sizeof(handler->results.layers) / sizeof(handler->results.layers[0])));
|
||||
handler->ptr_pkt_start = NULL;
|
||||
handler->pkt_trace_id = pkt_trace_id;
|
||||
}
|
||||
|
||||
// return most inner payload
|
||||
const void *raw_packet_parser_parse(struct raw_pkt_parser *handler, const void *data, size_t length)
|
||||
{
|
||||
handler->ptr_pkt_start = data;
|
||||
handler->pkt_trace_id = __atomic_fetch_add(&packet_trace_id, 1, __ATOMIC_RELAXED);
|
||||
|
||||
// TESTED
|
||||
return parse_ether(handler, data, length, LAYER_TYPE_ETHER);
|
||||
@@ -204,7 +123,7 @@ int raw_packet_parser_get_most_inner_tuple4(struct raw_pkt_parser *handler, stru
|
||||
const char *l4_layer_data = NULL;
|
||||
const struct layer_result *l3_layer_result = NULL;
|
||||
const struct layer_result *l4_layer_result = NULL;
|
||||
struct layer_result_array *results = &handler->results;
|
||||
struct layer_results *results = &handler->results;
|
||||
|
||||
// search L4 layer and L3 layer in reverse order
|
||||
for (int8_t i = results->layers_used - 1; i >= 0; i--)
|
||||
@@ -212,7 +131,7 @@ int raw_packet_parser_get_most_inner_tuple4(struct raw_pkt_parser *handler, stru
|
||||
const struct layer_result *layer = &results->layers[i];
|
||||
enum layer_type type = layer->type;
|
||||
|
||||
LOG_DEBUG("%s: find most inner tuple4, pkt_trace_id: %lu, layer[%d/%d]: %s", LOG_TAG, handler->pkt_trace_id, i, results->layers_size, layer_type2str(type));
|
||||
LOG_DEBUG("%s: find most inner tuple4, pkt_trace_id: %lu, layer[%d/%d]: %s", LOG_TAG_RAWPKT, handler->pkt_trace_id, i, results->layers_size, layer_type2str(type));
|
||||
|
||||
// first get L4 layer
|
||||
if (type & LAYER_TYPE_L4)
|
||||
@@ -259,7 +178,7 @@ int raw_packet_parser_get_most_outer_tuple4(struct raw_pkt_parser *handler, stru
|
||||
const char *l4_layer_data = NULL;
|
||||
const struct layer_result *l3_layer_result = NULL;
|
||||
const struct layer_result *l4_layer_result = NULL;
|
||||
struct layer_result_array *results = &handler->results;
|
||||
struct layer_results *results = &handler->results;
|
||||
|
||||
// search L3 layer and L4 layer in order
|
||||
for (int8_t i = 0; i <= results->layers_used - 1; i++)
|
||||
@@ -267,7 +186,7 @@ int raw_packet_parser_get_most_outer_tuple4(struct raw_pkt_parser *handler, stru
|
||||
const struct layer_result *layer = &results->layers[i];
|
||||
enum layer_type type = layer->type;
|
||||
|
||||
LOG_DEBUG("%s: find most outer tuple4, pkt_trace_id: %lu, layer[%d/%d]: %s", LOG_TAG, handler->pkt_trace_id, i, results->layers_size, layer_type2str(type));
|
||||
LOG_DEBUG("%s: find most outer tuple4, pkt_trace_id: %lu, layer[%d/%d]: %s", LOG_TAG_RAWPKT, handler->pkt_trace_id, i, results->layers_size, layer_type2str(type));
|
||||
|
||||
// first get L3 layer
|
||||
if (type & LAYER_TYPE_L3)
|
||||
@@ -311,7 +230,7 @@ int raw_packet_parser_get_most_outer_tuple4(struct raw_pkt_parser *handler, stru
|
||||
int raw_packet_parser_get_most_inner_address(struct raw_pkt_parser *handler, struct addr_tuple4 *addr)
|
||||
{
|
||||
const char *l3_layer_data = NULL;
|
||||
struct layer_result_array *results = &handler->results;
|
||||
struct layer_results *results = &handler->results;
|
||||
|
||||
// search L3 layer in reverse order
|
||||
for (int8_t i = results->layers_used - 1; i >= 0; i--)
|
||||
@@ -319,7 +238,7 @@ int raw_packet_parser_get_most_inner_address(struct raw_pkt_parser *handler, str
|
||||
const struct layer_result *layer = &results->layers[i];
|
||||
enum layer_type type = layer->type;
|
||||
|
||||
LOG_DEBUG("%s: find most inner address, pkt_trace_id: %lu, layer[%d/%d]: %s", LOG_TAG, handler->pkt_trace_id, i, results->layers_size, layer_type2str(type));
|
||||
LOG_DEBUG("%s: find most inner address, pkt_trace_id: %lu, layer[%d/%d]: %s", LOG_TAG_RAWPKT, handler->pkt_trace_id, i, results->layers_size, layer_type2str(type));
|
||||
if (type & LAYER_TYPE_L3)
|
||||
{
|
||||
l3_layer_data = (const char *)handler->ptr_pkt_start + layer->offset;
|
||||
@@ -336,7 +255,7 @@ int raw_packet_parser_get_most_inner_address(struct raw_pkt_parser *handler, str
|
||||
int raw_packet_parser_get_most_outer_address(struct raw_pkt_parser *handler, struct addr_tuple4 *addr)
|
||||
{
|
||||
const char *l3_layer_data = NULL;
|
||||
struct layer_result_array *results = &handler->results;
|
||||
struct layer_results *results = &handler->results;
|
||||
|
||||
// search L3 layer in order
|
||||
for (int8_t i = 0; i <= results->layers_used - 1; i++)
|
||||
@@ -344,7 +263,7 @@ int raw_packet_parser_get_most_outer_address(struct raw_pkt_parser *handler, str
|
||||
const struct layer_result *layer = &results->layers[i];
|
||||
enum layer_type type = layer->type;
|
||||
|
||||
LOG_DEBUG("%s: find most outer address, pkt_trace_id: %lu, layer[%d/%d]: %s", LOG_TAG, handler->pkt_trace_id, i, results->layers_size, layer_type2str(type));
|
||||
LOG_DEBUG("%s: find most outer address, pkt_trace_id: %lu, layer[%d/%d]: %s", LOG_TAG_RAWPKT, handler->pkt_trace_id, i, results->layers_size, layer_type2str(type));
|
||||
if (type & LAYER_TYPE_L3)
|
||||
{
|
||||
l3_layer_data = (const char *)handler->ptr_pkt_start + layer->offset;
|
||||
@@ -477,7 +396,7 @@ uint64_t raw_packet_parser_get_hash_value(struct raw_pkt_parser *handler, enum l
|
||||
char *inner_addr_str = addr_tuple4_to_str(&inner_addr);
|
||||
char *outer_addr_str = addr_tuple4_to_str(&outer_addr);
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, outer_addr: %s, inner_addr: %s, is_internal: %d, hash_method: %s, hash_value: %lu",
|
||||
LOG_TAG, handler->pkt_trace_id, outer_addr_str, inner_addr_str, dir_is_internal, ldbc_method_to_string(method), hash_value);
|
||||
LOG_TAG_RAWPKT, handler->pkt_trace_id, outer_addr_str, inner_addr_str, dir_is_internal, ldbc_method_to_string(method), hash_value);
|
||||
free(inner_addr_str);
|
||||
free(outer_addr_str);
|
||||
|
||||
@@ -488,6 +407,48 @@ uint64_t raw_packet_parser_get_hash_value(struct raw_pkt_parser *handler, enum l
|
||||
* Private API
|
||||
******************************************************************************/
|
||||
|
||||
// return 0 : success
|
||||
// return -ENOMEM : error
|
||||
static int raw_packet_parser_push(struct raw_pkt_parser *handler, enum layer_type type, uint16_t offset)
|
||||
{
|
||||
struct layer_results *result = &handler->results;
|
||||
|
||||
if (result->layers_used >= result->layers_size)
|
||||
{
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
result->layers[result->layers_used].offset = offset;
|
||||
result->layers[result->layers_used].type = type;
|
||||
result->layers_used++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// return PARSE_STATUS_CONTINUE
|
||||
// return PARSE_STATUS_STOP
|
||||
static enum parse_status raw_packet_parser_status(struct raw_pkt_parser *handler, const void *data, enum layer_type this_type)
|
||||
{
|
||||
/*
|
||||
* only when this_type & handler->expect_type is true,
|
||||
* the information of the current layer will be recorded in results.
|
||||
*/
|
||||
if (!(this_type & handler->expect_type))
|
||||
{
|
||||
return PARSE_STATUS_CONTINUE;
|
||||
}
|
||||
|
||||
uint16_t offset = (uintptr_t)data - (uintptr_t)(handler->ptr_pkt_start);
|
||||
if (raw_packet_parser_push(handler, this_type, offset) < 0)
|
||||
{
|
||||
return PARSE_STATUS_STOP;
|
||||
}
|
||||
else
|
||||
{
|
||||
return PARSE_STATUS_CONTINUE;
|
||||
}
|
||||
}
|
||||
|
||||
static const char *ldbc_method_to_string(enum ldbc_method ldbc_method)
|
||||
{
|
||||
switch (ldbc_method)
|
||||
@@ -629,7 +590,7 @@ static const void *parse_ether(struct raw_pkt_parser *handler, const void *data,
|
||||
{
|
||||
if (length < sizeof(struct ethhdr))
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -644,7 +605,7 @@ static const void *parse_ether(struct raw_pkt_parser *handler, const void *data,
|
||||
const void *data_next_layer = (const char *)data + hdr_len;
|
||||
size_t data_next_length = length - hdr_len;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
switch (next_proto)
|
||||
{
|
||||
case ETH_P_8021Q:
|
||||
@@ -666,7 +627,7 @@ static const void *parse_ether(struct raw_pkt_parser *handler, const void *data,
|
||||
// TESTED
|
||||
return parse_mpls(handler, data_next_layer, data_next_length, LAYER_TYPE_MPLS);
|
||||
default:
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
return data_next_layer;
|
||||
}
|
||||
}
|
||||
@@ -675,7 +636,7 @@ static const void *parse_ipv4(struct raw_pkt_parser *handler, const void *data,
|
||||
{
|
||||
if (length < sizeof(struct ip))
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -690,7 +651,7 @@ static const void *parse_ipv4(struct raw_pkt_parser *handler, const void *data,
|
||||
const void *data_next_layer = (const char *)data + hdr_len;
|
||||
size_t data_next_length = length - hdr_len;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
switch (next_proto)
|
||||
{
|
||||
case IPPROTO_TCP:
|
||||
@@ -706,7 +667,7 @@ static const void *parse_ipv4(struct raw_pkt_parser *handler, const void *data,
|
||||
// TESTED
|
||||
return parse_ipv6(handler, data_next_layer, data_next_length, LAYER_TYPE_IPV6);
|
||||
default:
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
return data_next_layer;
|
||||
}
|
||||
}
|
||||
@@ -715,7 +676,7 @@ static const void *parse_ipv6(struct raw_pkt_parser *handler, const void *data,
|
||||
{
|
||||
if (length < sizeof(struct ip6_hdr))
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -730,7 +691,7 @@ static const void *parse_ipv6(struct raw_pkt_parser *handler, const void *data,
|
||||
const void *data_next_layer = (const char *)data + hdr_len;
|
||||
size_t data_next_length = length - hdr_len;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
switch (next_proto)
|
||||
{
|
||||
case IPPROTO_TCP:
|
||||
@@ -746,7 +707,7 @@ static const void *parse_ipv6(struct raw_pkt_parser *handler, const void *data,
|
||||
// TESTED
|
||||
return parse_ipv6(handler, data_next_layer, data_next_length, LAYER_TYPE_IPV6);
|
||||
default:
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
return data_next_layer;
|
||||
}
|
||||
}
|
||||
@@ -755,7 +716,7 @@ static const void *parse_tcp(struct raw_pkt_parser *handler, const void *data, s
|
||||
{
|
||||
if (length < sizeof(struct tcphdr))
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -769,7 +730,7 @@ static const void *parse_tcp(struct raw_pkt_parser *handler, const void *data, s
|
||||
const void *data_next_layer = (const char *)data + hdr_len;
|
||||
size_t data_next_length = length - hdr_len;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
|
||||
return data_next_layer;
|
||||
}
|
||||
@@ -778,7 +739,7 @@ static const void *parse_udp(struct raw_pkt_parser *handler, const void *data, s
|
||||
{
|
||||
if (length < sizeof(struct udphdr))
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -792,7 +753,7 @@ static const void *parse_udp(struct raw_pkt_parser *handler, const void *data, s
|
||||
const void *data_next_layer = (const char *)data + hdr_len;
|
||||
size_t data_next_length = length - hdr_len;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
switch (ntohs(hdr->uh_dport))
|
||||
{
|
||||
// VXLAN_DPORT
|
||||
@@ -812,7 +773,7 @@ static const void *parse_ppp(struct raw_pkt_parser *handler, const void *data, s
|
||||
{
|
||||
if (length < PPP_HDRLEN)
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -826,7 +787,7 @@ static const void *parse_ppp(struct raw_pkt_parser *handler, const void *data, s
|
||||
const void *data_next_layer = (const char *)data + hdr_len;
|
||||
size_t data_next_length = length - hdr_len;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
switch (next_proto)
|
||||
{
|
||||
case PPP_IP:
|
||||
@@ -836,7 +797,7 @@ static const void *parse_ppp(struct raw_pkt_parser *handler, const void *data, s
|
||||
// TODO
|
||||
return parse_ipv6(handler, data_next_layer, data_next_length, LAYER_TYPE_IPV6);
|
||||
default:
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
return data_next_layer;
|
||||
}
|
||||
}
|
||||
@@ -845,7 +806,7 @@ static const void *parse_pppoe_ses(struct raw_pkt_parser *handler, const void *d
|
||||
{
|
||||
if (length < 8)
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -859,7 +820,7 @@ static const void *parse_pppoe_ses(struct raw_pkt_parser *handler, const void *d
|
||||
const void *data_next_layer = (const char *)data + hdr_len;
|
||||
size_t data_next_length = length - hdr_len;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
switch (next_proto)
|
||||
{
|
||||
// PPPOE_TYPE_IPV4
|
||||
@@ -871,7 +832,7 @@ static const void *parse_pppoe_ses(struct raw_pkt_parser *handler, const void *d
|
||||
// TODO
|
||||
return parse_ipv6(handler, data_next_layer, data_next_length, LAYER_TYPE_IPV6);
|
||||
default:
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
return data_next_layer;
|
||||
}
|
||||
}
|
||||
@@ -880,7 +841,7 @@ static const void *parse_hdlc(struct raw_pkt_parser *handler, const void *data,
|
||||
{
|
||||
if (length < 4)
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -894,7 +855,7 @@ static const void *parse_hdlc(struct raw_pkt_parser *handler, const void *data,
|
||||
const void *data_next_layer = (const char *)data + hdr_len;
|
||||
size_t data_next_length = length - hdr_len;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
// HDLC的协议字段与以太网的类似,对于IPv4,为0x0800
|
||||
switch (next_proto)
|
||||
{
|
||||
@@ -907,7 +868,7 @@ static const void *parse_hdlc(struct raw_pkt_parser *handler, const void *data,
|
||||
// TODO
|
||||
return parse_ipv6(handler, data_next_layer, data_next_length, LAYER_TYPE_IPV6);
|
||||
default:
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
return data_next_layer;
|
||||
}
|
||||
}
|
||||
@@ -916,7 +877,7 @@ static const void *parse_vxlan(struct raw_pkt_parser *handler, const void *data,
|
||||
{
|
||||
if (length < sizeof(struct vxlan_hdr))
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -930,7 +891,7 @@ static const void *parse_vxlan(struct raw_pkt_parser *handler, const void *data,
|
||||
const void *data_next_layer = (const char *)data + hdr_len;
|
||||
size_t data_next_length = length - hdr_len;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
// TESTED
|
||||
return parse_ether(handler, data_next_layer, data_next_length, LAYER_TYPE_ETHER);
|
||||
|
||||
@@ -942,7 +903,7 @@ static const void *parse_vlan8021q(struct raw_pkt_parser *handler, const void *d
|
||||
{
|
||||
if (length < sizeof(struct vlan_hdr))
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -957,7 +918,7 @@ static const void *parse_vlan8021q(struct raw_pkt_parser *handler, const void *d
|
||||
const void *data_next_layer = (const char *)data + hdr_len;
|
||||
size_t data_next_length = length - hdr_len;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
switch (next_proto)
|
||||
{
|
||||
case ETH_P_8021Q:
|
||||
@@ -976,7 +937,7 @@ static const void *parse_vlan8021q(struct raw_pkt_parser *handler, const void *d
|
||||
// TODO
|
||||
return parse_mpls(handler, data_next_layer, data_next_length, LAYER_TYPE_MPLS);
|
||||
default:
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
return data_next_layer;
|
||||
}
|
||||
}
|
||||
@@ -985,7 +946,7 @@ static const void *parse_gtpv1_u(struct raw_pkt_parser *handler, const void *dat
|
||||
{
|
||||
if (length < sizeof(struct gtp_hdr))
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1004,7 +965,7 @@ static const void *parse_gtpv1_u(struct raw_pkt_parser *handler, const void *dat
|
||||
const void *data_next_layer = (const char *)data + hdr_len;
|
||||
size_t data_next_length = length - hdr_len;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
switch (next_proto)
|
||||
{
|
||||
case 4:
|
||||
@@ -1014,7 +975,7 @@ static const void *parse_gtpv1_u(struct raw_pkt_parser *handler, const void *dat
|
||||
// TESTED
|
||||
return parse_ipv6(handler, data_next_layer, data_next_length, LAYER_TYPE_IPV6);
|
||||
default:
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, stop parse next protocol %d", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), next_proto);
|
||||
return data_next_layer;
|
||||
}
|
||||
}
|
||||
@@ -1023,7 +984,7 @@ static const void *parse_mpls(struct raw_pkt_parser *handler, const void *data,
|
||||
{
|
||||
if (length < 4)
|
||||
{
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
LOG_ERROR("%s: pkt_trace_id: %lu, this_layer: %s, err: data not enough", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type));
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -1077,32 +1038,32 @@ static const void *parse_mpls(struct raw_pkt_parser *handler, const void *data,
|
||||
data_next_layer = (const char *)data_next_layer + 4;
|
||||
data_next_length = data_next_length - 4;
|
||||
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
// TESTED
|
||||
return parse_ether(handler, data_next_layer, data_next_length, LAYER_TYPE_ETHER);
|
||||
}
|
||||
else if (ip_version == 4)
|
||||
{
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
// TESTED
|
||||
return parse_ipv4(handler, data_next_layer, data_next_length, LAYER_TYPE_IPV4);
|
||||
}
|
||||
else if (ip_version == 6)
|
||||
{
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
// TODO
|
||||
return parse_ipv6(handler, data_next_layer, data_next_length, LAYER_TYPE_IPV6);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
// TODO
|
||||
return parse_ether(handler, data_next_layer, data_next_length, LAYER_TYPE_ETHER);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
LOG_DEBUG("%s: pkt_trace_id: %lu, this_layer: %s, payload_len: [%lu/%lu]", LOG_TAG_RAWPKT, handler->pkt_trace_id, layer_type2str(this_type), data_next_length, length);
|
||||
// TESTED
|
||||
return parse_mpls(handler, data_next_layer, data_next_length, LAYER_TYPE_MPLS);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include <assert.h>
|
||||
|
||||
#include "session_table.h"
|
||||
#include "utils.h"
|
||||
#include "log.h"
|
||||
|
||||
struct session_table
|
||||
@@ -66,7 +67,7 @@ int session_table_insert(struct session_table *table, uint64_t session_id, const
|
||||
HASH_FIND(hh1, table->root_by_id, &session_id, sizeof(session_id), temp);
|
||||
if (temp)
|
||||
{
|
||||
LOG_DEBUG("session table insert: key %lu exists", session_id);
|
||||
LOG_DEBUG("%s: insert: key %lu exists", LOG_TAG_STABLE, session_id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -81,7 +82,7 @@ int session_table_insert(struct session_table *table, uint64_t session_id, const
|
||||
HASH_ADD(hh1, table->root_by_id, session_id, sizeof(temp->session_id), temp);
|
||||
HASH_ADD(hh2, table->root_by_addr, session_addr, sizeof(temp->session_addr), temp);
|
||||
|
||||
LOG_DEBUG("session table insert: key %lu success", session_id);
|
||||
LOG_DEBUG("%s: insert: key %lu success", LOG_TAG_STABLE, session_id);
|
||||
table->session_node_count++;
|
||||
|
||||
return 0;
|
||||
@@ -93,7 +94,7 @@ int session_table_delete_by_id(struct session_table *table, uint64_t session_id)
|
||||
HASH_FIND(hh1, table->root_by_id, &session_id, sizeof(session_id), temp);
|
||||
if (!temp)
|
||||
{
|
||||
LOG_DEBUG("session table delete: key %lu not exists", session_id);
|
||||
LOG_DEBUG("%s: delete: key %lu not exists", LOG_TAG_STABLE, session_id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -109,7 +110,7 @@ int session_table_delete_by_id(struct session_table *table, uint64_t session_id)
|
||||
free(temp);
|
||||
temp = NULL;
|
||||
|
||||
LOG_DEBUG("session table delete: key %lu success", session_id);
|
||||
LOG_DEBUG("%s: delete: key %lu success", LOG_TAG_STABLE, session_id);
|
||||
table->session_node_count--;
|
||||
|
||||
return 0;
|
||||
@@ -127,7 +128,7 @@ int session_table_delete_by_addr(struct session_table *table, const struct addr_
|
||||
HASH_FIND(hh2, table->root_by_addr, &reverse_addr, sizeof(struct addr_tuple4), temp);
|
||||
if (!temp)
|
||||
{
|
||||
LOG_DEBUG("session table delete: key %s not exists", addr_str);
|
||||
LOG_DEBUG("%s: delete: key %s not exists", LOG_TAG_STABLE, addr_str);
|
||||
free(addr_str);
|
||||
return -1;
|
||||
}
|
||||
@@ -145,7 +146,7 @@ int session_table_delete_by_addr(struct session_table *table, const struct addr_
|
||||
free(temp);
|
||||
temp = NULL;
|
||||
|
||||
LOG_DEBUG("session table delete: key %s success", addr_str);
|
||||
LOG_DEBUG("%s: delete: key %s success", LOG_TAG_STABLE, addr_str);
|
||||
free(addr_str);
|
||||
addr_str = NULL;
|
||||
table->session_node_count--;
|
||||
@@ -159,11 +160,11 @@ struct session_node *session_table_search_by_id(struct session_table *table, uin
|
||||
HASH_FIND(hh1, table->root_by_id, &session_id, sizeof(session_id), temp);
|
||||
if (!temp)
|
||||
{
|
||||
LOG_DEBUG("session table search: key %lu not exists", session_id);
|
||||
LOG_DEBUG("%s: search: key %lu not exists", LOG_TAG_STABLE, session_id);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
LOG_DEBUG("session table search: key %lu success", session_id);
|
||||
LOG_DEBUG("%s: search: key %lu success", LOG_TAG_STABLE, session_id);
|
||||
|
||||
return temp;
|
||||
}
|
||||
@@ -180,14 +181,14 @@ struct session_node *session_table_search_by_addr(struct session_table *table, c
|
||||
HASH_FIND(hh2, table->root_by_addr, &reverse_addr, sizeof(struct addr_tuple4), temp);
|
||||
if (!temp)
|
||||
{
|
||||
LOG_DEBUG("session table search: key %s not exists", addr_str);
|
||||
LOG_DEBUG("%s: search: key %s not exists", LOG_TAG_STABLE, addr_str);
|
||||
free(addr_str);
|
||||
addr_str = NULL;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
LOG_DEBUG("session table search: key %s success", addr_str);
|
||||
LOG_DEBUG("%s: search: key %s success", LOG_TAG_STABLE, addr_str);
|
||||
free(addr_str);
|
||||
addr_str = NULL;
|
||||
|
||||
|
||||
@@ -1,9 +1,21 @@
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/if.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <netinet/udp.h>
|
||||
#include <netinet/ether.h>
|
||||
|
||||
#include "utils.h"
|
||||
#include "log.h"
|
||||
|
||||
/******************************************************************************
|
||||
* fixed_num_array
|
||||
******************************************************************************/
|
||||
|
||||
void fixed_num_array_init(struct fixed_num_array *array)
|
||||
{
|
||||
memset(array, 0, sizeof(fixed_num_array));
|
||||
@@ -40,6 +52,18 @@ void fixed_num_array_del_elem(struct fixed_num_array *array, int elem)
|
||||
}
|
||||
}
|
||||
|
||||
int fixed_num_array_is_full(struct fixed_num_array *array)
|
||||
{
|
||||
if (array->num == array->size)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int fixed_num_array_count_elem(struct fixed_num_array *array)
|
||||
{
|
||||
if (array)
|
||||
@@ -52,6 +76,19 @@ int fixed_num_array_count_elem(struct fixed_num_array *array)
|
||||
}
|
||||
}
|
||||
|
||||
int fixed_num_array_exist_elem(struct fixed_num_array *array, int elem)
|
||||
{
|
||||
for (int i = 0; i < array->num; i++)
|
||||
{
|
||||
if (array->elems[i] == elem)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fixed_num_array_index_elem(struct fixed_num_array *array, int index)
|
||||
{
|
||||
if (index >= array->num)
|
||||
@@ -60,4 +97,178 @@ int fixed_num_array_index_elem(struct fixed_num_array *array, int index)
|
||||
}
|
||||
|
||||
return array->elems[index];
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* sids
|
||||
******************************************************************************/
|
||||
|
||||
void sids_write_once(struct sids *dst, struct sids *src)
|
||||
{
|
||||
if (dst && src)
|
||||
{
|
||||
if (dst->num == 0 && src->num > 0)
|
||||
{
|
||||
sids_copy(dst, src);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sids_copy(struct sids *dst, struct sids *src)
|
||||
{
|
||||
if (dst && src)
|
||||
{
|
||||
dst->num = src->num;
|
||||
memcpy(dst->elems, src->elems, sizeof(dst->elems[0]) * dst->num);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* throughput_metrics
|
||||
******************************************************************************/
|
||||
|
||||
void throughput_metrics_inc(struct throughput_metrics *iterm, uint64_t n_pkts, uint64_t n_bytes)
|
||||
{
|
||||
__atomic_fetch_add(&iterm->n_bytes, n_bytes, __ATOMIC_RELAXED);
|
||||
__atomic_fetch_add(&iterm->n_pkts, n_pkts, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* protocol
|
||||
******************************************************************************/
|
||||
|
||||
#define CHECKSUM_CARRY(x) (x = (x >> 16) + (x & 0xffff), (~(x + (x >> 16)) & 0xffff))
|
||||
|
||||
static int checksum(u_int16_t *addr, int len)
|
||||
{
|
||||
int sum = 0;
|
||||
int nleft = len;
|
||||
u_int16_t ans = 0;
|
||||
u_int16_t *w = addr;
|
||||
|
||||
while (nleft > 1)
|
||||
{
|
||||
sum += *w++;
|
||||
nleft -= 2;
|
||||
}
|
||||
|
||||
if (nleft == 1)
|
||||
{
|
||||
*(char *)(&ans) = *(char *)w;
|
||||
sum += ans;
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
void build_udp_header(const char *l3_hdr, int l3_hdr_len, struct udphdr *udp_hdr, u_int16_t udp_sport, u_int16_t udp_dport, int payload_len)
|
||||
{
|
||||
memset(udp_hdr, 0, sizeof(struct udphdr));
|
||||
|
||||
int udp_hlen = sizeof(struct udphdr) + payload_len;
|
||||
|
||||
udp_hdr->uh_sport = htons(udp_sport);
|
||||
udp_hdr->uh_dport = htons(udp_dport);
|
||||
|
||||
udp_hdr->uh_ulen = htons(udp_hlen);
|
||||
udp_hdr->uh_sum = 0;
|
||||
|
||||
int sum = checksum((u_int16_t *)l3_hdr, l3_hdr_len);
|
||||
sum += ntohs(IPPROTO_UDP + udp_hlen);
|
||||
sum += checksum((u_int16_t *)udp_hdr, udp_hlen);
|
||||
udp_hdr->uh_sum = CHECKSUM_CARRY(sum);
|
||||
}
|
||||
|
||||
void build_ip_header(struct ip *ip_hdr, u_int8_t next_protocol, const char *src_addr, const char *dst_addr, uint16_t payload_len)
|
||||
{
|
||||
memset(ip_hdr, 0, sizeof(struct ip));
|
||||
|
||||
ip_hdr->ip_hl = 5; /* 20 byte header */
|
||||
ip_hdr->ip_v = 4; /* version 4 */
|
||||
ip_hdr->ip_tos = 0; /* IP tos */
|
||||
ip_hdr->ip_id = htons(random()); /* IP ID */
|
||||
ip_hdr->ip_ttl = 80; /* time to live */
|
||||
ip_hdr->ip_p = next_protocol; /* transport protocol */
|
||||
ip_hdr->ip_src.s_addr = inet_addr(src_addr);
|
||||
ip_hdr->ip_dst.s_addr = inet_addr(dst_addr);
|
||||
ip_hdr->ip_len = htons(sizeof(struct ip) + payload_len); /* total length */
|
||||
ip_hdr->ip_off = htons(0); /* fragmentation flags */
|
||||
ip_hdr->ip_sum = 0; /* do this later */
|
||||
|
||||
int sum = checksum((u_int16_t *)ip_hdr, 20);
|
||||
ip_hdr->ip_sum = CHECKSUM_CARRY(sum);
|
||||
}
|
||||
|
||||
// l3_protocol: ETH_P_IPV6/ETH_P_IP
|
||||
void build_ether_header(struct ethhdr *eth_hdr, uint16_t next_protocol, const char *src_mac, const char *dst_mac)
|
||||
{
|
||||
memset(eth_hdr, 0, sizeof(struct ethhdr));
|
||||
|
||||
str_to_mac(src_mac, (char *)eth_hdr->h_source);
|
||||
str_to_mac(dst_mac, (char *)eth_hdr->h_dest);
|
||||
eth_hdr->h_proto = htons(next_protocol);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* device
|
||||
******************************************************************************/
|
||||
|
||||
int get_ip_by_device_name(const char *dev_name, char *ip_buff)
|
||||
{
|
||||
int fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (fd == -1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct ifreq ifr;
|
||||
memset(&ifr, 0, sizeof(struct ifreq));
|
||||
ifr.ifr_addr.sa_family = AF_INET;
|
||||
strcpy(ifr.ifr_name, dev_name);
|
||||
if (ioctl(fd, SIOCGIFADDR, &ifr) != 0)
|
||||
{
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
strcpy(ip_buff, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
|
||||
close(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_mac_by_device_name(const char *dev_name, char *mac_buff)
|
||||
{
|
||||
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
|
||||
if (fd == -1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct ifreq ifr;
|
||||
memset(&ifr, 0, sizeof(struct ifreq));
|
||||
strcpy(ifr.ifr_name, dev_name);
|
||||
if (ioctl(fd, SIOCGIFHWADDR, &ifr) != 0)
|
||||
{
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
unsigned char *mac = (unsigned char *)ifr.ifr_hwaddr.sa_data;
|
||||
sprintf(mac_buff, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||
close(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int str_to_mac(const char *str, char *mac_buff)
|
||||
{
|
||||
if (sscanf(str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", &(mac_buff[0]), &(mac_buff[1]), &(mac_buff[2]), &(mac_buff[3]), &(mac_buff[4]), &(mac_buff[5])) == 6)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user