Refactored packet API to support struct layer (using union to contain different types of encapsulation headers)
This commit is contained in:
@@ -58,21 +58,21 @@ static int parse_cmd(int argc, char **argv)
|
||||
|
||||
if (host)
|
||||
{
|
||||
if (inet_pton(AF_INET, host, &rule.addr.data.v4) != 1)
|
||||
if (inet_pton(AF_INET, host, &rule.addr4) != 1)
|
||||
{
|
||||
if (inet_pton(AF_INET6, host, &rule.addr.data.v6) != 1)
|
||||
if (inet_pton(AF_INET6, host, &rule.addr6) != 1)
|
||||
{
|
||||
printf("unable to convert host %s to IPv4 / IPv6\n", host);
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
rule.addr.family = AF_INET6;
|
||||
rule.family = AF_INET6;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rule.addr.family = AF_INET;
|
||||
rule.family = AF_INET;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,8 +24,10 @@ enum packet_inject_type
|
||||
|
||||
struct packet_inject_rule
|
||||
{
|
||||
struct address addr; /* network order */
|
||||
uint16_t port; /* network order */
|
||||
int family; /* AF_INET or AF_INET6 */
|
||||
struct in_addr addr4; /* network order */
|
||||
struct in6_addr addr6; /* network order */
|
||||
uint16_t port; /* network order */
|
||||
|
||||
enum packet_inject_type inject_type;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ static void packet_to_tshark_format(const struct packet *pkt, uint64_t idx)
|
||||
memset(tmp_src_buff, 0, sizeof(tmp_src_buff));
|
||||
memset(tmp_dst_buff, 0, sizeof(tmp_dst_buff));
|
||||
const struct raw_layer *layer = packet_get_raw_layer(pkt, i);
|
||||
switch (layer->type)
|
||||
switch (layer->proto)
|
||||
{
|
||||
case LAYER_PROTO_ETHER:
|
||||
buffer_push(&buff_proto, "eth:ethertype");
|
||||
@@ -232,6 +232,7 @@ static void packet_handler(u_char *user, const struct pcap_pkthdr *h, const u_ch
|
||||
struct options *opts = (struct options *)user;
|
||||
|
||||
struct packet pkt;
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
packet_parse(&pkt, (const char *)bytes, h->caplen);
|
||||
number++;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user