diff options
author | Stefan Becker <chemobejk@gmail.com> | 2019-06-26 11:45:06 +0300 |
---|---|---|
committer | Stefan Becker <chemobejk@gmail.com> | 2019-06-27 19:49:16 +0300 |
commit | e920a99518b3e8812f779dd7b5d809b8ac97dcd2 (patch) | |
tree | e075f759327fc0b73238ff5ba5ec81a6897ce542 /agent/interfaces.c | |
parent | 9c93234be8c3e4ed612453b27bfd6615cbc748ad (diff) | |
download | libnice-e920a99518b3e8812f779dd7b5d809b8ac97dcd2.tar.gz |
interfaces: detect IPv6 ULA & link-local addresses
Update nice_interfaces_is_private_ip() to handle IPv6 too:
- unique local address block: fc00::/7
- link-local address block: fe80::/10
Diffstat (limited to 'agent/interfaces.c')
-rw-r--r-- | agent/interfaces.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/agent/interfaces.c b/agent/interfaces.c index 0dc4b0d..f8bb086 100644 --- a/agent/interfaces.c +++ b/agent/interfaces.c @@ -193,6 +193,7 @@ nice_interfaces_is_private_ip (const struct sockaddr *_sa) union { const struct sockaddr *addr; const struct sockaddr_in *in; + const struct sockaddr_in6 *in6; } sa; sa.addr = _sa; @@ -213,6 +214,15 @@ nice_interfaces_is_private_ip (const struct sockaddr *_sa) /* 169.254.x.x/16 (for APIPA) */ if (sa.in->sin_addr.s_addr >> 16 == 0xA9FE) return TRUE; + } else if (sa.addr->sa_family == AF_INET6) { + /* fc00::/7 Unique local address (ULA) */ + if ((sa.in6->sin6_addr.s6_addr[0] & 0xFE) == 0xFC) + return TRUE; + + /* fe80::/10 link-local address */ + if ( (sa.in6->sin6_addr.s6_addr[0] == 0xFE) && + ((sa.in6->sin6_addr.s6_addr[1] & 0xC0) == 0x80)) + return TRUE; } return FALSE; |