From cf23457d3b08db54a61b0c79649acc2d0a03027b Mon Sep 17 00:00:00 2001 From: Logan oos Even <46396513+Logan007@users.noreply.github.com> Date: Tue, 28 Jun 2022 19:09:04 +0200 Subject: [PATCH] added sock type field to data structure (#1031) --- include/n2n_typedefs.h | 6 ++++-- src/wire.c | 22 +++++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/include/n2n_typedefs.h b/include/n2n_typedefs.h index 24562c9..047c991 100644 --- a/include/n2n_typedefs.h +++ b/include/n2n_typedefs.h @@ -302,8 +302,10 @@ typedef struct n2n_ip_subnet { } n2n_ip_subnet_t; typedef struct n2n_sock { - uint8_t family; /* AF_INET or AF_INET6; or 0 if invalid */ - uint16_t port; /* host order */ + uint8_t family; /* AF_INET, AF_INET6 or AF_INVALID (-1, a custom #define); + mind that AF_UNSPEC (0) means auto IPv4 or IPv6 */ + uint8_t type; /* for later use, usually SOCK_STREAM (1) or SOCK_DGRAM (2) */ + uint16_t port; /* host order */ union { uint8_t v6[IPV6_SIZE]; /* byte sequence */ uint8_t v4[IPV4_SIZE]; /* byte sequence */ diff --git a/src/wire.c b/src/wire.c index f85ee34..1a60314 100644 --- a/src/wire.c +++ b/src/wire.c @@ -255,6 +255,9 @@ int encode_sock (uint8_t * base, switch(sock->family) { case AF_INET: { f = 0; + if(sock->type == SOCK_STREAM) { + f |= 0x4000; + } retval += encode_uint16(base, idx, f); retval += encode_uint16(base, idx, sock->port); retval += encode_buf(base, idx, sock->addr.v4, IPV4_SIZE); @@ -263,6 +266,9 @@ int encode_sock (uint8_t * base, case AF_INET6: { f = 0x8000; + if(sock->type == SOCK_STREAM) { + f |= 0x4000; + } retval += encode_uint16(base, idx, f); retval += encode_uint16(base, idx, sock->port); retval += encode_buf(base, idx, sock->addr.v6, IPV6_SIZE); @@ -286,21 +292,27 @@ int decode_sock (n2n_sock_t * sock, uint16_t f = 0; decode_uint16(&f, base, rem, idx); + decode_uint16(&(sock->port), base, rem, idx); if(f & 0x8000) { - - /* IPv6 */ + // IPv6 sock->family = AF_INET6; - decode_uint16(&(sock->port), base, rem, idx); decode_buf(sock->addr.v6, IPV6_SIZE, base, rem, idx); } else { - /* IPv4 */ + // IPv4 sock->family = AF_INET; - decode_uint16(&(sock->port), base, rem, idx); memset(sock->addr.v6, 0, IPV6_SIZE); /* so memcmp() works for equality. */ decode_buf(sock->addr.v4, IPV4_SIZE, base, rem, idx); } + if(f & 0x4000) { + // TCP + sock->type = SOCK_STREAM; + } else { + // UDP + sock->type = SOCK_DGRAM; + } + return (idx - idx0); }