Wed Jan 27 20:02:42 2016

Asterisk developer's documentation


netsock2.h File Reference

Network socket handling. More...

#include <sys/socket.h>
#include <netinet/in.h>

Go to the source code of this file.

Data Structures

struct  ast_sockaddr
 Socket address structure. More...

Defines

#define ast_sockaddr_port(addr)   _ast_sockaddr_port(addr, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 Get the port number of a socket address.
#define ast_sockaddr_set_port(addr, port)   _ast_sockaddr_set_port(addr,port,__FILE__,__LINE__,__PRETTY_FUNCTION__)
 Sets the port number of a socket address.
#define AST_SOCKADDR_STR_ADDR   (1 << 0)
#define AST_SOCKADDR_STR_ADDR_REMOTE   (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_REMOTE)
#define AST_SOCKADDR_STR_BRACKETS   (1 << 2)
#define AST_SOCKADDR_STR_DEFAULT   (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_PORT)
#define AST_SOCKADDR_STR_DEFAULT_REMOTE   (AST_SOCKADDR_STR_DEFAULT | AST_SOCKADDR_STR_REMOTE)
#define AST_SOCKADDR_STR_FORMAT_MASK   (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_PORT | AST_SOCKADDR_STR_BRACKETS)
#define AST_SOCKADDR_STR_HOST   (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_BRACKETS)
#define AST_SOCKADDR_STR_HOST_REMOTE   (AST_SOCKADDR_STR_HOST | AST_SOCKADDR_STR_REMOTE)
#define AST_SOCKADDR_STR_PORT   (1 << 1)
#define AST_SOCKADDR_STR_REMOTE   (1 << 3)

Enumerations

enum  { AST_AF_UNSPEC = 0, AST_AF_INET = 2, AST_AF_INET6 = 10 }

Functions

uint16_t _ast_sockaddr_port (const struct ast_sockaddr *addr, const char *file, int line, const char *func)
void _ast_sockaddr_set_port (struct ast_sockaddr *addr, uint16_t port, const char *file, int line, const char *func)
int ast_accept (int sockfd, struct ast_sockaddr *addr)
 Wrapper around accept(2) that uses struct ast_sockaddr.
int ast_bind (int sockfd, const struct ast_sockaddr *addr)
 Wrapper around bind(2) that uses struct ast_sockaddr.
int ast_connect (int sockfd, const struct ast_sockaddr *addr)
 Wrapper around connect(2) that uses struct ast_sockaddr.
int ast_getsockname (int sockfd, struct ast_sockaddr *addr)
 Wrapper around getsockname(2) that uses struct ast_sockaddr.
ssize_t ast_recvfrom (int sockfd, void *buf, size_t len, int flags, struct ast_sockaddr *src_addr)
 Wrapper around recvfrom(2) that uses struct ast_sockaddr.
ssize_t ast_sendto (int sockfd, const void *buf, size_t len, int flags, const struct ast_sockaddr *dest_addr)
 Wrapper around sendto(2) that uses ast_sockaddr.
int ast_set_qos (int sockfd, int tos, int cos, const char *desc)
 Set type of service.
int ast_sockaddr_cmp (const struct ast_sockaddr *a, const struct ast_sockaddr *b)
 Compares two ast_sockaddr structures.
int ast_sockaddr_cmp_addr (const struct ast_sockaddr *a, const struct ast_sockaddr *b)
 Compares the addresses of two ast_sockaddr structures.
static void ast_sockaddr_copy (struct ast_sockaddr *dst, const struct ast_sockaddr *src)
 Copies the data from one ast_sockaddr to another.
int ast_sockaddr_hash (const struct ast_sockaddr *addr)
 Computes a hash value from the address. The port is ignored.
uint32_t ast_sockaddr_ipv4 (const struct ast_sockaddr *addr)
 Get an IPv4 address of an ast_sockaddr.
int ast_sockaddr_ipv4_mapped (const struct ast_sockaddr *addr, struct ast_sockaddr *ast_mapped)
 Convert an IPv4-mapped IPv6 address into an IPv4 address.
int ast_sockaddr_is_any (const struct ast_sockaddr *addr)
 Determine if the address type is unspecified, or "any" address.
int ast_sockaddr_is_ipv4 (const struct ast_sockaddr *addr)
 Determine if the address is an IPv4 address.
int ast_sockaddr_is_ipv4_mapped (const struct ast_sockaddr *addr)
 Determine if this is an IPv4-mapped IPv6 address.
int ast_sockaddr_is_ipv6 (const struct ast_sockaddr *addr)
 Determine if this is an IPv6 address.
int ast_sockaddr_is_ipv6_link_local (const struct ast_sockaddr *addr)
 Determine if this is a link-local IPv6 address.
static int ast_sockaddr_isnull (const struct ast_sockaddr *addr)
 Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized, or having a 0 length.
int ast_sockaddr_parse (struct ast_sockaddr *addr, const char *str, int flags)
 Parse an IPv4 or IPv6 address string.
int ast_sockaddr_resolve (struct ast_sockaddr **addrs, const char *str, int flags, int family)
 Parses a string with an IPv4 or IPv6 address and place results into an array.
static void ast_sockaddr_setnull (struct ast_sockaddr *addr)
 Sets address addr to null.
int ast_sockaddr_split_hostport (char *str, char **host, char **port, int flags)
 Splits a string into its host and port components.
static char * ast_sockaddr_stringify (const struct ast_sockaddr *addr)
 Wrapper around ast_sockaddr_stringify_fmt() with default format.
static char * ast_sockaddr_stringify_addr (const struct ast_sockaddr *addr)
 Wrapper around ast_sockaddr_stringify_fmt() to return an address only.
static char * ast_sockaddr_stringify_addr_remote (const struct ast_sockaddr *addr)
 Wrapper around ast_sockaddr_stringify_fmt() to return an address only.
char * ast_sockaddr_stringify_fmt (const struct ast_sockaddr *addr, int format)
 Convert a socket address to a string.
static char * ast_sockaddr_stringify_host (const struct ast_sockaddr *addr)
 Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brackets for IPv6).
static char * ast_sockaddr_stringify_host_remote (const struct ast_sockaddr *addr)
 Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brackets for IPv6).
static char * ast_sockaddr_stringify_port (const struct ast_sockaddr *addr)
 Wrapper around ast_sockaddr_stringify_fmt() to return a port only.
static char * ast_sockaddr_stringify_remote (const struct ast_sockaddr *addr)
 Wrapper around ast_sockaddr_stringify_fmt() with default format.



#define ast_sockaddr_from_sin(addr, sin)   _ast_sockaddr_from_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 Converts a struct sockaddr_in to a struct ast_sockaddr.
#define ast_sockaddr_to_sin(addr, sin)   _ast_sockaddr_to_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 Converts a struct ast_sockaddr to a struct sockaddr_in.
void _ast_sockaddr_from_sin (struct ast_sockaddr *addr, const struct sockaddr_in *sin, const char *file, int line, const char *func)
int _ast_sockaddr_to_sin (const struct ast_sockaddr *addr, struct sockaddr_in *sin, const char *file, int line, const char *func)

Detailed Description

Network socket handling.

Definition in file netsock2.h.


Define Documentation

#define ast_sockaddr_from_sin ( addr,
sin   )     _ast_sockaddr_from_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__)
#define ast_sockaddr_port ( addr   )     _ast_sockaddr_port(addr, __FILE__, __LINE__, __PRETTY_FUNCTION__)
#define ast_sockaddr_set_port ( addr,
port   )     _ast_sockaddr_set_port(addr,port,__FILE__,__LINE__,__PRETTY_FUNCTION__)

Sets the port number of a socket address.

Since:
1.8
Warning:
Do not use this function unless you really know what you are doing. And "I want the port number" is not knowing what you are doing.
Parameters:
addr Address on which to set the port
port The port you wish to set the address to use
Return values:
void 

Definition at line 422 of file netsock2.h.

Referenced by __ast_http_load(), __set_address_from_contact(), __sip_subscribe_mwi_do(), add_sdp(), ast_find_ourip(), ast_get_ip_or_srv(), ast_ouraddrfor(), ast_rtp_new(), ast_rtp_prop_set(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_sip_ouraddrfor(), ast_udptl_new_with_bindaddr(), build_peer(), check_via(), check_via_response(), create_addr(), dnsmgr_refresh(), get_our_media_address(), iax2_append_register(), on_dns_update_peer(), on_dns_update_registry(), parse_register_contact(), process_sdp(), process_via(), proxy_update(), realtime_peer(), reload_config(), set_destination(), stun_monitor_request(), and transmit_register().

#define AST_SOCKADDR_STR_ADDR   (1 << 0)

Definition at line 152 of file netsock2.h.

Referenced by ast_sockaddr_stringify_addr(), and ast_sockaddr_stringify_fmt().

#define AST_SOCKADDR_STR_ADDR_REMOTE   (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_REMOTE)

Definition at line 158 of file netsock2.h.

Referenced by ast_sockaddr_stringify_addr_remote().

#define AST_SOCKADDR_STR_BRACKETS   (1 << 2)

Definition at line 154 of file netsock2.h.

#define AST_SOCKADDR_STR_DEFAULT   (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_PORT)

Definition at line 157 of file netsock2.h.

Referenced by ast_sockaddr_stringify(), and ast_sockaddr_stringify_fmt().

#define AST_SOCKADDR_STR_DEFAULT_REMOTE   (AST_SOCKADDR_STR_DEFAULT | AST_SOCKADDR_STR_REMOTE)

Definition at line 160 of file netsock2.h.

Referenced by ast_sockaddr_stringify_remote().

#define AST_SOCKADDR_STR_FORMAT_MASK   (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_PORT | AST_SOCKADDR_STR_BRACKETS)

Definition at line 161 of file netsock2.h.

Referenced by ast_sockaddr_stringify_fmt().

#define AST_SOCKADDR_STR_HOST   (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_BRACKETS)

Definition at line 156 of file netsock2.h.

Referenced by ast_sockaddr_stringify_fmt(), and ast_sockaddr_stringify_host().

#define AST_SOCKADDR_STR_HOST_REMOTE   (AST_SOCKADDR_STR_HOST | AST_SOCKADDR_STR_REMOTE)

Definition at line 159 of file netsock2.h.

Referenced by ast_sockaddr_stringify_host_remote().

#define AST_SOCKADDR_STR_PORT   (1 << 1)

Definition at line 153 of file netsock2.h.

Referenced by ast_sockaddr_stringify_fmt(), and ast_sockaddr_stringify_port().

#define AST_SOCKADDR_STR_REMOTE   (1 << 3)

Definition at line 155 of file netsock2.h.

Referenced by ast_sockaddr_stringify_fmt().

#define ast_sockaddr_to_sin ( addr,
sin   )     _ast_sockaddr_to_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__)

Enumeration Type Documentation

anonymous enum

Values for address families that we support. This is reproduced from socket.h because we do not want users to include that file. Only netsock2.c should ever include socket.h.

Enumerator:
AST_AF_UNSPEC 
AST_AF_INET 
AST_AF_INET6 

Definition at line 39 of file netsock2.h.

00039      {
00040    AST_AF_UNSPEC  = 0,
00041    AST_AF_INET = 2,
00042    AST_AF_INET6   = 10,
00043 };


Function Documentation

void _ast_sockaddr_from_sin ( struct ast_sockaddr addr,
const struct sockaddr_in *  sin,
const char *  file,
int  line,
const char *  func 
)

Definition at line 561 of file netsock2.c.

References __LOG_DEBUG, ast_log(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.

00563 {
00564    memcpy(&addr->ss, sin, sizeof(*sin));
00565 
00566    if (addr->ss.ss_family != AF_INET && option_debug >= 1) {
00567       ast_log(__LOG_DEBUG, file, line, func, "Address family is not AF_INET\n");
00568    }
00569 
00570    addr->len = sizeof(*sin);
00571 }

uint16_t _ast_sockaddr_port ( const struct ast_sockaddr addr,
const char *  file,
int  line,
const char *  func 
)

Definition at line 365 of file netsock2.c.

References __LOG_DEBUG, ast_log(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.

00366 {
00367    if (addr->ss.ss_family == AF_INET &&
00368        addr->len == sizeof(struct sockaddr_in)) {
00369       return ntohs(((struct sockaddr_in *)&addr->ss)->sin_port);
00370    } else if (addr->ss.ss_family == AF_INET6 &&
00371        addr->len == sizeof(struct sockaddr_in6)) {
00372       return ntohs(((struct sockaddr_in6 *)&addr->ss)->sin6_port);
00373    }
00374    if (option_debug >= 1) {
00375       ast_log(__LOG_DEBUG, file, line, func, "Not an IPv4 nor IPv6 address, cannot get port.\n");
00376    }
00377    return 0;
00378 }

void _ast_sockaddr_set_port ( struct ast_sockaddr addr,
uint16_t  port,
const char *  file,
int  line,
const char *  func 
)

Definition at line 380 of file netsock2.c.

References __LOG_DEBUG, ast_log(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.

00381 {
00382    if (addr->ss.ss_family == AF_INET &&
00383        addr->len == sizeof(struct sockaddr_in)) {
00384       ((struct sockaddr_in *)&addr->ss)->sin_port = htons(port);
00385    } else if (addr->ss.ss_family == AF_INET6 &&
00386        addr->len == sizeof(struct sockaddr_in6)) {
00387       ((struct sockaddr_in6 *)&addr->ss)->sin6_port = htons(port);
00388    } else if (option_debug >= 1) {
00389       ast_log(__LOG_DEBUG, file, line, func,
00390          "Not an IPv4 nor IPv6 address, cannot set port.\n");
00391    }
00392 }

int _ast_sockaddr_to_sin ( const struct ast_sockaddr addr,
struct sockaddr_in *  sin,
const char *  file,
int  line,
const char *  func 
)

Definition at line 540 of file netsock2.c.

References __LOG_DEBUG, __LOG_ERROR, ast_log(), ast_sockaddr_isnull(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.

00542 {
00543    if (ast_sockaddr_isnull(addr)) {
00544       memset(sin, 0, sizeof(*sin));
00545       return 1;
00546    }
00547 
00548    if (addr->len != sizeof(*sin)) {
00549       ast_log(__LOG_ERROR, file, line, func, "Bad address cast to IPv4\n");
00550       return 0;
00551    }
00552 
00553    if (addr->ss.ss_family != AF_INET && option_debug >= 1) {
00554       ast_log(__LOG_DEBUG, file, line, func, "Address family is not AF_INET\n");
00555    }
00556 
00557    *sin = *(struct sockaddr_in *)&addr->ss;
00558    return 1;
00559 }

int ast_accept ( int  sockfd,
struct ast_sockaddr addr 
)

Wrapper around accept(2) that uses struct ast_sockaddr.

Since:
1.8

For parameter and return information, see the man page for accept(2).

Definition at line 456 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by ast_tcptls_server_root().

00457 {
00458    addr->len = sizeof(addr->ss);
00459    return accept(sockfd, (struct sockaddr *)&addr->ss, &addr->len);
00460 }

int ast_bind ( int  sockfd,
const struct ast_sockaddr addr 
)

Wrapper around bind(2) that uses struct ast_sockaddr.

Since:
1.8

For parameter and return information, see the man page for bind(2).

Definition at line 462 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by ast_rtp_new(), ast_rtp_prop_set(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_new_with_bindaddr(), and reload_config().

00463 {
00464    return bind(sockfd, (const struct sockaddr *)&addr->ss, addr->len);
00465 }

int ast_connect ( int  sockfd,
const struct ast_sockaddr addr 
)

Wrapper around connect(2) that uses struct ast_sockaddr.

Since:
1.8

For parameter and return information, see the man page for connect(2).

Definition at line 467 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by ast_ouraddrfor(), ast_tcptls_client_start(), gtalk_update_externip(), and stun_monitor_request().

00468 {
00469    return connect(sockfd, (const struct sockaddr *)&addr->ss, addr->len);
00470 }

int ast_getsockname ( int  sockfd,
struct ast_sockaddr addr 
)

Wrapper around getsockname(2) that uses struct ast_sockaddr.

Since:
1.8

For parameter and return information, see the man page for getsockname(2).

Definition at line 472 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by ast_ouraddrfor(), and ast_set_qos().

00473 {
00474    addr->len = sizeof(addr->ss);
00475    return getsockname(sockfd, (struct sockaddr *)&addr->ss, &addr->len);
00476 }

ssize_t ast_recvfrom ( int  sockfd,
void *  buf,
size_t  len,
int  flags,
struct ast_sockaddr src_addr 
)

Wrapper around recvfrom(2) that uses struct ast_sockaddr.

Since:
1.8

For parameter and return information, see the man page for recvfrom(2).

Definition at line 478 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by __rtp_recvfrom(), ast_udptl_read(), and sipsock_read().

00480 {
00481    src_addr->len = sizeof(src_addr->ss);
00482    return recvfrom(sockfd, buf, len, flags,
00483          (struct sockaddr *)&src_addr->ss, &src_addr->len);
00484 }

ssize_t ast_sendto ( int  sockfd,
const void *  buf,
size_t  len,
int  flags,
const struct ast_sockaddr dest_addr 
)

Wrapper around sendto(2) that uses ast_sockaddr.

Since:
1.8

For parameter and return information, see the man page for sendto(2)

Definition at line 486 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by __rtp_sendto(), __sip_xmit(), ast_udptl_write(), multicast_rtp_write(), and multicast_send_control_packet().

00488 {
00489    return sendto(sockfd, buf, len, flags,
00490             (const struct sockaddr *)&dest_addr->ss, dest_addr->len);
00491 }

int ast_set_qos ( int  sockfd,
int  tos,
int  cos,
const char *  desc 
)

Set type of service.

Since:
1.8

Set ToS ("Type of Service for IPv4 and "Traffic Class for IPv6) and CoS (Linux's SO_PRIORITY)

Parameters:
sockfd File descriptor for socket on which to set the parameters
tos The type of service for the socket
cos The cost of service for the socket
desc A text description of the socket in question.
Return values:
0 Success
-1 Error, with errno set to an appropriate value

Definition at line 493 of file netsock2.c.

References ast_getsockname(), ast_log(), ast_sockaddr_is_any(), ast_sockaddr_is_ipv6(), ast_verb, errno, and LOG_WARNING.

Referenced by ast_rtp_qos_set(), and reload_config().

00494 {
00495    int res = 0;
00496    int set_tos;
00497    int set_tclass;
00498    struct ast_sockaddr addr;
00499 
00500    /* If the sock address is IPv6, the TCLASS field must be set. */
00501    set_tclass = !ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr) ? 1 : 0;
00502 
00503    /* If the the sock address is IPv4 or (IPv6 set to any address [::]) set TOS bits */
00504    set_tos = (!set_tclass || (set_tclass && ast_sockaddr_is_any(&addr))) ? 1 : 0;
00505 
00506    if (set_tos) {
00507       if ((res = setsockopt(sockfd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)))) {
00508          ast_log(LOG_WARNING, "Unable to set %s DSCP TOS value to %d (may be you have no "
00509             "root privileges): %s\n", desc, tos, strerror(errno));
00510       } else if (tos) {
00511          ast_verb(2, "Using %s TOS bits %d\n", desc, tos);
00512       }
00513    }
00514 
00515 #if defined(IPV6_TCLASS) && defined(IPPROTO_IPV6)
00516    if (set_tclass) {
00517       if (!ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr)) {
00518          if ((res = setsockopt(sockfd, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof(tos)))) {
00519             ast_log(LOG_WARNING, "Unable to set %s DSCP TCLASS field to %d (may be you have no "
00520                "root privileges): %s\n", desc, tos, strerror(errno));
00521          } else if (tos) {
00522             ast_verb(2, "Using %s TOS bits %d in TCLASS field.\n", desc, tos);
00523          }
00524       }
00525    }
00526 #endif
00527 
00528 #ifdef linux
00529    if (setsockopt(sockfd, SOL_SOCKET, SO_PRIORITY, &cos, sizeof(cos))) {
00530       ast_log(LOG_WARNING, "Unable to set %s CoS to %d: %s\n", desc, cos,
00531          strerror(errno));
00532    } else if (cos) {
00533       ast_verb(2, "Using %s CoS mark %d\n", desc, cos);
00534    }
00535 #endif
00536 
00537    return res;
00538 }

int ast_sockaddr_cmp ( const struct ast_sockaddr a,
const struct ast_sockaddr b 
)

Compares two ast_sockaddr structures.

Since:
1.8
Return values:
-1 a is lexicographically smaller than b
0 a is equal to b
1 b is lexicographically smaller than a

Definition at line 300 of file netsock2.c.

References ast_sockaddr_ipv4_mapped(), ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by add_sdp(), ast_rtcp_read(), ast_rtp_instance_get_and_cmp_local_address(), ast_rtp_instance_get_and_cmp_remote_address(), ast_rtp_read(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_bridge(), ast_udptl_read(), dnsmgr_refresh(), parse_register_contact(), realtime_peer_by_name(), reload_config(), remote_bridge_loop(), rtcp_debug_test_addr(), rtp_debug_test_addr(), sip_debug_test_addr(), sip_uri_domain_cmp(), threadinfo_locate_cb(), transmit_register(), udptl_debug_test_addr(), and update_registry().

00301 {
00302    const struct ast_sockaddr *a_tmp, *b_tmp;
00303    struct ast_sockaddr ipv4_mapped;
00304 
00305    a_tmp = a;
00306    b_tmp = b;
00307 
00308    if (a_tmp->len != b_tmp->len) {
00309       if (ast_sockaddr_ipv4_mapped(a, &ipv4_mapped)) {
00310          a_tmp = &ipv4_mapped;
00311       } else if (ast_sockaddr_ipv4_mapped(b, &ipv4_mapped)) {
00312          b_tmp = &ipv4_mapped;
00313       }
00314    }
00315 
00316    if (a_tmp->len < b_tmp->len) {
00317       return -1;
00318    } else if (a_tmp->len > b_tmp->len) {
00319       return 1;
00320    }
00321 
00322    return memcmp(&a_tmp->ss, &b_tmp->ss, a_tmp->len);
00323 }

int ast_sockaddr_cmp_addr ( const struct ast_sockaddr a,
const struct ast_sockaddr b 
)

Compares the addresses of two ast_sockaddr structures.

Since:
1.8
Return values:
-1 a is lexicographically smaller than b
0 a is equal to b
1 b is lexicographically smaller than a

Definition at line 325 of file netsock2.c.

References ast_sockaddr_ipv4_mapped(), ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by addr_range_cmp_cb(), ast_apply_ha(), get_our_media_address(), peer_ipcmp_cb(), rtcp_debug_test_addr(), rtp_debug_test_addr(), sip_debug_test_addr(), and udptl_debug_test_addr().

00326 {
00327    const struct ast_sockaddr *a_tmp, *b_tmp;
00328    struct ast_sockaddr ipv4_mapped;
00329    const struct in_addr *ip4a, *ip4b;
00330    const struct in6_addr *ip6a, *ip6b;
00331    int ret = -1;
00332 
00333    a_tmp = a;
00334    b_tmp = b;
00335 
00336    if (a_tmp->len != b_tmp->len) {
00337       if (ast_sockaddr_ipv4_mapped(a, &ipv4_mapped)) {
00338          a_tmp = &ipv4_mapped;
00339       } else if (ast_sockaddr_ipv4_mapped(b, &ipv4_mapped)) {
00340          b_tmp = &ipv4_mapped;
00341       }
00342    }
00343 
00344    if (a->len < b->len) {
00345       ret = -1;
00346    } else if (a->len > b->len) {
00347       ret = 1;
00348    }
00349 
00350    switch (a_tmp->ss.ss_family) {
00351    case AF_INET:
00352       ip4a = &((const struct sockaddr_in*)&a_tmp->ss)->sin_addr;
00353       ip4b = &((const struct sockaddr_in*)&b_tmp->ss)->sin_addr;
00354       ret = memcmp(ip4a, ip4b, sizeof(*ip4a));
00355       break;
00356    case AF_INET6:
00357       ip6a = &((const struct sockaddr_in6*)&a_tmp->ss)->sin6_addr;
00358       ip6b = &((const struct sockaddr_in6*)&b_tmp->ss)->sin6_addr;
00359       ret = memcmp(ip6a, ip6b, sizeof(*ip6a));
00360       break;
00361    }
00362    return ret;
00363 }

static void ast_sockaddr_copy ( struct ast_sockaddr dst,
const struct ast_sockaddr src 
) [inline, static]
int ast_sockaddr_hash ( const struct ast_sockaddr addr  ) 

Computes a hash value from the address. The port is ignored.

Since:
1.8
Return values:
0 Unknown address family
other A 32-bit hash derived from the address

Definition at line 438 of file netsock2.c.

References ast_log(), LOG_ERROR, and ast_sockaddr::ss.

Referenced by peer_iphash_cb(), and threadt_hash_cb().

00439 {
00440    /*
00441     * For IPv4, return the IP address as-is. For IPv6, return the last 32
00442     * bits.
00443     */
00444    switch (addr->ss.ss_family) {
00445    case AF_INET:
00446       return ((const struct sockaddr_in *)&addr->ss)->sin_addr.s_addr;
00447    case AF_INET6:
00448       return ((uint32_t *)&((const struct sockaddr_in6 *)&addr->ss)->sin6_addr)[3];
00449    default:
00450       ast_log(LOG_ERROR, "Unknown address family '%d'.\n",
00451          addr->ss.ss_family);
00452       return 0;
00453    }
00454 }

uint32_t ast_sockaddr_ipv4 ( const struct ast_sockaddr addr  ) 

Get an IPv4 address of an ast_sockaddr.

Since:
1.8
Warning:
You should rarely need this function. Only use if you know what you're doing.
Returns:
IPv4 address in network byte order

Definition at line 394 of file netsock2.c.

References ast_sockaddr::ss.

Referenced by addr_is_multicast(), iax2_devicestate(), iax2_do_register(), iax2_poke_peer(), jingle_create_candidates(), load_module(), and multicast_send_control_packet().

00395 {
00396    const struct sockaddr_in *sin = (struct sockaddr_in *)&addr->ss;
00397    return ntohl(sin->sin_addr.s_addr);
00398 }

int ast_sockaddr_ipv4_mapped ( const struct ast_sockaddr addr,
struct ast_sockaddr ast_mapped 
)

Convert an IPv4-mapped IPv6 address into an IPv4 address.

Warning:
You should rarely need this function. Only call this if you know what you're doing.
Parameters:
addr The IPv4-mapped address to convert
mapped_addr The resulting IPv4 address
Return values:
0 Unable to make the conversion
1 Successful conversion

Definition at line 39 of file netsock2.c.

References ast_sockaddr_from_sin, ast_sockaddr_is_ipv4_mapped(), ast_sockaddr_is_ipv6(), and ast_sockaddr::ss.

Referenced by ast_append_ha(), ast_apply_ha(), ast_rtp_read(), ast_sockaddr_cmp(), ast_sockaddr_cmp_addr(), and ast_sockaddr_stringify_fmt().

00040 {
00041    const struct sockaddr_in6 *sin6;
00042    struct sockaddr_in sin4;
00043 
00044    if (!ast_sockaddr_is_ipv6(addr)) {
00045       return 0;
00046    }
00047 
00048    if (!ast_sockaddr_is_ipv4_mapped(addr)) {
00049       return 0;
00050    }
00051 
00052    sin6 = (const struct sockaddr_in6*)&addr->ss;
00053 
00054    memset(&sin4, 0, sizeof(sin4));
00055    sin4.sin_family = AF_INET;
00056    sin4.sin_port = sin6->sin6_port;
00057    sin4.sin_addr.s_addr = ((uint32_t *)&sin6->sin6_addr)[3];
00058 
00059    ast_sockaddr_from_sin(ast_mapped, &sin4);
00060 
00061    return 1;
00062 }

int ast_sockaddr_is_any ( const struct ast_sockaddr addr  ) 

Determine if the address type is unspecified, or "any" address.

Since:
1.8

For IPv4, this would be the address 0.0.0.0, and for IPv6, this would be the address ::. The port number is ignored.

Return values:
1 This is an "any" address
0 This is not an "any" address

Definition at line 424 of file netsock2.c.

References ast_sockaddr_is_ipv4(), ast_sockaddr_is_ipv6(), and ast_sockaddr::ss.

Referenced by ast_find_ourip(), ast_set_qos(), ast_sip_ouraddrfor(), get_address_family_filter(), get_our_media_address(), gtalk_get_local_ip(), reload_config(), sip_show_settings(), and sockaddr_is_null_or_any().

00425 {
00426    union {
00427       struct sockaddr_storage ss;
00428       struct sockaddr_in sin;
00429       struct sockaddr_in6 sin6;
00430    } tmp_addr = {
00431       .ss = addr->ss,
00432    };
00433 
00434    return (ast_sockaddr_is_ipv4(addr) && (tmp_addr.sin.sin_addr.s_addr == INADDR_ANY)) ||
00435        (ast_sockaddr_is_ipv6(addr) && IN6_IS_ADDR_UNSPECIFIED(&tmp_addr.sin6.sin6_addr));
00436 }

int ast_sockaddr_is_ipv4 ( const struct ast_sockaddr addr  ) 

Determine if the address is an IPv4 address.

Since:
1.8
Warning:
You should rarely need this function. Only use if you know what you're doing.
Return values:
1 This is an IPv4 address
0 This is an IPv6 or IPv4-mapped IPv6 address

Definition at line 400 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by apply_netmask(), ast_append_ha(), ast_apply_ha(), ast_rtp_new(), ast_rtp_prop_set(), ast_rtp_read(), and ast_sockaddr_is_any().

00401 {
00402    return addr->ss.ss_family == AF_INET &&
00403        addr->len == sizeof(struct sockaddr_in);
00404 }

int ast_sockaddr_is_ipv4_mapped ( const struct ast_sockaddr addr  ) 

Determine if this is an IPv4-mapped IPv6 address.

Since:
1.8
Warning:
You should rarely need this function. Only use if you know what you're doing.
Return values:
1 This is an IPv4-mapped IPv6 address.
0 This is not an IPv4-mapped IPv6 address.

Definition at line 406 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by add_sdp(), ast_apply_ha(), ast_rtp_instance_bridge(), and ast_sockaddr_ipv4_mapped().

00407 {
00408    const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr->ss;
00409    return addr->len && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr);
00410 }

int ast_sockaddr_is_ipv6 ( const struct ast_sockaddr addr  ) 

Determine if this is an IPv6 address.

Since:
1.8
Warning:
You should rarely need this function. Only use if you know what you're doing.
Return values:
1 This is an IPv6 or IPv4-mapped IPv6 address.
0 This is an IPv4 address.

Definition at line 418 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by add_sdp(), apply_netmask(), ast_apply_ha(), ast_ouraddrfor(), ast_rtp_new(), ast_rtp_prop_set(), ast_set_qos(), ast_sip_ouraddrfor(), ast_sockaddr_ipv4_mapped(), ast_sockaddr_is_any(), ast_sockaddr_is_ipv6_link_local(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_new_with_bindaddr(), get_address_family_filter(), multicast_send_control_packet(), reload_config(), and sip_show_settings().

00419 {
00420    return addr->ss.ss_family == AF_INET6 &&
00421        addr->len == sizeof(struct sockaddr_in6);
00422 }

int ast_sockaddr_is_ipv6_link_local ( const struct ast_sockaddr addr  ) 

Determine if this is a link-local IPv6 address.

Since:
1.8
Warning:
You should rarely need this function. Only use if you know what you're doing.
Return values:
1 This is a link-local IPv6 address.
0 This is link-local IPv6 address.

Definition at line 412 of file netsock2.c.

References ast_sockaddr_is_ipv6(), and ast_sockaddr::ss.

Referenced by ast_sockaddr_stringify_fmt().

00413 {
00414    const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr->ss;
00415    return ast_sockaddr_is_ipv6(addr) && IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr);
00416 }

static int ast_sockaddr_isnull ( const struct ast_sockaddr addr  )  [inline, static]

Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized, or having a 0 length.

Since:
1.8
Parameters:
addr Pointer to the ast_sockaddr we wish to check
Return values:
1 addr is null
0 addr is non-null.

Definition at line 93 of file netsock2.h.

References ast_sockaddr::len.

Referenced by _ast_sockaddr_to_sin(), _sip_show_peers_one(), add_sdp(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_rtp_sendcng(), ast_rtp_write(), ast_sip_ouraddrfor(), ast_sockaddr_stringify_fmt(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_read(), ast_udptl_write(), bridge_p2p_rtp_write(), build_peer(), check_rtp_timeout(), create_addr_from_peer(), expire_register(), get_our_media_address(), handle_response_invite(), multicast_send_control_packet(), on_dns_update_mwi(), on_dns_update_peer(), on_dns_update_registry(), parse_register_contact(), peer_iphash_cb(), process_sdp(), realtime_peer(), realtime_update_peer(), register_verify(), reload_config(), remote_bridge_loop(), rtcp_debug_test_addr(), rtp_debug_test_addr(), sip_acf_channel_read(), sip_debug_test_addr(), sip_devicestate(), sip_do_debug_peer(), sip_poke_peer(), sip_prune_realtime(), sip_send_mwi_to_peer(), sip_set_rtp_peer(), sip_show_channel(), sip_show_settings(), sockaddr_is_null_or_any(), transmit_register(), and udptl_debug_test_addr().

00094 {
00095    return !addr || addr->len == 0;
00096 }

int ast_sockaddr_parse ( struct ast_sockaddr addr,
const char *  str,
int  flags 
)

Parse an IPv4 or IPv6 address string.

Since:
1.8

Parses a string containing an IPv4 or IPv6 address followed by an optional port (separated by a colon) into a struct ast_sockaddr. The allowed formats are the following:

a.b.c.d a.b.c.d:port a:b:c:...:d [a:b:c:...:d] [a:b:c:...:d]:port

Host names are NOT allowed.

Parameters:
[out] addr The resulting ast_sockaddr. This MAY be NULL from functions that are performing validity checks only, e.g. ast_parse_arg().
str The string to parse
flags If set to zero, a port MAY be present. If set to PARSE_PORT_IGNORE, a port MAY be present but will be ignored. If set to PARSE_PORT_REQUIRE, a port MUST be present. If set to PARSE_PORT_FORBID, a port MUST NOT be present.
Return values:
1 Success
0 Failure

Definition at line 198 of file netsock2.c.

References ast_log(), ast_sockaddr_split_hostport(), ast_strdupa, ast_sockaddr::len, LOG_ERROR, LOG_WARNING, S_OR, and ast_sockaddr::ss.

Referenced by ast_append_ha(), ast_parse_arg(), build_peer(), internal_dnsmgr_lookup(), multicast_rtp_request(), proxy_update(), realtime_peer(), reg_source_db(), reload_config(), rtcp_do_debug_ip(), rtp_do_debug_ip(), sip_sanitized_host(), and sip_uri_domain_cmp().

00199 {
00200    struct addrinfo hints;
00201    struct addrinfo   *res;
00202    char *s;
00203    char *host;
00204    char *port;
00205    int   e;
00206 
00207    s = ast_strdupa(str);
00208    if (!ast_sockaddr_split_hostport(s, &host, &port, flags)) {
00209       return 0;
00210    }
00211 
00212    memset(&hints, 0, sizeof(hints));
00213    /* Hint to get only one entry from getaddrinfo */
00214    hints.ai_socktype = SOCK_DGRAM;
00215 
00216 #ifdef AI_NUMERICSERV
00217    hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
00218 #else
00219    hints.ai_flags = AI_NUMERICHOST;
00220 #endif
00221    if ((e = getaddrinfo(host, port, &hints, &res))) {
00222       if (e != EAI_NONAME) { /* if this was just a host name rather than a ip address, don't print error */
00223          ast_log(LOG_ERROR, "getaddrinfo(\"%s\", \"%s\", ...): %s\n",
00224             host, S_OR(port, "(null)"), gai_strerror(e));
00225       }
00226       return 0;
00227    }
00228 
00229    /*
00230     * I don't see how this could be possible since we're not resolving host
00231     * names. But let's be careful...
00232     */
00233    if (res->ai_next != NULL) {
00234       ast_log(LOG_WARNING, "getaddrinfo() returned multiple "
00235          "addresses. Ignoring all but the first.\n");
00236    }
00237 
00238    if (addr) {
00239       addr->len = res->ai_addrlen;
00240       memcpy(&addr->ss, res->ai_addr, addr->len);
00241    }
00242 
00243    freeaddrinfo(res);
00244 
00245    return 1;
00246 }

int ast_sockaddr_resolve ( struct ast_sockaddr **  addrs,
const char *  str,
int  flags,
int  family 
)

Parses a string with an IPv4 or IPv6 address and place results into an array.

Since:
1.8

Parses a string containing a host name or an IPv4 or IPv6 address followed by an optional port (separated by a colon). The result is returned into a array of struct ast_sockaddr. Allowed formats for str are the following:

hostname:port host.example.com:port a.b.c.d a.b.c.d:port a:b:c:...:d [a:b:c:...:d] [a:b:c:...:d]:port

Parameters:
[out] addrs The resulting array of ast_sockaddrs
str The string to parse
flags If set to zero, a port MAY be present. If set to PARSE_PORT_IGNORE, a port MAY be present but will be ignored. If set to PARSE_PORT_REQUIRE, a port MUST be present. If set to PARSE_PORT_FORBID, a port MUST NOT be present.
family Only addresses of the given family will be returned. Use 0 or AST_SOCKADDR_UNSPEC to get addresses of all families.
Return values:
0 Failure
non-zero The number of elements in addrs array.

Definition at line 248 of file netsock2.c.

References ast_log(), ast_malloc, ast_sockaddr_split_hostport(), ast_strdupa, cleanup(), LOG_ERROR, and S_OR.

Referenced by ast_sockaddr_resolve_first_af(), gtalk_get_local_ip(), handle_cli_udptl_set_debug(), realtime_peer_by_name(), and resolve_first().

00250 {
00251    struct addrinfo hints, *res, *ai;
00252    char *s, *host, *port;
00253    int   e, i, res_cnt;
00254 
00255    if (!str) {
00256       return 0;
00257    }
00258 
00259    s = ast_strdupa(str);
00260    if (!ast_sockaddr_split_hostport(s, &host, &port, flags)) {
00261       return 0;
00262    }
00263 
00264    memset(&hints, 0, sizeof(hints));
00265    hints.ai_family = family;
00266    hints.ai_socktype = SOCK_DGRAM;
00267 
00268    if ((e = getaddrinfo(host, port, &hints, &res))) {
00269       ast_log(LOG_ERROR, "getaddrinfo(\"%s\", \"%s\", ...): %s\n",
00270          host, S_OR(port, "(null)"), gai_strerror(e));
00271       return 0;
00272    }
00273 
00274    res_cnt = 0;
00275    for (ai = res; ai; ai = ai->ai_next) {
00276       res_cnt++;
00277    }
00278 
00279    if (res_cnt == 0) {
00280       goto cleanup;
00281    }
00282 
00283    if ((*addrs = ast_malloc(res_cnt * sizeof(struct ast_sockaddr))) == NULL) {
00284       res_cnt = 0;
00285       goto cleanup;
00286    }
00287 
00288    i = 0;
00289    for (ai = res; ai; ai = ai->ai_next) {
00290       (*addrs)[i].len = ai->ai_addrlen;
00291       memcpy(&(*addrs)[i].ss, ai->ai_addr, ai->ai_addrlen);
00292       ++i;
00293    }
00294 
00295 cleanup:
00296    freeaddrinfo(res);
00297    return res_cnt;
00298 }

static void ast_sockaddr_setnull ( struct ast_sockaddr addr  )  [inline, static]

Sets address addr to null.

Since:
1.8
Return values:
void 

Definition at line 106 of file netsock2.h.

References ast_sockaddr::len.

Referenced by __ast_http_load(), ast_rtp_stop(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_stop(), build_peer(), get_local_address(), manager_set_defaults(), multicast_rtp_request(), reload_config(), and set_peer_defaults().

00107 {
00108    addr->len = 0;
00109 }

int ast_sockaddr_split_hostport ( char *  str,
char **  host,
char **  port,
int  flags 
)

Splits a string into its host and port components.

Since:
1.8
Parameters:
str[in] The string to parse. May be modified by writing a NUL at the end of the host part.
host[out] Pointer to the host component within str.
port[out] Pointer to the port component within str.
flags If set to zero, a port MAY be present. If set to PARSE_PORT_IGNORE, a port MAY be present but will be ignored. If set to PARSE_PORT_REQUIRE, a port MUST be present. If set to PARSE_PORT_FORBID, a port MUST NOT be present.
Return values:
1 Success
0 Failure

Definition at line 132 of file netsock2.c.

References ast_debug, ast_log(), LOG_WARNING, PARSE_PORT_FORBID, PARSE_PORT_IGNORE, PARSE_PORT_MASK, and PARSE_PORT_REQUIRE.

Referenced by ast_sockaddr_parse(), ast_sockaddr_resolve(), extract_host_from_hostport(), rtcp_do_debug_ip(), rtp_do_debug_ip(), setup_stunaddr(), and sip_parse_host().

00133 {
00134    char *s = str;
00135    char *orig_str = str;/* Original string in case the port presence is incorrect. */
00136    char *host_end = NULL;/* Delay terminating the host in case the port presence is incorrect. */
00137 
00138    ast_debug(5, "Splitting '%s' into...\n", str);
00139    *host = NULL;
00140    *port = NULL;
00141    if (*s == '[') {
00142       *host = ++s;
00143       for (; *s && *s != ']'; ++s) {
00144       }
00145       if (*s == ']') {
00146          host_end = s;
00147          ++s;
00148       }
00149       if (*s == ':') {
00150          *port = s + 1;
00151       }
00152    } else {
00153       *host = s;
00154       for (; *s; ++s) {
00155          if (*s == ':') {
00156             if (*port) {
00157                *port = NULL;
00158                break;
00159             } else {
00160                *port = s;
00161             }
00162          }
00163       }
00164       if (*port) {
00165          host_end = *port;
00166          ++*port;
00167       }
00168    }
00169 
00170    switch (flags & PARSE_PORT_MASK) {
00171    case PARSE_PORT_IGNORE:
00172       *port = NULL;
00173       break;
00174    case PARSE_PORT_REQUIRE:
00175       if (*port == NULL) {
00176          ast_log(LOG_WARNING, "Port missing in %s\n", orig_str);
00177          return 0;
00178       }
00179       break;
00180    case PARSE_PORT_FORBID:
00181       if (*port != NULL) {
00182          ast_log(LOG_WARNING, "Port disallowed in %s\n", orig_str);
00183          return 0;
00184       }
00185       break;
00186    }
00187 
00188    /* Can terminate the host string now if needed. */
00189    if (host_end) {
00190       *host_end = '\0';
00191    }
00192    ast_debug(5, "...host '%s' and port '%s'.\n", *host, *port ? *port : "");
00193    return 1;
00194 }

static char* ast_sockaddr_stringify ( const struct ast_sockaddr addr  )  [inline, static]

Wrapper around ast_sockaddr_stringify_fmt() with default format.

Since:
1.8
Returns:
same as ast_sockaddr_stringify_fmt()

Definition at line 210 of file netsock2.h.

References AST_SOCKADDR_STR_DEFAULT, and ast_sockaddr_stringify_fmt().

Referenced by __sip_xmit(), _sip_show_peer(), add_sdp(), apply_directmedia_ha(), ast_append_ha(), ast_apply_ha(), ast_parse_arg(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_sendcng(), ast_sip_ouraddrfor(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_server_start(), ast_udptl_bridge(), ast_udptl_read(), ast_udptl_write(), bridge_p2p_rtp_write(), check_peer_ok(), check_via(), create_dtmf_frame(), dnsmgr_refresh(), gtalk_update_externip(), handle_cli_iax2_show_registry(), handle_cli_udptl_set_debug(), handle_incoming(), handle_manager_show_settings(), handle_request_bye(), handle_request_do(), handle_request_invite(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_info(), handle_response_message(), handle_response_notify(), handle_response_refer(), manager_iax2_show_registry(), multicast_rtp_write(), on_dns_update_mwi(), on_dns_update_peer(), on_dns_update_registry(), parse_register_contact(), process_cn_rfc3389(), process_dtmf_rfc2833(), process_sdp(), reg_source_db(), register_verify(), reload_config(), remote_bridge_loop(), retrans_pkt(), rtcp_do_debug_ip(), rtp_do_debug_ip(), send_request(), send_response(), set_destination(), sip_acf_channel_read(), sip_set_rtp_peer(), sip_set_udptl_peer(), sip_show_channel(), sip_show_settings(), sip_show_tcp(), sip_tcptls_read(), and stun_monitor_request().

00211 {
00212    return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_DEFAULT);
00213 }

static char* ast_sockaddr_stringify_addr ( const struct ast_sockaddr addr  )  [inline, static]
static char* ast_sockaddr_stringify_addr_remote ( const struct ast_sockaddr addr  )  [inline, static]

Wrapper around ast_sockaddr_stringify_fmt() to return an address only.

Since:
1.8
Note:
This address will be suitable for passing to a remote machine via the application layer. For example, the scope-id on a link-local IPv6 address will be stripped.
Returns:
same as ast_sockaddr_stringify_fmt()

Definition at line 257 of file netsock2.h.

References AST_SOCKADDR_STR_ADDR_REMOTE, and ast_sockaddr_stringify_fmt().

Referenced by add_sdp(), and copy_via_headers().

00258 {
00259    return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_ADDR_REMOTE);
00260 }

char* ast_sockaddr_stringify_fmt ( const struct ast_sockaddr addr,
int  format 
)

Convert a socket address to a string.

Since:
1.8

This will be of the form a.b.c.d:xyz for IPv4 and [a:b:c:...:d]:xyz for IPv6.

This function is thread-safe. The returned string is on static thread-specific storage.

Parameters:
addr The input to be stringified
format one of the following: AST_SOCKADDR_STR_DEFAULT: a.b.c.d:xyz for IPv4 [a:b:c:...:d]:xyz for IPv6. AST_SOCKADDR_STR_ADDR: address only a.b.c.d for IPv4 a:b:c:...:d for IPv6. AST_SOCKADDR_STR_HOST: address only, suitable for a URL a.b.c.d for IPv4 [a:b:c:...:d] for IPv6. AST_SOCKADDR_STR_PORT: port only
Note:
The string pointer returned by this function will point to a string that will be changed whenever any form of ast_sockaddr_stringify_fmt is called on that thread. Because of this, it is important that if you use this function, you use the string before another use of this function is made elsewhere in the same thread. The easiest way to accomplish this is by immediately copying the string to a buffer with something like ast_strdupa.
Return values:
(null) addr is null
"" An error occurred during processing
string The stringified form of the address

Definition at line 67 of file netsock2.c.

References ast_log(), ast_sockaddr_ipv4_mapped(), ast_sockaddr_is_ipv6_link_local(), ast_sockaddr_isnull(), AST_SOCKADDR_STR_ADDR, AST_SOCKADDR_STR_DEFAULT, AST_SOCKADDR_STR_FORMAT_MASK, AST_SOCKADDR_STR_HOST, AST_SOCKADDR_STR_PORT, AST_SOCKADDR_STR_REMOTE, ast_sockaddr_stringify_buf, ast_str_buffer(), ast_str_set(), ast_str_thread_get(), ast_sockaddr::len, LOG_ERROR, ast_sockaddr::ss, and str.

Referenced by ast_sockaddr_stringify(), ast_sockaddr_stringify_addr(), ast_sockaddr_stringify_addr_remote(), ast_sockaddr_stringify_host(), ast_sockaddr_stringify_host_remote(), ast_sockaddr_stringify_port(), and ast_sockaddr_stringify_remote().

00068 {
00069    struct ast_sockaddr sa_ipv4;
00070    const struct ast_sockaddr *sa_tmp;
00071    char host[NI_MAXHOST];
00072    char port[NI_MAXSERV];
00073    struct ast_str *str;
00074    int e;
00075    static const size_t size = sizeof(host) - 1 + sizeof(port) - 1 + 4;
00076 
00077 
00078    if (ast_sockaddr_isnull(sa)) {
00079       return "(null)";
00080    }
00081 
00082    if (!(str = ast_str_thread_get(&ast_sockaddr_stringify_buf, size))) {
00083       return "";
00084    }
00085 
00086    if (ast_sockaddr_ipv4_mapped(sa, &sa_ipv4)) {
00087       sa_tmp = &sa_ipv4;
00088    } else {
00089       sa_tmp = sa;
00090    }
00091 
00092    if ((e = getnameinfo((struct sockaddr *)&sa_tmp->ss, sa_tmp->len,
00093               format & AST_SOCKADDR_STR_ADDR ? host : NULL,
00094               format & AST_SOCKADDR_STR_ADDR ? sizeof(host) : 0,
00095               format & AST_SOCKADDR_STR_PORT ? port : 0,
00096               format & AST_SOCKADDR_STR_PORT ? sizeof(port): 0,
00097               NI_NUMERICHOST | NI_NUMERICSERV))) {
00098       ast_log(LOG_ERROR, "getnameinfo(): %s\n", gai_strerror(e));
00099       return "";
00100    }
00101 
00102    if ((format & AST_SOCKADDR_STR_REMOTE) == AST_SOCKADDR_STR_REMOTE) {
00103       char *p;
00104       if (ast_sockaddr_is_ipv6_link_local(sa) && (p = strchr(host, '%'))) {
00105          *p = '\0';
00106       }
00107    }
00108 
00109    switch ((format & AST_SOCKADDR_STR_FORMAT_MASK))  {
00110    case AST_SOCKADDR_STR_DEFAULT:
00111       ast_str_set(&str, 0, sa_tmp->ss.ss_family == AF_INET6 ?
00112             "[%s]:%s" : "%s:%s", host, port);
00113       break;
00114    case AST_SOCKADDR_STR_ADDR:
00115       ast_str_set(&str, 0, "%s", host);
00116       break;
00117    case AST_SOCKADDR_STR_HOST:
00118       ast_str_set(&str, 0,
00119              sa_tmp->ss.ss_family == AF_INET6 ? "[%s]" : "%s", host);
00120       break;
00121    case AST_SOCKADDR_STR_PORT:
00122       ast_str_set(&str, 0, "%s", port);
00123       break;
00124    default:
00125       ast_log(LOG_ERROR, "Invalid format\n");
00126       return "";
00127    }
00128 
00129    return ast_str_buffer(str);
00130 }

static char* ast_sockaddr_stringify_host ( const struct ast_sockaddr addr  )  [inline, static]

Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brackets for IPv6).

Since:
1.8
Returns:
same as ast_sockaddr_stringify_fmt()

Definition at line 271 of file netsock2.h.

References AST_SOCKADDR_STR_HOST, and ast_sockaddr_stringify_fmt().

Referenced by peers_data_provider_get(), and reg_source_db().

00272 {
00273    return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_HOST);
00274 }

static char* ast_sockaddr_stringify_host_remote ( const struct ast_sockaddr addr  )  [inline, static]

Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brackets for IPv6).

Since:
1.8
Note:
This address will be suitable for passing to a remote machine via the application layer. For example, the scope-id on a link-local IPv6 address will be stripped.
Returns:
same as ast_sockaddr_stringify_fmt()

Definition at line 289 of file netsock2.h.

References AST_SOCKADDR_STR_HOST_REMOTE, and ast_sockaddr_stringify_fmt().

Referenced by add_diversion_header(), add_rpid(), build_callid_registry(), build_reply_digest(), create_addr_from_peer(), initreqprep(), sip_poke_peer(), sip_sanitized_host(), and transmit_notify_with_mwi().

00290 {
00291    return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_HOST_REMOTE);
00292 }

static char* ast_sockaddr_stringify_port ( const struct ast_sockaddr addr  )  [inline, static]
static char* ast_sockaddr_stringify_remote ( const struct ast_sockaddr addr  )  [inline, static]

Wrapper around ast_sockaddr_stringify_fmt() with default format.

Since:
1.8
Note:
This address will be suitable for passing to a remote machine via the application layer. For example, the scope-id on a link-local IPv6 address will be stripped.
Returns:
same as ast_sockaddr_stringify_fmt()

Definition at line 227 of file netsock2.h.

References AST_SOCKADDR_STR_DEFAULT_REMOTE, and ast_sockaddr_stringify_fmt().

Referenced by build_callid_pvt(), build_contact(), build_via(), and generate_uri().

00228 {
00229    return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_DEFAULT_REMOTE);
00230 }


Generated on 27 Jan 2016 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1