Refactored packet API to support struct layer (using union to contain different types of encapsulation headers)

This commit is contained in:
luwenpeng
2024-06-14 19:24:27 +08:00
parent 1f78881cbb
commit de4c15f43c
47 changed files with 834 additions and 701 deletions

View File

@@ -2,7 +2,7 @@
#include <stdlib.h>
#include <string.h>
#include "stellar/packet.h"
#include "stellar/layer.h"
#include "stellar/session_mq.h"
#include "packet_inject_main.h"
@@ -38,27 +38,51 @@ static void on_sess_msg(struct session *sess, int topic_id, const void *msg, voi
struct packet *pkt = (struct packet *)msg;
char buffer[1024] = {0};
uint16_t src_port = 0;
uint16_t dst_port = 0;
struct address src_addr = {0};
struct address dst_addr = {0};
int is_ip_hit = 0;
int is_port_hit = 0;
struct layer layer;
PACKET_FOREACH_LAYER_REVERSE(pkt, layer)
{
switch (layer.proto)
{
case LAYER_PROTO_IPV4:
if (memcmp(&layer.header.ip4->ip_src, &rule.addr4, sizeof(struct in_addr)) == 0 ||
memcmp(&layer.header.ip4->ip_dst, &rule.addr4, sizeof(struct in_addr)) == 0)
{
is_ip_hit = 1;
}
break;
case LAYER_PROTO_IPV6:
if (memcmp(&layer.header.ip6->ip6_src, &rule.addr6, sizeof(struct in6_addr)) == 0 ||
memcmp(&layer.header.ip6->ip6_dst, &rule.addr6, sizeof(struct in6_addr)) == 0)
{
is_ip_hit = 1;
}
break;
case LAYER_PROTO_TCP:
if (layer.header.tcp->th_sport == rule.port ||
layer.header.tcp->th_dport == rule.port)
{
is_port_hit = 1;
}
break;
case LAYER_PROTO_UDP:
if (layer.header.udp->uh_sport == rule.port ||
layer.header.udp->uh_dport == rule.port)
{
is_port_hit = 1;
}
break;
default:
break;
}
}
packet_get_addr(pkt, &src_addr, &dst_addr);
packet_get_port(pkt, &src_port, &dst_port);
if (rule.addr.family == AF_INET &&
memcmp(&src_addr.data.v4, &rule.addr.data.v4, sizeof(struct in_addr)) &&
memcmp(&dst_addr.data.v4, &rule.addr.data.v4, sizeof(struct in_addr)))
if (rule.family && !is_ip_hit)
{
return;
}
if (rule.addr.family == AF_INET6 &&
memcmp(&src_addr.data.v6, &rule.addr.data.v6, sizeof(struct in6_addr)) &&
memcmp(&dst_addr.data.v6, &rule.addr.data.v6, sizeof(struct in6_addr)))
{
return;
}
if (rule.port != 0 && src_port != rule.port && dst_port != rule.port)
if (rule.port && !is_port_hit)
{
return;
}