@ -39,23 +39,32 @@ namespace llarp
init ( ) ;
}
SockAddr : : SockAddr ( uint8_t a , uint8_t b , uint8_t c , uint8_t d )
SockAddr : : SockAddr ( uint8_t a , uint8_t b , uint8_t c , uint8_t d , huint16_t port )
{
init ( ) ;
setIPv4 ( a , b , c , d ) ;
setPort ( port ) ;
}
SockAddr : : SockAddr ( uint8_t a , uint8_t b , uint8_t c , uint8_t d , uint16_t port )
: SockAddr { a , b , c , d }
SockAddr : : SockAddr ( nuint32_t ip , nuint16_t port )
{
init ( ) ;
setIPv4 ( ip ) ;
setPort ( port ) ;
}
SockAddr : : SockAddr ( uint32_t ip , uint16_t port )
SockAddr : : SockAddr ( huint128_t ip , h uint16_t port )
{
init ( ) ;
setIPv4 ( ip ) ;
setPort ( ntohs ( port ) ) ;
setIPv6 ( ip ) ;
setPort ( port ) ;
}
SockAddr : : SockAddr ( nuint128_t ip , nuint16_t port )
{
init ( ) ;
setIPv6 ( ip ) ;
setPort ( port ) ;
}
SockAddr : : SockAddr ( std : : string_view addr )
@ -66,13 +75,13 @@ namespace llarp
SockAddr : : SockAddr ( std : : string_view addr , uint16_t port )
{
init ( ) ;
setPort ( port) ;
setPort ( huint16_t{ port} ) ;
fromString ( addr , false ) ;
}
SockAddr : : SockAddr ( const AddressInfo & info ) : SockAddr { info . ip }
{
setPort ( info. port ) ;
setPort ( huint16_t{ info. port } ) ;
}
SockAddr : : SockAddr ( const SockAddr & other )
@ -138,12 +147,14 @@ namespace llarp
memcpy ( & m_addr , & other , sizeof ( sockaddr_in6 ) ) ;
if ( ipv6_is_mapped_ipv4 ( other . sin6_addr ) )
{
setIPv4 (
other . sin6_addr . s6_addr [ 12 ] ,
other . sin6_addr . s6_addr [ 13 ] ,
other . sin6_addr . s6_addr [ 14 ] ,
other . sin6_addr . s6_addr [ 15 ] ) ;
setPort ( ntohs ( other . sin6_port ) ) ;
m_addr4 . sin_port = m_addr . sin6_port ;
}
m_empty = false ;
return * this ;
@ -161,7 +172,10 @@ namespace llarp
memcpy ( & m_addr . sin6_addr . s6_addr , & other . s6_addr , sizeof ( m_addr . sin6_addr . s6_addr ) ) ;
if ( ipv6_is_mapped_ipv4 ( other ) )
{
setIPv4 ( other . s6_addr [ 12 ] , other . s6_addr [ 13 ] , other . s6_addr [ 14 ] , other . s6_addr [ 15 ] ) ;
m_addr4 . sin_port = m_addr . sin6_port ;
}
m_empty = false ;
return * this ;
@ -302,14 +316,14 @@ namespace llarp
return m_empty ;
}
uint32_t
n uint32_t
SockAddr : : getIPv4 ( ) const
{
return m_addr4 . sin_addr . s_addr ;
return { m_addr4 . sin_addr . s_addr } ;
}
void
SockAddr : : setIPv4 ( uint32_t ip )
SockAddr : : setIPv4 ( n uint32_t ip )
{
uint8_t * ip6 = m_addr . sin6_addr . s6_addr ;
llarp : : Zero ( ip6 , sizeof ( m_addr . sin6_addr . s6_addr ) ) ;
@ -317,10 +331,16 @@ namespace llarp
applyIPv4MapBytes ( ) ;
std : : memcpy ( ip6 + 12 , & ip , 4 ) ;
m_addr4 . sin_addr . s_addr = ip ;
m_addr4 . sin_addr . s_addr = ip .n ;
m_empty = false ;
}
void
SockAddr : : setIPv4 ( huint32_t ip )
{
setIPv4 ( ToNet ( ip ) ) ;
}
void
SockAddr : : setIPv4 ( uint8_t a , uint8_t b , uint8_t c , uint8_t d )
{
@ -339,10 +359,37 @@ namespace llarp
}
void
SockAddr : : setPort ( uint16_t port )
SockAddr : : setIPv6 ( huint128_t ip )
{
return setIPv6 ( ToNet ( ip ) ) ;
}
void
SockAddr : : setIPv6 ( nuint128_t ip )
{
std : : memcpy ( & m_addr . sin6_addr , & ip , sizeof ( m_addr . sin6_addr ) ) ;
if ( ipv6_is_mapped_ipv4 ( m_addr . sin6_addr ) )
{
setIPv4 (
m_addr . sin6_addr . s6_addr [ 12 ] ,
m_addr . sin6_addr . s6_addr [ 13 ] ,
m_addr . sin6_addr . s6_addr [ 14 ] ,
m_addr . sin6_addr . s6_addr [ 15 ] ) ;
m_addr4 . sin_port = m_addr . sin6_port ;
}
}
void
SockAddr : : setPort ( nuint16_t port )
{
m_addr . sin6_port = port . n ;
m_addr4 . sin_port = port . n ;
}
void
SockAddr : : setPort ( huint16_t port )
{
m_addr . sin6_port = htons ( port ) ;
m_addr4 . sin_port = htons ( port ) ;
setPort ( ToNet ( port ) ) ;
}
uint16_t