diff options
author | Michael L. Young <elgueromexicano@gmail.com> | 2013-10-04 21:41:58 +0000 |
---|---|---|
committer | Michael L. Young <elgueromexicano@gmail.com> | 2013-10-04 21:41:58 +0000 |
commit | 2af53640c88464bb338753120945159e8e1a9cb9 (patch) | |
tree | 65951c78f0d8b20bb58808b5fa12444b4de38154 /channels/iax2 | |
parent | 21902bf9647823049358cdf386150d4b9b15e75e (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 'channels/iax2')
-rw-r--r-- | channels/iax2/include/parser.h | 6 | ||||
-rw-r--r-- | channels/iax2/parser.c | 66 |
2 files changed, 49 insertions, 23 deletions
diff --git a/channels/iax2/include/parser.h b/channels/iax2/include/parser.h index caaa098c9..d17def8e5 100644 --- a/channels/iax2/include/parser.h +++ b/channels/iax2/include/parser.h @@ -47,7 +47,7 @@ struct iax_ies { char *challenge; char *md5_result; char *rsa_result; - struct sockaddr_in *apparent_addr; + struct ast_sockaddr apparent_addr; unsigned short refresh; unsigned short dpstatus; unsigned short callno; @@ -153,13 +153,13 @@ struct iax_ie_data { void iax_set_output(void (*output)(const char *data)); /* Choose a different function for errors */ void iax_set_error(void (*output)(const char *data)); -void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen); +void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct ast_sockaddr *addr, int datalen); void iax_frame_subclass2str(enum iax_frame_subclass subclass, char *str, size_t len); const char *iax_ie2str(int ie); int iax_ie_append_raw(struct iax_ie_data *ied, unsigned char ie, const void *data, int datalen); -int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, const struct sockaddr_in *sin); +int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, const struct ast_sockaddr *addr); int iax_ie_append_versioned_uint64(struct iax_ie_data *ied, unsigned char ie, unsigned char version, uint64_t value); int iax_ie_append_int(struct iax_ie_data *ied, unsigned char ie, unsigned int value); int iax_ie_append_short(struct iax_ie_data *ied, unsigned char ie, unsigned short value); diff --git a/channels/iax2/parser.c b/channels/iax2/parser.c index e77a9b3cf..ee4a6c3be 100644 --- a/channels/iax2/parser.c +++ b/channels/iax2/parser.c @@ -41,6 +41,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/config.h" #include "asterisk/lock.h" #include "asterisk/threadstorage.h" +#include "asterisk/netsock2.h" #include "include/iax2.h" #include "include/parser.h" @@ -83,13 +84,23 @@ static void (*errorf)(const char *str) = internalerror; static void dump_addr(char *output, int maxlen, void *value, int len) { - struct sockaddr_in sin; - if (len == (int)sizeof(sin)) { - memcpy(&sin, value, len); - snprintf(output, maxlen, "IPV4 %s:%d", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); + struct ast_sockaddr addr; + + if (len == (int)sizeof(struct sockaddr_in)) { + addr.ss.ss_family = AF_INET; + } else if (len == (int) sizeof(struct sockaddr_in6)) { + addr.ss.ss_family = AF_INET6; } else { ast_copy_string(output, "Invalid Address", maxlen); + return; } + + memcpy(&addr, value, len); + addr.len = len; + + snprintf(output, maxlen, "%s %s", + ast_sockaddr_is_ipv4(&addr) || ast_sockaddr_is_ipv4_mapped(&addr) ? "IPV4" : "IPV6", + ast_sockaddr_stringify(&addr)); } static void dump_string_hex(char *output, int maxlen, void *value, int len) @@ -172,12 +183,23 @@ static void dump_datetime(char *output, int maxlen, void *value, int len) static void dump_ipaddr(char *output, int maxlen, void *value, int len) { - struct sockaddr_in sin; - if (len == (int)sizeof(unsigned int)) { - memcpy(&sin.sin_addr, value, len); - snprintf(output, maxlen, "%s", ast_inet_ntoa(sin.sin_addr)); - } else + struct ast_sockaddr addr; + char *str_addr; + + if (len == (int)sizeof(struct sockaddr_in)) { + addr.ss.ss_family = AF_INET; + } else if (len == (int)sizeof(struct sockaddr_in6)) { + addr.ss.ss_family = AF_INET6; + } else { ast_copy_string(output, "Invalid IPADDR", maxlen); + return; + } + + memcpy(&addr, value, len); + addr.len = len; + + str_addr = ast_sockaddr_stringify(&addr); + ast_copy_string(output, str_addr, maxlen); } @@ -564,7 +586,7 @@ void iax_frame_subclass2str(enum iax_frame_subclass subclass, char *str, size_t ast_copy_string(str, cmd, len); } -void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen) +void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct ast_sockaddr *addr, int datalen) { const char *framelist[] = { "(0?)", @@ -677,19 +699,22 @@ void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, s snprintf(subclass2, sizeof(subclass2), "%d", fh->csub); subclass = subclass2; } - snprintf(tmp, sizeof(tmp), - "%s-Frame Retry[%s] -- OSeqno: %3.3d ISeqno: %3.3d Type: %s Subclass: %s\n", + + snprintf(tmp, sizeof(tmp), + "%s-Frame Retry[%s] -- OSeqno: %3.3d ISeqno: %3.3d Type: %s Subclass: %s\n", dir, retries, fh->oseqno, fh->iseqno, class, subclass); outputf(tmp); - snprintf(tmp, sizeof(tmp), - " Timestamp: %05lums SCall: %5.5d DCall: %5.5d [%s:%d]\n", - (unsigned long)ntohl(fh->ts), - ntohs(fh->scallno) & ~IAX_FLAG_FULL, ntohs(fh->dcallno) & ~IAX_FLAG_RETRANS, - ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port)); + snprintf(tmp, sizeof(tmp), " Timestamp: %05lums SCall: %5.5d DCall: %5.5d %s\n", + (unsigned long)ntohl(fh->ts), + ntohs(fh->scallno) & ~IAX_FLAG_FULL, + ntohs(fh->dcallno) & ~IAX_FLAG_RETRANS, + ast_sockaddr_stringify(addr)); + outputf(tmp); if (fh->type == AST_FRAME_IAX) dump_ies(fh->iedata, datalen); + } int iax_ie_append_raw(struct iax_ie_data *ied, unsigned char ie, const void *data, int datalen) @@ -707,9 +732,9 @@ int iax_ie_append_raw(struct iax_ie_data *ied, unsigned char ie, const void *dat return 0; } -int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, const struct sockaddr_in *sin) +int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, const struct ast_sockaddr *addr) { - return iax_ie_append_raw(ied, ie, sin, (int)sizeof(struct sockaddr_in)); + return iax_ie_append_raw(ied, ie, addr, addr->len); } int iax_ie_append_versioned_uint64(struct iax_ie_data *ied, unsigned char ie, unsigned char version, uint64_t value) @@ -904,7 +929,8 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen) ies->rsa_result = (char *)data + 2; break; case IAX_IE_APPARENT_ADDR: - ies->apparent_addr = ((struct sockaddr_in *)(data + 2)); + memcpy(&ies->apparent_addr , (struct ast_sockaddr *) (data + 2), len); + ies->apparent_addr.len = len; break; case IAX_IE_REFRESH: if (len != (int)sizeof(unsigned short)) { |