summaryrefslogtreecommitdiff
path: root/main/netsock2.c
diff options
context:
space:
mode:
authorMichael L. Young <elgueromexicano@gmail.com>2013-10-04 21:41:58 +0000
committerMichael L. Young <elgueromexicano@gmail.com>2013-10-04 21:41:58 +0000
commit2af53640c88464bb338753120945159e8e1a9cb9 (patch)
tree65951c78f0d8b20bb58808b5fa12444b4de38154 /main/netsock2.c
parent21902bf9647823049358cdf386150d4b9b15e75e (diff)
Add IPv6 Support To chan_iax2
This patch adds IPv6 support to chan_iax2. Yay! (closes issue ASTERISK-22025) Patches: iax2-ipv6-v5-reviewboard.diff by Michael L. Young (license 5026) Review: https://reviewboard.asterisk.org/r/2660/ ........ Merged revisions 400567 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@400568 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/netsock2.c')
-rw-r--r--main/netsock2.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/main/netsock2.c b/main/netsock2.c
index aa5e17d9e..bee88c2f8 100644
--- a/main/netsock2.c
+++ b/main/netsock2.c
@@ -297,6 +297,37 @@ cleanup:
return res_cnt;
}
+int ast_sockaddr_apply_netmask(const struct ast_sockaddr *addr, const struct ast_sockaddr *netmask,
+ struct ast_sockaddr *result)
+{
+ int res = 0;
+
+ if (ast_sockaddr_is_ipv4(addr)) {
+ struct sockaddr_in result4 = { 0, };
+ struct sockaddr_in *addr4 = (struct sockaddr_in *) &addr->ss;
+ struct sockaddr_in *mask4 = (struct sockaddr_in *) &netmask->ss;
+ result4.sin_family = AF_INET;
+ result4.sin_addr.s_addr = addr4->sin_addr.s_addr & mask4->sin_addr.s_addr;
+ ast_sockaddr_from_sin(result, &result4);
+ } else if (ast_sockaddr_is_ipv6(addr)) {
+ struct sockaddr_in6 result6 = { 0, };
+ struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) &addr->ss;
+ struct sockaddr_in6 *mask6 = (struct sockaddr_in6 *) &netmask->ss;
+ int i;
+ result6.sin6_family = AF_INET6;
+ for (i = 0; i < 4; ++i) {
+ V6_WORD(&result6, i) = V6_WORD(addr6, i) & V6_WORD(mask6, i);
+ }
+ memcpy(&result->ss, &result6, sizeof(result6));
+ result->len = sizeof(result6);
+ } else {
+ /* Unsupported address scheme */
+ res = -1;
+ }
+
+ return res;
+}
+
int ast_sockaddr_cmp(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
{
const struct ast_sockaddr *a_tmp, *b_tmp;