Refactored packet API to support struct layer (using union to contain different types of encapsulation headers)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user