diff options
| author | yangwei <[email protected]> | 2024-03-22 11:08:00 +0800 |
|---|---|---|
| committer | yangwei <[email protected]> | 2024-03-22 14:08:42 +0800 |
| commit | 6bad4730f7a3089ace6072986256865b94a066fb (patch) | |
| tree | c19b8d6248cd51fd057a31f96a4584504b44233e | |
| parent | 0075dcbd3da31e0a396e414eaa93814f1e2c1ac0 (diff) | |
🧪 test(refactor test stellar plugin):
| -rw-r--r-- | examples/stellar_plugin/simple_plugin.toml | 7 | ||||
| -rw-r--r-- | examples/stellar_plugin/simple_stellar_plugin.c | 266 | ||||
| -rw-r--r-- | include/stellar/stellar.h | 2 | ||||
| -rw-r--r-- | src/adapter/adapter.c | 12 | ||||
| -rw-r--r-- | src/adapter/adapter.h | 2 | ||||
| -rw-r--r-- | src/adapter/session_manager.c | 10 | ||||
| -rw-r--r-- | src/stellar_on_sapp/stellar_on_sapp.c | 5 | ||||
| -rw-r--r-- | src/stellar_on_sapp/version.map | 5 |
8 files changed, 222 insertions, 87 deletions
diff --git a/examples/stellar_plugin/simple_plugin.toml b/examples/stellar_plugin/simple_plugin.toml index ce08b65..1b02a5d 100644 --- a/examples/stellar_plugin/simple_plugin.toml +++ b/examples/stellar_plugin/simple_plugin.toml @@ -7,4 +7,9 @@ exit = "simple_stellar_event_plugin_exit" [[plugin]] path = "./stellar_plugin/simple_stellar_plugin.so" init = "simple_stellar_mq_plugin_init" -exit = "simple_stellar_mq_plugin_exit"
\ No newline at end of file +exit = "simple_stellar_mq_plugin_exit" + +[[plugin]] +path = "./stellar_plugin/simple_stellar_plugin.so" +init = "simple_stellar_pp_plugin_init" +exit = "simple_stellar_pp_plugin_exit"
\ No newline at end of file diff --git a/examples/stellar_plugin/simple_stellar_plugin.c b/examples/stellar_plugin/simple_stellar_plugin.c index 50f38f0..c5798eb 100644 --- a/examples/stellar_plugin/simple_stellar_plugin.c +++ b/examples/stellar_plugin/simple_stellar_plugin.c @@ -1,3 +1,4 @@ +#include "src/adapter/stellar_internal.h" #include "stellar/stellar.h" #include "stellar/utils.h" #include "stellar/session_exdata.h" @@ -5,14 +6,16 @@ #include <stdio.h> -struct simple_stellar_plugin_ctx +struct simple_stellar_plugin_env { int plugin_id; int exdata_idx; + int topic_id; + int sub_id; struct stellar *st; }; -struct mq_message_stat +struct simple_message { uint32_t c2s_pkts; uint32_t c2s_bytes; @@ -21,62 +24,75 @@ struct mq_message_stat struct session_event* ud_ev; }; -extern int simple_mq_plugin_entry(struct session *sess, int events, const struct packet *pkt, void *cb_arg); -static int session_mq_plugin_sub_fn(struct session *sess, int topic_id, const void *data, void *cb_arg) +static void print_simple_message(struct session *sess, struct simple_message *msg, int plugin_id) { - struct mq_message_stat *ctx =(struct mq_message_stat *)data; - struct simple_stellar_plugin_ctx *plugin_ctx = (struct simple_stellar_plugin_ctx *)cb_arg; - printf("%s(topic:%d->plug:%d)-----------%20s: ", __FUNCTION__, topic_id, plugin_ctx->plugin_id, session_get0_readable_addr(sess)); + printf("%s(plug:%d)-----------%20s: ", __FUNCTION__, plugin_id, session_get0_readable_addr(sess)); printf("server-pkt=%u, server-count=%u, client-pkt=%u, client-count=%u, ", - ctx->c2s_pkts, ctx->c2s_bytes, - ctx->s2c_pkts, ctx->s2c_bytes); - printf("total-pkt=%u, ", ctx->c2s_pkts+ctx->s2c_pkts); - printf("total-count=%u\n", ctx->c2s_bytes+ctx->s2c_bytes); - - struct session_event *i_ev=session_get_intrinsic_event(sess, plugin_ctx->plugin_id); - session_event_assign(i_ev, plugin_ctx->st, sess, (SESS_EV_TCP|SESS_EV_UDP|SESS_EV_OPENING|SESS_EV_PACKET|SESS_EV_CLOSING), simple_mq_plugin_entry, plugin_ctx); - printf("%s(plug:%d)session_event_assign-----------%20s\n", __FUNCTION__, plugin_ctx->plugin_id, session_get0_readable_addr(sess)); + msg->c2s_pkts, msg->c2s_bytes, + msg->s2c_pkts, msg->s2c_bytes); + printf("total-pkt=%u, ", msg->c2s_pkts+msg->s2c_pkts); + printf("total-count=%u\n", msg->c2s_bytes+msg->s2c_bytes); + return; +} - return 0; +static void simple_message_free(void *data, void *cb_arg) +{ + FREE(data); + return; } -static void print_session_ctx(struct session *sess, struct mq_message_stat *ctx, int plugin_id) +static void simple_exdata_free(struct session *sess, int idx, void *ex_ptr, void *arg) { - printf("%s(plug:%d)-----------%20s: ", __FUNCTION__, plugin_id, session_get0_readable_addr(sess)); - printf("server-pkt=%u, server-count=%u, client-pkt=%u, client-count=%u, ", - ctx->c2s_pkts, ctx->c2s_bytes, - ctx->s2c_pkts, ctx->s2c_bytes); - printf("total-pkt=%u, ", ctx->c2s_pkts+ctx->s2c_pkts); - printf("total-count=%u\n", ctx->c2s_bytes+ctx->s2c_bytes); + if(ex_ptr) + { + FREE(ex_ptr); + } return; } +/*************************************** + * simple stellar mq publisher plugin * + ***************************************/ + int simple_event_plugin_user_defined_ev(struct session *sess, int events, const struct packet *pkt, void *cb_arg) { if(cb_arg == NULL)return -1; - struct simple_stellar_plugin_ctx *plugin_ctx=(struct simple_stellar_plugin_ctx *)cb_arg; - struct mq_message_stat *mg_stat = (struct mq_message_stat *)session_get_ex_data(sess, plugin_ctx->exdata_idx); - printf("%s(plug:%d)trigger-----------%20s\n", __FUNCTION__, plugin_ctx->plugin_id, session_get0_readable_addr(sess)); - print_session_ctx(sess, mg_stat, plugin_ctx->plugin_id); + struct simple_stellar_plugin_env *plugin_env=(struct simple_stellar_plugin_env *)cb_arg; + struct simple_message *msg = (struct simple_message *)session_get_ex_data(sess, plugin_env->exdata_idx); + printf("%s(plug:%d)trigger-----------%20s\n", __FUNCTION__, plugin_env->plugin_id, session_get0_readable_addr(sess)); + print_simple_message(sess, msg, plugin_env->plugin_id); return 0; } +static struct simple_message *simple_message_dup(struct simple_message *in) +{ + struct simple_message *out = CALLOC(struct simple_message, 1); + if(out) + { + out->c2s_pkts = in->c2s_pkts; + out->c2s_bytes = in->c2s_bytes; + out->s2c_pkts = in->s2c_pkts; + out->s2c_bytes = in->s2c_bytes; + } + return out; +} + int simple_event_plugin_entry(struct session *sess, int events, const struct packet *pkt, void *cb_arg) { if(cb_arg == NULL)return -1; - struct simple_stellar_plugin_ctx *plugin_ctx=(struct simple_stellar_plugin_ctx *)cb_arg; - struct mq_message_stat *mg_stat = (struct mq_message_stat *)session_get_ex_data(sess, plugin_ctx->exdata_idx); - if (mg_stat == NULL) + struct simple_stellar_plugin_env *plugin_env=(struct simple_stellar_plugin_env *)cb_arg; + struct simple_message *exdata_msg = (struct simple_message *)session_get_ex_data(sess, plugin_env->exdata_idx); + if (exdata_msg == NULL) { - mg_stat = CALLOC(struct mq_message_stat, 1); - session_set_ex_data(sess, plugin_ctx->exdata_idx, mg_stat); + exdata_msg = CALLOC(struct simple_message, 1); + session_set_ex_data(sess, plugin_env->exdata_idx, exdata_msg); } if ((events & SESS_EV_OPENING)) { - mg_stat->ud_ev=session_event_new(plugin_ctx->st, sess, (SESS_EV_TCP|SESS_EV_UDP|SESS_EV_OPENING|SESS_EV_PACKET|SESS_EV_CLOSING), simple_event_plugin_user_defined_ev, cb_arg); - session_event_add(mg_stat->ud_ev, NULL); + exdata_msg->ud_ev=session_event_new(plugin_env->st, sess, (SESS_EV_TCP|SESS_EV_UDP|SESS_EV_OPENING|SESS_EV_PACKET|SESS_EV_CLOSING), simple_event_plugin_user_defined_ev, cb_arg); + session_event_add(exdata_msg->ud_ev, NULL); } if (pkt) @@ -86,82 +102,178 @@ int simple_event_plugin_entry(struct session *sess, int events, const struct pac int dir = session_get_direction(sess); if (dir==SESSION_DIRECTION_IN) { - mg_stat->c2s_bytes += payload_len; - mg_stat->c2s_pkts += 1; + exdata_msg->c2s_bytes += payload_len; + exdata_msg->c2s_pkts += 1; } if (dir==SESSION_DIRECTION_OUT) { - mg_stat->s2c_bytes += payload_len; - mg_stat->s2c_pkts += 1; + exdata_msg->s2c_bytes += payload_len; + exdata_msg->s2c_pkts += 1; + } + struct simple_message *send_msg = simple_message_dup(exdata_msg); + if(session_mq_publish_message(sess, plugin_env->topic_id, send_msg) < 0) + { + FREE(send_msg); } } - if (mg_stat != NULL && (events & SESS_EV_CLOSING)) + if (exdata_msg != NULL && (events & SESS_EV_CLOSING)) { - print_session_ctx(sess, mg_stat, plugin_ctx->plugin_id); - session_event_free(mg_stat->ud_ev); + print_simple_message(sess, exdata_msg, plugin_env->plugin_id); + session_event_free(exdata_msg->ud_ev); } return 0; } -int simple_mq_plugin_entry(struct session *sess, int events, const struct packet *pkt, void *cb_arg) +void *simple_stellar_event_plugin_init(struct stellar *st) { - if(cb_arg == NULL)return -1; - struct simple_stellar_plugin_ctx *plugin_ctx=(struct simple_stellar_plugin_ctx *)cb_arg; - struct session_event *i_ev=session_get_intrinsic_event(sess, plugin_ctx->plugin_id); - session_event_assign(i_ev, plugin_ctx->st, sess, 0, simple_mq_plugin_entry, plugin_ctx); - printf("%s(plug:%d)session_event_assign-----------%20s: \n", __FUNCTION__, plugin_ctx->plugin_id, session_get0_readable_addr(sess)); - return 0; + struct simple_stellar_plugin_env *plugin_env = CALLOC(struct simple_stellar_plugin_env, 1); + plugin_env->st = st; + plugin_env->exdata_idx = stellar_session_get_ex_new_index(st, "SIMPLE_EVENT_PLUGIN", simple_exdata_free, NULL); + if(plugin_env->exdata_idx < 0)exit(-1); + int plugin_id=stellar_plugin_register(st, (SESS_EV_TCP|SESS_EV_UDP|SESS_EV_OPENING|SESS_EV_PACKET|SESS_EV_CLOSING), simple_event_plugin_entry, plugin_env); + if(plugin_id < 0)exit(-1); + plugin_env->plugin_id=plugin_id; + + session_mq_create_topic(st, "SIMPLE_MQ_TOPIC", simple_message_free, NULL); + plugin_env->topic_id=session_mq_get_topic_id(st, "SIMPLE_MQ_TOPIC"); + if(plugin_env->topic_id < 0)exit(-1); + session_mq_update_topic(st, plugin_env->topic_id, simple_message_free, NULL); + return plugin_env; } -static void simple_exdata_free(struct session *sess, int idx, void *ex_ptr, void *arg) +void simple_stellar_event_plugin_exit(void *plugin_env) { - if(ex_ptr) + + if(plugin_env) { - FREE(ex_ptr); + struct simple_stellar_plugin_env *env=(struct simple_stellar_plugin_env *)plugin_env; + session_mq_destroy_topic(env->st, env->topic_id); + FREE(plugin_env); } return; } -void *simple_stellar_event_plugin_init(struct stellar *st) + +/************************************** + * simple stellar mq subscibe plugin * + **************************************/ + +int simple_mq_plugin_entry(struct session *sess, int events, const struct packet *pkt, void *cb_arg) { - struct simple_stellar_plugin_ctx *ctx = CALLOC(struct simple_stellar_plugin_ctx, 1); - ctx->st = st; - ctx->exdata_idx = stellar_session_get_ex_new_index(st, "SIMPLE_EVENT_PLUGIN", simple_exdata_free, NULL); - int plugin_id=stellar_plugin_register(st, (SESS_EV_TCP|SESS_EV_UDP|SESS_EV_OPENING|SESS_EV_PACKET|SESS_EV_CLOSING), simple_event_plugin_entry, ctx); - if(plugin_id >= 0) + if(cb_arg == NULL)return -1; + struct simple_stellar_plugin_env *plugin_env=(struct simple_stellar_plugin_env *)cb_arg; + struct session_event *i_ev=session_get_intrinsic_event(sess, plugin_env->plugin_id); + session_event_assign(i_ev, plugin_env->st, sess, 0, simple_mq_plugin_entry, plugin_env);// in event entry, remove all subsequent events + printf("%s(plug:%d)session_event_assign-----------%20s: \n", __FUNCTION__, plugin_env->plugin_id, session_get0_readable_addr(sess)); + return 0; +} + +static int session_mq_plugin_sub_fn(struct session *sess, int topic_id, const void *data, void *cb_arg) +{ + struct simple_message *msg =(struct simple_message *)data; + struct simple_stellar_plugin_env *plugin_ctx = (struct simple_stellar_plugin_env *)cb_arg; + printf("%s(topic:%d->plug:%d)-----------%20s: ", __FUNCTION__, topic_id, plugin_ctx->plugin_id, session_get0_readable_addr(sess)); + printf("server-pkt=%u, server-count=%u, client-pkt=%u, client-count=%u, ", + msg->c2s_pkts, msg->c2s_bytes, + msg->s2c_pkts, msg->s2c_bytes); + printf("total-pkt=%u, ", msg->c2s_pkts+msg->s2c_pkts); + printf("total-count=%u\n", msg->c2s_bytes+msg->s2c_bytes); + + if((msg->c2s_pkts+msg->s2c_pkts)>10) + { + session_mq_ignore_message(sess, topic_id, plugin_ctx->sub_id); + printf("%s(topic:%d->plug:%d)session_mq_ignore_message-----------%20s\n", __FUNCTION__, topic_id, plugin_ctx->plugin_id, session_get0_readable_addr(sess)); + } + else { - ctx->plugin_id=plugin_id; + struct session_event *i_ev=session_get_intrinsic_event(sess, plugin_ctx->plugin_id); + session_event_assign(i_ev, plugin_ctx->st, sess, (SESS_EV_TCP|SESS_EV_UDP|SESS_EV_OPENING|SESS_EV_PACKET|SESS_EV_CLOSING), simple_mq_plugin_entry, plugin_ctx); + printf("%s(plug:%d)session_event_assign-----------%20s\n", __FUNCTION__, plugin_ctx->plugin_id, session_get0_readable_addr(sess)); } - return ctx; + + return 0; +} + + + +void *simple_stellar_mq_plugin_init(struct stellar *st) +{ + struct simple_stellar_plugin_env *plugin_env = CALLOC(struct simple_stellar_plugin_env, 1); + plugin_env->st = st; + plugin_env->exdata_idx = stellar_session_get_ex_new_index(st, "SIMPLE_MQ_PLUGIN", simple_exdata_free, NULL); + session_mq_create_topic(st, "SIMPLE_MQ_TOPIC", simple_message_free, NULL); + plugin_env->topic_id=session_mq_get_topic_id(st, "SIMPLE_MQ_TOPIC"); + if(plugin_env->topic_id < 0)exit(-1); + plugin_env->sub_id=session_mq_subscribe_topic(st, plugin_env->topic_id, session_mq_plugin_sub_fn, plugin_env); + int plugin_id=stellar_plugin_register(st, 0, simple_mq_plugin_entry, plugin_env); + if(plugin_id < 0)exit(-1); + plugin_env->plugin_id=plugin_id; + return plugin_env; } -void simple_stellar_event_plugin_exit(void *ctx) +void simple_stellar_mq_plugin_exit(void *plugin_env) { - if(ctx)FREE(ctx); + if(plugin_env)FREE(plugin_env); return; } -void *simple_stellar_mq_plugin_init(struct stellar *st) +/********************************************* + * simple stellar pakcet and polling plugin * + *********************************************/ + +struct pp_plugin_env { - struct simple_stellar_plugin_ctx *ctx = CALLOC(struct simple_stellar_plugin_ctx, 1); - ctx->st = st; - ctx->exdata_idx = stellar_session_get_ex_new_index(st, "SIMPLE_MQ_PLUGIN", simple_exdata_free, NULL); - int topic_id=session_mq_get_topic_id(st, "SIMPLE_MQ_TOPIC"); - if(topic_id < 0) - { - topic_id=session_mq_create_topic(st, "SIMPLE_MQ_TOPIC", NULL, NULL); - } - session_mq_subscribe_topic(st, topic_id, session_mq_plugin_sub_fn, ctx); - int plugin_id=stellar_plugin_register(st, 0, simple_mq_plugin_entry, ctx); - if(plugin_id >= 0) + struct stellar *st; + long long polling_cnt[256]; + long long tcp_pkt_cnt[256]; + long long udp_pkt_cnt[256]; +}; + + +static int simple_pp_plugin_on_polling_entry(void *cb_arg) +{ + struct pp_plugin_env *plugin_env=(struct pp_plugin_env *)cb_arg; + int work_thread_idx=stellar_get_current_thread_id(plugin_env->st); + plugin_env->polling_cnt[work_thread_idx]+=1; + return 0; +} + +static void simple_pp_plugin_on_packet_entry(struct packet *pkt, unsigned char ip_protocol, void *cb_arg) +{ + struct pp_plugin_env *plugin_env=(struct pp_plugin_env *)cb_arg; + int work_thread_idx=stellar_get_current_thread_id(plugin_env->st); + switch (ip_protocol) { - ctx->plugin_id=plugin_id; + case 6: + plugin_env->tcp_pkt_cnt[work_thread_idx]+=1; + break; + case 17: + plugin_env->udp_pkt_cnt[work_thread_idx]+=1; + break; + default: + break; } - return ctx; } -void simple_stellar_mq_plugin_exit(void *ctx) +void *simple_stellar_pp_plugin_init(struct stellar *st) { - if(ctx)FREE(ctx); + struct pp_plugin_env *plugin_env = CALLOC(struct pp_plugin_env, 1); + plugin_env->st = st; + stellar_polling_plugin_register(st, simple_pp_plugin_on_polling_entry, plugin_env); + stellar_packet_plugin_register(st, 6, simple_pp_plugin_on_packet_entry, plugin_env); + stellar_packet_plugin_register(st, 17, simple_pp_plugin_on_packet_entry, plugin_env); + return plugin_env; +} + +void simple_stellar_pp_plugin_exit(void *plugin_env) +{ + struct pp_plugin_env *pp_env=(struct pp_plugin_env *)plugin_env; + int thread_num=stellar_get_worker_thread_num(pp_env->st); + printf("(%s)-----------thread_num:%d\n", __FUNCTION__, thread_num); + for(int i=0; i<thread_num; i++) + { + printf("thread:%d, polling_cnt:%lld, tcp_pkt_cnt:%lld, udp_pkt_cnt:%lld\n", i, pp_env->polling_cnt[i], pp_env->tcp_pkt_cnt[i], pp_env->udp_pkt_cnt[i]); + } + if(plugin_env)FREE(plugin_env); return; }
\ No newline at end of file diff --git a/include/stellar/stellar.h b/include/stellar/stellar.h index 559da20..7f9cd05 100644 --- a/include/stellar/stellar.h +++ b/include/stellar/stellar.h @@ -18,7 +18,7 @@ typedef int stellar_periodic_cb_func(struct stellar *st, void *cb_arg); int stellar_worker_thread_periodic_add(struct stellar *st, stellar_periodic_cb_func *periodic_cb, void *cb_arg, const struct timeval *interval); -typedef void plugin_on_polling_func(void *cb_arg); +typedef int plugin_on_polling_func(void *cb_arg); //return polling plugin_id int stellar_polling_plugin_register(struct stellar *st, plugin_on_polling_func on_polling, void *cb_arg);
\ No newline at end of file diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index 48e211e..ee7d9aa 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -251,18 +251,22 @@ int stellar_polling_plugin_register(struct stellar *st, plugin_on_polling_func o } // FIXME: scheduler with return value -void adapter_on_polling(struct stellar *st) +int adapter_on_polling(struct stellar *st) { - if(st->registered_polling_plugin_array == NULL)return; + if(st->registered_polling_plugin_array == NULL)return 0; struct registered_polling_plugin_schema *p=NULL; + int is_working=0; while ((p = (struct registered_polling_plugin_schema *)utarray_next(st->registered_polling_plugin_array, p))) { if(p->on_polling) { - p->on_polling(p->plugin_env); + if(p->on_polling(p->plugin_env)==1) + { + is_working=1; + } } } - return; + return is_working; } diff --git a/src/adapter/adapter.h b/src/adapter/adapter.h index d9385bc..2d2cbda 100644 --- a/src/adapter/adapter.h +++ b/src/adapter/adapter.h @@ -28,4 +28,4 @@ enum packet_type }; void adapter_on_packet_update(struct stellar *st, struct streaminfo *pstream, void *pkt_hdr, enum packet_type type); -void adapter_on_polling(struct stellar *st);
\ No newline at end of file +int adapter_on_polling(struct stellar *st);
\ No newline at end of file diff --git a/src/adapter/session_manager.c b/src/adapter/session_manager.c index e12709b..3312763 100644 --- a/src/adapter/session_manager.c +++ b/src/adapter/session_manager.c @@ -129,8 +129,16 @@ static void session_mq_topic_schema_dtor(void *_elt) { struct session_mq_topic_schema *elt = (struct session_mq_topic_schema *)_elt; if (elt->topic_name) + { FREE(elt->topic_name); - // FREE(elt); // free the item + } + // free the item + struct session_mq_subscriber *sub_elt, *sub_tmp; + DL_FOREACH_SAFE(elt->subscribers, sub_elt, sub_tmp) + { + DL_DELETE(elt->subscribers, sub_elt); + free(sub_elt); + } } UT_icd session_mq_topic_schema_icd = {sizeof(struct session_mq_topic_schema), NULL, session_mq_topic_schema_copy, session_mq_topic_schema_dtor}; diff --git a/src/stellar_on_sapp/stellar_on_sapp.c b/src/stellar_on_sapp/stellar_on_sapp.c index 3f60b4e..9d0096e 100644 --- a/src/stellar_on_sapp/stellar_on_sapp.c +++ b/src/stellar_on_sapp/stellar_on_sapp.c @@ -198,6 +198,7 @@ char stellar_on_sapp_ip6_entry( struct streaminfo *pstream,unsigned char routedi char stellar_on_sapp_polling_entry(struct streaminfo *stream, void **pme, int thread_seq,void *a_packet) { - adapter_on_polling(g_stellar); - return APP_STATE_GIVEME; + int is_working=adapter_on_polling(g_stellar); + if(is_working==1)return POLLING_STATE_WORK; + return POLLING_STATE_IDLE; } diff --git a/src/stellar_on_sapp/version.map b/src/stellar_on_sapp/version.map index 32bdd9d..ecd8ed8 100644 --- a/src/stellar_on_sapp/version.map +++ b/src/stellar_on_sapp/version.map @@ -8,11 +8,16 @@ STELLAR_DEFER_LOADER_INIT; STELLAR_DEFER_LOADER_EXIT; stellar_on_sapp_defer_entry; + stellar_on_sapp_ip4_entry; + stellar_on_sapp_ip6_entry; + stellar_on_sapp_polling_entry; stellar_get_worker_thread_num; stellar_get_current_thread_id; stellar_session_get_ex_new_index; stellar_plugin_register; + stellar_polling_plugin_register; + stellar_packet_plugin_register; session_is_inner_most; session_is_outer_tunnel; |
