diff options
Diffstat (limited to 'inc/common/net/net.h')
-rw-r--r-- | inc/common/net/net.h | 63 |
1 files changed, 54 insertions, 9 deletions
diff --git a/inc/common/net/net.h b/inc/common/net/net.h index 187487b..d687120 100644 --- a/inc/common/net/net.h +++ b/inc/common/net/net.h @@ -65,7 +65,8 @@ typedef enum { NA_BAD, NA_LOOPBACK, NA_BROADCAST, - NA_IP + NA_IP, + NA_IP6 } netadrtype_t; typedef enum { @@ -81,9 +82,10 @@ typedef enum { } netflag_t; typedef union { - uint8_t u8[4]; - uint16_t u16[2]; - uint32_t u32; + uint8_t u8[16]; + uint16_t u16[8]; + uint32_t u32[4]; + uint64_t u64[2]; } netadrip_t; typedef struct netadr_s { @@ -119,10 +121,15 @@ static inline qboolean NET_IsEqualAdr(const netadr_t *a, const netadr_t *b) return qtrue; case NA_IP: case NA_BROADCAST: - if (a->ip.u32 == b->ip.u32 && a->port == b->port) { + if (a->ip.u32[0] == b->ip.u32[0] && a->port == b->port) { return qtrue; } - // fall through + return qfalse; + case NA_IP6: + if (memcmp(a->ip.u8, b->ip.u8, 16) == 0 && a->port == b->port) { + return qtrue; + } + return qfalse; default: break; } @@ -141,10 +148,43 @@ static inline qboolean NET_IsEqualBaseAdr(const netadr_t *a, const netadr_t *b) return qtrue; case NA_IP: case NA_BROADCAST: - if (a->ip.u32 == b->ip.u32) { + if (a->ip.u32[0] == b->ip.u32[0]) { + return qtrue; + } + return qfalse; + case NA_IP6: + if (memcmp(a->ip.u8, b->ip.u8, 16) == 0) { return qtrue; } - // fall through + return qfalse; + default: + break; + } + + return qfalse; +} + +static inline qboolean NET_IsEqualBaseAdrMask(const netadr_t *a, + const netadr_t *b, + const netadr_t *m) +{ + if (a->type != b->type) { + return qfalse; + } + + switch (a->type) { + case NA_IP: + return !((a->ip.u32[0] ^ b->ip.u32[0]) & m->ip.u32[0]); + case NA_IP6: +#if (defined __amd64__) || (defined _M_AMD64) + return !(((a->ip.u64[0] ^ b->ip.u64[0]) & m->ip.u64[0]) | + ((a->ip.u64[1] ^ b->ip.u64[1]) & m->ip.u64[1])); +#else + return !(((a->ip.u32[0] ^ b->ip.u32[0]) & m->ip.u32[0]) | + ((a->ip.u32[1] ^ b->ip.u32[1]) & m->ip.u32[1]) | + ((a->ip.u32[2] ^ b->ip.u32[2]) & m->ip.u32[2]) | + ((a->ip.u32[3] ^ b->ip.u32[3]) & m->ip.u32[3])); +#endif default: break; } @@ -166,7 +206,12 @@ static inline qboolean NET_IsLanAddress(const netadr_t *adr) adr->ip.u16[0] == MakeRawShort(172, 16)) { return qtrue; } - // fall through + return qfalse; + case NA_IP6: + if (adr->ip.u8[0] == 0xfe && (adr->ip.u8[1] & 0xc0) == 0x80) { + return qtrue; + } + return qfalse; default: break; } |