summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2010-09-17 21:22:59 +0400
committerAndrey Nazarov <skuller@skuller.net>2010-09-17 21:22:59 +0400
commitcea1e6775af6bccb3b739d563f26bbd8cea1ad70 (patch)
tree1d7f4d7b7e67480ffb8722923ae48c30d676f26c
parent45e6aff04accfbafeeb27ebe32382dd75ff80939 (diff)
Use netadrip_t union when working with IP addresses.
-rw-r--r--src/net_common.c8
-rw-r--r--src/net_sock.h22
-rw-r--r--src/sv_ac.c2
-rw-r--r--src/sv_ccmds.c16
-rw-r--r--src/sv_local.h2
-rw-r--r--src/sv_main.c12
6 files changed, 30 insertions, 32 deletions
diff --git a/src/net_common.c b/src/net_common.c
index b569f8f..8ade312 100644
--- a/src/net_common.c
+++ b/src/net_common.c
@@ -166,7 +166,7 @@ static void NET_NetadrToSockadr( const netadr_t *a, struct sockaddr_in *s ) {
break;
case NA_IP:
s->sin_family = AF_INET;
- s->sin_addr.s_addr = *( uint32_t * )&a->ip;
+ s->sin_addr.s_addr = a->ip.u32;
s->sin_port = a->port;
break;
default:
@@ -184,7 +184,7 @@ static void NET_SockadrToNetadr( const struct sockaddr_in *s, netadr_t *a ) {
memset( a, 0, sizeof( *a ) );
a->type = NA_IP;
- *( uint32_t * )&a->ip = s->sin_addr.s_addr;
+ a->ip.u32 = s->sin_addr.s_addr;
a->port = s->sin_port;
}
@@ -247,6 +247,7 @@ NET_AdrToString
*/
char *NET_AdrToString( const netadr_t *a ) {
static char s[MAX_QPATH];
+ const uint8_t *ip;
switch( a->type ) {
case NA_LOOPBACK:
@@ -254,8 +255,9 @@ char *NET_AdrToString( const netadr_t *a ) {
return s;
case NA_IP:
case NA_BROADCAST:
+ ip = a->ip.u8;
Q_snprintf( s, sizeof( s ), "%u.%u.%u.%u:%u",
- a->ip[0], a->ip[1], a->ip[2], a->ip[3], ntohs( a->port ) );
+ ip[0], ip[1], ip[2], ip[3], ntohs( a->port ) );
return s;
default:
Com_Error( ERR_FATAL, "%s: bad address type", __func__ );
diff --git a/src/net_sock.h b/src/net_sock.h
index 2669e09..8fccacb 100644
--- a/src/net_sock.h
+++ b/src/net_sock.h
@@ -59,10 +59,16 @@ typedef enum {
NET_ERROR,
} neterr_t;
+typedef union {
+ uint8_t u8[4];
+ uint16_t u16[2];
+ uint32_t u32;
+} netadrip_t;
+
typedef struct {
- netadrtype_t type;
- uint8_t ip[4];
- uint16_t port;
+ netadrtype_t type;
+ netadrip_t ip;
+ uint16_t port;
} netadr_t;
static inline qboolean NET_IsEqualAdr( const netadr_t *a, const netadr_t *b ) {
@@ -75,7 +81,7 @@ static inline qboolean NET_IsEqualAdr( const netadr_t *a, const netadr_t *b ) {
return qtrue;
case NA_IP:
case NA_BROADCAST:
- if( *( uint32_t * )a->ip == *( uint32_t * )b->ip && a->port == b->port ) {
+ if( a->ip.u32 == b->ip.u32 && a->port == b->port ) {
return qtrue;
}
// fall through
@@ -96,7 +102,7 @@ static inline qboolean NET_IsEqualBaseAdr( const netadr_t *a, const netadr_t *b
return qtrue;
case NA_IP:
case NA_BROADCAST:
- if( *( uint32_t * )a->ip == *( uint32_t * )b->ip ) {
+ if( a->ip.u32 == b->ip.u32 ) {
return qtrue;
}
// fall through
@@ -113,11 +119,11 @@ static inline qboolean NET_IsLanAddress( const netadr_t *adr ) {
return qtrue;
case NA_IP:
case NA_BROADCAST:
- if( adr->ip[0] == 127 || adr->ip[0] == 10 ) {
+ if( adr->ip.u8[0] == 127 || adr->ip.u8[0] == 10 ) {
return qtrue;
}
- if( *( uint16_t * )adr->ip == MakeRawShort( 192, 168 ) ||
- *( uint16_t * )adr->ip == MakeRawShort( 172, 16 ) )
+ if( adr->ip.u16[0] == MakeRawShort( 192, 168 ) ||
+ adr->ip.u16[0] == MakeRawShort( 172, 16 ) )
{
return qtrue;
}
diff --git a/src/sv_ac.c b/src/sv_ac.c
index 268e7c3..fd9e762 100644
--- a/src/sv_ac.c
+++ b/src/sv_ac.c
@@ -1095,7 +1095,7 @@ char *AC_ClientConnect( client_t *cl ) {
if( ac.ready ) {
MSG_WriteShort( 15 );
MSG_WriteByte( ACC_REQUESTCHALLENGE );
- MSG_WriteData( net_from.ip, 4 );
+ MSG_WriteData( net_from.ip.u8, 4 );
MSG_WriteData( &net_from.port, 2 );
MSG_WriteLong( cl->number );
MSG_WriteLong( cl->challenge );
diff --git a/src/sv_ccmds.c b/src/sv_ccmds.c
index a2ae4ca..30d83d1 100644
--- a/src/sv_ccmds.c
+++ b/src/sv_ccmds.c
@@ -407,7 +407,7 @@ void SV_Kick_f( void ) {
netadr_t *addr = &sv_client->netchan->remote_address;
if( addr->type == NA_IP ) {
addrmatch_t *match = Z_Malloc( sizeof( *match ) );
- match->addr = *( uint32_t * )addr->ip;
+ match->addr.u32 = addr->ip.u32;
match->mask = 0xffffffffU;
match->hits = 0;
match->time = 0;
@@ -872,18 +872,16 @@ static qboolean parse_mask( const char *s, uint32_t *addr, uint32_t *mask ) {
return qfalse;
}
- *addr = *( uint32_t * )address.ip;
+ *addr = address.ip.u32;
*mask = BigLong( ~( ( 1 << ( 32 - bits ) ) - 1 ) );
return qtrue;
}
static size_t format_mask( addrmatch_t *match, char *buf, size_t size ) {
- byte ip[4];
- uint32_t mask;
+ uint8_t *ip = match->addr.u8;
+ uint32_t mask = BigLong( match->mask );
int i;
- *( uint32_t * )ip = match->addr;
- mask = BigLong( match->mask );
for( i = 0; i < 32; i++ ) {
if( mask & ( 1 << i ) ) {
break;
@@ -911,7 +909,7 @@ void SV_AddMatch_f( list_t *list ) {
}
LIST_FOR_EACH( addrmatch_t, match, list, entry ) {
- if( match->addr == addr && match->mask == mask ) {
+ if( match->addr.u32 == addr && match->mask == mask ) {
format_mask( match, buf, sizeof( buf ) );
Com_Printf( "Entry %s already exists.\n", buf );
return;
@@ -921,7 +919,7 @@ void SV_AddMatch_f( list_t *list ) {
s = Cmd_ArgsFrom( 2 );
len = strlen( s );
match = Z_Malloc( sizeof( *match ) + len );
- match->addr = addr;
+ match->addr.u32 = addr;
match->mask = mask;
match->hits = 0;
match->time = 0;
@@ -974,7 +972,7 @@ void SV_DelMatch_f( list_t *list ) {
}
LIST_FOR_EACH( addrmatch_t, match, list, entry ) {
- if( match->addr == addr && match->mask == mask ) {
+ if( match->addr.u32 == addr && match->mask == mask ) {
remove:
List_Remove( &match->entry );
Z_Free( match );
diff --git a/src/sv_local.h b/src/sv_local.h
index fb8b2bb..6a9cfb4 100644
--- a/src/sv_local.h
+++ b/src/sv_local.h
@@ -318,7 +318,7 @@ typedef struct {
typedef struct {
list_t entry;
- uint32_t addr;
+ netadrip_t addr;
uint32_t mask;
unsigned hits;
time_t time; // time of the last hit
diff --git a/src/sv_main.c b/src/sv_main.c
index e50414f..b5f0fe0 100644
--- a/src/sv_main.c
+++ b/src/sv_main.c
@@ -281,12 +281,11 @@ static void SV_RateInit( ratelimit_t *r, const char *s ) {
r->period = period;
}
-addrmatch_t *SV_MatchAddress( list_t *list, netadr_t *address ) {
- uint32_t addr = *( uint32_t * )address->ip;
+addrmatch_t *SV_MatchAddress( list_t *list, netadr_t *addr ) {
addrmatch_t *match;
LIST_FOR_EACH( addrmatch_t, match, list, entry ) {
- if( ( addr & match->mask ) == ( match->addr & match->mask ) ) {
+ if( ( addr->ip.u32 & match->mask ) == ( match->addr.u32 & match->mask ) ) {
match->hits++;
match->time = time( NULL );
return match;
@@ -1074,13 +1073,6 @@ static void SV_ConnectionlessPacket( void ) {
c = Cmd_Argv( 0 );
Com_DPrintf( "ServerPacket[%s]: %s\n", NET_AdrToString( &net_from ), c );
- if( !NET_IsLocalAddress( &net_from ) && net_from.ip[0] == 127 &&
- net_from.port == Cvar_VariableInteger( "net_port" ) )
- {
- Com_DPrintf( "dropped connectionless packet from self\n" );
- return;
- }
-
if( !strcmp( c, "rcon" ) ) {
SVC_RemoteCommand();
return; // accept rcon commands even if not active