Asterisk - The Open Source Telephony Project  18.5.0
Functions | Variables
netsock2.c File Reference

Network socket handling. More...

#include "asterisk.h"
#include "asterisk/config.h"
#include "asterisk/netsock2.h"
#include "asterisk/utils.h"
#include "asterisk/threadstorage.h"
Include dependency graph for netsock2.c:

Go to the source code of this file.

Functions

static void __init_ast_sockaddr_stringify_buf (void)
 
void _ast_sockaddr_from_sin (struct ast_sockaddr *addr, const struct sockaddr_in *sin, const char *file, int line, const char *func)
 
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_sockaddr_to_sin (const struct ast_sockaddr *addr, struct sockaddr_in *sin, 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. More...
 
int ast_bind (int sockfd, const struct ast_sockaddr *addr)
 Wrapper around bind(2) that uses struct ast_sockaddr. More...
 
int ast_connect (int sockfd, const struct ast_sockaddr *addr)
 Wrapper around connect(2) that uses struct ast_sockaddr. More...
 
int ast_getsockname (int sockfd, struct ast_sockaddr *addr)
 Wrapper around getsockname(2) that uses struct ast_sockaddr. More...
 
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. More...
 
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. More...
 
int ast_set_qos (int sockfd, int tos, int cos, const char *desc)
 Set type of service. More...
 
int ast_sockaddr_apply_netmask (const struct ast_sockaddr *addr, const struct ast_sockaddr *netmask, struct ast_sockaddr *result)
 Apply a netmask to an address and store the result in a separate structure. More...
 
int ast_sockaddr_cidr_bits (const struct ast_sockaddr *sa)
 Count the 1 bits in a netmask. More...
 
int ast_sockaddr_cmp (const struct ast_sockaddr *a, const struct ast_sockaddr *b)
 Compares two ast_sockaddr structures. More...
 
int ast_sockaddr_cmp_addr (const struct ast_sockaddr *a, const struct ast_sockaddr *b)
 Compares the addresses of two ast_sockaddr structures. More...
 
int ast_sockaddr_hash (const struct ast_sockaddr *addr)
 Computes a hash value from the address. The port is ignored. More...
 
uint32_t ast_sockaddr_ipv4 (const struct ast_sockaddr *addr)
 Get an IPv4 address of an ast_sockaddr. More...
 
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. More...
 
int ast_sockaddr_is_any (const struct ast_sockaddr *addr)
 Determine if the address type is unspecified, or "any" address. More...
 
int ast_sockaddr_is_ipv4 (const struct ast_sockaddr *addr)
 Determine if the address is an IPv4 address. More...
 
int ast_sockaddr_is_ipv4_mapped (const struct ast_sockaddr *addr)
 Determine if this is an IPv4-mapped IPv6 address. More...
 
int ast_sockaddr_is_ipv4_multicast (const struct ast_sockaddr *addr)
 Determine if an IPv4 address is a multicast address. More...
 
int ast_sockaddr_is_ipv6 (const struct ast_sockaddr *addr)
 Determine if this is an IPv6 address. More...
 
int ast_sockaddr_is_ipv6_link_local (const struct ast_sockaddr *addr)
 Determine if this is a link-local IPv6 address. More...
 
int ast_sockaddr_parse (struct ast_sockaddr *addr, const char *str, int flags)
 Parse an IPv4 or IPv6 address string. More...
 
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. More...
 
int ast_sockaddr_resolve_first_af (struct ast_sockaddr *addr, const char *name, int flag, int family)
 Pulls first resolved address and returns it. More...
 
int ast_sockaddr_split_hostport (char *str, char **host, char **port, int flags)
 Splits a string into its host and port components. More...
 
char * ast_sockaddr_stringify_fmt (const struct ast_sockaddr *sa, int format)
 Convert a socket address to a string. More...
 
const char * ast_transport2str (enum ast_transport transport)
 Returns a string representation of an ast_transport. More...
 

Variables

static struct ast_threadstorage ast_sockaddr_stringify_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_ast_sockaddr_stringify_buf , .custom_init = NULL , }
 

Detailed Description

Network socket handling.

Author
Viagénie aster.nosp@m.iskv.nosp@m.6@via.nosp@m.geni.nosp@m.e.ca

Definition in file netsock2.c.

Function Documentation

◆ __init_ast_sockaddr_stringify_buf()

static void __init_ast_sockaddr_stringify_buf ( void  )
static

Definition at line 63 of file netsock2.c.

66 {

◆ _ast_sockaddr_from_sin()

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

References __LOG_DEBUG, ast_log, DEBUG_ATLEAST, ast_sockaddr::len, and ast_sockaddr::ss.

691 {
692  memcpy(&addr->ss, sin, sizeof(*sin));
693 
694  if (addr->ss.ss_family != AF_INET && DEBUG_ATLEAST(1)) {
695  ast_log(__LOG_DEBUG, file, line, func, "Address family is not AF_INET\n");
696  }
697 
698  addr->len = sizeof(*sin);
699 }
struct sockaddr_storage ss
Definition: netsock2.h:98
#define __LOG_DEBUG
Definition: logger.h:240
socklen_t len
Definition: netsock2.h:99
#define ast_log
Definition: astobj2.c:42
#define DEBUG_ATLEAST(level)
Definition: logger.h:441

◆ _ast_sockaddr_port()

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

Definition at line 453 of file netsock2.c.

References __LOG_DEBUG, ast_log, DEBUG_ATLEAST, ast_sockaddr::len, and ast_sockaddr::ss.

454 {
455  /*
456  * Test addr->len first to be tolerant of an ast_sockaddr_setnull()
457  * addr. In that case addr->len might be the only value initialized.
458  */
459  if (addr->len == sizeof(struct sockaddr_in)
460  && addr->ss.ss_family == AF_INET) {
461  return ntohs(((struct sockaddr_in *)&addr->ss)->sin_port);
462  }
463  if (addr->len == sizeof(struct sockaddr_in6)
464  && addr->ss.ss_family == AF_INET6) {
465  return ntohs(((struct sockaddr_in6 *)&addr->ss)->sin6_port);
466  }
467  if (DEBUG_ATLEAST(1)) {
468  ast_log(__LOG_DEBUG, file, line, func, "Not an IPv4 nor IPv6 address, cannot get port.\n");
469  }
470  return 0;
471 }
struct sockaddr_storage ss
Definition: netsock2.h:98
#define __LOG_DEBUG
Definition: logger.h:240
socklen_t len
Definition: netsock2.h:99
#define ast_log
Definition: astobj2.c:42
#define DEBUG_ATLEAST(level)
Definition: logger.h:441

◆ _ast_sockaddr_set_port()

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

Definition at line 473 of file netsock2.c.

References __LOG_DEBUG, ast_log, DEBUG_ATLEAST, ast_sockaddr::len, and ast_sockaddr::ss.

474 {
475  /*
476  * Test addr->len first to be tolerant of an ast_sockaddr_setnull()
477  * addr. In that case addr->len might be the only value initialized.
478  */
479  if (addr->len == sizeof(struct sockaddr_in)
480  && addr->ss.ss_family == AF_INET) {
481  ((struct sockaddr_in *)&addr->ss)->sin_port = htons(port);
482  } else if (addr->len == sizeof(struct sockaddr_in6)
483  && addr->ss.ss_family == AF_INET6) {
484  ((struct sockaddr_in6 *)&addr->ss)->sin6_port = htons(port);
485  } else if (DEBUG_ATLEAST(1)) {
486  ast_log(__LOG_DEBUG, file, line, func,
487  "Not an IPv4 nor IPv6 address, cannot set port.\n");
488  }
489 }
struct sockaddr_storage ss
Definition: netsock2.h:98
#define __LOG_DEBUG
Definition: logger.h:240
socklen_t len
Definition: netsock2.h:99
#define ast_log
Definition: astobj2.c:42
#define DEBUG_ATLEAST(level)
Definition: logger.h:441

◆ _ast_sockaddr_to_sin()

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

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

670 {
671  if (ast_sockaddr_isnull(addr)) {
672  memset(sin, 0, sizeof(*sin));
673  return 1;
674  }
675 
676  if (addr->len != sizeof(*sin)) {
677  ast_log(__LOG_ERROR, file, line, func, "Bad address cast to IPv4\n");
678  return 0;
679  }
680 
681  if (addr->ss.ss_family != AF_INET && DEBUG_ATLEAST(1)) {
682  ast_log(__LOG_DEBUG, file, line, func, "Address family is not AF_INET\n");
683  }
684 
685  *sin = *(struct sockaddr_in *)&addr->ss;
686  return 1;
687 }
struct sockaddr_storage ss
Definition: netsock2.h:98
#define __LOG_DEBUG
Definition: logger.h:240
socklen_t len
Definition: netsock2.h:99
#define __LOG_ERROR
Definition: logger.h:284
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.
Definition: netsock2.h:127
#define ast_log
Definition: astobj2.c:42
#define DEBUG_ATLEAST(level)
Definition: logger.h:441

◆ ast_accept()

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

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

Referenced by ast_tcptls_server_root().

585 {
586  addr->len = sizeof(addr->ss);
587  return accept(sockfd, (struct sockaddr *)&addr->ss, &addr->len);
588 }
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99

◆ ast_bind()

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

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

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

591 {
592  return bind(sockfd, (const struct sockaddr *)&addr->ss, addr->len);
593 }
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99

◆ ast_connect()

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

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

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

596 {
597  return connect(sockfd, (const struct sockaddr *)&addr->ss, addr->len);
598 }
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99

◆ ast_getsockname()

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

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

Referenced by ast_ouraddrfor(), ast_set_qos(), and ast_websocket_uri_cb().

601 {
602  addr->len = sizeof(addr->ss);
603  return getsockname(sockfd, (struct sockaddr *)&addr->ss, &addr->len);
604 }
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99

◆ ast_recvfrom()

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

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

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

608 {
609  src_addr->len = sizeof(src_addr->ss);
610  return recvfrom(sockfd, buf, len, flags,
611  (struct sockaddr *)&src_addr->ss, &src_addr->len);
612 }
struct sockaddr_storage ss
Definition: netsock2.h:98
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
socklen_t len
Definition: netsock2.h:99
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)

◆ ast_sendto()

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

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

Referenced by __rtp_sendto(), __sip_xmit(), ast_rtp_on_turn_rx_rtcp_data(), ast_rtp_on_turn_rx_rtp_data(), ast_statsd_log_string(), ast_udptl_write(), dundi_xmit(), hep_queue_cb(), multicast_send_control_packet(), raw_hangup(), rtp_raw_write(), send_apathetic_reply(), send_packet(), sip_send_keepalive(), and transmit_trunk().

616 {
617  return sendto(sockfd, buf, len, flags,
618  (const struct sockaddr *)&dest_addr->ss, dest_addr->len);
619 }
struct sockaddr_storage ss
Definition: netsock2.h:98
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
socklen_t len
Definition: netsock2.h:99
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)

◆ ast_set_qos()

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 621 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(), reload_config(), and sip_prepare_socket().

622 {
623  int res = 0;
624  int set_tos;
625  int set_tclass;
626  struct ast_sockaddr addr;
627 
628  /* If the sock address is IPv6, the TCLASS field must be set. */
629  set_tclass = !ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr) ? 1 : 0;
630 
631  /* If the sock address is IPv4 or (IPv6 set to any address [::]) set TOS bits */
632  set_tos = (!set_tclass || (set_tclass && ast_sockaddr_is_any(&addr))) ? 1 : 0;
633 
634  if (set_tos) {
635  if ((res = setsockopt(sockfd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)))) {
636  ast_log(LOG_WARNING, "Unable to set %s DSCP TOS value to %d (may be you have no "
637  "root privileges): %s\n", desc, tos, strerror(errno));
638  } else if (tos) {
639  ast_verb(2, "Using %s TOS bits %d\n", desc, tos);
640  }
641  }
642 
643 #if defined(IPV6_TCLASS) && defined(IPPROTO_IPV6)
644  if (set_tclass) {
645  if (!ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr)) {
646  if ((res = setsockopt(sockfd, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof(tos)))) {
647  ast_log(LOG_WARNING, "Unable to set %s DSCP TCLASS field to %d (may be you have no "
648  "root privileges): %s\n", desc, tos, strerror(errno));
649  } else if (tos) {
650  ast_verb(2, "Using %s TOS bits %d in TCLASS field.\n", desc, tos);
651  }
652  }
653  }
654 #endif
655 
656 #ifdef linux
657  if (setsockopt(sockfd, SOL_SOCKET, SO_PRIORITY, &cos, sizeof(cos))) {
658  ast_log(LOG_WARNING, "Unable to set %s CoS to %d: %s\n", desc, cos,
659  strerror(errno));
660  } else if (cos) {
661  ast_verb(2, "Using %s CoS mark %d\n", desc, cos);
662  }
663 #endif
664 
665  return res;
666 }
unsigned int cos
Definition: chan_iax2.c:352
#define LOG_WARNING
Definition: logger.h:274
static const char desc[]
Definition: cdr_mysql.c:73
Socket address structure.
Definition: netsock2.h:97
#define ast_verb(level,...)
Definition: logger.h:463
unsigned int tos
Definition: chan_iax2.c:351
#define ast_log
Definition: astobj2.c:42
int ast_getsockname(int sockfd, struct ast_sockaddr *addr)
Wrapper around getsockname(2) that uses struct ast_sockaddr.
Definition: netsock2.c:600
int errno
int ast_sockaddr_is_any(const struct ast_sockaddr *addr)
Determine if the address type is unspecified, or "any" address.
Definition: netsock2.c:534
int ast_sockaddr_is_ipv6(const struct ast_sockaddr *addr)
Determine if this is an IPv6 address.
Definition: netsock2.c:524

◆ ast_sockaddr_apply_netmask()

int ast_sockaddr_apply_netmask ( const struct ast_sockaddr addr,
const struct ast_sockaddr netmask,
struct ast_sockaddr result 
)

Apply a netmask to an address and store the result in a separate structure.

When dealing with IPv6 addresses, one cannot apply a netmask with a simple logical AND operation. Futhermore, the incoming address may be an IPv4 address and needs to be mapped properly before attempting to apply a rule.

Parameters
addrThe IP address to apply the mask to.
netmaskThe netmask configured in the host access rule.
resultThe resultant address after applying the netmask to the given address
Return values
0Successfully applied netmask
-1Failed to apply netmask

Definition at line 357 of file netsock2.c.

References ast_sockaddr_from_sin, ast_sockaddr_is_ipv4(), ast_sockaddr_is_ipv6(), ast_sockaddr::len, ast_sockaddr::ss, and V6_WORD.

Referenced by addr_range_match_address_cb(), append_ha_core(), ast_apply_ha(), ast_sockaddr_stringify_port(), and authenticate_reply().

359 {
360  int res = 0;
361 
362  if (ast_sockaddr_is_ipv4(addr)) {
363  struct sockaddr_in result4 = { 0, };
364  struct sockaddr_in *addr4 = (struct sockaddr_in *) &addr->ss;
365  struct sockaddr_in *mask4 = (struct sockaddr_in *) &netmask->ss;
366  result4.sin_family = AF_INET;
367  result4.sin_addr.s_addr = addr4->sin_addr.s_addr & mask4->sin_addr.s_addr;
368  ast_sockaddr_from_sin(result, &result4);
369  } else if (ast_sockaddr_is_ipv6(addr)) {
370  struct sockaddr_in6 result6 = { 0, };
371  struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) &addr->ss;
372  struct sockaddr_in6 *mask6 = (struct sockaddr_in6 *) &netmask->ss;
373  int i;
374  result6.sin6_family = AF_INET6;
375  for (i = 0; i < 4; ++i) {
376  V6_WORD(&result6, i) = V6_WORD(addr6, i) & V6_WORD(mask6, i);
377  }
378  memcpy(&result->ss, &result6, sizeof(result6));
379  result->len = sizeof(result6);
380  } else {
381  /* Unsupported address scheme */
382  res = -1;
383  }
384 
385  return res;
386 }
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99
#define ast_sockaddr_from_sin(addr, sin)
Converts a struct sockaddr_in to a struct ast_sockaddr.
Definition: netsock2.h:782
int ast_sockaddr_is_ipv4(const struct ast_sockaddr *addr)
Determine if the address is an IPv4 address.
Definition: netsock2.c:497
int ast_sockaddr_is_ipv6(const struct ast_sockaddr *addr)
Determine if this is an IPv6 address.
Definition: netsock2.c:524
#define V6_WORD(sin6, index)
Isolate a 32-bit section of an IPv6 address.
Definition: netsock2.h:77

◆ ast_sockaddr_cidr_bits()

int ast_sockaddr_cidr_bits ( const struct ast_sockaddr sa)

Count the 1 bits in a netmask.

Since
12.4
Returns
number of 1 bits

Definition at line 130 of file netsock2.c.

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

Referenced by ast_ha_join_cidr(), ast_sockaddr_stringify_addr(), and cli_print_body().

131 {
132  struct ast_sockaddr sa_ipv4;
133  const struct ast_sockaddr *sa_tmp;
134  int bits = 0;
135  int bytes;
136  int i;
137  int j;
138  char *addr;
139 
140  if (ast_sockaddr_isnull(sa)) {
141  return 0;
142  }
143 
144  if (ast_sockaddr_ipv4_mapped(sa, &sa_ipv4)) {
145  sa_tmp = &sa_ipv4;
146  } else {
147  sa_tmp = sa;
148  }
149 
150  bytes = sa_tmp->len;
151  addr = ((struct sockaddr *)&sa_tmp->ss)->sa_data;
152 
153  for (i = 0; i < bytes ; ++i) {
154  for (j = 0; j < 8; ++j) {
155  if ((addr[i] >> j) & 1) {
156  bits++;
157  }
158  }
159  }
160 
161  return bits;
162 }
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99
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.
Definition: netsock2.c:37
Socket address structure.
Definition: netsock2.h:97
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.
Definition: netsock2.h:127

◆ ast_sockaddr_cmp()

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

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

Referenced by __rtp_recvfrom(), ast_netsock_find(), ast_rtcp_interpret(), ast_rtp_instance_get_and_cmp_local_address(), ast_rtp_instance_get_and_cmp_requested_target_address(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_sd_notify(), ast_sockaddr_copy(), ast_tcptls_client_create(), ast_tcptls_server_start(), AST_TEST_DEFINE(), ast_udptl_read(), dnsmgr_refresh(), find_tpeer(), find_transaction(), handle_command_response(), has_state_changed(), iax2_ack_registry(), iax2_getpeername(), iax2_getpeertrunk(), ice_candidate_cmp(), match(), parse_register_contact(), realtime_peer_by_name(), registry_rerequest(), reload_config(), rtcp_debug_test_addr(), rtp_add_candidates_to_ice(), rtp_debug_test_addr(), should_drop_packets(), sip_debug_test_addr(), sip_uri_domain_cmp(), socket_process_helper(), threadinfo_locate_cb(), transmit_register(), udptl_debug_test_addr(), and update_registry().

389 {
390  const struct ast_sockaddr *a_tmp, *b_tmp;
391  struct ast_sockaddr ipv4_mapped;
392 
393  a_tmp = a;
394  b_tmp = b;
395 
396  if (a_tmp->len != b_tmp->len) {
397  if (ast_sockaddr_ipv4_mapped(a, &ipv4_mapped)) {
398  a_tmp = &ipv4_mapped;
399  } else if (ast_sockaddr_ipv4_mapped(b, &ipv4_mapped)) {
400  b_tmp = &ipv4_mapped;
401  }
402  }
403 
404  if (a_tmp->len < b_tmp->len) {
405  return -1;
406  } else if (a_tmp->len > b_tmp->len) {
407  return 1;
408  }
409 
410  return memcmp(&a_tmp->ss, &b_tmp->ss, a_tmp->len);
411 }
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99
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.
Definition: netsock2.c:37
Socket address structure.
Definition: netsock2.h:97
static struct test_val b
static struct test_val a

◆ ast_sockaddr_cmp_addr()

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

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

Referenced by add_sdp(), addr_range_cmp_cb(), addr_range_match_address_cb(), ast_apply_ha(), ast_sockaddr_copy(), AST_TEST_DEFINE(), authenticate_reply(), check_for_nat(), get_our_media_address(), iax_outputframe(), peer_ipcmp_cb_full(), peercnt_cmp_cb(), realtime_peer(), realtime_user(), reload_config(), rtcp_debug_test_addr(), rtp_add_candidates_to_ice(), rtp_debug_test_addr(), should_drop_packets(), sip_debug_test_addr(), socket_read(), and udptl_debug_test_addr().

414 {
415  const struct ast_sockaddr *a_tmp, *b_tmp;
416  struct ast_sockaddr ipv4_mapped;
417  const struct in_addr *ip4a, *ip4b;
418  const struct in6_addr *ip6a, *ip6b;
419  int ret = -1;
420 
421  a_tmp = a;
422  b_tmp = b;
423 
424  if (a_tmp->len != b_tmp->len) {
425  if (ast_sockaddr_ipv4_mapped(a, &ipv4_mapped)) {
426  a_tmp = &ipv4_mapped;
427  } else if (ast_sockaddr_ipv4_mapped(b, &ipv4_mapped)) {
428  b_tmp = &ipv4_mapped;
429  }
430  }
431 
432  if (a->len < b->len) {
433  ret = -1;
434  } else if (a->len > b->len) {
435  ret = 1;
436  }
437 
438  switch (a_tmp->ss.ss_family) {
439  case AF_INET:
440  ip4a = &((const struct sockaddr_in*)&a_tmp->ss)->sin_addr;
441  ip4b = &((const struct sockaddr_in*)&b_tmp->ss)->sin_addr;
442  ret = memcmp(ip4a, ip4b, sizeof(*ip4a));
443  break;
444  case AF_INET6:
445  ip6a = &((const struct sockaddr_in6*)&a_tmp->ss)->sin6_addr;
446  ip6b = &((const struct sockaddr_in6*)&b_tmp->ss)->sin6_addr;
447  ret = memcmp(ip6a, ip6b, sizeof(*ip6a));
448  break;
449  }
450  return ret;
451 }
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99
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.
Definition: netsock2.c:37
Socket address structure.
Definition: netsock2.h:97
static struct test_val b
static struct test_val a

◆ ast_sockaddr_hash()

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

References ast_log, LOG_ERROR, and ast_sockaddr::ss.

Referenced by addr_range_hash_cb(), peer_iphash_cb(), peercnt_hash_cb(), and threadt_hash_cb().

549 {
550  /*
551  * For IPv4, return the IP address as-is. For IPv6, return the last 32
552  * bits.
553  */
554  switch (addr->ss.ss_family) {
555  case AF_INET:
556  return ((const struct sockaddr_in *)&addr->ss)->sin_addr.s_addr;
557  case AF_INET6:
558  return ((uint32_t *)&((const struct sockaddr_in6 *)&addr->ss)->sin6_addr)[3];
559  default:
560  ast_log(LOG_ERROR, "Unknown address family '%d'.\n",
561  addr->ss.ss_family);
562  return 0;
563  }
564 }
struct sockaddr_storage ss
Definition: netsock2.h:98
#define ast_log
Definition: astobj2.c:42
#define LOG_ERROR
Definition: logger.h:285

◆ ast_sockaddr_ipv4()

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

References ast_sockaddr::ss.

Referenced by ast_sockaddr_is_ipv4_multicast(), and multicast_send_control_packet().

492 {
493  const struct sockaddr_in *sin = (struct sockaddr_in *)&addr->ss;
494  return ntohl(sin->sin_addr.s_addr);
495 }
struct sockaddr_storage ss
Definition: netsock2.h:98

◆ ast_sockaddr_ipv4_mapped()

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
ast_mappedThe resulting IPv4 address
Return values
0Unable to make the conversion
1Successful conversion

Definition at line 37 of file netsock2.c.

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

Referenced by append_ha_core(), ast_apply_ha(), ast_rtcp_read(), ast_rtp_read(), ast_sockaddr_cidr_bits(), ast_sockaddr_cmp(), ast_sockaddr_cmp_addr(), and ast_sockaddr_stringify_fmt().

38 {
39  const struct sockaddr_in6 *sin6;
40  struct sockaddr_in sin4;
41 
42  if (!ast_sockaddr_is_ipv6(addr)) {
43  return 0;
44  }
45 
46  if (!ast_sockaddr_is_ipv4_mapped(addr)) {
47  return 0;
48  }
49 
50  sin6 = (const struct sockaddr_in6*)&addr->ss;
51 
52  memset(&sin4, 0, sizeof(sin4));
53  sin4.sin_family = AF_INET;
54  sin4.sin_port = sin6->sin6_port;
55  sin4.sin_addr.s_addr = ((uint32_t *)&sin6->sin6_addr)[3];
56 
57  ast_sockaddr_from_sin(ast_mapped, &sin4);
58 
59  return 1;
60 }
struct sockaddr_storage ss
Definition: netsock2.h:98
int ast_sockaddr_is_ipv4_mapped(const struct ast_sockaddr *addr)
Determine if this is an IPv4-mapped IPv6 address.
Definition: netsock2.c:507
#define ast_sockaddr_from_sin(addr, sin)
Converts a struct sockaddr_in to a struct ast_sockaddr.
Definition: netsock2.h:782
int ast_sockaddr_is_ipv6(const struct ast_sockaddr *addr)
Determine if this is an IPv6 address.
Definition: netsock2.c:524

◆ ast_sockaddr_is_any()

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 534 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(), ast_tcptls_client_create(), get_address_family_filter(), get_our_media_address(), negotiate_incoming_sdp_stream(), reload_config(), rtp_add_candidates_to_ice(), sip_show_settings(), and sockaddr_is_null_or_any().

535 {
536  union {
537  struct sockaddr_storage ss;
538  struct sockaddr_in sin;
539  struct sockaddr_in6 sin6;
540  } tmp_addr = {
541  .ss = addr->ss,
542  };
543 
544  return (ast_sockaddr_is_ipv4(addr) && (tmp_addr.sin.sin_addr.s_addr == INADDR_ANY)) ||
545  (ast_sockaddr_is_ipv6(addr) && IN6_IS_ADDR_UNSPECIFIED(&tmp_addr.sin6.sin6_addr));
546 }
struct sockaddr_storage ss
Definition: netsock2.h:98
int ast_sockaddr_is_ipv4(const struct ast_sockaddr *addr)
Determine if the address is an IPv4 address.
Definition: netsock2.c:497
int ast_sockaddr_is_ipv6(const struct ast_sockaddr *addr)
Determine if this is an IPv6 address.
Definition: netsock2.c:524

◆ ast_sockaddr_is_ipv4()

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

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

Referenced by append_ha_core(), ast_apply_ha(), ast_json_ipaddr(), ast_rtcp_read(), ast_rtp_ice_turn_request(), ast_rtp_prop_set(), ast_rtp_read(), ast_sockaddr_apply_netmask(), ast_sockaddr_is_any(), dump_addr(), dundi_xmit(), hep_queue_cb(), jingle_interpret_ice_udp_transport(), load_module(), negotiate_incoming_sdp_stream(), rtp_add_candidates_to_ice(), and rtp_allocate_transport().

498 {
499  /*
500  * Test addr->len first to be tolerant of an ast_sockaddr_setnull()
501  * addr. In that case addr->len might be the only value initialized.
502  */
503  return addr->len == sizeof(struct sockaddr_in)
504  && addr->ss.ss_family == AF_INET;
505 }
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99

◆ ast_sockaddr_is_ipv4_mapped()

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

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

Referenced by add_sdp(), ast_apply_ha(), ast_json_ipaddr(), ast_sip_ouraddrfor(), ast_sockaddr_ipv4_mapped(), build_peer(), and dump_addr().

508 {
509  const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr->ss;
510  return addr->len && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr);
511 }
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99

◆ ast_sockaddr_is_ipv4_multicast()

int ast_sockaddr_is_ipv4_multicast ( const struct ast_sockaddr addr)

Determine if an IPv4 address is a multicast address.

Since
10.0
Parameters
addrthe 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 513 of file netsock2.c.

References ast_sockaddr_ipv4().

Referenced by process_via().

514 {
515  return ((ast_sockaddr_ipv4(addr) & 0xf0000000) == 0xe0000000);
516 }
uint32_t ast_sockaddr_ipv4(const struct ast_sockaddr *addr)
Get an IPv4 address of an ast_sockaddr.
Definition: netsock2.c:491

◆ ast_sockaddr_is_ipv6()

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

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

Referenced by add_sdp(), ast_apply_ha(), ast_netsock_bindaddr(), ast_ouraddrfor(), ast_rtp_prop_set(), ast_set_qos(), ast_sip_ouraddrfor(), ast_sockaddr_apply_netmask(), 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(), build_peer(), get_address_family_filter(), hepv3_data_alloc(), load_module(), multicast_send_control_packet(), negotiate_incoming_sdp_stream(), reload_config(), rtp_allocate_transport(), set_host_ipaddr(), and sip_show_settings().

525 {
526  /*
527  * Test addr->len first to be tolerant of an ast_sockaddr_setnull()
528  * addr. In that case addr->len might be the only value initialized.
529  */
530  return addr->len == sizeof(struct sockaddr_in6)
531  && addr->ss.ss_family == AF_INET6;
532 }
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99

◆ ast_sockaddr_is_ipv6_link_local()

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

References ast_sockaddr_is_ipv6(), and ast_sockaddr::ss.

Referenced by ast_sockaddr_stringify_fmt().

519 {
520  const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr->ss;
521  return ast_sockaddr_is_ipv6(addr) && IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr);
522 }
struct sockaddr_storage ss
Definition: netsock2.h:98
int ast_sockaddr_is_ipv6(const struct ast_sockaddr *addr)
Determine if this is an IPv6 address.
Definition: netsock2.c:524

◆ ast_sockaddr_parse()

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]

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

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

Referenced by __init_manager(), append_ha_core(), apply_acl(), apply_endpoint_acl(), ast_netsock_bind(), ast_parse_arg(), ast_rtp_ice_add_cand(), ast_rtp_ice_turn_request(), ast_sip_get_transport_name(), ast_sockaddr_stringify_port(), AST_TEST_DEFINE(), build_peer(), change_outgoing_sdp_stream_media_address(), corosync_node_alloc(), create_rtp(), evt_gen_auth_method_not_allowed(), evt_gen_chal_resp_failed(), evt_gen_chal_sent(), evt_gen_failed_acl(), evt_gen_inval_acct_id(), evt_gen_inval_password(), evt_gen_inval_transport(), evt_gen_load_avg(), evt_gen_mem_limit(), evt_gen_req_bad_format(), evt_gen_req_no_support(), evt_gen_req_not_allowed(), evt_gen_session_limit(), evt_gen_successful_auth(), evt_gen_unexpected_addr(), handle_cli_rtp_drop_incoming_packets(), internal_dnsmgr_lookup(), ip_identify(), ip_identify_match_handler(), jingle_alloc(), jingle_enable_video(), jingle_interpret_google_transport(), jingle_interpret_ice_udp_transport(), load_module(), logging_on_rx_msg(), logging_on_tx_msg(), multicast_rtp_request(), peer_set_srcaddr(), pjsip_enable_logger_host(), pjsip_log_test_addr(), process_ice_attributes(), process_nat(), process_sdp_a_ice(), proxy_update(), realtime_peer(), reg_source_db(), reload_config(), rtcp_do_debug_ip(), rtcp_message_handler(), rtp_do_debug_ip(), security_event_populate(), session_outgoing_nat_hook(), set_config(), sip_sanitized_host(), sip_uri_domain_cmp(), test_init_rtp_instances(), unicast_rtp_request(), and update_address_with_ice_candidate().

231 {
232  struct addrinfo hints;
233  struct addrinfo *res;
234  char *s;
235  char *host;
236  char *port;
237  int e;
238 
239  s = ast_strdupa(str);
240  if (!ast_sockaddr_split_hostport(s, &host, &port, flags)) {
241  return 0;
242  }
243 
244  memset(&hints, 0, sizeof(hints));
245  /* Hint to get only one entry from getaddrinfo */
246  hints.ai_socktype = SOCK_DGRAM;
247 
248 #ifdef AI_NUMERICSERV
249  hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
250 #else
251  hints.ai_flags = AI_NUMERICHOST;
252 #endif
253  if ((e = getaddrinfo(host, port, &hints, &res))) {
254  if (e != EAI_NONAME) { /* if this was just a host name rather than a ip address, don't print error */
255  ast_log(LOG_ERROR, "getaddrinfo(\"%s\", \"%s\", ...): %s\n",
256  host, S_OR(port, "(null)"), gai_strerror(e));
257  }
258  return 0;
259  }
260 
261  /*
262  * I don't see how this could be possible since we're not resolving host
263  * names. But let's be careful...
264  */
265  if (res->ai_next != NULL) {
266  ast_log(LOG_WARNING, "getaddrinfo() returned multiple "
267  "addresses. Ignoring all but the first.\n");
268  }
269 
270  if (addr) {
271  addr->len = res->ai_addrlen;
272  memcpy(&addr->ss, res->ai_addr, addr->len);
273  }
274 
275  freeaddrinfo(res);
276 
277  return 1;
278 }
struct sockaddr_storage ss
Definition: netsock2.h:98
#define LOG_WARNING
Definition: logger.h:274
socklen_t len
Definition: netsock2.h:99
const char * str
Definition: app_jack.c:147
#define NULL
Definition: resample.c:96
#define ast_log
Definition: astobj2.c:42
static char host[256]
Definition: muted.c:77
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
int ast_sockaddr_split_hostport(char *str, char **host, char **port, int flags)
Splits a string into its host and port components.
Definition: netsock2.c:164
#define LOG_ERROR
Definition: logger.h:285
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79

◆ ast_sockaddr_resolve()

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]

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

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

Referenced by __ast_http_load(), app_exec(), apply_negotiated_sdp_stream(), ast_audiosocket_connect(), ast_sockaddr_resolve_first_af(), ast_sockaddr_stringify_port(), build_peer(), extract_contact_addr(), get_ipaddress(), handle_cli_udptl_set_debug(), ip_identify_match_host_lookup(), launch_netscript(), negotiate_incoming_sdp_stream(), populate_addr(), realtime_peer(), realtime_peer_by_name(), realtime_user(), resolve_first(), and websocket_client_args_create().

282 {
283  struct addrinfo hints, *res, *ai;
284  char *s, *host, *port;
285  int e, i, res_cnt;
286 
287  if (!str) {
288  *addrs = NULL;
289  return 0;
290  }
291 
292  s = ast_strdupa(str);
293  if (!ast_sockaddr_split_hostport(s, &host, &port, flags)) {
294  *addrs = NULL;
295  return 0;
296  }
297 
298  memset(&hints, 0, sizeof(hints));
299  hints.ai_family = family;
300  hints.ai_socktype = SOCK_DGRAM;
301 
302  if ((e = getaddrinfo(host, port, &hints, &res))) {
303  ast_log(LOG_ERROR, "getaddrinfo(\"%s\", \"%s\", ...): %s\n",
304  host, S_OR(port, "(null)"), gai_strerror(e));
305  *addrs = NULL;
306  return 0;
307  }
308 
309  res_cnt = 0;
310  for (ai = res; ai; ai = ai->ai_next) {
311  res_cnt++;
312  }
313 
314  if (res_cnt == 0) {
315  *addrs = NULL;
316  goto cleanup;
317  }
318 
319  if ((*addrs = ast_malloc(res_cnt * sizeof(struct ast_sockaddr))) == NULL) {
320  res_cnt = 0;
321  goto cleanup;
322  }
323 
324  i = 0;
325  for (ai = res; ai; ai = ai->ai_next) {
326  (*addrs)[i].len = ai->ai_addrlen;
327  memcpy(&(*addrs)[i].ss, ai->ai_addr, ai->ai_addrlen);
328  ++i;
329  }
330 
331 cleanup:
332  freeaddrinfo(res);
333  return res_cnt;
334 }
const char * str
Definition: app_jack.c:147
#define NULL
Definition: resample.c:96
Socket address structure.
Definition: netsock2.h:97
#define ast_log
Definition: astobj2.c:42
static char host[256]
Definition: muted.c:77
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:193
int ast_sockaddr_split_hostport(char *str, char **host, char **port, int flags)
Splits a string into its host and port components.
Definition: netsock2.c:164
#define LOG_ERROR
Definition: logger.h:285
static void * cleanup(void *unused)
Definition: pbx_realtime.c:124
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79

◆ ast_sockaddr_resolve_first_af()

int ast_sockaddr_resolve_first_af ( struct ast_sockaddr addr,
const char *  name,
int  flag,
int  family 
)

Pulls first resolved address and returns it.

Return the first entry from ast_sockaddr_resolve filtered by address family.

Definition at line 337 of file netsock2.c.

References ast_debug, ast_free, ast_sockaddr_copy(), and ast_sockaddr_resolve().

Referenced by ast_sip_ouraddrfor(), ast_sockaddr_resolve_first(), ast_sockaddr_resolve_first_transport(), ast_sockaddr_stringify_port(), audiosocket_request(), hepv3_data_alloc(), pjsip_enable_logger_host(), process_sdp_c(), reload_config(), and sip_do_debug_ip().

339 {
340  struct ast_sockaddr *addrs;
341  int addrs_cnt;
342 
343  addrs_cnt = ast_sockaddr_resolve(&addrs, name, flag, family);
344  if (addrs_cnt <= 0) {
345  return 1;
346  }
347  if (addrs_cnt > 1) {
348  ast_debug(1, "Multiple addresses resolving %s, using the first one only\n", name);
349  }
350 
351  ast_sockaddr_copy(addr, &addrs[0]);
352 
353  ast_free(addrs);
354  return 0;
355 }
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.
Definition: netsock2.c:280
static void ast_sockaddr_copy(struct ast_sockaddr *dst, const struct ast_sockaddr *src)
Copies the data from one ast_sockaddr to another.
Definition: netsock2.h:171
Socket address structure.
Definition: netsock2.h:97
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
long int flag
Definition: f2c.h:83
static const char name[]
Definition: cdr_mysql.c:74
#define ast_free(a)
Definition: astmm.h:182

◆ ast_sockaddr_split_hostport()

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
[in]strThe string to parse. May be modified by writing a NUL at the end of the host part.
[out]hostPointer to the host component within str.
[out]portPointer 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 164 of file netsock2.c.

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

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

165 {
166  char *s = str;
167  char *orig_str = str;/* Original string in case the port presence is incorrect. */
168  char *host_end = NULL;/* Delay terminating the host in case the port presence is incorrect. */
169 
170  ast_debug(5, "Splitting '%s' into...\n", str);
171  *host = NULL;
172  *port = NULL;
173  if (*s == '[') {
174  *host = ++s;
175  for (; *s && *s != ']'; ++s) {
176  }
177  if (*s == ']') {
178  host_end = s;
179  ++s;
180  }
181  if (*s == ':') {
182  *port = s + 1;
183  }
184  } else {
185  *host = s;
186  for (; *s; ++s) {
187  if (*s == ':') {
188  if (*port) {
189  *port = NULL;
190  break;
191  } else {
192  *port = s;
193  }
194  }
195  }
196  if (*port) {
197  host_end = *port;
198  ++*port;
199  }
200  }
201 
202  switch (flags & PARSE_PORT_MASK) {
203  case PARSE_PORT_IGNORE:
204  *port = NULL;
205  break;
206  case PARSE_PORT_REQUIRE:
207  if (*port == NULL) {
208  ast_log(LOG_WARNING, "Port missing in %s\n", orig_str);
209  return 0;
210  }
211  break;
212  case PARSE_PORT_FORBID:
213  if (*port != NULL) {
214  ast_log(LOG_WARNING, "Port disallowed in %s\n", orig_str);
215  return 0;
216  }
217  break;
218  }
219 
220  /* Can terminate the host string now if needed. */
221  if (host_end) {
222  *host_end = '\0';
223  }
224  ast_debug(5, "...host '%s' and port '%s'.\n", *host, *port ? *port : "");
225  return 1;
226 }
#define LOG_WARNING
Definition: logger.h:274
const char * str
Definition: app_jack.c:147
#define NULL
Definition: resample.c:96
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
static char host[256]
Definition: muted.c:77

◆ ast_sockaddr_stringify_fmt()

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 65 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(), host, ast_sockaddr::len, LOG_ERROR, NULL, 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(), ast_sockaddr_stringify_remote(), create_outgoing_sdp_stream(), and statsd_init().

66 {
67  struct ast_sockaddr sa_ipv4;
68  const struct ast_sockaddr *sa_tmp;
69  char host[NI_MAXHOST];
70  char port[NI_MAXSERV];
71  struct ast_str *str;
72  int e;
73  static const size_t size = sizeof(host) - 1 + sizeof(port) - 1 + 4;
74 
75 
76  if (ast_sockaddr_isnull(sa)) {
77  return "(null)";
78  }
79 
80  if (!(str = ast_str_thread_get(&ast_sockaddr_stringify_buf, size))) {
81  return "";
82  }
83 
84  if (ast_sockaddr_ipv4_mapped(sa, &sa_ipv4)) {
85  sa_tmp = &sa_ipv4;
86  } else {
87  sa_tmp = sa;
88  }
89 
90  if ((e = getnameinfo((struct sockaddr *)&sa_tmp->ss, sa_tmp->len,
92  format & AST_SOCKADDR_STR_ADDR ? sizeof(host) : 0,
93  format & AST_SOCKADDR_STR_PORT ? port : 0,
94  format & AST_SOCKADDR_STR_PORT ? sizeof(port): 0,
95  NI_NUMERICHOST | NI_NUMERICSERV))) {
96  ast_log(LOG_ERROR, "getnameinfo(): %s\n", gai_strerror(e));
97  return "";
98  }
99 
100  if ((format & AST_SOCKADDR_STR_REMOTE) == AST_SOCKADDR_STR_REMOTE) {
101  char *p;
102  if (ast_sockaddr_is_ipv6_link_local(sa) && (p = strchr(host, '%'))) {
103  *p = '\0';
104  }
105  }
106 
107  switch ((format & AST_SOCKADDR_STR_FORMAT_MASK)) {
109  ast_str_set(&str, 0, sa_tmp->ss.ss_family == AF_INET6 ?
110  "[%s]:%s" : "%s:%s", host, port);
111  break;
113  ast_str_set(&str, 0, "%s", host);
114  break;
116  ast_str_set(&str, 0,
117  sa_tmp->ss.ss_family == AF_INET6 ? "[%s]" : "%s", host);
118  break;
120  ast_str_set(&str, 0, "%s", port);
121  break;
122  default:
123  ast_log(LOG_ERROR, "Invalid format\n");
124  return "";
125  }
126 
127  return ast_str_buffer(str);
128 }
struct sockaddr_storage ss
Definition: netsock2.h:98
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
socklen_t len
Definition: netsock2.h:99
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.
Definition: netsock2.c:37
const char * str
Definition: app_jack.c:147
#define NULL
Definition: resample.c:96
Socket address structure.
Definition: netsock2.h:97
#define AST_SOCKADDR_STR_DEFAULT
Definition: netsock2.h:207
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.
Definition: netsock2.h:127
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1065
#define ast_log
Definition: astobj2.c:42
static char host[256]
Definition: muted.c:77
int ast_sockaddr_is_ipv6_link_local(const struct ast_sockaddr *addr)
Determine if this is a link-local IPv6 address.
Definition: netsock2.c:518
#define LOG_ERROR
Definition: logger.h:285
#define AST_SOCKADDR_STR_PORT
Definition: netsock2.h:203
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
#define AST_SOCKADDR_STR_HOST
Definition: netsock2.h:206
#define AST_SOCKADDR_STR_ADDR
Definition: netsock2.h:202
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861
#define AST_SOCKADDR_STR_FORMAT_MASK
Definition: netsock2.h:211
static snd_pcm_format_t format
Definition: chan_alsa.c:102
static struct ast_threadstorage ast_sockaddr_stringify_buf
Definition: netsock2.c:63
#define AST_SOCKADDR_STR_REMOTE
Definition: netsock2.h:205

◆ ast_transport2str()

const char* ast_transport2str ( enum ast_transport  transport)

Returns a string representation of an ast_transport.

Since
12.3
Return values
Nameof the tranpsort if it is defined
Undefinedif the transport is undefined

Definition at line 566 of file netsock2.c.

References AST_TRANSPORT_TCP, AST_TRANSPORT_TLS, AST_TRANSPORT_UDP, AST_TRANSPORT_WS, and AST_TRANSPORT_WSS.

Referenced by sip_show_channel().

567 {
568  switch (transport) {
569  case AST_TRANSPORT_TLS:
570  return "TLS";
571  case AST_TRANSPORT_UDP:
572  return "UDP";
573  case AST_TRANSPORT_TCP:
574  return "TCP";
575  case AST_TRANSPORT_WS:
576  return "WS";
577  case AST_TRANSPORT_WSS:
578  return "WSS";
579  }
580 
581  return "Undefined";
582 }

Variable Documentation

◆ ast_sockaddr_stringify_buf

struct ast_threadstorage ast_sockaddr_stringify_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_ast_sockaddr_stringify_buf , .custom_init = NULL , }
static

Definition at line 63 of file netsock2.c.

Referenced by ast_sockaddr_stringify_fmt().