/* * sip_config_get_nat_ipaddr() * * Get the nat IP address. * Note: the IP Address is returned in the non-Telecaster * SIP format, which is not byte reversed. * Eg. 0xac2c33f8 = 161.44.51.248 */ void sip_config_get_nat_ipaddr (cpr_ip_addr_t *ip_addr) { cpr_ip_addr_t IPAddress; char address[MAX_IPADDR_STR_LEN]; int dnsErrorCode = 1; if (redirected_nat_ipaddr.type == CPR_IP_ADDR_INVALID) { config_get_string(CFGID_NAT_ADDRESS, address, sizeof(address)); if ((cpr_strcasecmp(address, UNPROVISIONED) != 0) && (address[0] != 0)) { dnsErrorCode = dnsGetHostByName(address, &IPAddress, 100, 1); } if (dnsErrorCode == 0) { util_ntohl(ip_addr, &IPAddress); return ; } else { /* * If the NAT address is not provisioned or * unavailable, return the local address instead. */ sip_config_get_net_device_ipaddr(ip_addr); return; } } else { *ip_addr = redirected_nat_ipaddr; return ; } }
/** * Returns dot notation IP address phone used for registration purpose. If phone is not * registered, then "0.0.0.0" is returned. * @return char IP address used to register phone. */ cc_string_t CCAPI_DeviceInfo_getSignalingIPAddress(cc_deviceinfo_ref_t handle) { static const char *fname="CCAPI_DeviceInfo_getSignalingIPAddress"; cpr_ip_addr_t ip_addr = {0,{0}}; sip_config_get_net_device_ipaddr(&ip_addr); ipaddr2dotted(g_deviceInfo.registration_ip_addr, &ip_addr); CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), g_deviceInfo.registration_ip_addr); return g_deviceInfo.registration_ip_addr; }
int sip_platform_udp_channel_create (cpr_ip_mode_e ip_mode, cpr_socket_t *s, cpr_ip_addr_t *remote_ipaddr, uint16_t remote_port, uint32_t local_udp_port) { static const char *fname = "sip_platform_udp_channel_create"; cpr_sockaddr_storage sock_addr; uint16_t addr_len; cpr_sockaddr_storage local_sock_addr; cpr_ip_addr_t local_signaladdr; int tos_dscp_val = 0; // set to default if there is no config. for dscp CPR_IP_ADDR_INIT(local_signaladdr); if (*s != INVALID_SOCKET) { (void) sipSocketClose(*s, FALSE); } if (ip_mode == CPR_IP_MODE_IPV6 || ip_mode == CPR_IP_MODE_DUAL) { af_family_connect = AF_INET6; } else { af_family_connect = AF_INET; } /* * Create socket */ *s = cprSocket(af_family_connect, SOCK_DGRAM, 0); if (*s == INVALID_SOCKET) { CCSIP_DEBUG_ERROR(get_debug_string(DEBUG_GENERAL_SYSTEMCALL_FAILED), fname, "cprSocket unable to open socket", cpr_errno); /* Try opening ipv4 socket */ if (ip_mode == CPR_IP_MODE_DUAL) { CCSIP_DEBUG_TASK("%s: cprSocket Open failed for IPv6 trying IPv4", fname); af_family_connect = AF_INET; *s = cprSocket(af_family_connect, SOCK_DGRAM, 0); if (*s == INVALID_SOCKET) { CCSIP_DEBUG_ERROR(get_debug_string(DEBUG_GENERAL_SYSTEMCALL_FAILED), fname, "cprSocket unable to open AF_INET socket", cpr_errno); return SIP_ERROR; } } } sip_config_get_net_device_ipaddr(&local_signaladdr); memset(&local_sock_addr, 0, sizeof(local_sock_addr)); (void) sip_set_sockaddr(&local_sock_addr, af_family_connect, local_signaladdr, 0, &addr_len); CCSIP_DEBUG_REG_STATE(DEB_F_PREFIX"local_signaladdr.u.ip4=%x\n", DEB_F_PREFIX_ARGS(SIP_SDP, fname), local_signaladdr.u.ip4); if(cprBind(*s, (cpr_sockaddr_t *)&local_sock_addr, addr_len)){ CCSIP_DEBUG_ERROR(SIP_F_PREFIX"UDP bind failed with errno %d\n", fname, cpr_errno); (void) sipSocketClose(*s, FALSE); *s = INVALID_SOCKET; return SIP_ERROR; } /* * Connect to remote address */ (void) sip_set_sockaddr(&sock_addr, af_family_connect, *remote_ipaddr, remote_port, &addr_len); /* if (cprConnect(*s, (cpr_sockaddr_t *)&sock_addr, addr_len) == CPR_FAILURE) { CCSIP_DEBUG_ERROR(get_debug_string(DEBUG_GENERAL_SYSTEMCALL_FAILED), fname, "cprConnect", cpr_errno); (void) sipSocketClose(*s, FALSE); *s = INVALID_SOCKET; return SIP_ERROR; } */ // set IP tos/dscp value for SIP messaging config_get_value(CFGID_DSCP_FOR_CALL_CONTROL, (int *)&tos_dscp_val, sizeof(tos_dscp_val)); if (cprSetSockOpt(*s, SOL_IP, IP_TOS, (void *)&tos_dscp_val, sizeof(tos_dscp_val)) == CPR_FAILURE) { // do NOT take hard action; just log the error and move on CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Unable to set IP TOS %d on UDP socket. " "cpr_errno = %d\n", fname, tos_dscp_val, cpr_errno); } return SIP_OK; }