Skip to content

Commit

Permalink
Merge pull request #1 from coledishington/sockaddr-port-endianness-v1
Browse files Browse the repository at this point in the history
Store ports in sockaddr_in structure in network byte order
  • Loading branch information
carlatat authored Jun 19, 2024
2 parents 3a5bc43 + 0c35028 commit 1d2b8a4
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 41 deletions.
32 changes: 13 additions & 19 deletions inetflow.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,8 +199,8 @@ static int sock_address_comparison(struct sockaddr_storage *a, struct sockaddr_s

struct sockaddr_storage *inet_tuple_get_lower(InetTuple * tuple)
{
guint16 sport = ((struct sockaddr_in *)&tuple->src)->sin_port;
guint16 dport = ((struct sockaddr_in *)&tuple->dst)->sin_port;
guint16 sport = GUINT16_FROM_BE(((struct sockaddr_in *)&tuple->src)->sin_port);
guint16 dport = GUINT16_FROM_BE(((struct sockaddr_in *)&tuple->dst)->sin_port);
if (sport < dport ||
(sport == 0 && dport == 0 && sock_address_comparison(&tuple->src, &tuple->dst) < 0))
return &tuple->src;
Expand All @@ -210,8 +210,8 @@ struct sockaddr_storage *inet_tuple_get_lower(InetTuple * tuple)

struct sockaddr_storage *inet_tuple_get_upper(InetTuple * tuple)
{
guint16 sport = ((struct sockaddr_in *)&tuple->src)->sin_port;
guint16 dport = ((struct sockaddr_in *)&tuple->dst)->sin_port;
guint16 sport = GUINT16_FROM_BE(((struct sockaddr_in *)&tuple->src)->sin_port);
guint16 dport = GUINT16_FROM_BE(((struct sockaddr_in *)&tuple->dst)->sin_port);
if (dport > sport ||
(dport == 0 && sport == 0 && sock_address_comparison(&tuple->dst, &tuple->src) > 0))
return &tuple->dst;
Expand Down Expand Up @@ -275,9 +275,9 @@ guint inet_tuple_hash(InetTuple * tuple)
struct sockaddr_storage *lower = inet_tuple_get_lower(tuple);
struct sockaddr_storage *upper = inet_tuple_get_upper(tuple);

tuple->hash =
((struct sockaddr_in *)lower)->
sin_port << 16 | ((struct sockaddr_in *)upper)->sin_port;
guint16 lport = GUINT16_FROM_BE(((struct sockaddr_in *)lower)->sin_port);
guint16 uport = GUINT16_FROM_BE(((struct sockaddr_in *)upper)->sin_port);
tuple->hash = lport << 16 | uport;

return tuple->hash;
}
Expand Down Expand Up @@ -436,11 +436,9 @@ static gboolean flow_parse_tcp(InetTuple * f, const guint8 * data, guint32 lengt
tcp_hdr_t *tcp = (tcp_hdr_t *) data;
if (length < sizeof(tcp_hdr_t))
return FALSE;
guint16 sport = GUINT16_FROM_BE(tcp->source);
guint16 dport = GUINT16_FROM_BE(tcp->destination);

((struct sockaddr_in *)&f->src)->sin_port = sport;
((struct sockaddr_in *)&f->dst)->sin_port = dport;
((struct sockaddr_in *)&f->src)->sin_port = tcp->source;
((struct sockaddr_in *)&f->dst)->sin_port = tcp->destination;

if (flags) {
*flags = GUINT16_FROM_BE(tcp->flags);
Expand All @@ -453,11 +451,9 @@ static gboolean flow_parse_udp(InetTuple * f, const guint8 * data, guint32 lengt
udp_hdr_t *udp = (udp_hdr_t *) data;
if (length < sizeof(udp_hdr_t))
return FALSE;
guint16 sport = GUINT16_FROM_BE(udp->source);
guint16 dport = GUINT16_FROM_BE(udp->destination);

((struct sockaddr_in *)&f->src)->sin_port = sport;
((struct sockaddr_in *)&f->dst)->sin_port = dport;
((struct sockaddr_in *)&f->src)->sin_port = udp->source;
((struct sockaddr_in *)&f->dst)->sin_port = udp->destination;

return TRUE;
}
Expand All @@ -467,11 +463,9 @@ static gboolean flow_parse_sctp(InetTuple * f, const guint8 * data, guint32 leng
sctp_hdr_t *sctp = (sctp_hdr_t *) data;
if (length < sizeof(sctp_hdr_t))
return FALSE;
guint16 sport = GUINT16_FROM_BE(sctp->source);
guint16 dport = GUINT16_FROM_BE(sctp->destination);

((struct sockaddr_in *)&f->src)->sin_port = sport;
((struct sockaddr_in *)&f->dst)->sin_port = dport;
((struct sockaddr_in *)&f->src)->sin_port = sctp->source;
((struct sockaddr_in *)&f->dst)->sin_port = sctp->destination;

return TRUE;
}
Expand Down
36 changes: 14 additions & 22 deletions test.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ static InetTuple _test_tuple;
static InetTuple *test_tuple = &_test_tuple;
#define MAX_BUFFER_SIZE 1600

#define _TEST_SPORT 0x1111
#define _TEST_SPORT 0x1234
uint16_t TEST_SPORT = _TEST_SPORT;
#define _TEST_DPORT 0x2222
#define _TEST_DPORT 0x4321
uint16_t TEST_DPORT = _TEST_DPORT;
#define _TEST_SADDR 0x12345678
uint32_t TEST_SADDR = _TEST_SADDR;
Expand Down Expand Up @@ -1056,10 +1056,6 @@ gchar *num_to_string(guint8 * number, int family)

void test_flow_properties()
{
/* Original values converted to network byte order */
guint saddr = htonl(TEST_SADDR);
guint daddr = htonl(TEST_DADDR);

InetFlowTable *table;
InetFlow *flow;
struct sockaddr_in *lip;
Expand Down Expand Up @@ -1092,9 +1088,9 @@ void test_flow_properties()
g_assert_nonnull(uip);
g_assert_nonnull(sip);

g_assert_cmpuint(lip->sin_port, ==, TEST_SPORT);
g_assert_cmpuint(sip->sin_port, ==, TEST_SPORT);
g_assert_cmpuint(uip->sin_port, ==, TEST_DPORT);
g_assert_cmpuint(lip->sin_port, ==, htons(TEST_SPORT));
g_assert_cmpuint(sip->sin_port, ==, htons(TEST_SPORT));
g_assert_cmpuint(uip->sin_port, ==, htons(TEST_DPORT));

g_assert(((struct sockaddr_in *)lip)->sin_addr.s_addr == htonl(TEST_SADDR));
g_assert(((struct sockaddr_in *)sip)->sin_addr.s_addr == htonl(TEST_SADDR));
Expand All @@ -1106,10 +1102,6 @@ void test_flow_properties()

void test_flow_properties_reversed()
{
/* Addresses in network order */
guint saddr = htonl(TEST_SADDR);
guint daddr = htonl(TEST_DADDR);

InetFlowTable *table;
InetFlow *flow;
struct sockaddr_in *lip;
Expand Down Expand Up @@ -1142,9 +1134,9 @@ void test_flow_properties_reversed()
g_assert_nonnull(uip);
g_assert_nonnull(sip);

g_assert_cmpuint(lip->sin_port, ==, TEST_SPORT);
g_assert_cmpuint(sip->sin_port, ==, TEST_SPORT);
g_assert_cmpuint(uip->sin_port, ==, TEST_DPORT);
g_assert_cmpuint(lip->sin_port, ==, htons(TEST_SPORT));
g_assert_cmpuint(sip->sin_port, ==, htons(TEST_SPORT));
g_assert_cmpuint(uip->sin_port, ==, htons(TEST_DPORT));

g_assert(lip->sin_addr.s_addr == htonl(TEST_SADDR));
g_assert(sip->sin_addr.s_addr == htonl(TEST_SADDR));
Expand Down Expand Up @@ -1188,9 +1180,9 @@ void test_flow_properties_ipv6()
g_assert_nonnull(uip);
g_assert_nonnull(sip);

g_assert_cmpuint(lip->sin6_port, ==, TEST_SPORT);
g_assert_cmpuint(lip->sin6_port, ==, TEST_SPORT);
g_assert_cmpuint(uip->sin6_port, ==, TEST_DPORT);
g_assert_cmpuint(lip->sin6_port, ==, htons(TEST_SPORT));
g_assert_cmpuint(lip->sin6_port, ==, htons(TEST_SPORT));
g_assert_cmpuint(uip->sin6_port, ==, htons(TEST_DPORT));

g_assert(memcmp(&lip->sin6_addr, test_ip6src, sizeof(test_ip6src)) == 0);
g_assert(memcmp(&sip->sin6_addr, test_ip6src, sizeof(test_ip6src)) == 0);
Expand Down Expand Up @@ -1235,9 +1227,9 @@ void test_flow_properties_ipv6_reversed()
g_assert_nonnull(uip);
g_assert_nonnull(sip);

g_assert_cmpuint(lip->sin6_port, ==, TEST_SPORT);
g_assert_cmpuint(sip->sin6_port, ==, TEST_SPORT);
g_assert_cmpuint(uip->sin6_port, ==, TEST_DPORT);
g_assert_cmpuint(lip->sin6_port, ==, htons(TEST_SPORT));
g_assert_cmpuint(sip->sin6_port, ==, htons(TEST_SPORT));
g_assert_cmpuint(uip->sin6_port, ==, htons(TEST_DPORT));

g_assert(memcmp(&lip->sin6_addr, test_ip6src, sizeof(test_ip6src)) == 0);
g_assert(memcmp(&sip->sin6_addr, test_ip6src, sizeof(test_ip6src)) == 0);
Expand Down

0 comments on commit 1d2b8a4

Please sign in to comment.