summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2024-06-07 15:17:35 +0800
committerluwenpeng <[email protected]>2024-06-07 16:50:21 +0800
commit10528bcfd3b6cce87fd4c913899ee41b39f1b943 (patch)
tree6599a019b5399062a21350fb129ec7617b0f0748
parent4c0ad823d488cc5aaf6470453ca0a2fca3f72ece (diff)
remove tuple.h from include/stellar
-rw-r--r--include/CMakeLists.txt1
-rw-r--r--include/stellar/packet.h215
-rw-r--r--include/stellar/session.h4
-rw-r--r--src/evicted_session_filter/evicted_session_filter.h2
-rw-r--r--src/packet/packet_priv.h20
-rw-r--r--src/session/session_priv.h5
-rw-r--r--src/stellar/version.map33
-rw-r--r--src/tuple/test/gtest_tuple.cpp2
-rw-r--r--src/tuple/tuple.cpp2
-rw-r--r--src/tuple/tuple.h (renamed from include/stellar/tuple.h)4
-rw-r--r--test/packet_inject/packet_inject_main.cpp8
-rw-r--r--test/packet_inject/packet_inject_main.h7
-rw-r--r--test/packet_inject/packet_inject_plugin.cpp27
13 files changed, 227 insertions, 103 deletions
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
index ac87277..91b7269 100644
--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -1,5 +1,4 @@
install(FILES stellar/utils.h DESTINATION include/stellar/ COMPONENT LIBRARIES)
-install(FILES stellar/tuple.h DESTINATION include/stellar/ COMPONENT LIBRARIES)
install(FILES stellar/packet.h DESTINATION include/stellar/ COMPONENT LIBRARIES)
install(FILES stellar/session.h DESTINATION include/stellar/ COMPONENT LIBRARIES)
install(FILES stellar/stellar.h DESTINATION include/stellar/ COMPONENT LIBRARIES)
diff --git a/include/stellar/packet.h b/include/stellar/packet.h
index b867b6f..02060d0 100644
--- a/include/stellar/packet.h
+++ b/include/stellar/packet.h
@@ -6,7 +6,13 @@ extern "C"
{
#endif
-#include "stellar/tuple.h"
+#include <string.h>
+#include <arpa/inet.h>
+#define __FAVOR_BSD 1
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netinet/ip.h>
+#include <netinet/ip6.h>
enum layer_type
{
@@ -59,28 +65,6 @@ struct packet_layer
uint16_t pld_len; // payload length
};
-// return 0: found
-// return -1: not found
-int packet_get_innermost_tuple2(const struct packet *pkt, struct tuple2 *tuple);
-int packet_get_outermost_tuple2(const struct packet *pkt, struct tuple2 *tuple);
-
-// return 0: found
-// return -1: not found
-int packet_get_innermost_tuple4(const struct packet *pkt, struct tuple4 *tuple);
-int packet_get_outermost_tuple4(const struct packet *pkt, struct tuple4 *tuple);
-
-// return 0: found
-// return -1: not found
-int packet_get_innermost_tuple6(const struct packet *pkt, struct tuple6 *tuple);
-int packet_get_outermost_tuple6(const struct packet *pkt, struct tuple6 *tuple);
-
-const struct packet_layer *packet_get_innermost_layer(const struct packet *pkt, enum layer_type type);
-const struct packet_layer *packet_get_outermost_layer(const struct packet *pkt, enum layer_type type);
-
-/******************************************************************************
- * Utils
- ******************************************************************************/
-
#define MAX_SID_NUM 8
struct sid_list
{
@@ -118,29 +102,6 @@ enum packet_action packet_get_action(const struct packet *pkt);
/*
******************************************************************************
- * Example: getting the innermost TCP layer
- ******************************************************************************
- *
- * |<--------------------------- pkt->data_len -------------------------->|
- * +----------+------+-----+-------+------+---------------+---------------+
- * | Ethernet | IPv4 | UDP | GTP-U | IPv4 | TCP | Payload |
- * +----------+------+-----+-------+------+---------------+---------------+
- * ^ ^ ^
- * | | |
- * |<------------ hdr_offset ------------>|<-- hdr_len -->|<-- pld_len -->|
- * | | |
- * | | +-- pld_ptr
- * | +-- hdr_ptr
- * +-- data_ptr
- *
- * const struct packet_layer *tcp_layer = packet_get_innermost_layer(pkt, LAYER_TYPE_TCP);
- * const struct tcphdr *hdr = (const struct tcphdr *)tcp_layer->hdr_ptr;
- * uint16_t src_port = ntohs(hdr->th_sport);
- * uint16_t dst_port = ntohs(hdr->th_dport);
- * uint32_t seq = ntohl(hdr->th_seq);
- * uint32_t ack = ntohl(hdr->th_ack);
- *
- ******************************************************************************
* Example: foreach layer in packet
******************************************************************************
*
@@ -160,6 +121,168 @@ enum packet_action packet_get_action(const struct packet *pkt);
* }
*/
+struct address
+{
+ uint8_t family; // AF_INET or AF_INET6
+ union
+ {
+ struct in_addr v4; /* network order */
+ struct in6_addr v6; /* network order */
+ } data;
+};
+
+static inline int packet_get_addr(const struct packet *pkt, struct address *src_addr, struct address *dst_addr)
+{
+ const struct ip *ip4_hdr = NULL;
+ const struct ip6_hdr *ip6_hdr = NULL;
+ const struct packet_layer *layer = NULL;
+ int8_t num = packet_get_layers_number(pkt);
+ for (int8_t i = num - 1; i >= 0; i--)
+ {
+ layer = packet_get_layer(pkt, i);
+ if (layer->type & LAYER_TYPE_IPV4)
+ {
+ ip4_hdr = (const struct ip *)layer->hdr_ptr;
+ if (src_addr != NULL)
+ {
+ src_addr->family = AF_INET;
+ src_addr->data.v4.s_addr = ip4_hdr->ip_src.s_addr;
+ }
+ if (dst_addr != NULL)
+ {
+ dst_addr->family = AF_INET;
+ dst_addr->data.v4.s_addr = ip4_hdr->ip_dst.s_addr;
+ }
+ return 0;
+ }
+ if (layer->type & LAYER_TYPE_IPV6)
+ {
+ ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
+ if (src_addr != NULL)
+ {
+ src_addr->family = AF_INET6;
+ src_addr->data.v6 = ip6_hdr->ip6_src;
+ }
+ if (dst_addr != NULL)
+ {
+ dst_addr->family = AF_INET6;
+ dst_addr->data.v6 = ip6_hdr->ip6_dst;
+ }
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+static inline int packet_get_port(const struct packet *pkt, uint16_t *src_port, uint16_t *dst_port)
+{
+ const struct tcphdr *tcp_hdr = NULL;
+ const struct udphdr *udp_hdr = NULL;
+ const struct packet_layer *layer = NULL;
+ int8_t num = packet_get_layers_number(pkt);
+ for (int8_t i = num - 1; i >= 0; i--)
+ {
+ layer = packet_get_layer(pkt, i);
+ if (layer->type & LAYER_TYPE_TCP)
+ {
+ tcp_hdr = (const struct tcphdr *)layer->hdr_ptr;
+ src_port != NULL ? *src_port = tcp_hdr->th_sport : 0;
+ dst_port != NULL ? *dst_port = tcp_hdr->th_dport : 0;
+ return 0;
+ }
+ if (layer->type & LAYER_TYPE_UDP)
+ {
+ udp_hdr = (const struct udphdr *)layer->hdr_ptr;
+ src_port != NULL ? *src_port = udp_hdr->uh_sport : 0;
+ dst_port != NULL ? *dst_port = udp_hdr->uh_dport : 0;
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+static inline int packet_get_ip_hdr(const struct packet *pkt, struct ip *hdr)
+{
+ const struct packet_layer *layer = NULL;
+ int8_t num = packet_get_layers_number(pkt);
+ for (int8_t i = num - 1; i >= 0; i--)
+ {
+ layer = packet_get_layer(pkt, i);
+ if (layer->type & LAYER_TYPE_IPV4)
+ {
+ if (hdr != NULL)
+ {
+ memcpy(hdr, layer->hdr_ptr, sizeof(struct ip));
+ }
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+static inline int packet_get_ip6_hdr(const struct packet *pkt, struct ip6_hdr *hdr)
+{
+ const struct packet_layer *layer = NULL;
+ int8_t num = packet_get_layers_number(pkt);
+ for (int8_t i = num - 1; i >= 0; i--)
+ {
+ layer = packet_get_layer(pkt, i);
+ if (layer->type & LAYER_TYPE_IPV6)
+ {
+ if (hdr != NULL)
+ {
+ memcpy(hdr, layer->hdr_ptr, sizeof(struct ip6_hdr));
+ }
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+static inline int packet_get_tcp_hdr(const struct packet *pkt, struct tcphdr *hdr)
+{
+ const struct packet_layer *layer = NULL;
+ int8_t num = packet_get_layers_number(pkt);
+ for (int8_t i = num - 1; i >= 0; i--)
+ {
+ layer = packet_get_layer(pkt, i);
+ if (layer->type & LAYER_TYPE_TCP)
+ {
+ if (hdr != NULL)
+ {
+ memcpy(hdr, layer->hdr_ptr, sizeof(struct tcphdr));
+ }
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+static inline int packet_get_udp_hdr(const struct packet *pkt, struct udphdr *hdr)
+{
+ const struct packet_layer *layer = NULL;
+ int8_t num = packet_get_layers_number(pkt);
+ for (int8_t i = num - 1; i >= 0; i--)
+ {
+ layer = packet_get_layer(pkt, i);
+ if (layer->type & LAYER_TYPE_UDP)
+ {
+ if (hdr != NULL)
+ {
+ memcpy(hdr, layer->hdr_ptr, sizeof(struct udphdr));
+ }
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/include/stellar/session.h b/include/stellar/session.h
index 182677a..959ab50 100644
--- a/include/stellar/session.h
+++ b/include/stellar/session.h
@@ -139,10 +139,6 @@ enum closing_reason session_get_closing_reason(const struct session *sess);
enum session_direction session_get_direction(const struct session *sess);
enum flow_direction session_get_current_flow_direction(const struct session *sess);
const struct packet *session_get_first_packet(const struct session *sess, enum flow_direction dir);
-
-const struct tuple6 *session_get_tuple6(const struct session *sess);
-enum flow_direction session_get_tuple6_direction(const struct session *sess);
-
uint64_t session_get_id(const struct session *sess);
uint64_t session_get_timestamp(const struct session *sess, enum session_timestamp type);
uint64_t session_get_stat(const struct session *sess, enum flow_direction dir, enum session_stat stat);
diff --git a/src/evicted_session_filter/evicted_session_filter.h b/src/evicted_session_filter/evicted_session_filter.h
index 9c9ce38..262b77d 100644
--- a/src/evicted_session_filter/evicted_session_filter.h
+++ b/src/evicted_session_filter/evicted_session_filter.h
@@ -7,7 +7,7 @@ extern "C"
#endif
#include "log.h"
-#include "stellar/tuple.h"
+#include "tuple.h"
#define EVICTED_SESSION_FILTER_LOG_ERROR(format, ...) LOG_ERROR("evicted session filter", format, ##__VA_ARGS__)
diff --git a/src/packet/packet_priv.h b/src/packet/packet_priv.h
index a40b049..46ac181 100644
--- a/src/packet/packet_priv.h
+++ b/src/packet/packet_priv.h
@@ -10,7 +10,7 @@ extern "C"
#include <stdio.h>
#include "log.h"
-#include "stellar/tuple.h"
+#include "tuple.h"
#include "stellar/packet.h"
#define PACKET_MAX_LAYERS 32
@@ -60,6 +60,24 @@ void packet_print_str(const struct packet *pkt);
// direction 0: I2E
uint64_t packet_get_hash(const struct packet *pkt, enum ldbc_method method, int direction);
+// return 0: found
+// return -1: not found
+int packet_get_innermost_tuple2(const struct packet *pkt, struct tuple2 *tuple);
+int packet_get_outermost_tuple2(const struct packet *pkt, struct tuple2 *tuple);
+
+// return 0: found
+// return -1: not found
+int packet_get_innermost_tuple4(const struct packet *pkt, struct tuple4 *tuple);
+int packet_get_outermost_tuple4(const struct packet *pkt, struct tuple4 *tuple);
+
+// return 0: found
+// return -1: not found
+int packet_get_innermost_tuple6(const struct packet *pkt, struct tuple6 *tuple);
+int packet_get_outermost_tuple6(const struct packet *pkt, struct tuple6 *tuple);
+
+const struct packet_layer *packet_get_innermost_layer(const struct packet *pkt, enum layer_type type);
+const struct packet_layer *packet_get_outermost_layer(const struct packet *pkt, enum layer_type type);
+
/******************************************************************************
* Utils
******************************************************************************/
diff --git a/src/session/session_priv.h b/src/session/session_priv.h
index d2f1092..75b593d 100644
--- a/src/session/session_priv.h
+++ b/src/session/session_priv.h
@@ -10,7 +10,7 @@ extern "C"
#include "packet_priv.h"
#include "timeout.h"
#include "uthash.h"
-#include "stellar/tuple.h"
+#include "tuple.h"
#include "stellar/session.h"
#include "tcp_reassembly.h"
#include "session_manager.h"
@@ -84,7 +84,10 @@ void session_init(struct session *sess);
void session_set_id(struct session *sess, uint64_t id);
void session_set_tuple(struct session *sess, const struct tuple6 *key);
+const struct tuple6 *session_get_tuple6(const struct session *sess);
+
void session_set_tuple_direction(struct session *sess, enum flow_direction dir);
+enum flow_direction session_get_tuple6_direction(const struct session *sess);
void session_set_direction(struct session *sess, enum session_direction dir);
void session_set_current_flow_direction(struct session *sess, enum flow_direction dir);
diff --git a/src/stellar/version.map b/src/stellar/version.map
index 275d5bd..f30c404 100644
--- a/src/stellar/version.map
+++ b/src/stellar/version.map
@@ -1,13 +1,5 @@
LIBSTELLAR_DEVEL {
global:
- packet_get_innermost_tuple2;
- packet_get_outermost_tuple2;
- packet_get_innermost_tuple4;
- packet_get_outermost_tuple4;
- packet_get_innermost_tuple6;
- packet_get_outermost_tuple6;
- packet_get_innermost_layer;
- packet_get_outermost_layer;
packet_get_direction;
packet_get_session_id;
packet_prepend_sid_list;
@@ -19,6 +11,12 @@ global:
packet_get_payload_len;
packet_set_action;
packet_get_action;
+ packet_get_addr;
+ packet_get_port;
+ packet_get_ip_hdr;
+ packet_get_ip6_hdr;
+ packet_get_tcp_hdr;
+ packet_get_udp_hdr;
session_exdata_free;
stellar_session_exdata_new_index;
@@ -44,8 +42,6 @@ global:
session_get_direction;
session_get_current_flow_direction;
session_get_first_packet;
- session_get_tuple6;
- session_get_tuple6_direction;
session_get_id;
session_get_timestamp;
session_get_stat;
@@ -64,22 +60,5 @@ global:
stellar_inject_ctrl_msg;
stellar_main;
- tuple2_hash;
- tuple4_hash;
- tuple5_hash;
- tuple6_hash;
- tuple2_cmp;
- tuple4_cmp;
- tuple5_cmp;
- tuple6_cmp;
- tuple2_reverse;
- tuple4_reverse;
- tuple5_reverse;
- tuple6_reverse;
- tuple2_to_str;
- tuple4_to_str;
- tuple5_to_str;
- tuple6_to_str;
-
local: *;
};
diff --git a/src/tuple/test/gtest_tuple.cpp b/src/tuple/test/gtest_tuple.cpp
index f1772e5..a5d141f 100644
--- a/src/tuple/test/gtest_tuple.cpp
+++ b/src/tuple/test/gtest_tuple.cpp
@@ -1,6 +1,6 @@
#include <gtest/gtest.h>
-#include "stellar/tuple.h"
+#include "tuple.h"
TEST(TUPLE, TUPLE2)
{
diff --git a/src/tuple/tuple.cpp b/src/tuple/tuple.cpp
index 9c5bccf..63e2d7b 100644
--- a/src/tuple/tuple.cpp
+++ b/src/tuple/tuple.cpp
@@ -1,7 +1,7 @@
#include <string.h>
#include <stdio.h>
-#include "stellar/tuple.h"
+#include "tuple.h"
#include "crc32_hash.h"
uint32_t tuple2_hash(const struct tuple2 *tuple)
diff --git a/include/stellar/tuple.h b/src/tuple/tuple.h
index 8c9b2ff..15bae48 100644
--- a/include/stellar/tuple.h
+++ b/src/tuple/tuple.h
@@ -1,5 +1,5 @@
-#ifndef _TUPLE_PUB_H
-#define _TUPLE_PUB_H
+#ifndef _TUPLE_H
+#define _TUPLE_H
#ifdef __cplusplus
extern "C"
diff --git a/test/packet_inject/packet_inject_main.cpp b/test/packet_inject/packet_inject_main.cpp
index e4a3872..0a4a521 100644
--- a/test/packet_inject/packet_inject_main.cpp
+++ b/test/packet_inject/packet_inject_main.cpp
@@ -58,21 +58,21 @@ static int parse_cmd(int argc, char **argv)
if (host)
{
- if (inet_pton(AF_INET, host, &rule.v4) != 1)
+ if (inet_pton(AF_INET, host, &rule.addr.data.v4) != 1)
{
- if (inet_pton(AF_INET6, host, &rule.v6) != 1)
+ if (inet_pton(AF_INET6, host, &rule.addr.data.v6) != 1)
{
printf("unable to convert host %s to IPv4 / IPv6\n", host);
return -1;
}
else
{
- rule.ip_type = 6;
+ rule.addr.family = AF_INET6;
}
}
else
{
- rule.ip_type = 4;
+ rule.addr.family = AF_INET;
}
}
diff --git a/test/packet_inject/packet_inject_main.h b/test/packet_inject/packet_inject_main.h
index a11cdb0..edf64fd 100644
--- a/test/packet_inject/packet_inject_main.h
+++ b/test/packet_inject/packet_inject_main.h
@@ -7,6 +7,7 @@ extern "C"
#endif
#include <arpa/inet.h>
+#include "stellar/packet.h"
#define AFTER_RECV_C2S_N_PACKET 1
#define AFTER_RECV_S2C_N_PACKET 2
@@ -23,10 +24,8 @@ enum packet_inject_type
struct packet_inject_rule
{
- int ip_type;
- struct in_addr v4; /* network order */
- struct in6_addr v6; /* network order */
- int port; /* network order */
+ struct address addr; /* network order */
+ uint16_t port; /* network order */
enum packet_inject_type inject_type;
diff --git a/test/packet_inject/packet_inject_plugin.cpp b/test/packet_inject/packet_inject_plugin.cpp
index 1c2917b..c9b84b3 100644
--- a/test/packet_inject/packet_inject_plugin.cpp
+++ b/test/packet_inject/packet_inject_plugin.cpp
@@ -2,7 +2,7 @@
#include <stdlib.h>
#include <string.h>
-#include "stellar/tuple.h"
+#include "stellar/packet.h"
#include "stellar/session_mq.h"
#include "packet_inject_main.h"
@@ -36,22 +36,29 @@ static void on_sess_msg(struct session *sess, int topic_id, const void *msg, voi
session_get_stat(sess, FLOW_DIRECTION_C2S, STAT_RAW_PACKETS_RECEIVED),
session_get_stat(sess, FLOW_DIRECTION_S2C, STAT_RAW_PACKETS_RECEIVED));
+ struct packet *pkt = (struct packet *)msg;
char buffer[1024] = {0};
- // struct packet *pkt = (struct packet *)msg;
- const struct tuple6 *tuple = session_get_tuple6(sess);
- if (rule.ip_type == 4 &&
- memcmp(&tuple->src_addr.v4, &rule.v4, sizeof(struct in_addr)) &&
- memcmp(&tuple->dst_addr.v4, &rule.v4, sizeof(struct in_addr)))
+ uint16_t src_port = 0;
+ uint16_t dst_port = 0;
+ struct address src_addr = {0};
+ struct address dst_addr = {0};
+
+ 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)))
{
return;
}
- if (rule.ip_type == 6 &&
- memcmp(&tuple->src_addr.v6, &rule.v6, sizeof(struct in6_addr)) &&
- memcmp(&tuple->dst_addr.v6, &rule.v6, sizeof(struct in6_addr)))
+ 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 && tuple->src_port != rule.port && tuple->dst_port != rule.port)
+ if (rule.port != 0 && src_port != rule.port && dst_port != rule.port)
{
return;
}