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(&param, 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(&param);

    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;
}
Exemplo n.º 3
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;
}