Sat Apr 26 2014 22:02:57

Asterisk developer's documentation


netsock2.h File Reference

Network socket handling. More...

#include <sys/socket.h>
#include <netinet/in.h>
Include dependency graph for netsock2.h:
This graph shows which files directly or indirectly include this file:

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_ipv4_multicast (const struct ast_sockaddr *addr)
 Determine if an IPv4 address is a multicast 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_to_sin(addr, sin)   _ast_sockaddr_to_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 Converts a struct ast_sockaddr to a struct sockaddr_in.
#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.
int _ast_sockaddr_to_sin (const struct ast_sockaddr *addr, struct sockaddr_in *sin, const char *file, int line, const char *func)
void _ast_sockaddr_from_sin (struct ast_sockaddr *addr, const 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_set_port (   addr,
  port 
)    _ast_sockaddr_set_port(addr,port,__FILE__,__LINE__,__PRETTY_FUNCTION__)
#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_BRACKETS   (1 << 2)

Definition at line 154 of file netsock2.h.

#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.

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

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 566 of file netsock2.c.

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

{
   memcpy(&addr->ss, sin, sizeof(*sin));

   if (addr->ss.ss_family != AF_INET && option_debug >= 1) {
      ast_log(__LOG_DEBUG, file, line, func, "Address family is not AF_INET\n");
   }

   addr->len = sizeof(*sin);
}
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.

{
   if (addr->ss.ss_family == AF_INET &&
       addr->len == sizeof(struct sockaddr_in)) {
      return ntohs(((struct sockaddr_in *)&addr->ss)->sin_port);
   } else if (addr->ss.ss_family == AF_INET6 &&
       addr->len == sizeof(struct sockaddr_in6)) {
      return ntohs(((struct sockaddr_in6 *)&addr->ss)->sin6_port);
   }
   if (option_debug >= 1) {
      ast_log(__LOG_DEBUG, file, line, func, "Not an IPv4 nor IPv6 address, cannot get port.\n");
   }
   return 0;
}
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.

{
   if (addr->ss.ss_family == AF_INET &&
       addr->len == sizeof(struct sockaddr_in)) {
      ((struct sockaddr_in *)&addr->ss)->sin_port = htons(port);
   } else if (addr->ss.ss_family == AF_INET6 &&
       addr->len == sizeof(struct sockaddr_in6)) {
      ((struct sockaddr_in6 *)&addr->ss)->sin6_port = htons(port);
   } else if (option_debug >= 1) {
      ast_log(__LOG_DEBUG, file, line, func,
         "Not an IPv4 nor IPv6 address, cannot set port.\n");
   }
}
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 545 of file netsock2.c.

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

{
   if (ast_sockaddr_isnull(addr)) {
      memset(sin, 0, sizeof(*sin));
      return 1;
   }

   if (addr->len != sizeof(*sin)) {
      ast_log(__LOG_ERROR, file, line, func, "Bad address cast to IPv4\n");
      return 0;
   }

   if (addr->ss.ss_family != AF_INET && option_debug >= 1) {
      ast_log(__LOG_DEBUG, file, line, func, "Address family is not AF_INET\n");
   }

   *sin = *(struct sockaddr_in *)&addr->ss;
   return 1;
}
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 461 of file netsock2.c.

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

Referenced by ast_tcptls_server_root().

{
   addr->len = sizeof(addr->ss);
   return accept(sockfd, (struct sockaddr *)&addr->ss, &addr->len);
}
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 467 of file netsock2.c.

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

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

{
   return bind(sockfd, (const struct sockaddr *)&addr->ss, addr->len);
}
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 472 of file netsock2.c.

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

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

{
   return connect(sockfd, (const struct sockaddr *)&addr->ss, addr->len);
}
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 477 of file netsock2.c.

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

Referenced by ast_ouraddrfor(), and ast_set_qos().

{
   addr->len = sizeof(addr->ss);
   return getsockname(sockfd, (struct sockaddr *)&addr->ss, &addr->len);
}
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 483 of file netsock2.c.

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

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

{
   src_addr->len = sizeof(src_addr->ss);
   return recvfrom(sockfd, buf, len, flags,
         (struct sockaddr *)&src_addr->ss, &src_addr->len);
}
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 491 of file netsock2.c.

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

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

{
   return sendto(sockfd, buf, len, flags,
            (const struct sockaddr *)&dest_addr->ss, dest_addr->len);
}
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:
sockfdFile descriptor for socket on which to set the parameters
tosThe type of service for the socket
cosThe cost of service for the socket
descA text description of the socket in question.
Return values:
0Success
-1Error, with errno set to an appropriate value

Definition at line 498 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_netsock_bindaddr(), ast_netsock_set_qos(), ast_rtp_qos_set(), ast_udptl_setqos(), config_load(), load_module(), and reload_config().

{
   int res = 0;
   int set_tos;
   int set_tclass;
   struct ast_sockaddr addr;

   /* If the sock address is IPv6, the TCLASS field must be set. */
   set_tclass = !ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr) ? 1 : 0;

   /* If the the sock address is IPv4 or (IPv6 set to any address [::]) set TOS bits */
   set_tos = (!set_tclass || (set_tclass && ast_sockaddr_is_any(&addr))) ? 1 : 0;

   if (set_tos) {
      if ((res = setsockopt(sockfd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)))) {
         ast_log(LOG_WARNING, "Unable to set %s DSCP TOS value to %d (may be you have no "
            "root privileges): %s\n", desc, tos, strerror(errno));
      } else if (tos) {
         ast_verb(2, "Using %s TOS bits %d\n", desc, tos);
      }
   }

#if defined(IPV6_TCLASS) && defined(IPPROTO_IPV6)
   if (set_tclass) {
      if (!ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr)) {
         if ((res = setsockopt(sockfd, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof(tos)))) {
            ast_log(LOG_WARNING, "Unable to set %s DSCP TCLASS field to %d (may be you have no "
               "root privileges): %s\n", desc, tos, strerror(errno));
         } else if (tos) {
            ast_verb(2, "Using %s TOS bits %d in TCLASS field.\n", desc, tos);
         }
      }
   }
#endif

#ifdef linux
   if (setsockopt(sockfd, SOL_SOCKET, SO_PRIORITY, &cos, sizeof(cos))) {
      ast_log(LOG_WARNING, "Unable to set %s CoS to %d: %s\n", desc, cos,
         strerror(errno));
   } else if (cos) {
      ast_verb(2, "Using %s CoS mark %d\n", desc, cos);
   }
#endif

   return res;
}
int ast_sockaddr_cmp ( const struct ast_sockaddr a,
const struct ast_sockaddr b 
)

Compares two ast_sockaddr structures.

Since:
1.8
Return values:
-1a is lexicographically smaller than b
0a is equal to b
1b 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_netsock_find(), 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().

{
   const struct ast_sockaddr *a_tmp, *b_tmp;
   struct ast_sockaddr ipv4_mapped;

   a_tmp = a;
   b_tmp = b;

   if (a_tmp->len != b_tmp->len) {
      if (ast_sockaddr_ipv4_mapped(a, &ipv4_mapped)) {
         a_tmp = &ipv4_mapped;
      } else if (ast_sockaddr_ipv4_mapped(b, &ipv4_mapped)) {
         b_tmp = &ipv4_mapped;
      }
   }

   if (a_tmp->len < b_tmp->len) {
      return -1;
   } else if (a_tmp->len > b_tmp->len) {
      return 1;
   }

   return memcmp(&a_tmp->ss, &b_tmp->ss, a_tmp->len);
}
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:
-1a is lexicographically smaller than b
0a is equal to b
1b 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(), check_for_nat(), get_our_media_address(), peer_ipcmp_cb_full(), rtcp_debug_test_addr(), rtp_debug_test_addr(), sip_debug_test_addr(), and udptl_debug_test_addr().

{
   const struct ast_sockaddr *a_tmp, *b_tmp;
   struct ast_sockaddr ipv4_mapped;
   const struct in_addr *ip4a, *ip4b;
   const struct in6_addr *ip6a, *ip6b;
   int ret = -1;

   a_tmp = a;
   b_tmp = b;

   if (a_tmp->len != b_tmp->len) {
      if (ast_sockaddr_ipv4_mapped(a, &ipv4_mapped)) {
         a_tmp = &ipv4_mapped;
      } else if (ast_sockaddr_ipv4_mapped(b, &ipv4_mapped)) {
         b_tmp = &ipv4_mapped;
      }
   }

   if (a->len < b->len) {
      ret = -1;
   } else if (a->len > b->len) {
      ret = 1;
   }

   switch (a_tmp->ss.ss_family) {
   case AF_INET:
      ip4a = &((const struct sockaddr_in*)&a_tmp->ss)->sin_addr;
      ip4b = &((const struct sockaddr_in*)&b_tmp->ss)->sin_addr;
      ret = memcmp(ip4a, ip4b, sizeof(*ip4a));
      break;
   case AF_INET6:
      ip6a = &((const struct sockaddr_in6*)&a_tmp->ss)->sin6_addr;
      ip6b = &((const struct sockaddr_in6*)&b_tmp->ss)->sin6_addr;
      ret = memcmp(ip6a, ip6b, sizeof(*ip6a));
      break;
   }
   return ret;
}
static void ast_sockaddr_copy ( struct ast_sockaddr dst,
const struct ast_sockaddr src 
) [inline, static]

Copies the data from one ast_sockaddr to another.

Since:
1.8
Parameters:
dstThe destination ast_sockaddr
srcThe source ast_sockaddr
Return values:
void

Definition at line 121 of file netsock2.h.

References ast_sockaddr::len.

Referenced by __ast_http_load(), __init_manager(), add_sdp(), app_exec(), ast_copy_ha(), ast_find_ourip(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_alt_remote_address_set(), ast_rtp_instance_get_and_cmp_local_address(), ast_rtp_instance_get_and_cmp_remote_address(), ast_rtp_instance_get_local_address(), ast_rtp_instance_get_remote_address(), ast_rtp_instance_new(), ast_rtp_instance_set_alt_remote_address(), ast_rtp_instance_set_local_address(), ast_rtp_instance_set_remote_address(), ast_rtp_new(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_sip_ouraddrfor(), ast_sockaddr_resolve_first_af(), ast_tcptls_client_create(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_udptl_bridge(), ast_udptl_get_peer(), ast_udptl_get_us(), ast_udptl_new_with_bindaddr(), ast_udptl_read(), ast_udptl_set_peer(), auth_manager_http_callback(), auth_mxml_http_callback(), auth_rawman_http_callback(), build_mansession(), check_peer_ok(), create_addr(), dialog_initialize_rtp(), dnsmgr_refresh(), get_our_media_address(), gtalk_get_local_ip(), handle_cli_udptl_set_debug(), handle_request_do(), manager_http_callback(), mxml_http_callback(), on_dns_update_mwi(), on_dns_update_peer(), on_dns_update_registry(), parse_register_contact(), rawman_http_callback(), reg_source_db(), reload_config(), remote_bridge_loop(), resolve_first(), session_do(), sip_alloc(), sip_do_debug_peer(), sip_find_peer_full(), sip_prepare_socket(), transmit_response_using_temp(), and websocket_callback().

{
   memcpy(dst, src, src->len);
   dst->len = src->len;
};
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:
0Unknown address family
otherA 32-bit hash derived from the address

Definition at line 443 of file netsock2.c.

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

Referenced by peer_iphash_cb(), and threadt_hash_cb().

{
   /*
    * For IPv4, return the IP address as-is. For IPv6, return the last 32
    * bits.
    */
   switch (addr->ss.ss_family) {
   case AF_INET:
      return ((const struct sockaddr_in *)&addr->ss)->sin_addr.s_addr;
   case AF_INET6:
      return ((uint32_t *)&((const struct sockaddr_in6 *)&addr->ss)->sin6_addr)[3];
   default:
      ast_log(LOG_ERROR, "Unknown address family '%d'.\n",
         addr->ss.ss_family);
      return 0;
   }
}
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 ast_sockaddr_is_ipv4_multicast(), iax2_devicestate(), iax2_do_register(), iax2_poke_peer(), jingle_create_candidates(), load_module(), and multicast_send_control_packet().

{
   const struct sockaddr_in *sin = (struct sockaddr_in *)&addr->ss;
   return ntohl(sin->sin_addr.s_addr);
}
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:
addrThe IPv4-mapped address to convert
mapped_addrThe resulting IPv4 address
Return values:
0Unable to make the conversion
1Successful 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_rtcp_read(), ast_rtp_read(), ast_sockaddr_cmp(), ast_sockaddr_cmp_addr(), and ast_sockaddr_stringify_fmt().

{
   const struct sockaddr_in6 *sin6;
   struct sockaddr_in sin4;

   if (!ast_sockaddr_is_ipv6(addr)) {
      return 0;
   }

   if (!ast_sockaddr_is_ipv4_mapped(addr)) {
      return 0;
   }

   sin6 = (const struct sockaddr_in6*)&addr->ss;

   memset(&sin4, 0, sizeof(sin4));
   sin4.sin_family = AF_INET;
   sin4.sin_port = sin6->sin6_port;
   sin4.sin_addr.s_addr = ((uint32_t *)&sin6->sin6_addr)[3];

   ast_sockaddr_from_sin(ast_mapped, &sin4);

   return 1;
}
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:
1This is an "any" address
0This is not an "any" address

Definition at line 429 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().

{
   union {
      struct sockaddr_storage ss;
      struct sockaddr_in sin;
      struct sockaddr_in6 sin6;
   } tmp_addr = {
      .ss = addr->ss,
   };

   return (ast_sockaddr_is_ipv4(addr) && (tmp_addr.sin.sin_addr.s_addr == INADDR_ANY)) ||
       (ast_sockaddr_is_ipv6(addr) && IN6_IS_ADDR_UNSPECIFIED(&tmp_addr.sin6.sin6_addr));
}
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:
1This is an IPv4 address
0This 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 add_ip_ie(), apply_netmask(), ast_append_ha(), ast_apply_ha(), ast_netsock_bind(), ast_rtcp_read(), ast_rtp_new(), ast_rtp_prop_set(), ast_rtp_read(), ast_sockaddr_is_any(), and jingle_interpret_ice_udp_transport().

{
   return addr->ss.ss_family == AF_INET &&
       addr->len == sizeof(struct sockaddr_in);
}
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:
1This is an IPv4-mapped IPv6 address.
0This 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_ip_ie(), add_sdp(), ast_apply_ha(), ast_rtp_instance_bridge(), and ast_sockaddr_ipv4_mapped().

{
   const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr->ss;
   return addr->len && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr);
}
int ast_sockaddr_is_ipv4_multicast ( const struct ast_sockaddr addr)

Determine if an IPv4 address is a multicast address.

Since:
10.0

addr the address to check

This function checks if an address is in the 224.0.0.0/4 network block.

Returns:
non-zero if this is a multicast address

Definition at line 412 of file netsock2.c.

References ast_sockaddr_ipv4().

Referenced by process_via().

{
   return ((ast_sockaddr_ipv4(addr) & 0xf0000000) == 0xe0000000);
}
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:
1This is an IPv6 or IPv4-mapped IPv6 address.
0This is an IPv4 address.

Definition at line 423 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().

{
   return addr->ss.ss_family == AF_INET6 &&
       addr->len == sizeof(struct sockaddr_in6);
}
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:
1This is a link-local IPv6 address.
0This is link-local IPv6 address.

Definition at line 417 of file netsock2.c.

References ast_sockaddr_is_ipv6(), and ast_sockaddr::ss.

Referenced by ast_sockaddr_stringify_fmt().

{
   const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr->ss;
   return ast_sockaddr_is_ipv6(addr) && IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr);
}
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:
addrPointer to the ast_sockaddr we wish to check
Return values:
1addr is null
0addr is non-null.

Definition at line 93 of file netsock2.h.

References ast_sockaddr::len.

Referenced by __ast_http_load(), __init_manager(), _ast_sockaddr_to_sin(), _sip_show_peers_one(), add_ice_to_sdp(), 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(), dtls_srtp_check_pending(), expire_register(), get_our_media_address(), handle_response_invite(), handle_show_http(), jingle_interpret_ice_udp_transport(), 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_keepalive(), sip_send_mwi_to_peer(), sip_set_rtp_peer(), sip_show_channel(), sip_show_settings(), sockaddr_is_null_or_any(), transmit_register(), udptl_debug_test_addr(), and unlink_peer_from_tables().

{
   return !addr || addr->len == 0;
}
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]addrThe resulting ast_sockaddr. This MAY be NULL from functions that are performing validity checks only, e.g. ast_parse_arg().
strThe string to parse
flagsIf 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:
1Success
0Failure

Definition at line 198 of file netsock2.c.

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

Referenced by __init_manager(), ast_append_ha(), ast_netsock_bind(), ast_parse_arg(), build_peer(), internal_dnsmgr_lookup(), jingle_alloc(), jingle_enable_video(), jingle_interpret_google_transport(), jingle_interpret_ice_udp_transport(), multicast_rtp_request(), peer_set_srcaddr(), process_sdp_a_ice(), 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().

{
   struct addrinfo hints;
   struct addrinfo   *res;
   char *s;
   char *host;
   char *port;
   int   e;

   s = ast_strdupa(str);
   if (!ast_sockaddr_split_hostport(s, &host, &port, flags)) {
      return 0;
   }

   memset(&hints, 0, sizeof(hints));
   /* Hint to get only one entry from getaddrinfo */
   hints.ai_socktype = SOCK_DGRAM;

#ifdef AI_NUMERICSERV
   hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
#else
   hints.ai_flags = AI_NUMERICHOST;
#endif
   if ((e = getaddrinfo(host, port, &hints, &res))) {
      if (e != EAI_NONAME) { /* if this was just a host name rather than a ip address, don't print error */
         ast_log(LOG_ERROR, "getaddrinfo(\"%s\", \"%s\", ...): %s\n",
            host, S_OR(port, "(null)"), gai_strerror(e));
      }
      return 0;
   }

   /*
    * I don't see how this could be possible since we're not resolving host
    * names. But let's be careful...
    */
   if (res->ai_next != NULL) {
      ast_log(LOG_WARNING, "getaddrinfo() returned multiple "
         "addresses. Ignoring all but the first.\n");
   }

   if (addr) {
      addr->len = res->ai_addrlen;
      memcpy(&addr->ss, res->ai_addr, addr->len);
   }

   freeaddrinfo(res);

   return 1;
}
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]addrsThe resulting array of ast_sockaddrs
strThe string to parse
flagsIf 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.
familyOnly addresses of the given family will be returned. Use 0 or AST_AF_UNSPEC to get addresses of all families.
Return values:
0Failure
non-zeroThe number of elements in addrs array.

Definition at line 248 of file netsock2.c.

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

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

{
   struct addrinfo hints, *res, *ai;
   char *s, *host, *port;
   int   e, i, res_cnt;

   if (!str) {
      return 0;
   }

   s = ast_strdupa(str);
   if (!ast_sockaddr_split_hostport(s, &host, &port, flags)) {
      return 0;
   }

   memset(&hints, 0, sizeof(hints));
   hints.ai_family = family;
   hints.ai_socktype = SOCK_DGRAM;

   if ((e = getaddrinfo(host, port, &hints, &res))) {
      ast_log(LOG_ERROR, "getaddrinfo(\"%s\", \"%s\", ...): %s\n",
         host, S_OR(port, "(null)"), gai_strerror(e));
      return 0;
   }

   res_cnt = 0;
   for (ai = res; ai; ai = ai->ai_next) {
      res_cnt++;
   }

   if (res_cnt == 0) {
      goto cleanup;
   }

   if ((*addrs = ast_malloc(res_cnt * sizeof(struct ast_sockaddr))) == NULL) {
      res_cnt = 0;
      goto cleanup;
   }

   i = 0;
   for (ai = res; ai; ai = ai->ai_next) {
      (*addrs)[i].len = ai->ai_addrlen;
      memcpy(&(*addrs)[i].ss, ai->ai_addr, ai->ai_addrlen);
      ++i;
   }

cleanup:
   freeaddrinfo(res);
   return res_cnt;
}
static void ast_sockaddr_setnull ( struct ast_sockaddr addr) [inline, static]
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.
flagsIf 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:
1Success
0Failure

Definition at line 132 of file netsock2.c.

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

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

{
   char *s = str;
   char *orig_str = str;/* Original string in case the port presence is incorrect. */
   char *host_end = NULL;/* Delay terminating the host in case the port presence is incorrect. */

   ast_debug(5, "Splitting '%s' into...\n", str);
   *host = NULL;
   *port = NULL;
   if (*s == '[') {
      *host = ++s;
      for (; *s && *s != ']'; ++s) {
      }
      if (*s == ']') {
         host_end = s;
         ++s;
      }
      if (*s == ':') {
         *port = s + 1;
      }
   } else {
      *host = s;
      for (; *s; ++s) {
         if (*s == ':') {
            if (*port) {
               *port = NULL;
               break;
            } else {
               *port = s;
            }
         }
      }
      if (*port) {
         host_end = *port;
         ++*port;
      }
   }

   switch (flags & PARSE_PORT_MASK) {
   case PARSE_PORT_IGNORE:
      *port = NULL;
      break;
   case PARSE_PORT_REQUIRE:
      if (*port == NULL) {
         ast_log(LOG_WARNING, "Port missing in %s\n", orig_str);
         return 0;
      }
      break;
   case PARSE_PORT_FORBID:
      if (*port != NULL) {
         ast_log(LOG_WARNING, "Port disallowed in %s\n", orig_str);
         return 0;
      }
      break;
   }

   /* Can terminate the host string now if needed. */
   if (host_end) {
      *host_end = '\0';
   }
   ast_debug(5, "...host '%s' and port '%s'.\n", *host, *port ? *port : "");
   return 1;
}
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 __ast_http_load(), __rtp_recvfrom(), __sip_xmit(), _sip_show_peer(), add_sdp(), apply_directmedia_acl(), ast_append_ha(), ast_apply_ha(), ast_netsock_bindaddr(), 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(), ast_websocket_read(), bridge_p2p_rtp_write(), check_peer_ok(), check_via(), create_dtmf_frame(), dnsmgr_refresh(), do_message_auth(), gtalk_update_externip(), handle_cli_iax2_show_registry(), handle_cli_udptl_set_debug(), handle_connection(), 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(), handle_show_http(), launch_netscript(), 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(), receive_message(), reg_source_db(), register_verify(), reload_config(), remote_bridge_loop(), retrans_pkt(), rtcp_do_debug_ip(), rtp_do_debug_ip(), send_request(), send_response(), session_destroy_fn(), set_destination(), sip_acf_channel_read(), sip_send_keepalive(), sip_set_rtp_peer(), sip_set_udptl_peer(), sip_show_channel(), sip_show_settings(), sip_show_tcp(), sip_tcp_read(), sip_tls_read(), stun_monitor_request(), and websocket_callback().

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().

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:
addrThe input to be stringified
formatone 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
stringThe 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().

{
   struct ast_sockaddr sa_ipv4;
   const struct ast_sockaddr *sa_tmp;
   char host[NI_MAXHOST];
   char port[NI_MAXSERV];
   struct ast_str *str;
   int e;
   static const size_t size = sizeof(host) - 1 + sizeof(port) - 1 + 4;


   if (ast_sockaddr_isnull(sa)) {
      return "(null)";
   }

   if (!(str = ast_str_thread_get(&ast_sockaddr_stringify_buf, size))) {
      return "";
   }

   if (ast_sockaddr_ipv4_mapped(sa, &sa_ipv4)) {
      sa_tmp = &sa_ipv4;
   } else {
      sa_tmp = sa;
   }

   if ((e = getnameinfo((struct sockaddr *)&sa_tmp->ss, sa_tmp->len,
              format & AST_SOCKADDR_STR_ADDR ? host : NULL,
              format & AST_SOCKADDR_STR_ADDR ? sizeof(host) : 0,
              format & AST_SOCKADDR_STR_PORT ? port : 0,
              format & AST_SOCKADDR_STR_PORT ? sizeof(port): 0,
              NI_NUMERICHOST | NI_NUMERICSERV))) {
      ast_log(LOG_ERROR, "getnameinfo(): %s\n", gai_strerror(e));
      return "";
   }

   if ((format & AST_SOCKADDR_STR_REMOTE) == AST_SOCKADDR_STR_REMOTE) {
      char *p;
      if (ast_sockaddr_is_ipv6_link_local(sa) && (p = strchr(host, '%'))) {
         *p = '\0';
      }
   }

   switch ((format & AST_SOCKADDR_STR_FORMAT_MASK))  {
   case AST_SOCKADDR_STR_DEFAULT:
      ast_str_set(&str, 0, sa_tmp->ss.ss_family == AF_INET6 ?
            "[%s]:%s" : "%s:%s", host, port);
      break;
   case AST_SOCKADDR_STR_ADDR:
      ast_str_set(&str, 0, "%s", host);
      break;
   case AST_SOCKADDR_STR_HOST:
      ast_str_set(&str, 0,
             sa_tmp->ss.ss_family == AF_INET6 ? "[%s]" : "%s", host);
      break;
   case AST_SOCKADDR_STR_PORT:
      ast_str_set(&str, 0, "%s", port);
      break;
   default:
      ast_log(LOG_ERROR, "Invalid format\n");
      return "";
   }

   return ast_str_buffer(str);
}
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 add_ice_to_sdp(), jingle_add_google_candidates_to_transport(), jingle_add_ice_udp_candidates_to_transport(), peers_data_provider_get(), and reg_source_db().

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(), add_rpid(), build_callid_registry(), build_reply_digest(), create_addr_from_peer(), initreqprep(), sip_poke_peer(), sip_sanitized_host(), and transmit_notify_with_mwi().

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().