summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryangwei <[email protected]>2023-08-30 00:36:15 +0800
committeryangwei <[email protected]>2023-08-30 00:36:15 +0800
commita3e32acfe8a96ce517dcd1f361b4d10b795d1a5e (patch)
tree9e2292ff875181e90cdc169c53abc8a64ac6c7e6
parent460967d296f8bf175d076f9a9498b0fd1f6ea419 (diff)
✨ feat(session addr): support session_get0_addr
-rw-r--r--examples/sapp_plugin/simple_loader.c6
-rw-r--r--examples/sapp_plugin/simple_loader.inf4
-rw-r--r--include/stellar/session.h36
-rw-r--r--src/adapter/adapter.c49
4 files changed, 84 insertions, 11 deletions
diff --git a/examples/sapp_plugin/simple_loader.c b/examples/sapp_plugin/simple_loader.c
index f8c6c77..f5eab17 100644
--- a/examples/sapp_plugin/simple_loader.c
+++ b/examples/sapp_plugin/simple_loader.c
@@ -86,3 +86,9 @@ char simple_loader_tcpall_stream_entry(struct streaminfo *pstream,void **pme, in
loader_transfer_stream_entry(pstream, pstream->pktstate, pme, thread_seq, a_packet);
return APP_STATE_GIVEME;
}
+
+char simple_loader_tcp_stream_entry(struct streaminfo *pstream,void **pme, int thread_seq,void *a_packet)
+{
+ loader_transfer_stream_entry(pstream, pstream->opstate, pme, thread_seq, a_packet);
+ return APP_STATE_GIVEME;
+}
diff --git a/examples/sapp_plugin/simple_loader.inf b/examples/sapp_plugin/simple_loader.inf
index d490fd4..76f027a 100644
--- a/examples/sapp_plugin/simple_loader.inf
+++ b/examples/sapp_plugin/simple_loader.inf
@@ -8,6 +8,10 @@ DESTROY_FUNC=SIMPLE_LOADER_EXIT
FUNC_FLAG=ALL
FUNC_NAME=simple_loader_tcpall_stream_entry
+#[TCP]
+#FUNC_FLAG=ALL
+#FUNC_NAME=simple_loader_tcp_stream_entry
+
[UDP]
FUNC_FLAG=ALL
FUNC_NAME=simple_loader_udp_stream_entry \ No newline at end of file
diff --git a/include/stellar/session.h b/include/stellar/session.h
index 75772b3..428130a 100644
--- a/include/stellar/session.h
+++ b/include/stellar/session.h
@@ -32,6 +32,42 @@ int session_is_symmetric(const struct session *sess, unsigned char *flag);
#define SESSION_DIRECTION_OUT 1
int session_get_direction(const struct session *sess);
+enum session_addr_type
+{
+ SESSION_ADDR_TYPE_IPV4_TCP,
+ SESSION_ADDR_TYPE_IPV4_UDP,
+ SESSION_ADDR_TYPE_IPV6_TCP,
+ SESSION_ADDR_TYPE_IPV6_UDP,
+ SESSION_ADDR_TYPE_UNKNOWN,
+ __SESSION_ADDR_TYPE_MAX,
+};
+struct session_addr_ipv4{
+ uint32_t saddr; /* network order */
+ uint32_t daddr; /* network order */
+ uint16_t sport; /* network order */
+ uint16_t dport; /* network order */
+};
+
+#include <netinet/in.h>
+struct session_addr_ipv6
+{
+ uint8_t saddr[INET6_ADDRSTRLEN] ;
+ uint8_t daddr[INET6_ADDRSTRLEN] ;
+ uint16_t sport; /* network order */
+ uint16_t dport; /* network order */
+};
+
+struct session_addr
+{
+ union
+ {
+ struct session_addr_ipv4 ipv4;
+ struct session_addr_ipv6 ipv6;
+ };
+};
+
+struct session_addr *session_get0_addr(struct session *sess, enum session_addr_type *addr_type);
+
const char *session_get0_readable_addr(struct session *sess);
const char *session_get0_current_payload(struct session *sess, size_t *payload_len);
diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c
index cc4259f..c0bc299 100644
--- a/src/adapter/adapter.c
+++ b/src/adapter/adapter.c
@@ -117,20 +117,12 @@ struct stellar *stellar_init(const char *toml_conf_path)
if (specs[i].init_cb != NULL)
{
spec_internal.plugin_ctx=specs[i].init_cb(st);
- if(spec_internal.plugin_ctx == NULL)
- {
- goto ADAPTER_INIT_ERROR;
- }
spec_internal.specs=specs[i];
utarray_push_back(st->plugin_specs_array, &spec_internal);
}
}
FREE(specs);
return st;
-ADAPTER_INIT_ERROR:
- stellar_exit(st);
- FREE(specs);
- return NULL;
}
void stellar_exit(struct stellar *st)
@@ -214,6 +206,41 @@ const char* session_get0_readable_addr(struct session *sess)
return printaddr(&sess->cur_pkt->a_stream->addr, sess->cur_pkt->a_stream->threadnum);
}
+struct session_addr *session_get0_addr(struct session *sess, enum session_addr_type *addr_type)
+{
+ struct session_addr *addr=NULL;
+ *addr_type=SESSION_ADDR_TYPE_UNKNOWN;
+ if(sess && sess->cur_pkt && sess->cur_pkt->a_stream)
+ {
+ struct streaminfo *pstream=sess->cur_pkt->a_stream;
+ if(pstream->addr.addrtype==ADDR_TYPE_IPV4)
+ {
+ if(pstream->type == STREAM_TYPE_TCP)
+ {
+ *addr_type=SESSION_ADDR_TYPE_IPV4_TCP;
+ }
+ else if(pstream->type == STREAM_TYPE_UDP)
+ {
+ *addr_type=SESSION_ADDR_TYPE_IPV4_UDP;
+ }
+ addr=(struct session_addr *)pstream->addr.tuple4_v4;
+ }
+ if(pstream->addr.addrtype==ADDR_TYPE_IPV6)
+ {
+ if(pstream->type == STREAM_TYPE_TCP)
+ {
+ *addr_type=SESSION_ADDR_TYPE_IPV6_TCP;
+ }
+ else if(pstream->type == STREAM_TYPE_UDP)
+ {
+ *addr_type=SESSION_ADDR_TYPE_IPV6_UDP;
+ }
+ addr=(struct session_addr *)pstream->addr.tuple4_v6;
+ }
+ }
+ return addr;
+}
+
const char *session_get0_current_payload(struct session *sess, size_t *payload_len)
{
*payload_len = (size_t)sess->cur_pkt->a_stream->ptcpdetail->datalen;
@@ -280,16 +307,16 @@ int session_is_symmetric(const struct session *sess, unsigned char *flag)
int is_symmetric=0;
if(sess->cur_pkt && sess->cur_pkt->a_stream)
{
- if(sess->cur_pkt->a_stream->curdir==DIR_DOUBLE)
+ if(sess->cur_pkt->a_stream->dir==DIR_DOUBLE)
{
*flag=(SESSION_SEEN_C2S_FLOW|SESSION_SEEN_S2C_FLOW);
is_symmetric=1;
}
- else if(sess->cur_pkt->a_stream->curdir==DIR_C2S)
+ else if(sess->cur_pkt->a_stream->dir==DIR_C2S)
{
*flag=SESSION_SEEN_C2S_FLOW;
}
- else if(sess->cur_pkt->a_stream->curdir==DIR_S2C)
+ else if(sess->cur_pkt->a_stream->dir==DIR_S2C)
{
*flag=SESSION_SEEN_S2C_FLOW;
}