Skip to content

Commit 73087dd

Browse files
authored
Merge pull request #35 from blairsteven/direction_support
Add flow direction support
2 parents 3d24ad2 + 94aba20 commit 73087dd

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

ginetflow.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,7 @@ enum {
644644
FLOW_LIP,
645645
FLOW_UIP,
646646
FLOW_SERVER_IP,
647+
FLOW_DIRECTION,
647648
};
648649

649650
static int find_expiry_index(guint64 lifetime)
@@ -689,6 +690,9 @@ static void g_inet_flow_get_property(GObject * object, guint prop_id,
689690
case FLOW_PROTOCOL:
690691
g_value_set_uint(value, g_inet_tuple_get_protocol(&flow->tuple));
691692
break;
693+
case FLOW_DIRECTION:
694+
g_value_set_schar(value, flow->direction);
695+
break;
692696
case FLOW_LPORT:
693697
case FLOW_SERVER_PORT:
694698
{
@@ -756,6 +760,11 @@ static void g_inet_flow_class_init(GInetFlowClass * class)
756760
g_param_spec_uint("protocol", "Protocol",
757761
"IP Protocol for the flow",
758762
0, G_MAXUINT16, 0, G_PARAM_READABLE));
763+
g_object_class_install_property(object_class, FLOW_DIRECTION,
764+
g_param_spec_char("direction", "Direction",
765+
"Original or Reply",
766+
G_MININT8, G_MAXINT8, 0,
767+
G_PARAM_READABLE));
759768
g_object_class_install_property(object_class, FLOW_LPORT,
760769
g_param_spec_uint("lport", "LPort",
761770
"Lower L4 port (smaller value)",
@@ -802,18 +811,29 @@ void g_inet_flow_update_tcp(GInetFlow * flow, GInetFlow * packet)
802811
} else {
803812
flow->state = FLOW_NEW;
804813
flow->lifetime = G_INET_FLOW_DEFAULT_NEW_TIMEOUT;
814+
flow->server_port = g_inet_tuple_get_dst_port(&packet->tuple);
805815
}
806816
}
807817
/* RST */
808818
else if (CHECK_BIT(packet->flags, 2)) {
809819
flow->state = FLOW_CLOSED;
810820
flow->lifetime = G_INET_FLOW_DEFAULT_CLOSED_TIMEOUT;
811821
}
822+
823+
if (packet->direction == FLOW_DIRECTION_UNKNOWN) {
824+
packet->direction = g_inet_tuple_get_dst_port(&packet->tuple) == flow->server_port ?
825+
FLOW_DIRECTION_ORIGINAL : FLOW_DIRECTION_REPLY;
826+
}
812827
}
813828

814829
void g_inet_flow_update_udp(GInetFlow * flow, GInetFlow * packet)
815830
{
816-
if (packet->direction != flow->direction) {
831+
packet->direction =
832+
g_inet_tuple_get_dst_port(&packet->tuple) <
833+
g_inet_tuple_get_src_port(&packet->
834+
tuple) ? FLOW_DIRECTION_ORIGINAL : FLOW_DIRECTION_REPLY;
835+
836+
if (flow->direction && packet->direction && packet->direction != flow->direction) {
817837
flow->state = FLOW_OPEN;
818838
flow->lifetime = G_INET_FLOW_DEFAULT_OPEN_TIMEOUT;
819839
}
@@ -826,6 +846,7 @@ void g_inet_flow_update(GInetFlow * flow, GInetFlow * packet)
826846
} else if (g_inet_tuple_get_protocol(&flow->tuple) == IP_PROTOCOL_UDP) {
827847
g_inet_flow_update_udp(flow, packet);
828848
}
849+
flow->direction = packet->direction;
829850
}
830851

831852
static void g_inet_flow_init(GInetFlow * flow)
@@ -907,7 +928,10 @@ GInetFlow *g_inet_flow_get_full(GInetFlowTable * table,
907928
flow->direction = packet.direction;
908929
flow->hash = packet.hash;
909930
flow->tuple = packet.tuple;
910-
flow->server_port = packet.server_port;
931+
if (packet.server_port)
932+
{
933+
flow->server_port = packet.server_port;
934+
}
911935
memcpy(flow->server_ip, packet.server_ip, sizeof(packet.server_ip));
912936
g_hash_table_replace(table->table, (gpointer) flow, (gpointer) flow);
913937
table->misses++;

ginetflow.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ typedef enum {
4040
FLOW_CLOSED,
4141
} GInetFlowState;
4242

43+
/* Flow Directions */
44+
typedef enum {
45+
FLOW_DIRECTION_UNKNOWN,
46+
FLOW_DIRECTION_ORIGINAL,
47+
FLOW_DIRECTION_REPLY,
48+
} GInetFlowDirection;
49+
4350
/* Default timeouts */
4451
#define G_INET_FLOW_DEFAULT_NEW_TIMEOUT 30
4552
#define G_INET_FLOW_DEFAULT_OPEN_TIMEOUT 300

0 commit comments

Comments
 (0)