IP_GLOBAL int ipnet_loopback_if_setup(Ipnet_netif *netif) { int ret = 0; #ifdef IPCOM_USE_INET6 struct Ip_in6_addr lo_addr = IP_IN6ADDR_LOOPBACK_INIT; struct Ipnet_route_add_param param; struct Ipnet_ipv6_key key; struct Ipnet_ipv6_key mask; /* Add ::1 loopback address to interface */ (void)ipnet_ip6_add_addr(netif, &lo_addr, IP_TRUE, 0xffffffff, 0xffffffff, 128); /* All packets matching ff02::/16 with no scope specified must be rejected */ ipcom_memset(&key, 0, sizeof(key)); ipcom_memset(&mask, 0, sizeof(mask)); ipcom_memset(¶m, 0, sizeof(param)); key.addr.in6.addr16[0] = ip_htons(0xff02); ipnet_route_create_mask(&mask.addr, 16); param.domain = IP_AF_INET6; param.key = &key; param.netmask = &mask; param.flags = IPNET_RTF_X_HIDDEN | IPNET_RTF_REJECT | IPNET_RTF_DONE; param.netif = netif; param.vr = netif->vr_index; param.table = IPCOM_ROUTE_TABLE_DEFAULT; ret = ipnet_route_add(¶m); if (ret < 0) IPCOM_LOG2(ERR, "Failed to setup routes on %s in vr %d", netif->ipcom.name, netif->vr_index); #endif /* IPCOM_USE_INET6 */ #ifdef IPCOM_USE_INET /* Add 127.0.0.1 loopback address to interface */ (void)ipnet_ip4_add_addr(netif, ip_htonl(IP_INADDR_LOOPBACK), ip_htonl(0xff000000), IP_TRUE, IPNET_ADDR_TYPE_UNICAST); #endif /* IPCOM_USE_INET */ return ret; }
IP_STATIC int ipnet_sockdev_ip6_create_addr(Ipnet_netif *netif, IP_CONST struct Ip_in6_addr* prefix, struct Ip_in6_addr* in6_addr) { in6_addr->in6.addr16[0] = prefix->in6.addr16[0]; in6_addr->in6.addr16[1] = prefix->in6.addr16[1]; in6_addr->in6.addr16[2] = prefix->in6.addr16[2]; in6_addr->in6.addr16[3] = prefix->in6.addr16[3]; in6_addr->in6.addr16[4] = 0; in6_addr->in6.addr16[5] = 0; IP_SET_32ON16(&in6_addr->in6.addr32[3], ip_htonl(((Ipnet_socket *) netif->ipcom.plink)->ipcom.fd)); return 0; }
/* *=========================================================================== * ipnet_nat_proxy_sip_localaddrprocess *=========================================================================== * Description: Process the private transport address * Parameters: pmsgstr - pointer to message * pipaddrstr - pointer to buffer for the local address string * pgaddrstr - pointer to buffer for the gloab address string * pcallid - pointer to the call id string * type - type of search * ppend - pointer to pointer to last byte of message * Returns: The next character position after the parsed string or * IP_NULL if parse fails */ IP_STATIC char * ipnet_nat_proxy_sip_localaddrprocess(char *pmsgstr, char *pipaddrstr, char *pgaddrstr, char *pcallid, int type, Ipnet_nat_proxy_param *param, char **ppend) { int localport, newport; int len, diff; Ip_u32 ipaddr; char *pstart; char tmpholder[30]; Ipnet_nat_proxy_tuple proxy_tuple; (void)pcallid; SIP_SKIP_SPACES(pmsgstr); pstart = pmsgstr; pmsgstr = ipnet_nat_proxy_sip_addrportstrparse(pmsgstr, &ipaddr, &localport, type); if (pmsgstr == IP_NULL) return IP_NULL; if (!localport) localport = SIP_DEFAULT_PORT; if (type == SIP_ADDRESS_PORT_STRING) { ipaddr = ip_htonl(ipaddr); (void)ipcom_inet_ntop(IP_AF_INET, &ipaddr, pipaddrstr, 16); ipaddr = ip_ntohl(ipaddr); } else /* PORT string only */ { ipaddr = ipcom_inet_addr(pipaddrstr); ipaddr = ip_ntohl(ipaddr); } /* make sure it is the private address, otherwise no translation */ if (ipaddr != param->tuple.private_addr) return pmsgstr; /* create a bind entry for this transport address if it hasn't been created yet */ if (param->tuple.private_port != localport) { ipcom_memset(&proxy_tuple, 0, sizeof(proxy_tuple)); proxy_tuple.protocol = IP_IPPROTO_UDP; proxy_tuple.private_addr = ipaddr; proxy_tuple.private_port = localport; newport = ipnet_nat_proxy_add_mapping(&proxy_tuple, IPNET_NAT_SIP_ENTRY_MEDIA_TIMEOUT, param->mapping, IP_FALSE, /* Use port translation */ IP_TRUE, /* Inbound session */ IP_NULL, IP_NULL); if (newport < 0) { IPCOM_LOG2(ERR, "ipnet_nat_proxy_sip_localaddrprocess() :: Failed to add mapping for address = 0x%08x, port = %d", ipaddr, localport); } else { IPCOM_LOG2(DEBUG, "ipnet_nat_proxy_sip_localaddrprocess() :: Added mapping for address = 0x%08x, port = %d", ipaddr, localport); } } else { newport = param->nat_port; IPCOM_LOG2(DEBUG, "ipnet_nat_proxy_sip_localaddrprocess() :: Mapping already existed for address = 0x%08x, port = %d", ipaddr, localport); } /* compose the new modified string */ len = 0; if (type == SIP_ADDRESS_PORT_STRING) { ipaddr = ip_htonl(param->nat_addr); (void)ipcom_inet_ntop(IP_AF_INET, &ipaddr, tmpholder, 16); ipcom_strcpy(pgaddrstr, tmpholder); len = ipcom_strlen(tmpholder); tmpholder[len++]= ':'; } ipcom_sprintf(tmpholder + len, "%d", newport); IPCOM_LOG1(DEBUG, "ipnet_nat_proxy_sip_localaddrprocess() new str: %s", tmpholder); if (ipnet_nat_proxy_sip_modmsg(tmpholder, ipcom_strlen(tmpholder), pstart, pmsgstr - pstart, ppend) < 0) { return IP_NULL; } diff = ipcom_strlen(tmpholder) - (pmsgstr - pstart); return pmsgstr + diff; }