2024-04-11 19:44:02 +08:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
2024-06-24 17:07:05 +08:00
|
|
|
#include "log.h"
|
|
|
|
|
#include "tuple.h"
|
|
|
|
|
#include "tcp_utils.h"
|
|
|
|
|
#include "udp_utils.h"
|
2024-07-09 11:17:03 +08:00
|
|
|
#include "ip4_utils.h"
|
|
|
|
|
#include "ip6_utils.h"
|
2024-06-24 17:07:05 +08:00
|
|
|
#include "packet_def.h"
|
2024-06-14 19:24:27 +08:00
|
|
|
#include "packet_utils.h"
|
2024-04-11 19:44:02 +08:00
|
|
|
|
2024-06-24 17:07:05 +08:00
|
|
|
#define PACKET_UTILS_LOG_ERROR(format, ...) LOG_ERROR("packet utils", format, ##__VA_ARGS__)
|
|
|
|
|
|
2024-04-11 19:44:02 +08:00
|
|
|
/******************************************************************************
|
2024-06-14 19:24:27 +08:00
|
|
|
* metadata utils
|
2024-04-11 19:44:02 +08:00
|
|
|
******************************************************************************/
|
|
|
|
|
|
2024-06-14 19:24:27 +08:00
|
|
|
void packet_set_sids(struct packet *pkt, const struct sids *sids)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-14 19:24:27 +08:00
|
|
|
pkt->meta.sids = *sids;
|
2024-04-11 19:44:02 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-14 19:24:27 +08:00
|
|
|
const struct sids *packet_get_sids(const struct packet *pkt)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-14 19:24:27 +08:00
|
|
|
return &pkt->meta.sids;
|
2024-04-11 19:44:02 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-14 19:24:27 +08:00
|
|
|
void packet_prepend_sids(struct packet *pkt, const struct sids *sids)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-14 19:24:27 +08:00
|
|
|
if (pkt->meta.sids.used + sids->used > MAX_SIDS)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-24 17:07:05 +08:00
|
|
|
PACKET_UTILS_LOG_ERROR("sids overflow");
|
2024-06-14 19:24:27 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for (int i = pkt->meta.sids.used - 1; i >= 0; i--)
|
|
|
|
|
{
|
|
|
|
|
pkt->meta.sids.sid[i + sids->used] = pkt->meta.sids.sid[i];
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < sids->used; i++)
|
|
|
|
|
{
|
|
|
|
|
pkt->meta.sids.sid[i] = sids->sid[i];
|
|
|
|
|
}
|
|
|
|
|
pkt->meta.sids.used += sids->used;
|
2024-04-11 19:44:02 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-14 19:24:27 +08:00
|
|
|
void packet_set_session_id(struct packet *pkt, uint64_t id)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-14 19:24:27 +08:00
|
|
|
pkt->meta.session_id = id;
|
2024-04-11 19:44:02 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-14 19:24:27 +08:00
|
|
|
uint64_t packet_get_session_id(const struct packet *pkt)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-14 19:24:27 +08:00
|
|
|
return pkt->meta.session_id;
|
2024-04-11 19:44:02 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-25 10:32:51 +08:00
|
|
|
void packet_set_domain(struct packet *pkt, uint64_t domain)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-25 10:32:51 +08:00
|
|
|
pkt->meta.domain = domain;
|
2024-04-11 19:44:02 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-25 10:32:51 +08:00
|
|
|
uint64_t packet_get_domain(const struct packet *pkt)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-25 10:32:51 +08:00
|
|
|
return pkt->meta.domain;
|
2024-06-14 19:24:27 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void packet_set_link_id(struct packet *pkt, uint16_t id)
|
|
|
|
|
{
|
|
|
|
|
pkt->meta.link_id = id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint16_t packet_get_link_id(const struct packet *pkt)
|
|
|
|
|
{
|
|
|
|
|
return pkt->meta.link_id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void packet_set_ctrl(struct packet *pkt, uint8_t ctrl)
|
|
|
|
|
{
|
|
|
|
|
pkt->meta.is_ctrl = ctrl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint8_t packet_is_ctrl(const struct packet *pkt)
|
|
|
|
|
{
|
|
|
|
|
return pkt->meta.is_ctrl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void packet_set_direction(struct packet *pkt, enum packet_direction dir)
|
|
|
|
|
{
|
|
|
|
|
pkt->meta.direction = dir;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum packet_direction packet_get_direction(const struct packet *pkt)
|
|
|
|
|
{
|
|
|
|
|
return pkt->meta.direction;
|
2024-04-11 19:44:02 +08:00
|
|
|
}
|
|
|
|
|
|
2024-05-09 14:57:12 +08:00
|
|
|
void packet_set_action(struct packet *pkt, enum packet_action action)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-14 19:24:27 +08:00
|
|
|
pkt->meta.action = action;
|
2024-04-11 19:44:02 +08:00
|
|
|
}
|
|
|
|
|
|
2024-05-09 14:57:12 +08:00
|
|
|
enum packet_action packet_get_action(const struct packet *pkt)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-14 19:24:27 +08:00
|
|
|
return pkt->meta.action;
|
2024-04-11 19:44:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-06-24 17:07:05 +08:00
|
|
|
/******************************************************************************
|
|
|
|
|
* tuple uitls
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// return 0 : found
|
|
|
|
|
// return -1 : not found
|
|
|
|
|
int packet_get_innermost_tuple2(const struct packet *pkt, struct tuple2 *tuple)
|
|
|
|
|
{
|
|
|
|
|
memset(tuple, 0, sizeof(struct tuple2));
|
|
|
|
|
const struct raw_layer *layer = NULL;
|
|
|
|
|
|
|
|
|
|
for (int8_t i = pkt->layers_used - 1; i >= 0; i--)
|
|
|
|
|
{
|
|
|
|
|
layer = &pkt->layers[i];
|
|
|
|
|
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV4)
|
|
|
|
|
{
|
|
|
|
|
const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
|
|
|
|
|
tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV6)
|
|
|
|
|
{
|
|
|
|
|
const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET6;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
|
|
|
|
|
tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// return 0 : found
|
|
|
|
|
// return -1 : not found
|
|
|
|
|
int packet_get_outermost_tuple2(const struct packet *pkt, struct tuple2 *tuple)
|
|
|
|
|
{
|
|
|
|
|
memset(tuple, 0, sizeof(struct tuple2));
|
|
|
|
|
const struct raw_layer *layer = NULL;
|
|
|
|
|
|
|
|
|
|
for (int8_t i = 0; i < pkt->layers_used; i++)
|
|
|
|
|
{
|
|
|
|
|
layer = &pkt->layers[i];
|
|
|
|
|
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV4)
|
|
|
|
|
{
|
|
|
|
|
const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
|
|
|
|
|
tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV6)
|
|
|
|
|
{
|
|
|
|
|
const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET6;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
|
|
|
|
|
tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// return 0 : found
|
|
|
|
|
// return -1 : not found
|
|
|
|
|
int packet_get_innermost_tuple4(const struct packet *pkt, struct tuple4 *tuple)
|
|
|
|
|
{
|
|
|
|
|
memset(tuple, 0, sizeof(struct tuple4));
|
|
|
|
|
const struct raw_layer *layer_l3 = NULL;
|
|
|
|
|
const struct raw_layer *layer_l4 = NULL;
|
|
|
|
|
const struct raw_layer *layer = NULL;
|
|
|
|
|
|
|
|
|
|
for (int8_t i = pkt->layers_used - 1; i >= 0; i--)
|
|
|
|
|
{
|
|
|
|
|
layer = &pkt->layers[i];
|
|
|
|
|
|
|
|
|
|
// first get L4 layer
|
|
|
|
|
if (layer->proto == LAYER_PROTO_UDP)
|
|
|
|
|
{
|
|
|
|
|
const struct udphdr *udp_hdr = (const struct udphdr *)layer->hdr_ptr;
|
|
|
|
|
tuple->src_port = udp_hdr->uh_sport;
|
|
|
|
|
tuple->dst_port = udp_hdr->uh_dport;
|
|
|
|
|
layer_l4 = layer;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (layer->proto == LAYER_PROTO_TCP)
|
|
|
|
|
{
|
|
|
|
|
const struct tcphdr *tcp_hdr = (const struct tcphdr *)layer->hdr_ptr;
|
|
|
|
|
tuple->src_port = tcp_hdr->th_sport;
|
|
|
|
|
tuple->dst_port = tcp_hdr->th_dport;
|
|
|
|
|
layer_l4 = layer;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// second get L3 layer
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV4)
|
|
|
|
|
{
|
|
|
|
|
const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
|
|
|
|
|
tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
layer_l3 = layer;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV6)
|
|
|
|
|
{
|
|
|
|
|
const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET6;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
|
|
|
|
|
tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
layer_l3 = layer;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (layer_l3 && layer_l4 && layer_l4 - layer_l3 == 1)
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// return 0 : found
|
|
|
|
|
// return -1 : not found
|
|
|
|
|
int packet_get_outermost_tuple4(const struct packet *pkt, struct tuple4 *tuple)
|
|
|
|
|
{
|
|
|
|
|
memset(tuple, 0, sizeof(struct tuple4));
|
|
|
|
|
const struct raw_layer *layer_l3 = NULL;
|
|
|
|
|
const struct raw_layer *layer_l4 = NULL;
|
|
|
|
|
const struct raw_layer *layer = NULL;
|
|
|
|
|
|
|
|
|
|
for (int8_t i = 0; i < pkt->layers_used; i++)
|
|
|
|
|
{
|
|
|
|
|
layer = &pkt->layers[i];
|
|
|
|
|
|
|
|
|
|
// first get L3 layer
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV4)
|
|
|
|
|
{
|
|
|
|
|
const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
|
|
|
|
|
tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
layer_l3 = layer;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV6)
|
|
|
|
|
{
|
|
|
|
|
const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET6;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
|
|
|
|
|
tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
layer_l3 = layer;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// second get L4 layer
|
|
|
|
|
if (layer->proto == LAYER_PROTO_UDP)
|
|
|
|
|
{
|
|
|
|
|
const struct udphdr *udp_hdr = (const struct udphdr *)layer->hdr_ptr;
|
|
|
|
|
tuple->src_port = udp_hdr->uh_sport;
|
|
|
|
|
tuple->dst_port = udp_hdr->uh_dport;
|
|
|
|
|
layer_l4 = layer;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (layer->proto == LAYER_PROTO_TCP)
|
|
|
|
|
{
|
|
|
|
|
const struct tcphdr *tcp_hdr = (const struct tcphdr *)layer->hdr_ptr;
|
|
|
|
|
tuple->src_port = tcp_hdr->th_sport;
|
|
|
|
|
tuple->dst_port = tcp_hdr->th_dport;
|
|
|
|
|
layer_l4 = layer;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (layer_l3 && layer_l4 && layer_l4 - layer_l3 == 1)
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// return 0 : found
|
|
|
|
|
// return -1 : not found
|
|
|
|
|
int packet_get_innermost_tuple6(const struct packet *pkt, struct tuple6 *tuple)
|
|
|
|
|
{
|
|
|
|
|
memset(tuple, 0, sizeof(struct tuple6));
|
|
|
|
|
const struct raw_layer *layer_l3 = NULL;
|
|
|
|
|
const struct raw_layer *layer_l4 = NULL;
|
|
|
|
|
const struct raw_layer *layer = NULL;
|
|
|
|
|
|
|
|
|
|
for (int8_t i = pkt->layers_used - 1; i >= 0; i--)
|
|
|
|
|
{
|
|
|
|
|
layer = &pkt->layers[i];
|
|
|
|
|
|
|
|
|
|
// first get L4 layer
|
|
|
|
|
if (layer->proto == LAYER_PROTO_UDP)
|
|
|
|
|
{
|
|
|
|
|
const struct udphdr *udp_hdr = (const struct udphdr *)layer->hdr_ptr;
|
|
|
|
|
tuple->ip_proto = IPPROTO_UDP;
|
|
|
|
|
tuple->src_port = udp_hdr->uh_sport;
|
|
|
|
|
tuple->dst_port = udp_hdr->uh_dport;
|
|
|
|
|
layer_l4 = layer;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (layer->proto == LAYER_PROTO_TCP)
|
|
|
|
|
{
|
|
|
|
|
const struct tcphdr *tcp_hdr = (const struct tcphdr *)layer->hdr_ptr;
|
|
|
|
|
tuple->ip_proto = IPPROTO_TCP;
|
|
|
|
|
tuple->src_port = tcp_hdr->th_sport;
|
|
|
|
|
tuple->dst_port = tcp_hdr->th_dport;
|
|
|
|
|
layer_l4 = layer;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// second get L3 layer
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV4)
|
|
|
|
|
{
|
|
|
|
|
const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
|
|
|
|
|
tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
layer_l3 = layer;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV6)
|
|
|
|
|
{
|
|
|
|
|
const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET6;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
|
|
|
|
|
tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
layer_l3 = layer;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (layer_l3 && layer_l4 && layer_l4 - layer_l3 == 1)
|
|
|
|
|
{
|
2024-06-25 10:32:51 +08:00
|
|
|
tuple->domain = packet_get_domain(pkt);
|
2024-06-24 17:07:05 +08:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// return 0 : found
|
|
|
|
|
// return -1 : not found
|
|
|
|
|
int packet_get_outermost_tuple6(const struct packet *pkt, struct tuple6 *tuple)
|
|
|
|
|
{
|
|
|
|
|
memset(tuple, 0, sizeof(struct tuple6));
|
|
|
|
|
const struct raw_layer *layer_l3 = NULL;
|
|
|
|
|
const struct raw_layer *layer_l4 = NULL;
|
|
|
|
|
const struct raw_layer *layer = NULL;
|
|
|
|
|
|
|
|
|
|
for (int8_t i = 0; i < pkt->layers_used; i++)
|
|
|
|
|
{
|
|
|
|
|
layer = &pkt->layers[i];
|
|
|
|
|
|
|
|
|
|
// first get L3 layer
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV4)
|
|
|
|
|
{
|
|
|
|
|
const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
|
|
|
|
|
tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
layer_l3 = layer;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (layer->proto == LAYER_PROTO_IPV6)
|
|
|
|
|
{
|
|
|
|
|
const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
|
2024-07-25 18:29:57 +08:00
|
|
|
tuple->addr_family = AF_INET6;
|
2024-07-09 11:17:03 +08:00
|
|
|
tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
|
|
|
|
|
tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
|
2024-06-24 17:07:05 +08:00
|
|
|
layer_l3 = layer;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// second get L4 layer
|
|
|
|
|
if (layer->proto == LAYER_PROTO_UDP)
|
|
|
|
|
{
|
|
|
|
|
const struct udphdr *udp_hdr = (const struct udphdr *)layer->hdr_ptr;
|
|
|
|
|
tuple->ip_proto = IPPROTO_UDP;
|
|
|
|
|
tuple->src_port = udp_hdr->uh_sport;
|
|
|
|
|
tuple->dst_port = udp_hdr->uh_dport;
|
|
|
|
|
layer_l4 = layer;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (layer->proto == LAYER_PROTO_TCP)
|
|
|
|
|
{
|
|
|
|
|
const struct tcphdr *tcp_hdr = (const struct tcphdr *)layer->hdr_ptr;
|
|
|
|
|
tuple->ip_proto = IPPROTO_TCP;
|
|
|
|
|
tuple->src_port = tcp_hdr->th_sport;
|
|
|
|
|
tuple->dst_port = tcp_hdr->th_dport;
|
|
|
|
|
layer_l4 = layer;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (layer_l3 && layer_l4 && layer_l4 - layer_l3 == 1)
|
|
|
|
|
{
|
2024-06-25 10:32:51 +08:00
|
|
|
tuple->domain = packet_get_domain(pkt);
|
2024-06-24 17:07:05 +08:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-14 19:24:27 +08:00
|
|
|
/******************************************************************************
|
|
|
|
|
* other uitls
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
2024-06-24 17:07:05 +08:00
|
|
|
const char *packet_get_raw_data(const struct packet *pkt)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-24 17:07:05 +08:00
|
|
|
return pkt->data_ptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint16_t packet_get_raw_len(const struct packet *pkt)
|
|
|
|
|
{
|
|
|
|
|
return pkt->data_len;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char *packet_get_payload(const struct packet *pkt)
|
|
|
|
|
{
|
2024-08-08 16:17:40 +08:00
|
|
|
if (pkt == NULL || pkt->layers_used == 0)
|
2024-06-24 17:07:05 +08:00
|
|
|
{
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2024-07-11 14:13:34 +08:00
|
|
|
|
|
|
|
|
if (pkt->layers[pkt->layers_used - 1].pld_len)
|
|
|
|
|
{
|
|
|
|
|
return pkt->layers[pkt->layers_used - 1].pld_ptr;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2024-06-24 17:07:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint16_t packet_get_payload_len(const struct packet *pkt)
|
|
|
|
|
{
|
2024-08-08 16:17:40 +08:00
|
|
|
if (pkt==NULL || pkt->layers_used == 0)
|
2024-06-24 17:07:05 +08:00
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return pkt->layers[pkt->layers_used - 1].pld_len;
|
2024-04-11 19:44:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct packet *packet_new(uint16_t pkt_len)
|
|
|
|
|
{
|
2024-07-31 00:00:44 +08:00
|
|
|
struct packet *pkt = (struct packet *)malloc( sizeof(struct packet) + pkt_len);
|
2024-04-11 19:44:02 +08:00
|
|
|
if (pkt == NULL)
|
|
|
|
|
{
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
pkt->data_len = pkt_len;
|
|
|
|
|
pkt->data_ptr = (const char *)pkt + sizeof(struct packet);
|
2024-06-14 19:24:27 +08:00
|
|
|
pkt->need_free = 1;
|
2024-04-11 19:44:02 +08:00
|
|
|
|
|
|
|
|
return pkt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct packet *packet_dup(const struct packet *pkt)
|
|
|
|
|
{
|
|
|
|
|
if (pkt == NULL)
|
|
|
|
|
{
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct packet *dup_pkt = packet_new(pkt->data_len);
|
|
|
|
|
if (dup_pkt == NULL)
|
|
|
|
|
{
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2024-05-15 11:40:00 +08:00
|
|
|
|
|
|
|
|
dup_pkt->layers_used = pkt->layers_used;
|
|
|
|
|
dup_pkt->layers_size = pkt->layers_size;
|
|
|
|
|
|
2024-04-11 19:44:02 +08:00
|
|
|
memcpy((char *)dup_pkt->data_ptr, pkt->data_ptr, pkt->data_len);
|
2024-05-15 11:40:00 +08:00
|
|
|
dup_pkt->data_len = pkt->data_len;
|
2024-06-14 19:24:27 +08:00
|
|
|
packet_set_action(dup_pkt, PACKET_ACTION_DROP);
|
2024-04-11 19:44:02 +08:00
|
|
|
|
|
|
|
|
for (int8_t i = 0; i < pkt->layers_used; i++)
|
|
|
|
|
{
|
2024-06-14 19:24:27 +08:00
|
|
|
dup_pkt->layers[i].proto = pkt->layers[i].proto;
|
2024-04-11 19:44:02 +08:00
|
|
|
dup_pkt->layers[i].hdr_ptr = dup_pkt->data_ptr + pkt->layers[i].hdr_offset;
|
|
|
|
|
dup_pkt->layers[i].pld_ptr = dup_pkt->data_ptr + pkt->layers[i].hdr_offset + pkt->layers[i].hdr_len;
|
2024-05-15 11:40:00 +08:00
|
|
|
dup_pkt->layers[i].hdr_offset = pkt->layers[i].hdr_offset;
|
|
|
|
|
dup_pkt->layers[i].hdr_len = pkt->layers[i].hdr_len;
|
|
|
|
|
dup_pkt->layers[i].pld_len = pkt->layers[i].pld_len;
|
2024-04-11 19:44:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// update frag_layer
|
|
|
|
|
if (pkt->frag_layer)
|
|
|
|
|
{
|
|
|
|
|
dup_pkt->frag_layer = &dup_pkt->layers[pkt->frag_layer - pkt->layers];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return dup_pkt;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-14 19:24:27 +08:00
|
|
|
void packet_free(struct packet *pkt)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-14 19:24:27 +08:00
|
|
|
if (pkt && pkt->need_free)
|
2024-04-11 19:44:02 +08:00
|
|
|
{
|
2024-06-14 19:24:27 +08:00
|
|
|
free((void *)pkt);
|
2024-05-08 18:24:26 +08:00
|
|
|
}
|
2024-06-17 11:41:21 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-24 17:07:05 +08:00
|
|
|
int packet_is_fragment(const struct packet *pkt)
|
|
|
|
|
{
|
|
|
|
|
return (pkt->frag_layer) ? 1 : 0;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-17 11:41:21 +08:00
|
|
|
void layer_convert(const struct raw_layer *in, struct layer *out)
|
|
|
|
|
{
|
|
|
|
|
if (in == NULL || out == NULL)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out->proto = in->proto;
|
2024-06-19 14:43:32 +08:00
|
|
|
out->hdr_len = in->hdr_len;
|
|
|
|
|
out->hdr.raw = (char *)in->hdr_ptr;
|
2024-06-24 17:07:05 +08:00
|
|
|
}
|
2024-08-06 20:37:59 +08:00
|
|
|
|
|
|
|
|
void packet_set_user_data(struct packet *pkt, void *data)
|
|
|
|
|
{
|
|
|
|
|
pkt->user_data=data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void *packet_get_user_data(struct packet *pkt)
|
|
|
|
|
{
|
|
|
|
|
return pkt->user_data;
|
|
|
|
|
}
|