From cd4ebd336f6fdd1fe5d2ad57f06654a9678d88d4 Mon Sep 17 00:00:00 2001 From: Mark Michelson Date: Thu, 8 Jul 2010 22:08:07 +0000 Subject: Add IPv6 to Asterisk. This adds a generic API for accommodating IPv6 and IPv4 addresses within Asterisk. While many files have been updated to make use of the API, chan_sip and the RTP code are the files which actually support IPv6 addresses at the time of this commit. The way has been paved for easier upgrading for other files in the near future, though. Big thanks go to Simon Perrault, Marc Blanchet, and Jean-Philippe Dionne for their hard work on this. (closes issue #17565) Reported by: russell Patches: asteriskv6-test-report.pdf uploaded by russell (license 2) Review: https://reviewboard.asterisk.org/r/743 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@274783 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_iax2.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'channels/chan_iax2.c') diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index ba482a065..7880e719d 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -4441,11 +4441,15 @@ static int create_addr(const char *peername, struct ast_channel *c, struct socka sin->sin_family = AF_INET; if (!(peer = find_peer(peername, 1))) { + struct ast_sockaddr sin_tmp; + cai->found = 0; - if (ast_get_ip_or_srv(sin, peername, srvlookup ? "_iax._udp" : NULL)) { + sin_tmp.ss.ss_family = AF_INET; + if (ast_get_ip_or_srv(&sin_tmp, peername, srvlookup ? "_iax._udp" : NULL)) { ast_log(LOG_WARNING, "No such host: %s\n", peername); return -1; } + ast_sockaddr_to_sin(&sin_tmp, sin); sin->sin_port = htons(IAX_DEFAULT_PORTNO); /* use global iax prefs for unknown peer/user */ /* But move the calling channel's native codec to the top of the preference list */ @@ -8312,14 +8316,18 @@ static int iax2_append_register(const char *hostname, const char *username, const char *secret, const char *porta) { struct iax2_registry *reg; + struct ast_sockaddr reg_addr_tmp; if (!(reg = ast_calloc(1, sizeof(*reg)))) return -1; - if (ast_dnsmgr_lookup(hostname, ®->addr, ®->dnsmgr, srvlookup ? "_iax._udp" : NULL) < 0) { + reg->addr.sin_family = AF_INET; + ast_sockaddr_from_sin(®_addr_tmp, ®->addr); + if (ast_dnsmgr_lookup(hostname, ®_addr_tmp, ®->dnsmgr, srvlookup ? "_iax._udp" : NULL) < 0) { ast_free(reg); return -1; } + ast_sockaddr_to_sin(®_addr_tmp, ®->addr); ast_copy_string(reg->username, username, sizeof(reg->username)); @@ -11991,6 +11999,7 @@ static int check_srcaddr(struct sockaddr *sa, socklen_t salen) static int peer_set_srcaddr(struct iax2_peer *peer, const char *srcaddr) { struct sockaddr_in sin; + struct ast_sockaddr sin_tmp; int nonlocal = 1; int port = IAX_DEFAULT_PORTNO; int sockfd = defaultsockfd; @@ -12010,10 +12019,11 @@ static int peer_set_srcaddr(struct iax2_peer *peer, const char *srcaddr) port = IAX_DEFAULT_PORTNO; } - if (!ast_get_ip(&sin, addr)) { + if (!ast_get_ip(&sin_tmp, addr)) { struct ast_netsock *sock; int res; + ast_sockaddr_to_sin(&sin_tmp, &sin); sin.sin_port = 0; sin.sin_family = AF_INET; res = check_srcaddr((struct sockaddr *) &sin, sizeof(sin)); @@ -12212,19 +12222,29 @@ static struct iax2_peer *build_peer(const char *name, struct ast_variable *v, st } } } else { + struct ast_sockaddr peer_addr_tmp; + /* Non-dynamic. Make sure we become that way if we're not */ ast_sched_thread_del(sched, peer->expire); ast_clear_flag64(peer, IAX_DYNAMIC); - if (ast_dnsmgr_lookup(v->value, &peer->addr, &peer->dnsmgr, srvlookup ? "_iax._udp" : NULL)) + peer_addr_tmp.ss.ss_family = AF_INET; + if (ast_dnsmgr_lookup(v->value, &peer_addr_tmp, &peer->dnsmgr, srvlookup ? "_iax._udp" : NULL)) return peer_unref(peer); + ast_sockaddr_to_sin(&peer_addr_tmp, + &peer->addr); if (!peer->addr.sin_port) peer->addr.sin_port = htons(IAX_DEFAULT_PORTNO); } if (!maskfound) inet_aton("255.255.255.255", &peer->mask); } else if (!strcasecmp(v->name, "defaultip")) { - if (ast_get_ip(&peer->defaddr, v->value)) + struct ast_sockaddr peer_defaddr_tmp; + + if (ast_get_ip(&peer_defaddr_tmp, v->value)) { return peer_unref(peer); + } + ast_sockaddr_to_sin(&peer_defaddr_tmp, + &peer->defaddr); } else if (!strcasecmp(v->name, "sourceaddress")) { peer_set_srcaddr(peer, v->value); } else if (!strcasecmp(v->name, "permit") || -- cgit v1.2.3