Network socket handling. More...
#include <sys/socket.h>
#include <netinet/in.h>
Go to the source code of this file.
Data Structures | |
struct | ast_sockaddr |
Socket address structure. More... | |
Defines | |
#define | ast_sockaddr_port(addr) _ast_sockaddr_port(addr, __FILE__, __LINE__, __PRETTY_FUNCTION__) |
Get the port number of a socket address. | |
#define | ast_sockaddr_set_port(addr, port) _ast_sockaddr_set_port(addr,port,__FILE__,__LINE__,__PRETTY_FUNCTION__) |
Sets the port number of a socket address. | |
#define | AST_SOCKADDR_STR_ADDR (1 << 0) |
#define | AST_SOCKADDR_STR_ADDR_REMOTE (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_REMOTE) |
#define | AST_SOCKADDR_STR_BRACKETS (1 << 2) |
#define | AST_SOCKADDR_STR_DEFAULT (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_PORT) |
#define | AST_SOCKADDR_STR_DEFAULT_REMOTE (AST_SOCKADDR_STR_DEFAULT | AST_SOCKADDR_STR_REMOTE) |
#define | AST_SOCKADDR_STR_FORMAT_MASK (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_PORT | AST_SOCKADDR_STR_BRACKETS) |
#define | AST_SOCKADDR_STR_HOST (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_BRACKETS) |
#define | AST_SOCKADDR_STR_HOST_REMOTE (AST_SOCKADDR_STR_HOST | AST_SOCKADDR_STR_REMOTE) |
#define | AST_SOCKADDR_STR_PORT (1 << 1) |
#define | AST_SOCKADDR_STR_REMOTE (1 << 3) |
Enumerations | |
enum | { AST_AF_UNSPEC = 0, AST_AF_INET = 2, AST_AF_INET6 = 10 } |
Functions | |
uint16_t | _ast_sockaddr_port (const struct ast_sockaddr *addr, const char *file, int line, const char *func) |
void | _ast_sockaddr_set_port (struct ast_sockaddr *addr, uint16_t port, const char *file, int line, const char *func) |
int | ast_accept (int sockfd, struct ast_sockaddr *addr) |
Wrapper around accept(2) that uses struct ast_sockaddr. | |
int | ast_bind (int sockfd, const struct ast_sockaddr *addr) |
Wrapper around bind(2) that uses struct ast_sockaddr. | |
int | ast_connect (int sockfd, const struct ast_sockaddr *addr) |
Wrapper around connect(2) that uses struct ast_sockaddr. | |
int | ast_getsockname (int sockfd, struct ast_sockaddr *addr) |
Wrapper around getsockname(2) that uses struct ast_sockaddr. | |
ssize_t | ast_recvfrom (int sockfd, void *buf, size_t len, int flags, struct ast_sockaddr *src_addr) |
Wrapper around recvfrom(2) that uses struct ast_sockaddr. | |
ssize_t | ast_sendto (int sockfd, const void *buf, size_t len, int flags, const struct ast_sockaddr *dest_addr) |
Wrapper around sendto(2) that uses ast_sockaddr. | |
int | ast_set_qos (int sockfd, int tos, int cos, const char *desc) |
Set type of service. | |
int | ast_sockaddr_cmp (const struct ast_sockaddr *a, const struct ast_sockaddr *b) |
Compares two ast_sockaddr structures. | |
int | ast_sockaddr_cmp_addr (const struct ast_sockaddr *a, const struct ast_sockaddr *b) |
Compares the addresses of two ast_sockaddr structures. | |
static void | ast_sockaddr_copy (struct ast_sockaddr *dst, const struct ast_sockaddr *src) |
Copies the data from one ast_sockaddr to another. | |
int | ast_sockaddr_hash (const struct ast_sockaddr *addr) |
Computes a hash value from the address. The port is ignored. | |
uint32_t | ast_sockaddr_ipv4 (const struct ast_sockaddr *addr) |
Get an IPv4 address of an ast_sockaddr. | |
int | ast_sockaddr_ipv4_mapped (const struct ast_sockaddr *addr, struct ast_sockaddr *ast_mapped) |
Convert an IPv4-mapped IPv6 address into an IPv4 address. | |
int | ast_sockaddr_is_any (const struct ast_sockaddr *addr) |
Determine if the address type is unspecified, or "any" address. | |
int | ast_sockaddr_is_ipv4 (const struct ast_sockaddr *addr) |
Determine if the address is an IPv4 address. | |
int | ast_sockaddr_is_ipv4_mapped (const struct ast_sockaddr *addr) |
Determine if this is an IPv4-mapped IPv6 address. | |
int | ast_sockaddr_is_ipv6 (const struct ast_sockaddr *addr) |
Determine if this is an IPv6 address. | |
int | ast_sockaddr_is_ipv6_link_local (const struct ast_sockaddr *addr) |
Determine if this is a link-local IPv6 address. | |
static int | ast_sockaddr_isnull (const struct ast_sockaddr *addr) |
Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized, or having a 0 length. | |
int | ast_sockaddr_parse (struct ast_sockaddr *addr, const char *str, int flags) |
Parse an IPv4 or IPv6 address string. | |
int | ast_sockaddr_resolve (struct ast_sockaddr **addrs, const char *str, int flags, int family) |
Parses a string with an IPv4 or IPv6 address and place results into an array. | |
static void | ast_sockaddr_setnull (struct ast_sockaddr *addr) |
Sets address addr to null. | |
int | ast_sockaddr_split_hostport (char *str, char **host, char **port, int flags) |
Splits a string into its host and port components. | |
static char * | ast_sockaddr_stringify (const struct ast_sockaddr *addr) |
Wrapper around ast_sockaddr_stringify_fmt() with default format. | |
static char * | ast_sockaddr_stringify_addr (const struct ast_sockaddr *addr) |
Wrapper around ast_sockaddr_stringify_fmt() to return an address only. | |
static char * | ast_sockaddr_stringify_addr_remote (const struct ast_sockaddr *addr) |
Wrapper around ast_sockaddr_stringify_fmt() to return an address only. | |
char * | ast_sockaddr_stringify_fmt (const struct ast_sockaddr *addr, int format) |
Convert a socket address to a string. | |
static char * | ast_sockaddr_stringify_host (const struct ast_sockaddr *addr) |
Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brackets for IPv6). | |
static char * | ast_sockaddr_stringify_host_remote (const struct ast_sockaddr *addr) |
Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brackets for IPv6). | |
static char * | ast_sockaddr_stringify_port (const struct ast_sockaddr *addr) |
Wrapper around ast_sockaddr_stringify_fmt() to return a port only. | |
static char * | ast_sockaddr_stringify_remote (const struct ast_sockaddr *addr) |
Wrapper around ast_sockaddr_stringify_fmt() with default format. | |
| |
#define | ast_sockaddr_from_sin(addr, sin) _ast_sockaddr_from_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__) |
Converts a struct sockaddr_in to a struct ast_sockaddr. | |
#define | ast_sockaddr_to_sin(addr, sin) _ast_sockaddr_to_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__) |
Converts a struct ast_sockaddr to a struct sockaddr_in. | |
void | _ast_sockaddr_from_sin (struct ast_sockaddr *addr, const struct sockaddr_in *sin, const char *file, int line, const char *func) |
int | _ast_sockaddr_to_sin (const struct ast_sockaddr *addr, struct sockaddr_in *sin, const char *file, int line, const char *func) |
Network socket handling.
Definition in file netsock2.h.
#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.
sin | The sockaddr_in to convert |
Definition at line 642 of file netsock2.h.
Referenced by __ast_http_load(), __init_manager(), __oh323_rtp_create(), app_exec(), apply_netmask(), ast_rtp_read(), ast_rtp_stun_request(), ast_sockaddr_ipv4_mapped(), auth_http_callback(), auth_manager_http_callback(), auth_mxml_http_callback(), auth_rawman_http_callback(), authenticate(), build_gateway(), check_access(), find_subchannel_and_lock(), gtalk_alloc(), gtalk_get_local_ip(), gtalk_update_externip(), gtalk_update_stun(), handle_open_receive_channel_ack_message(), jingle_alloc(), jingle_create_candidates(), jingle_update_stun(), load_module(), manager_http_callback(), mxml_http_callback(), parse_cidr_mask(), process_sdp(), rawman_http_callback(), register_verify(), setup_rtp_connection(), skinny_register(), start_rtp(), and update_registry().
#define ast_sockaddr_port | ( | addr | ) | _ast_sockaddr_port(addr, __FILE__, __LINE__, __PRETTY_FUNCTION__) |
Get the port number of a socket address.
0 | Address is null | |
non-zero | The port number of the ast_sockaddr |
Definition at line 406 of file netsock2.h.
Referenced by __iax2_show_peers(), __set_address_from_contact(), __sip_subscribe_mwi_do(), _sip_show_peer(), _sip_show_peers_one(), add_sdp(), ast_find_ourip(), ast_ouraddrfor(), ast_rtp_prop_set(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_sip_ouraddrfor(), build_peer(), check_via(), copy_via_headers(), create_addr(), dnsmgr_refresh(), function_sippeer(), get_our_media_address(), initreqprep(), manager_iax2_show_peer_list(), multicast_send_control_packet(), on_dns_update_peer(), on_dns_update_registry(), parse_register_contact(), peer_ipcmp_cb(), peers_data_provider_get(), realtime_update_peer(), reload_config(), set_destination(), sip_debug_test_addr(), sipsock_read(), transmit_notify_with_mwi(), transmit_register(), and udptl_debug_test_addr().
#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.
addr | Address on which to set the port | |
port | The port you wish to set the address to use |
void |
Definition at line 422 of file netsock2.h.
Referenced by __ast_http_load(), __set_address_from_contact(), __sip_subscribe_mwi_do(), add_sdp(), ast_find_ourip(), ast_get_ip_or_srv(), ast_ouraddrfor(), ast_rtp_new(), ast_rtp_prop_set(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_sip_ouraddrfor(), ast_udptl_new_with_bindaddr(), build_peer(), check_via(), check_via_response(), create_addr(), dnsmgr_refresh(), get_our_media_address(), iax2_append_register(), on_dns_update_peer(), on_dns_update_registry(), parse_register_contact(), process_sdp(), process_via(), proxy_update(), realtime_peer(), reload_config(), set_destination(), stun_monitor_request(), and transmit_register().
#define AST_SOCKADDR_STR_ADDR (1 << 0) |
Definition at line 152 of file netsock2.h.
Referenced by ast_sockaddr_stringify_addr(), and ast_sockaddr_stringify_fmt().
#define AST_SOCKADDR_STR_ADDR_REMOTE (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_REMOTE) |
Definition at line 158 of file netsock2.h.
Referenced by ast_sockaddr_stringify_addr_remote().
#define AST_SOCKADDR_STR_BRACKETS (1 << 2) |
Definition at line 154 of file netsock2.h.
#define AST_SOCKADDR_STR_DEFAULT (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_PORT) |
Definition at line 157 of file netsock2.h.
Referenced by ast_sockaddr_stringify(), and ast_sockaddr_stringify_fmt().
#define AST_SOCKADDR_STR_DEFAULT_REMOTE (AST_SOCKADDR_STR_DEFAULT | AST_SOCKADDR_STR_REMOTE) |
Definition at line 160 of file netsock2.h.
Referenced by ast_sockaddr_stringify_remote().
#define AST_SOCKADDR_STR_FORMAT_MASK (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_PORT | AST_SOCKADDR_STR_BRACKETS) |
Definition at line 161 of file netsock2.h.
Referenced by ast_sockaddr_stringify_fmt().
#define AST_SOCKADDR_STR_HOST (AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_BRACKETS) |
Definition at line 156 of file netsock2.h.
Referenced by ast_sockaddr_stringify_fmt(), and ast_sockaddr_stringify_host().
#define AST_SOCKADDR_STR_HOST_REMOTE (AST_SOCKADDR_STR_HOST | AST_SOCKADDR_STR_REMOTE) |
Definition at line 159 of file netsock2.h.
Referenced by ast_sockaddr_stringify_host_remote().
#define AST_SOCKADDR_STR_PORT (1 << 1) |
Definition at line 153 of file netsock2.h.
Referenced by ast_sockaddr_stringify_fmt(), and ast_sockaddr_stringify_port().
#define AST_SOCKADDR_STR_REMOTE (1 << 3) |
Definition at line 155 of file netsock2.h.
Referenced by ast_sockaddr_stringify_fmt().
#define ast_sockaddr_to_sin | ( | addr, | |||
sin | ) | _ast_sockaddr_to_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__) |
Converts a struct ast_sockaddr to a struct sockaddr_in.
These are backward compatibility functions that may be used by subsystems that have not yet been converted to IPv6. They will be removed when all subsystems are IPv6-ready.
addr | The ast_sockaddr to convert | |
[out] | sin | The resulting sockaddr_in struct |
nonzero | Success | |
zero | Failure |
Definition at line 629 of file netsock2.h.
Referenced by __ast_http_load(), __iax2_show_peers(), __init_manager(), add_sdp(), addr_range_hash_cb(), addr_range_match_address_cb(), ast_rtp_read(), ast_rtp_stun_request(), auth_manager_http_callback(), auth_mxml_http_callback(), auth_rawman_http_callback(), authenticate_reply(), build_gateway(), build_peer(), build_user(), config_parse_variables(), create_addr(), external_rtp_create(), find_subchannel_and_lock(), gtalk_create_candidates(), gtalk_update_stun(), handle_cli_iax2_set_debug(), handle_cli_iax2_show_peer(), handle_open_receive_channel_ack_message(), handle_show_http(), iax2_ack_registry(), iax2_do_register(), iax2_getpeername(), iax2_getpeertrunk(), iax2_poke_peer(), jingle_create_candidates(), manager_http_callback(), mansession_encode_sin_local(), mxml_http_callback(), oh323_set_rtp_peer(), peer_set_srcaddr(), peercnt_modify(), rawman_http_callback(), registry_rerequest(), session_do(), skinny_set_rtp_peer(), start_rtp(), transmit_modify_with_sdp(), unistim_set_rtp_peer(), and update_registry().
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.
Definition at line 39 of file netsock2.h.
00039 { 00040 AST_AF_UNSPEC = 0, 00041 AST_AF_INET = 2, 00042 AST_AF_INET6 = 10, 00043 };
void _ast_sockaddr_from_sin | ( | struct ast_sockaddr * | addr, | |
const struct sockaddr_in * | sin, | |||
const char * | file, | |||
int | line, | |||
const char * | func | |||
) |
Definition at line 561 of file netsock2.c.
References __LOG_DEBUG, ast_log(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.
00563 { 00564 memcpy(&addr->ss, sin, sizeof(*sin)); 00565 00566 if (addr->ss.ss_family != AF_INET && option_debug >= 1) { 00567 ast_log(__LOG_DEBUG, file, line, func, "Address family is not AF_INET\n"); 00568 } 00569 00570 addr->len = sizeof(*sin); 00571 }
uint16_t _ast_sockaddr_port | ( | const struct ast_sockaddr * | addr, | |
const char * | file, | |||
int | line, | |||
const char * | func | |||
) |
Definition at line 365 of file netsock2.c.
References __LOG_DEBUG, ast_log(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.
00366 { 00367 if (addr->ss.ss_family == AF_INET && 00368 addr->len == sizeof(struct sockaddr_in)) { 00369 return ntohs(((struct sockaddr_in *)&addr->ss)->sin_port); 00370 } else if (addr->ss.ss_family == AF_INET6 && 00371 addr->len == sizeof(struct sockaddr_in6)) { 00372 return ntohs(((struct sockaddr_in6 *)&addr->ss)->sin6_port); 00373 } 00374 if (option_debug >= 1) { 00375 ast_log(__LOG_DEBUG, file, line, func, "Not an IPv4 nor IPv6 address, cannot get port.\n"); 00376 } 00377 return 0; 00378 }
void _ast_sockaddr_set_port | ( | struct ast_sockaddr * | addr, | |
uint16_t | port, | |||
const char * | file, | |||
int | line, | |||
const char * | func | |||
) |
Definition at line 380 of file netsock2.c.
References __LOG_DEBUG, ast_log(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.
00381 { 00382 if (addr->ss.ss_family == AF_INET && 00383 addr->len == sizeof(struct sockaddr_in)) { 00384 ((struct sockaddr_in *)&addr->ss)->sin_port = htons(port); 00385 } else if (addr->ss.ss_family == AF_INET6 && 00386 addr->len == sizeof(struct sockaddr_in6)) { 00387 ((struct sockaddr_in6 *)&addr->ss)->sin6_port = htons(port); 00388 } else if (option_debug >= 1) { 00389 ast_log(__LOG_DEBUG, file, line, func, 00390 "Not an IPv4 nor IPv6 address, cannot set port.\n"); 00391 } 00392 }
int _ast_sockaddr_to_sin | ( | const struct ast_sockaddr * | addr, | |
struct sockaddr_in * | sin, | |||
const char * | file, | |||
int | line, | |||
const char * | func | |||
) |
Definition at line 540 of file netsock2.c.
References __LOG_DEBUG, __LOG_ERROR, ast_log(), ast_sockaddr_isnull(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.
00542 { 00543 if (ast_sockaddr_isnull(addr)) { 00544 memset(sin, 0, sizeof(*sin)); 00545 return 1; 00546 } 00547 00548 if (addr->len != sizeof(*sin)) { 00549 ast_log(__LOG_ERROR, file, line, func, "Bad address cast to IPv4\n"); 00550 return 0; 00551 } 00552 00553 if (addr->ss.ss_family != AF_INET && option_debug >= 1) { 00554 ast_log(__LOG_DEBUG, file, line, func, "Address family is not AF_INET\n"); 00555 } 00556 00557 *sin = *(struct sockaddr_in *)&addr->ss; 00558 return 1; 00559 }
int ast_accept | ( | int | sockfd, | |
struct ast_sockaddr * | addr | |||
) |
Wrapper around accept(2) that uses struct ast_sockaddr.
For parameter and return information, see the man page for accept(2).
Definition at line 456 of file netsock2.c.
References ast_sockaddr::len, and ast_sockaddr::ss.
Referenced by ast_tcptls_server_root().
int ast_bind | ( | int | sockfd, | |
const struct ast_sockaddr * | addr | |||
) |
Wrapper around bind(2) that uses struct ast_sockaddr.
For parameter and return information, see the man page for bind(2).
Definition at line 462 of file netsock2.c.
References ast_sockaddr::len, and ast_sockaddr::ss.
Referenced by ast_rtp_new(), ast_rtp_prop_set(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_new_with_bindaddr(), and reload_config().
int ast_connect | ( | int | sockfd, | |
const struct ast_sockaddr * | addr | |||
) |
Wrapper around connect(2) that uses struct ast_sockaddr.
For parameter and return information, see the man page for connect(2).
Definition at line 467 of file netsock2.c.
References ast_sockaddr::len, and ast_sockaddr::ss.
Referenced by ast_ouraddrfor(), ast_tcptls_client_start(), gtalk_update_externip(), and stun_monitor_request().
int ast_getsockname | ( | int | sockfd, | |
struct ast_sockaddr * | addr | |||
) |
Wrapper around getsockname(2) that uses struct ast_sockaddr.
For parameter and return information, see the man page for getsockname(2).
Definition at line 472 of file netsock2.c.
References ast_sockaddr::len, and ast_sockaddr::ss.
Referenced by ast_ouraddrfor(), and ast_set_qos().
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.
For parameter and return information, see the man page for recvfrom(2).
Definition at line 478 of file netsock2.c.
References ast_sockaddr::len, and ast_sockaddr::ss.
Referenced by __rtp_recvfrom(), ast_udptl_read(), and sipsock_read().
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.
For parameter and return information, see the man page for sendto(2)
Definition at line 486 of file netsock2.c.
References ast_sockaddr::len, and ast_sockaddr::ss.
Referenced by __rtp_sendto(), __sip_xmit(), ast_udptl_write(), multicast_rtp_write(), and multicast_send_control_packet().
int ast_set_qos | ( | int | sockfd, | |
int | tos, | |||
int | cos, | |||
const char * | desc | |||
) |
Set type of service.
Set ToS ("Type of Service for IPv4 and "Traffic Class for IPv6) and CoS (Linux's SO_PRIORITY)
sockfd | File descriptor for socket on which to set the parameters | |
tos | The type of service for the socket | |
cos | The cost of service for the socket | |
desc | A text description of the socket in question. |
0 | Success | |
-1 | Error, with errno set to an appropriate value |
Definition at line 493 of file netsock2.c.
References ast_getsockname(), ast_log(), ast_sockaddr_is_any(), ast_sockaddr_is_ipv6(), ast_verb, errno, and LOG_WARNING.
Referenced by ast_rtp_qos_set(), and reload_config().
00494 { 00495 int res = 0; 00496 int set_tos; 00497 int set_tclass; 00498 struct ast_sockaddr addr; 00499 00500 /* If the sock address is IPv6, the TCLASS field must be set. */ 00501 set_tclass = !ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr) ? 1 : 0; 00502 00503 /* If the the sock address is IPv4 or (IPv6 set to any address [::]) set TOS bits */ 00504 set_tos = (!set_tclass || (set_tclass && ast_sockaddr_is_any(&addr))) ? 1 : 0; 00505 00506 if (set_tos) { 00507 if ((res = setsockopt(sockfd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)))) { 00508 ast_log(LOG_WARNING, "Unable to set %s DSCP TOS value to %d (may be you have no " 00509 "root privileges): %s\n", desc, tos, strerror(errno)); 00510 } else if (tos) { 00511 ast_verb(2, "Using %s TOS bits %d\n", desc, tos); 00512 } 00513 } 00514 00515 #if defined(IPV6_TCLASS) && defined(IPPROTO_IPV6) 00516 if (set_tclass) { 00517 if (!ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr)) { 00518 if ((res = setsockopt(sockfd, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof(tos)))) { 00519 ast_log(LOG_WARNING, "Unable to set %s DSCP TCLASS field to %d (may be you have no " 00520 "root privileges): %s\n", desc, tos, strerror(errno)); 00521 } else if (tos) { 00522 ast_verb(2, "Using %s TOS bits %d in TCLASS field.\n", desc, tos); 00523 } 00524 } 00525 } 00526 #endif 00527 00528 #ifdef linux 00529 if (setsockopt(sockfd, SOL_SOCKET, SO_PRIORITY, &cos, sizeof(cos))) { 00530 ast_log(LOG_WARNING, "Unable to set %s CoS to %d: %s\n", desc, cos, 00531 strerror(errno)); 00532 } else if (cos) { 00533 ast_verb(2, "Using %s CoS mark %d\n", desc, cos); 00534 } 00535 #endif 00536 00537 return res; 00538 }
int ast_sockaddr_cmp | ( | const struct ast_sockaddr * | a, | |
const struct ast_sockaddr * | b | |||
) |
Compares two ast_sockaddr structures.
-1 | a is lexicographically smaller than b | |
0 | a is equal to b | |
1 | b is lexicographically smaller than a |
Definition at line 300 of file netsock2.c.
References ast_sockaddr_ipv4_mapped(), ast_sockaddr::len, and ast_sockaddr::ss.
Referenced by add_sdp(), ast_rtcp_read(), ast_rtp_instance_get_and_cmp_local_address(), ast_rtp_instance_get_and_cmp_remote_address(), ast_rtp_read(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_bridge(), ast_udptl_read(), dnsmgr_refresh(), parse_register_contact(), realtime_peer_by_name(), reload_config(), remote_bridge_loop(), rtcp_debug_test_addr(), rtp_debug_test_addr(), sip_debug_test_addr(), sip_uri_domain_cmp(), threadinfo_locate_cb(), transmit_register(), udptl_debug_test_addr(), and update_registry().
00301 { 00302 const struct ast_sockaddr *a_tmp, *b_tmp; 00303 struct ast_sockaddr ipv4_mapped; 00304 00305 a_tmp = a; 00306 b_tmp = b; 00307 00308 if (a_tmp->len != b_tmp->len) { 00309 if (ast_sockaddr_ipv4_mapped(a, &ipv4_mapped)) { 00310 a_tmp = &ipv4_mapped; 00311 } else if (ast_sockaddr_ipv4_mapped(b, &ipv4_mapped)) { 00312 b_tmp = &ipv4_mapped; 00313 } 00314 } 00315 00316 if (a_tmp->len < b_tmp->len) { 00317 return -1; 00318 } else if (a_tmp->len > b_tmp->len) { 00319 return 1; 00320 } 00321 00322 return memcmp(&a_tmp->ss, &b_tmp->ss, a_tmp->len); 00323 }
int ast_sockaddr_cmp_addr | ( | const struct ast_sockaddr * | a, | |
const struct ast_sockaddr * | b | |||
) |
Compares the addresses of two ast_sockaddr structures.
-1 | a is lexicographically smaller than b | |
0 | a is equal to b | |
1 | b is lexicographically smaller than a |
Definition at line 325 of file netsock2.c.
References ast_sockaddr_ipv4_mapped(), ast_sockaddr::len, and ast_sockaddr::ss.
Referenced by addr_range_cmp_cb(), ast_apply_ha(), get_our_media_address(), peer_ipcmp_cb(), rtcp_debug_test_addr(), rtp_debug_test_addr(), sip_debug_test_addr(), and udptl_debug_test_addr().
00326 { 00327 const struct ast_sockaddr *a_tmp, *b_tmp; 00328 struct ast_sockaddr ipv4_mapped; 00329 const struct in_addr *ip4a, *ip4b; 00330 const struct in6_addr *ip6a, *ip6b; 00331 int ret = -1; 00332 00333 a_tmp = a; 00334 b_tmp = b; 00335 00336 if (a_tmp->len != b_tmp->len) { 00337 if (ast_sockaddr_ipv4_mapped(a, &ipv4_mapped)) { 00338 a_tmp = &ipv4_mapped; 00339 } else if (ast_sockaddr_ipv4_mapped(b, &ipv4_mapped)) { 00340 b_tmp = &ipv4_mapped; 00341 } 00342 } 00343 00344 if (a->len < b->len) { 00345 ret = -1; 00346 } else if (a->len > b->len) { 00347 ret = 1; 00348 } 00349 00350 switch (a_tmp->ss.ss_family) { 00351 case AF_INET: 00352 ip4a = &((const struct sockaddr_in*)&a_tmp->ss)->sin_addr; 00353 ip4b = &((const struct sockaddr_in*)&b_tmp->ss)->sin_addr; 00354 ret = memcmp(ip4a, ip4b, sizeof(*ip4a)); 00355 break; 00356 case AF_INET6: 00357 ip6a = &((const struct sockaddr_in6*)&a_tmp->ss)->sin6_addr; 00358 ip6b = &((const struct sockaddr_in6*)&b_tmp->ss)->sin6_addr; 00359 ret = memcmp(ip6a, ip6b, sizeof(*ip6a)); 00360 break; 00361 } 00362 return ret; 00363 }
static void ast_sockaddr_copy | ( | struct ast_sockaddr * | dst, | |
const struct ast_sockaddr * | src | |||
) | [inline, static] |
Copies the data from one ast_sockaddr to another.
dst | The destination ast_sockaddr | |
src | The source ast_sockaddr |
void |
Definition at line 121 of file netsock2.h.
References ast_sockaddr::len.
Referenced by add_sdp(), ast_copy_ha(), ast_find_ourip(), ast_rtcp_read(), 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_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(), create_addr(), dialog_initialize_rtp(), dnsmgr_refresh(), find_peer(), get_our_media_address(), gtalk_get_local_ip(), handle_cli_udptl_set_debug(), handle_request_do(), on_dns_update_mwi(), on_dns_update_peer(), on_dns_update_registry(), parse_register_contact(), reg_source_db(), reload_config(), remote_bridge_loop(), resolve_first(), sip_alloc(), sip_do_debug_peer(), sip_prepare_socket(), and transmit_response_using_temp().
int ast_sockaddr_hash | ( | const struct ast_sockaddr * | addr | ) |
Computes a hash value from the address. The port is ignored.
0 | Unknown address family | |
other | A 32-bit hash derived from the address |
Definition at line 438 of file netsock2.c.
References ast_log(), LOG_ERROR, and ast_sockaddr::ss.
Referenced by peer_iphash_cb(), and threadt_hash_cb().
00439 { 00440 /* 00441 * For IPv4, return the IP address as-is. For IPv6, return the last 32 00442 * bits. 00443 */ 00444 switch (addr->ss.ss_family) { 00445 case AF_INET: 00446 return ((const struct sockaddr_in *)&addr->ss)->sin_addr.s_addr; 00447 case AF_INET6: 00448 return ((uint32_t *)&((const struct sockaddr_in6 *)&addr->ss)->sin6_addr)[3]; 00449 default: 00450 ast_log(LOG_ERROR, "Unknown address family '%d'.\n", 00451 addr->ss.ss_family); 00452 return 0; 00453 } 00454 }
uint32_t ast_sockaddr_ipv4 | ( | const struct ast_sockaddr * | addr | ) |
Get an IPv4 address of an ast_sockaddr.
Definition at line 394 of file netsock2.c.
References ast_sockaddr::ss.
Referenced by addr_is_multicast(), iax2_devicestate(), iax2_do_register(), iax2_poke_peer(), jingle_create_candidates(), load_module(), and multicast_send_control_packet().
00395 { 00396 const struct sockaddr_in *sin = (struct sockaddr_in *)&addr->ss; 00397 return ntohl(sin->sin_addr.s_addr); 00398 }
int ast_sockaddr_ipv4_mapped | ( | const struct ast_sockaddr * | addr, | |
struct ast_sockaddr * | ast_mapped | |||
) |
Convert an IPv4-mapped IPv6 address into an IPv4 address.
addr | The IPv4-mapped address to convert | |
mapped_addr | The resulting IPv4 address |
0 | Unable to make the conversion | |
1 | Successful conversion |
Definition at line 39 of file netsock2.c.
References ast_sockaddr_from_sin, ast_sockaddr_is_ipv4_mapped(), ast_sockaddr_is_ipv6(), and ast_sockaddr::ss.
Referenced by ast_append_ha(), ast_apply_ha(), ast_rtp_read(), ast_sockaddr_cmp(), ast_sockaddr_cmp_addr(), and ast_sockaddr_stringify_fmt().
00040 { 00041 const struct sockaddr_in6 *sin6; 00042 struct sockaddr_in sin4; 00043 00044 if (!ast_sockaddr_is_ipv6(addr)) { 00045 return 0; 00046 } 00047 00048 if (!ast_sockaddr_is_ipv4_mapped(addr)) { 00049 return 0; 00050 } 00051 00052 sin6 = (const struct sockaddr_in6*)&addr->ss; 00053 00054 memset(&sin4, 0, sizeof(sin4)); 00055 sin4.sin_family = AF_INET; 00056 sin4.sin_port = sin6->sin6_port; 00057 sin4.sin_addr.s_addr = ((uint32_t *)&sin6->sin6_addr)[3]; 00058 00059 ast_sockaddr_from_sin(ast_mapped, &sin4); 00060 00061 return 1; 00062 }
int ast_sockaddr_is_any | ( | const struct ast_sockaddr * | addr | ) |
Determine if the address type is unspecified, or "any" address.
For IPv4, this would be the address 0.0.0.0, and for IPv6, this would be the address ::. The port number is ignored.
1 | This is an "any" address | |
0 | This is not an "any" address |
Definition at line 424 of file netsock2.c.
References ast_sockaddr_is_ipv4(), ast_sockaddr_is_ipv6(), and ast_sockaddr::ss.
Referenced by ast_find_ourip(), ast_set_qos(), ast_sip_ouraddrfor(), get_address_family_filter(), get_our_media_address(), gtalk_get_local_ip(), reload_config(), sip_show_settings(), and sockaddr_is_null_or_any().
00425 { 00426 union { 00427 struct sockaddr_storage ss; 00428 struct sockaddr_in sin; 00429 struct sockaddr_in6 sin6; 00430 } tmp_addr = { 00431 .ss = addr->ss, 00432 }; 00433 00434 return (ast_sockaddr_is_ipv4(addr) && (tmp_addr.sin.sin_addr.s_addr == INADDR_ANY)) || 00435 (ast_sockaddr_is_ipv6(addr) && IN6_IS_ADDR_UNSPECIFIED(&tmp_addr.sin6.sin6_addr)); 00436 }
int ast_sockaddr_is_ipv4 | ( | const struct ast_sockaddr * | addr | ) |
Determine if the address is an IPv4 address.
1 | This is an IPv4 address | |
0 | This is an IPv6 or IPv4-mapped IPv6 address |
Definition at line 400 of file netsock2.c.
References ast_sockaddr::len, and ast_sockaddr::ss.
Referenced by apply_netmask(), ast_append_ha(), ast_apply_ha(), ast_rtp_new(), ast_rtp_prop_set(), ast_rtp_read(), and ast_sockaddr_is_any().
int ast_sockaddr_is_ipv4_mapped | ( | const struct ast_sockaddr * | addr | ) |
Determine if this is an IPv4-mapped IPv6 address.
1 | This is an IPv4-mapped IPv6 address. | |
0 | This is not an IPv4-mapped IPv6 address. |
Definition at line 406 of file netsock2.c.
References ast_sockaddr::len, and ast_sockaddr::ss.
Referenced by add_sdp(), ast_apply_ha(), ast_rtp_instance_bridge(), and ast_sockaddr_ipv4_mapped().
int ast_sockaddr_is_ipv6 | ( | const struct ast_sockaddr * | addr | ) |
Determine if this is an IPv6 address.
1 | This is an IPv6 or IPv4-mapped IPv6 address. | |
0 | This is an IPv4 address. |
Definition at line 418 of file netsock2.c.
References ast_sockaddr::len, and ast_sockaddr::ss.
Referenced by add_sdp(), apply_netmask(), ast_apply_ha(), ast_ouraddrfor(), ast_rtp_new(), ast_rtp_prop_set(), ast_set_qos(), ast_sip_ouraddrfor(), ast_sockaddr_ipv4_mapped(), ast_sockaddr_is_any(), ast_sockaddr_is_ipv6_link_local(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_new_with_bindaddr(), get_address_family_filter(), multicast_send_control_packet(), reload_config(), and sip_show_settings().
int ast_sockaddr_is_ipv6_link_local | ( | const struct ast_sockaddr * | addr | ) |
Determine if this is a link-local IPv6 address.
1 | This is a link-local IPv6 address. | |
0 | This is link-local IPv6 address. |
Definition at line 412 of file netsock2.c.
References ast_sockaddr_is_ipv6(), and ast_sockaddr::ss.
Referenced by ast_sockaddr_stringify_fmt().
00413 { 00414 const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr->ss; 00415 return ast_sockaddr_is_ipv6(addr) && IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr); 00416 }
static int ast_sockaddr_isnull | ( | const struct ast_sockaddr * | addr | ) | [inline, static] |
Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized, or having a 0 length.
addr | Pointer to the ast_sockaddr we wish to check |
1 | addr is null | |
0 | addr is non-null. |
Definition at line 93 of file netsock2.h.
References ast_sockaddr::len.
Referenced by _ast_sockaddr_to_sin(), _sip_show_peers_one(), add_sdp(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_rtp_sendcng(), ast_rtp_write(), ast_sip_ouraddrfor(), ast_sockaddr_stringify_fmt(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_read(), ast_udptl_write(), bridge_p2p_rtp_write(), build_peer(), check_rtp_timeout(), create_addr_from_peer(), expire_register(), get_our_media_address(), handle_response_invite(), multicast_send_control_packet(), on_dns_update_mwi(), on_dns_update_peer(), on_dns_update_registry(), parse_register_contact(), peer_iphash_cb(), process_sdp(), realtime_peer(), realtime_update_peer(), register_verify(), reload_config(), remote_bridge_loop(), rtcp_debug_test_addr(), rtp_debug_test_addr(), sip_acf_channel_read(), sip_debug_test_addr(), sip_devicestate(), sip_do_debug_peer(), sip_poke_peer(), sip_prune_realtime(), sip_send_mwi_to_peer(), sip_set_rtp_peer(), sip_show_channel(), sip_show_settings(), sockaddr_is_null_or_any(), transmit_register(), and udptl_debug_test_addr().
00094 { 00095 return !addr || addr->len == 0; 00096 }
int ast_sockaddr_parse | ( | struct ast_sockaddr * | addr, | |
const char * | str, | |||
int | flags | |||
) |
Parse an IPv4 or IPv6 address string.
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.
[out] | addr | The resulting ast_sockaddr. This MAY be NULL from functions that are performing validity checks only, e.g. ast_parse_arg(). |
str | The string to parse | |
flags | If set to zero, a port MAY be present. If set to PARSE_PORT_IGNORE, a port MAY be present but will be ignored. If set to PARSE_PORT_REQUIRE, a port MUST be present. If set to PARSE_PORT_FORBID, a port MUST NOT be present. |
1 | Success | |
0 | Failure |
Definition at line 198 of file netsock2.c.
References ast_log(), ast_sockaddr_split_hostport(), ast_strdupa, ast_sockaddr::len, LOG_ERROR, LOG_WARNING, S_OR, and ast_sockaddr::ss.
Referenced by ast_append_ha(), ast_parse_arg(), build_peer(), internal_dnsmgr_lookup(), multicast_rtp_request(), proxy_update(), realtime_peer(), reg_source_db(), reload_config(), rtcp_do_debug_ip(), rtp_do_debug_ip(), sip_sanitized_host(), and sip_uri_domain_cmp().
00199 { 00200 struct addrinfo hints; 00201 struct addrinfo *res; 00202 char *s; 00203 char *host; 00204 char *port; 00205 int e; 00206 00207 s = ast_strdupa(str); 00208 if (!ast_sockaddr_split_hostport(s, &host, &port, flags)) { 00209 return 0; 00210 } 00211 00212 memset(&hints, 0, sizeof(hints)); 00213 /* Hint to get only one entry from getaddrinfo */ 00214 hints.ai_socktype = SOCK_DGRAM; 00215 00216 #ifdef AI_NUMERICSERV 00217 hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; 00218 #else 00219 hints.ai_flags = AI_NUMERICHOST; 00220 #endif 00221 if ((e = getaddrinfo(host, port, &hints, &res))) { 00222 if (e != EAI_NONAME) { /* if this was just a host name rather than a ip address, don't print error */ 00223 ast_log(LOG_ERROR, "getaddrinfo(\"%s\", \"%s\", ...): %s\n", 00224 host, S_OR(port, "(null)"), gai_strerror(e)); 00225 } 00226 return 0; 00227 } 00228 00229 /* 00230 * I don't see how this could be possible since we're not resolving host 00231 * names. But let's be careful... 00232 */ 00233 if (res->ai_next != NULL) { 00234 ast_log(LOG_WARNING, "getaddrinfo() returned multiple " 00235 "addresses. Ignoring all but the first.\n"); 00236 } 00237 00238 if (addr) { 00239 addr->len = res->ai_addrlen; 00240 memcpy(&addr->ss, res->ai_addr, addr->len); 00241 } 00242 00243 freeaddrinfo(res); 00244 00245 return 1; 00246 }
int ast_sockaddr_resolve | ( | struct ast_sockaddr ** | addrs, | |
const char * | str, | |||
int | flags, | |||
int | family | |||
) |
Parses a string with an IPv4 or IPv6 address and place results into an array.
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
[out] | addrs | The resulting array of ast_sockaddrs |
str | The string to parse | |
flags | If set to zero, a port MAY be present. If set to PARSE_PORT_IGNORE, a port MAY be present but will be ignored. If set to PARSE_PORT_REQUIRE, a port MUST be present. If set to PARSE_PORT_FORBID, a port MUST NOT be present. | |
family | Only addresses of the given family will be returned. Use 0 or AST_SOCKADDR_UNSPEC to get addresses of all families. |
0 | Failure | |
non-zero | The number of elements in addrs array. |
Definition at line 248 of file netsock2.c.
References ast_log(), ast_malloc, ast_sockaddr_split_hostport(), ast_strdupa, cleanup(), LOG_ERROR, and S_OR.
Referenced by ast_sockaddr_resolve_first_af(), gtalk_get_local_ip(), handle_cli_udptl_set_debug(), realtime_peer_by_name(), and resolve_first().
00250 { 00251 struct addrinfo hints, *res, *ai; 00252 char *s, *host, *port; 00253 int e, i, res_cnt; 00254 00255 if (!str) { 00256 return 0; 00257 } 00258 00259 s = ast_strdupa(str); 00260 if (!ast_sockaddr_split_hostport(s, &host, &port, flags)) { 00261 return 0; 00262 } 00263 00264 memset(&hints, 0, sizeof(hints)); 00265 hints.ai_family = family; 00266 hints.ai_socktype = SOCK_DGRAM; 00267 00268 if ((e = getaddrinfo(host, port, &hints, &res))) { 00269 ast_log(LOG_ERROR, "getaddrinfo(\"%s\", \"%s\", ...): %s\n", 00270 host, S_OR(port, "(null)"), gai_strerror(e)); 00271 return 0; 00272 } 00273 00274 res_cnt = 0; 00275 for (ai = res; ai; ai = ai->ai_next) { 00276 res_cnt++; 00277 } 00278 00279 if (res_cnt == 0) { 00280 goto cleanup; 00281 } 00282 00283 if ((*addrs = ast_malloc(res_cnt * sizeof(struct ast_sockaddr))) == NULL) { 00284 res_cnt = 0; 00285 goto cleanup; 00286 } 00287 00288 i = 0; 00289 for (ai = res; ai; ai = ai->ai_next) { 00290 (*addrs)[i].len = ai->ai_addrlen; 00291 memcpy(&(*addrs)[i].ss, ai->ai_addr, ai->ai_addrlen); 00292 ++i; 00293 } 00294 00295 cleanup: 00296 freeaddrinfo(res); 00297 return res_cnt; 00298 }
static void ast_sockaddr_setnull | ( | struct ast_sockaddr * | addr | ) | [inline, static] |
Sets address addr to null.
void |
Definition at line 106 of file netsock2.h.
References ast_sockaddr::len.
Referenced by __ast_http_load(), ast_rtp_stop(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_stop(), build_peer(), get_local_address(), manager_set_defaults(), multicast_rtp_request(), reload_config(), and set_peer_defaults().
00107 { 00108 addr->len = 0; 00109 }
int ast_sockaddr_split_hostport | ( | char * | str, | |
char ** | host, | |||
char ** | port, | |||
int | flags | |||
) |
Splits a string into its host and port components.
str[in] | The string to parse. May be modified by writing a NUL at the end of the host part. | |
host[out] | Pointer to the host component within str. | |
port[out] | Pointer to the port component within str. | |
flags | If set to zero, a port MAY be present. If set to PARSE_PORT_IGNORE, a port MAY be present but will be ignored. If set to PARSE_PORT_REQUIRE, a port MUST be present. If set to PARSE_PORT_FORBID, a port MUST NOT be present. |
1 | Success | |
0 | Failure |
Definition at line 132 of file netsock2.c.
References ast_debug, ast_log(), LOG_WARNING, PARSE_PORT_FORBID, PARSE_PORT_IGNORE, PARSE_PORT_MASK, and PARSE_PORT_REQUIRE.
Referenced by ast_sockaddr_parse(), ast_sockaddr_resolve(), extract_host_from_hostport(), rtcp_do_debug_ip(), rtp_do_debug_ip(), setup_stunaddr(), and sip_parse_host().
00133 { 00134 char *s = str; 00135 char *orig_str = str;/* Original string in case the port presence is incorrect. */ 00136 char *host_end = NULL;/* Delay terminating the host in case the port presence is incorrect. */ 00137 00138 ast_debug(5, "Splitting '%s' into...\n", str); 00139 *host = NULL; 00140 *port = NULL; 00141 if (*s == '[') { 00142 *host = ++s; 00143 for (; *s && *s != ']'; ++s) { 00144 } 00145 if (*s == ']') { 00146 host_end = s; 00147 ++s; 00148 } 00149 if (*s == ':') { 00150 *port = s + 1; 00151 } 00152 } else { 00153 *host = s; 00154 for (; *s; ++s) { 00155 if (*s == ':') { 00156 if (*port) { 00157 *port = NULL; 00158 break; 00159 } else { 00160 *port = s; 00161 } 00162 } 00163 } 00164 if (*port) { 00165 host_end = *port; 00166 ++*port; 00167 } 00168 } 00169 00170 switch (flags & PARSE_PORT_MASK) { 00171 case PARSE_PORT_IGNORE: 00172 *port = NULL; 00173 break; 00174 case PARSE_PORT_REQUIRE: 00175 if (*port == NULL) { 00176 ast_log(LOG_WARNING, "Port missing in %s\n", orig_str); 00177 return 0; 00178 } 00179 break; 00180 case PARSE_PORT_FORBID: 00181 if (*port != NULL) { 00182 ast_log(LOG_WARNING, "Port disallowed in %s\n", orig_str); 00183 return 0; 00184 } 00185 break; 00186 } 00187 00188 /* Can terminate the host string now if needed. */ 00189 if (host_end) { 00190 *host_end = '\0'; 00191 } 00192 ast_debug(5, "...host '%s' and port '%s'.\n", *host, *port ? *port : ""); 00193 return 1; 00194 }
static char* ast_sockaddr_stringify | ( | const struct ast_sockaddr * | addr | ) | [inline, static] |
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition at line 210 of file netsock2.h.
References AST_SOCKADDR_STR_DEFAULT, and ast_sockaddr_stringify_fmt().
Referenced by __sip_xmit(), _sip_show_peer(), add_sdp(), apply_directmedia_ha(), ast_append_ha(), ast_apply_ha(), ast_parse_arg(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_sendcng(), ast_sip_ouraddrfor(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_server_start(), ast_udptl_bridge(), ast_udptl_read(), ast_udptl_write(), bridge_p2p_rtp_write(), check_peer_ok(), check_via(), create_dtmf_frame(), dnsmgr_refresh(), gtalk_update_externip(), handle_cli_iax2_show_registry(), handle_cli_udptl_set_debug(), handle_incoming(), handle_manager_show_settings(), handle_request_bye(), handle_request_do(), handle_request_invite(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_info(), handle_response_message(), handle_response_notify(), handle_response_refer(), manager_iax2_show_registry(), multicast_rtp_write(), on_dns_update_mwi(), on_dns_update_peer(), on_dns_update_registry(), parse_register_contact(), process_cn_rfc3389(), process_dtmf_rfc2833(), process_sdp(), reg_source_db(), register_verify(), reload_config(), remote_bridge_loop(), retrans_pkt(), rtcp_do_debug_ip(), rtp_do_debug_ip(), send_request(), send_response(), set_destination(), sip_acf_channel_read(), sip_set_rtp_peer(), sip_set_udptl_peer(), sip_show_channel(), sip_show_settings(), sip_show_tcp(), sip_tcptls_read(), and stun_monitor_request().
00211 { 00212 return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_DEFAULT); 00213 }
static char* ast_sockaddr_stringify_addr | ( | const struct ast_sockaddr * | addr | ) | [inline, static] |
Wrapper around ast_sockaddr_stringify_fmt() to return an address only.
Definition at line 240 of file netsock2.h.
References AST_SOCKADDR_STR_ADDR, and ast_sockaddr_stringify_fmt().
Referenced by __iax2_show_peers(), _sip_show_peer(), _sip_show_peers_one(), add_sdp(), ast_ouraddrfor(), build_peer(), function_iaxpeer(), function_sipchaninfo_read(), function_sippeer(), gtalk_create_candidates(), httpstatus_callback(), manager_iax2_show_peer_list(), parse_register_contact(), realtime_peer(), realtime_update_peer(), register_verify(), reload_config(), show_channels_cb(), show_chanstats_cb(), sip_acf_channel_read(), sip_do_debug_ip(), sip_do_debug_peer(), sip_show_channel(), and sip_show_settings().
00241 { 00242 return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_ADDR); 00243 }
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.
Definition at line 257 of file netsock2.h.
References AST_SOCKADDR_STR_ADDR_REMOTE, and ast_sockaddr_stringify_fmt().
Referenced by add_sdp(), and copy_via_headers().
00258 { 00259 return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_ADDR_REMOTE); 00260 }
char* ast_sockaddr_stringify_fmt | ( | const struct ast_sockaddr * | addr, | |
int | format | |||
) |
Convert a socket address to a string.
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.
addr | The input to be stringified | |
format | one of the following: AST_SOCKADDR_STR_DEFAULT: a.b.c.d:xyz for IPv4 [a:b:c:...:d]:xyz for IPv6. AST_SOCKADDR_STR_ADDR: address only a.b.c.d for IPv4 a:b:c:...:d for IPv6. AST_SOCKADDR_STR_HOST: address only, suitable for a URL a.b.c.d for IPv4 [a:b:c:...:d] for IPv6. AST_SOCKADDR_STR_PORT: port only |
(null) | addr is null | |
"" | An error occurred during processing | |
string | The stringified form of the address |
Definition at line 67 of file netsock2.c.
References ast_log(), ast_sockaddr_ipv4_mapped(), ast_sockaddr_is_ipv6_link_local(), ast_sockaddr_isnull(), AST_SOCKADDR_STR_ADDR, AST_SOCKADDR_STR_DEFAULT, AST_SOCKADDR_STR_FORMAT_MASK, AST_SOCKADDR_STR_HOST, AST_SOCKADDR_STR_PORT, AST_SOCKADDR_STR_REMOTE, ast_sockaddr_stringify_buf, ast_str_buffer(), ast_str_set(), ast_str_thread_get(), ast_sockaddr::len, LOG_ERROR, ast_sockaddr::ss, and str.
Referenced by ast_sockaddr_stringify(), ast_sockaddr_stringify_addr(), ast_sockaddr_stringify_addr_remote(), ast_sockaddr_stringify_host(), ast_sockaddr_stringify_host_remote(), ast_sockaddr_stringify_port(), and ast_sockaddr_stringify_remote().
00068 { 00069 struct ast_sockaddr sa_ipv4; 00070 const struct ast_sockaddr *sa_tmp; 00071 char host[NI_MAXHOST]; 00072 char port[NI_MAXSERV]; 00073 struct ast_str *str; 00074 int e; 00075 static const size_t size = sizeof(host) - 1 + sizeof(port) - 1 + 4; 00076 00077 00078 if (ast_sockaddr_isnull(sa)) { 00079 return "(null)"; 00080 } 00081 00082 if (!(str = ast_str_thread_get(&ast_sockaddr_stringify_buf, size))) { 00083 return ""; 00084 } 00085 00086 if (ast_sockaddr_ipv4_mapped(sa, &sa_ipv4)) { 00087 sa_tmp = &sa_ipv4; 00088 } else { 00089 sa_tmp = sa; 00090 } 00091 00092 if ((e = getnameinfo((struct sockaddr *)&sa_tmp->ss, sa_tmp->len, 00093 format & AST_SOCKADDR_STR_ADDR ? host : NULL, 00094 format & AST_SOCKADDR_STR_ADDR ? sizeof(host) : 0, 00095 format & AST_SOCKADDR_STR_PORT ? port : 0, 00096 format & AST_SOCKADDR_STR_PORT ? sizeof(port): 0, 00097 NI_NUMERICHOST | NI_NUMERICSERV))) { 00098 ast_log(LOG_ERROR, "getnameinfo(): %s\n", gai_strerror(e)); 00099 return ""; 00100 } 00101 00102 if ((format & AST_SOCKADDR_STR_REMOTE) == AST_SOCKADDR_STR_REMOTE) { 00103 char *p; 00104 if (ast_sockaddr_is_ipv6_link_local(sa) && (p = strchr(host, '%'))) { 00105 *p = '\0'; 00106 } 00107 } 00108 00109 switch ((format & AST_SOCKADDR_STR_FORMAT_MASK)) { 00110 case AST_SOCKADDR_STR_DEFAULT: 00111 ast_str_set(&str, 0, sa_tmp->ss.ss_family == AF_INET6 ? 00112 "[%s]:%s" : "%s:%s", host, port); 00113 break; 00114 case AST_SOCKADDR_STR_ADDR: 00115 ast_str_set(&str, 0, "%s", host); 00116 break; 00117 case AST_SOCKADDR_STR_HOST: 00118 ast_str_set(&str, 0, 00119 sa_tmp->ss.ss_family == AF_INET6 ? "[%s]" : "%s", host); 00120 break; 00121 case AST_SOCKADDR_STR_PORT: 00122 ast_str_set(&str, 0, "%s", port); 00123 break; 00124 default: 00125 ast_log(LOG_ERROR, "Invalid format\n"); 00126 return ""; 00127 } 00128 00129 return ast_str_buffer(str); 00130 }
static char* ast_sockaddr_stringify_host | ( | const struct ast_sockaddr * | addr | ) | [inline, static] |
Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brackets for IPv6).
Definition at line 271 of file netsock2.h.
References AST_SOCKADDR_STR_HOST, and ast_sockaddr_stringify_fmt().
Referenced by peers_data_provider_get(), and reg_source_db().
00272 { 00273 return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_HOST); 00274 }
static char* ast_sockaddr_stringify_host_remote | ( | const struct ast_sockaddr * | addr | ) | [inline, static] |
Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brackets for IPv6).
Definition at line 289 of file netsock2.h.
References AST_SOCKADDR_STR_HOST_REMOTE, and ast_sockaddr_stringify_fmt().
Referenced by add_diversion_header(), add_rpid(), build_callid_registry(), build_reply_digest(), create_addr_from_peer(), initreqprep(), sip_poke_peer(), sip_sanitized_host(), and transmit_notify_with_mwi().
00290 { 00291 return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_HOST_REMOTE); 00292 }
static char* ast_sockaddr_stringify_port | ( | const struct ast_sockaddr * | addr | ) | [inline, static] |
Wrapper around ast_sockaddr_stringify_fmt() to return a port only.
Definition at line 302 of file netsock2.h.
References AST_SOCKADDR_STR_PORT, and ast_sockaddr_stringify_fmt().
Referenced by _sip_show_peers_one(), add_sdp(), httpstatus_callback(), realtime_peer_by_addr(), realtime_update_peer(), and register_verify().
00303 { 00304 return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_PORT); 00305 }
static char* ast_sockaddr_stringify_remote | ( | const struct ast_sockaddr * | addr | ) | [inline, static] |
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition at line 227 of file netsock2.h.
References AST_SOCKADDR_STR_DEFAULT_REMOTE, and ast_sockaddr_stringify_fmt().
Referenced by build_callid_pvt(), build_contact(), build_via(), and generate_uri().
00228 { 00229 return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_DEFAULT_REMOTE); 00230 }