Refactored packet API to support struct layer (using union to contain different types of encapsulation headers)

This commit is contained in:
luwenpeng
2024-06-14 19:24:27 +08:00
parent 1f78881cbb
commit de4c15f43c
47 changed files with 834 additions and 701 deletions

View File

@@ -57,15 +57,19 @@ static void update_session_stat(struct session *sess, struct packet *pkt)
enum flow_direction dir = session_get_current_flow_direction(sess);
assert(dir != FLOW_DIRECTION_NONE);
int is_ctrl = packet_is_ctrl(pkt);
uint16_t len = packet_get_raw_len(pkt);
switch (packet_get_action(pkt))
{
case PACKET_ACTION_DROP:
session_inc_stat(sess, dir, (is_ctrl ? STAT_CONTROL_PACKETS_DROPPED : STAT_RAW_PACKETS_DROPPED), 1);
session_inc_stat(sess, dir, (is_ctrl ? STAT_CONTROL_BYTES_DROPPED : STAT_RAW_BYTES_DROPPED), packet_get_len(pkt));
session_inc_stat(sess, dir, (is_ctrl ? STAT_CONTROL_BYTES_DROPPED : STAT_RAW_BYTES_DROPPED), len);
break;
case PACKET_ACTION_FORWARD:
session_inc_stat(sess, dir, (is_ctrl ? STAT_CONTROL_PACKETS_TRANSMITTED : STAT_RAW_PACKETS_TRANSMITTED), 1);
session_inc_stat(sess, dir, (is_ctrl ? STAT_CONTROL_BYTES_TRANSMITTED : STAT_RAW_BYTES_TRANSMITTED), packet_get_len(pkt));
session_inc_stat(sess, dir, (is_ctrl ? STAT_CONTROL_BYTES_TRANSMITTED : STAT_RAW_BYTES_TRANSMITTED), len);
break;
case PACKET_ACTION_DEFER:
// TODO
break;
default:
assert(0);
@@ -222,8 +226,9 @@ static void *work_thread(void *arg)
packet_set_action(pkt, PACKET_ACTION_DROP);
}
update_session_stat(sess, pkt);
if (packet_get_action(pkt) == PACKET_ACTION_DROP)
switch (packet_get_action(pkt))
{
case PACKET_ACTION_DROP:
if (pkt == defraged_pkt)
{
packet_io_drop(packet_io, thr_idx, &packets[i], 1);
@@ -233,9 +238,8 @@ static void *work_thread(void *arg)
{
packet_io_drop(packet_io, thr_idx, pkt, 1);
}
}
else
{
break;
case PACKET_ACTION_FORWARD:
if (pkt == defraged_pkt)
{
packet_io_egress(packet_io, thr_idx, &packets[i], 1);
@@ -245,6 +249,18 @@ static void *work_thread(void *arg)
{
packet_io_egress(packet_io, thr_idx, pkt, 1);
}
case PACKET_ACTION_DEFER:
if (pkt == defraged_pkt)
{
// TODO
// defer current packe: &packets[i], free defraged_pkt, update meta
packet_free(defraged_pkt);
}
else
{
// do nothing
}
break;
}
}