🦄 refactor(register_node with module): last para from arg to module

This commit is contained in:
yangwei
2024-11-26 15:31:51 +08:00
parent 9895e93214
commit 1b55f09ba7
5 changed files with 57 additions and 49 deletions

View File

@@ -211,11 +211,11 @@ struct packet_manager;
struct packet_manager *module_to_packet_manager(struct module *mod);
int packet_manager_new_packet_exdata_index(struct packet_manager *pkt_mgr, const char *name, exdata_free *func, void *arg);
typedef void on_packet_callback(struct packet *pkt, void *arg);
typedef void on_packet_callback(struct packet *pkt, struct module *mod);
int packet_manager_register_node(struct packet_manager *pkt_mgr, const char *name, enum packet_stage stage,
uint64_t interested_tag_key_bits,
uint64_t interested_tag_val_bits,
on_packet_callback *cb, void *arg);
on_packet_callback *cb, struct module *mod);
// if two modules claim the same packet at the same stage, the second 'claim' fails.
// return 0 on success
// return -1 on failure

View File

@@ -146,8 +146,8 @@ int session_manager_new_session_exdata_index(struct session_manager *sess_mgr, c
struct session *session_manager_lookup_session_by_packet(struct session_manager *sess_mgr, uint16_t thread_id, const struct packet *pkt);
struct session *session_manager_lookup_session_by_id(struct session_manager *sess_mgr, uint16_t thread_id, uint64_t sess_id);
void session_manager_on_packet_forward(struct packet *pkt, void *args);
void session_manager_on_packet_output(struct packet *pkt, void *args);
void session_manager_on_packet_forward(struct packet *pkt, struct module *mod);
void session_manager_on_packet_output(struct packet *pkt, struct module *mod);
struct module *session_manager_on_init(struct module_manager *mod_mgr);
void session_manager_on_exit(struct module_manager *mod_mgr, struct module *mod);

View File

@@ -16,7 +16,7 @@ struct node
uint64_t interested_tag_key_bits;
uint64_t interested_tag_val_bits;
on_packet_callback *node_entry;
void *arg;
struct module *mod;
};
#define MAX_NODE_PER_STAGE 128
@@ -174,7 +174,7 @@ int packet_manager_new_packet_exdata_index(struct packet_manager *pkt_mgr, const
int packet_manager_register_node(struct packet_manager *pkt_mgr, const char *name, enum packet_stage stage,
uint64_t interested_tag_key_bits,
uint64_t interested_tag_val_bits,
on_packet_callback *node_entry, void *arg)
on_packet_callback *node_entry, struct module *mod)
{
assert(pkt_mgr);
assert(stage < PACKET_STAGE_MAX);
@@ -192,7 +192,7 @@ int packet_manager_register_node(struct packet_manager *pkt_mgr, const char *nam
node->interested_tag_key_bits = interested_tag_key_bits;
node->interested_tag_val_bits = interested_tag_val_bits;
node->node_entry = node_entry;
node->arg = arg;
node->mod = mod;
nodes->used++;
return 0;
@@ -302,7 +302,7 @@ void packet_manager_dispatch(struct packet_manager *pkt_mgr, uint16_t thread_id)
if ((pkt_tag_key_bits & node->interested_tag_key_bits) &&
(pkt_tag_val_bits & node->interested_tag_val_bits))
{
node->node_entry(pkt, node->arg);
node->node_entry(pkt, node->mod);
}
}

View File

@@ -109,7 +109,7 @@ TEST(PACKET_MANAGER, NEW_FREE)
#endif
#if 1
static void on_packet(struct packet *pkt, void *args)
static void on_packet(struct packet *pkt, struct module *mod)
{
enum packet_stage stage = packet_get_stage(pkt);
printf("on_packet_stage: %s\n", packet_stage_to_str(stage));
@@ -123,7 +123,7 @@ static void on_packet(struct packet *pkt, void *args)
static int count = 0;
EXPECT_TRUE(count == stage);
EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO);
EXPECT_TRUE(args == NULL);
EXPECT_TRUE(mod == NULL);
count++;
}
@@ -176,7 +176,7 @@ TEST(PACKET_MANAGER, REGISTER)
#endif
#if 1
static void drop_packet(struct packet *pkt, void *args)
static void drop_packet(struct packet *pkt, struct module *mod)
{
enum packet_stage stage = packet_get_stage(pkt);
printf("on_packet_stage: %s\n", packet_stage_to_str(stage));
@@ -190,7 +190,7 @@ static void drop_packet(struct packet *pkt, void *args)
static int count = 0;
EXPECT_TRUE(count == stage);
EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO);
EXPECT_TRUE(args == NULL);
EXPECT_TRUE(mod == NULL);
count++;
if (stage == PACKET_STAGE_FORWARD)
@@ -247,9 +247,9 @@ TEST(PACKET_MANAGER, DROP_PACKET)
#endif
#if 1
static void packet_claimed(struct packet *pkt, void *args)
static void packet_claimed(struct packet *pkt, struct module *mod)
{
char *str = (char *)args;
char *str = (char *)mod;
EXPECT_STREQ(str, "hello");
printf("packet_claimed: with ctx %s\n", str);
EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO);
@@ -257,9 +257,9 @@ static void packet_claimed(struct packet *pkt, void *args)
free(str);
}
static void claim_packet_success(struct packet *pkt, void *args)
static void claim_packet_success(struct packet *pkt, struct module *mod)
{
struct packet_manager *pkt_mgr = (struct packet_manager *)args;
struct packet_manager *pkt_mgr = (struct packet_manager *)module_get_ctx(mod);
enum packet_stage stage = packet_get_stage(pkt);
printf("on_packet_stage: %s\n", packet_stage_to_str(stage));
@@ -278,9 +278,9 @@ static void claim_packet_success(struct packet *pkt, void *args)
count++;
}
static void claim_packet_failed(struct packet *pkt, void *args)
static void claim_packet_failed(struct packet *pkt, struct module *mod)
{
struct packet_manager *pkt_mgr = (struct packet_manager *)args;
struct packet_manager *pkt_mgr = (struct packet_manager *)module_get_ctx(mod);
enum packet_stage stage = packet_get_stage(pkt);
printf("on_packet_stage: %s\n", packet_stage_to_str(stage));
@@ -303,18 +303,19 @@ TEST(PACKET_MANAGER, CLAIM_PACKET)
{
// module init
struct packet_manager *pkt_mgr = packet_manager_new(1);
struct module *pkt_mgr_mod = module_new("packet_manager", pkt_mgr);
EXPECT_TRUE(pkt_mgr);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_PREROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_success, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_INPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_success, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_success, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_OUTPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_success, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_POSTROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_success, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_PREROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_success, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_INPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_success, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_success, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_OUTPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_success, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_POSTROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_success, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_PREROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_failed, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_INPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_failed, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_failed, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_OUTPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_failed, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_POSTROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_failed, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_PREROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_failed, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_INPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_failed, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_failed, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_OUTPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_failed, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_POSTROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_failed, pkt_mgr_mod) == 0);
// per-thread init
packet_manager_init(pkt_mgr, thread_id);
@@ -349,13 +350,14 @@ TEST(PACKET_MANAGER, CLAIM_PACKET)
// module free
packet_manager_free(pkt_mgr);
module_free(pkt_mgr_mod);
}
#endif
#if 1
static void schedule_packet(struct packet *pkt, void *args)
static void schedule_packet(struct packet *pkt, struct module *mod)
{
struct packet_manager *pkt_mgr = (struct packet_manager *)args;
struct packet_manager *pkt_mgr = (struct packet_manager *)module_get_ctx(mod);
enum packet_stage stage = packet_get_stage(pkt);
printf("on_packet_stage: %s\n", packet_stage_to_str(stage));
@@ -380,12 +382,13 @@ TEST(PACKET_MANAGER, SCHEDULE_PACKET)
{
// module init
struct packet_manager *pkt_mgr = packet_manager_new(1);
struct module *pkt_mgr_mod = module_new("packet_manager", pkt_mgr);
EXPECT_TRUE(pkt_mgr);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_PREROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, schedule_packet, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_INPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, schedule_packet, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, schedule_packet, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_OUTPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, schedule_packet, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_POSTROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, schedule_packet, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_PREROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, schedule_packet, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_INPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, schedule_packet, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, schedule_packet, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_OUTPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, schedule_packet, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_POSTROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, schedule_packet, pkt_mgr_mod) == 0);
// per-thread init
packet_manager_init(pkt_mgr, thread_id);
@@ -429,13 +432,15 @@ TEST(PACKET_MANAGER, SCHEDULE_PACKET)
// module free
packet_manager_free(pkt_mgr);
module_free(pkt_mgr_mod);
}
#endif
#if 1
static void schedule_claimed_packet(struct packet *pkt, void *args)
static void schedule_claimed_packet(struct packet *pkt, struct module *mod)
{
struct packet_manager *pkt_mgr = (struct packet_manager *)args;
struct packet_manager *pkt_mgr = (struct packet_manager *)module_get_ctx(mod);
printf("schedule_claimed_packet: %p\n", pkt);
EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO);
@@ -444,9 +449,9 @@ static void schedule_claimed_packet(struct packet *pkt, void *args)
packet_manager_schedule_packet(pkt_mgr, thread_id, pkt, PACKET_STAGE_POSTROUTING);
}
static void claim_packet_to_schedule(struct packet *pkt, void *args)
static void claim_packet_to_schedule(struct packet *pkt, struct module *mod)
{
struct packet_manager *pkt_mgr = (struct packet_manager *)args;
struct packet_manager *pkt_mgr = (struct packet_manager *)module_get_ctx(mod);
enum packet_stage stage = packet_get_stage(pkt);
printf("on_packet_stage: %s\n", packet_stage_to_str(stage));
@@ -462,7 +467,7 @@ static void claim_packet_to_schedule(struct packet *pkt, void *args)
if (stage == PACKET_STAGE_PREROUTING)
{
EXPECT_TRUE(count == 0); // packet not claim
EXPECT_TRUE(packet_manager_claim_packet(pkt_mgr, thread_id, pkt, schedule_claimed_packet, pkt_mgr) == 0); // claim packet success
EXPECT_TRUE(packet_manager_claim_packet(pkt_mgr, thread_id, pkt, schedule_claimed_packet, mod) == 0); // claim packet success
}
else if (stage == PACKET_STAGE_POSTROUTING)
{
@@ -480,12 +485,13 @@ TEST(PACKET_MANAGER, SCHEDULE_CLAIMED_PACKET)
{
// module init
struct packet_manager *pkt_mgr = packet_manager_new(1);
struct module *pkt_mgr_mod=module_new("packet_manager", pkt_mgr);
EXPECT_TRUE(pkt_mgr);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_PREROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_to_schedule, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_INPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_to_schedule, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_to_schedule, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_OUTPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_to_schedule, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_POSTROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_to_schedule, pkt_mgr) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_PREROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_to_schedule, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_INPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_to_schedule, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_to_schedule, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_OUTPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_to_schedule, pkt_mgr_mod) == 0);
EXPECT_TRUE(packet_manager_register_node(pkt_mgr, "name", PACKET_STAGE_POSTROUTING, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP, claim_packet_to_schedule, pkt_mgr_mod) == 0);
// per-thread init
packet_manager_init(pkt_mgr, thread_id);
@@ -520,6 +526,8 @@ TEST(PACKET_MANAGER, SCHEDULE_CLAIMED_PACKET)
// module free
packet_manager_free(pkt_mgr);
module_free(pkt_mgr_mod);
}
#endif

View File

@@ -131,9 +131,9 @@ static void on_polling(struct module_manager *mod_mgr, void *args)
* session manager
******************************************************************************/
void session_manager_on_packet_forward(struct packet *pkt, void *args)
void session_manager_on_packet_forward(struct packet *pkt, struct module *mod)
{
struct session_manager *sess_mgr = (struct session_manager *)args;
struct session_manager *sess_mgr = (struct session_manager *)module_get_ctx(mod);
int thread_id = module_manager_get_thread_id(sess_mgr->mod_mgr);
struct session_manager_rte *sess_mgr_rte = session_manager_get_rte(sess_mgr, thread_id);
@@ -223,9 +223,9 @@ void session_manager_on_packet_forward(struct packet *pkt, void *args)
}
}
void session_manager_on_packet_output(struct packet *pkt, void *args)
void session_manager_on_packet_output(struct packet *pkt, struct module *mod)
{
struct session_manager *sess_mgr = (struct session_manager *)args;
struct session_manager *sess_mgr = (struct session_manager *)module_get_ctx(mod);
int thread_id = module_manager_get_thread_id(sess_mgr->mod_mgr);
struct session_manager_rte *sess_mgr_rte = session_manager_get_rte(sess_mgr, thread_id);