summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryangwei <[email protected]>2023-11-03 14:23:38 +0800
committeryangwei <[email protected]>2023-11-03 14:23:38 +0800
commitee6b7e01559bb96dacbcdfc725e77e7a5bffae61 (patch)
treec9be866cbb79043680d5c65b0ec2e55a65d0ea22
parent10bd9896f01688a5a725f76d5dbaf7aeab1a8723 (diff)
✨ feat(ctrl packet): add EV_CONTROL in session.h
-rw-r--r--examples/sapp_plugin/simple_loader.c15
-rw-r--r--include/stellar/session.h3
-rw-r--r--src/adapter/adapter.c13
-rw-r--r--src/adapter/adapter.h1
4 files changed, 30 insertions, 2 deletions
diff --git a/examples/sapp_plugin/simple_loader.c b/examples/sapp_plugin/simple_loader.c
index 3d64774..9ef03eb 100644
--- a/examples/sapp_plugin/simple_loader.c
+++ b/examples/sapp_plugin/simple_loader.c
@@ -95,7 +95,8 @@ static char loader_transfer_stream_entry(struct streaminfo *pstream, UCHAR state
{
struct simple_stream_ctx *ctx=(struct simple_stream_ctx *)*pme;
struct tcpdetail *pdetail=(struct tcpdetail *)pstream->pdetail;
-
+ int is_ctrl_pkt=0;
+ const void *raw_pkt=NULL;
if(state == OP_STATE_PENDING && (is_l7_type_tunnels(pstream)==1))
{
return APP_STATE_DROPME;
@@ -125,7 +126,17 @@ static char loader_transfer_stream_entry(struct streaminfo *pstream, UCHAR state
stream_bridge_async_data_put(pstream, g_session_bridge_id, ctx->sess);
break;
case OP_STATE_DATA:
- adapter_session_active(pstream, ctx->sess, a_packet);
+ raw_pkt = get_rawpkt_from_streaminfo(pstream);
+ get_opt_from_rawpkt(raw_pkt, RAW_PKT_GET_IS_CTRL_PKT, (void *)&is_ctrl_pkt);
+ if(is_ctrl_pkt==1)
+ {
+ adapter_session_control(pstream, ctx->sess, a_packet);
+ return APP_STATE_GIVEME|APP_STATE_DROPPKT;
+ }
+ else
+ {
+ adapter_session_active(pstream, ctx->sess, a_packet);
+ }
break;
case OP_STATE_CLOSE:
FREE(*pme);
diff --git a/include/stellar/session.h b/include/stellar/session.h
index ca78423..d3155cc 100644
--- a/include/stellar/session.h
+++ b/include/stellar/session.h
@@ -18,6 +18,7 @@ enum session_state
SESSION_STATE_OPENING = 1 ,
SESSION_STATE_ACTIVE = 2,
SESSION_STATE_CLOSING = 3,
+ SESSION_STATE_CONTROL = 6,
__SESSION_STATE_MAX,
};
@@ -102,10 +103,12 @@ int packet_arrive_time(const struct packet *pkt, struct timeval *ts);
#define SESS_EV_OPENING 1<<1
#define SESS_EV_PACKET 1<<2
#define SESS_EV_CLOSING 1<<3
+#define SESS_EV_CONTROL 1<<6
#define SESS_EV_TCP 1<<4
#define SESS_EV_UDP 1<<5
+
typedef int session_event_cb_func(struct session *sess, int events, const struct packet *pkt, void *cb_arg);
struct session_event;
diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c
index 8bf0114..3052b54 100644
--- a/src/adapter/adapter.c
+++ b/src/adapter/adapter.c
@@ -188,6 +188,19 @@ void adapter_session_active(struct streaminfo *stream, struct session *sess, voi
return;
}
+void adapter_session_control(struct streaminfo *stream, struct session *sess, void *a_packet)
+{
+ if (sess)
+ {
+ struct packet *pkt=(struct packet *)session_get0_current_packet(sess);
+ pkt->raw_pkt=(void *)get_rawpkt_from_streaminfo(stream);
+ session_dispatch(sess, SESSION_STATE_CONTROL, pkt);
+ }
+ return;
+
+}
+
+
//streaminfo close, or firewall active close streaminfo
void adapter_session_close(struct streaminfo *stream, struct session *sess, void *a_packet)
{
diff --git a/src/adapter/adapter.h b/src/adapter/adapter.h
index 5f07399..6814403 100644
--- a/src/adapter/adapter.h
+++ b/src/adapter/adapter.h
@@ -11,6 +11,7 @@ void stellar_exit(struct stellar *st);
//streaminfo open
struct session *adapter_session_open(struct stellar *st, struct streaminfo *stream, void *a_packet);
void adapter_session_active(struct streaminfo *stream, struct session *session, void *a_packet);
+void adapter_session_control(struct streaminfo *stream, struct session *session, void *a_packet);
//streaminfo close, or firewall active close streaminfo
void adapter_session_close(struct streaminfo *stream, struct session *session, void *a_packet);