Ejemplo n.º 1
0
HRESULT RTIP_SOCKETS_Driver::LoadAdapterConfiguration( UINT32 interfaceIndex, SOCK_NetworkConfiguration* config )
{
    NATIVE_PROFILE_PAL_NETWORK();
    if(interfaceIndex >= NETWORK_INTERFACE_COUNT) 
    {
        return CLR_E_INVALID_PARAMETER;
    }

    memcpy(config, &g_NetworkConfig.NetworkInterfaces[interfaceIndex], sizeof(g_NetworkConfig.NetworkInterfaces[interfaceIndex]));

    if(config->flags & SOCK_NETWORKCONFIGURATION_FLAGS_DHCP)
    {
        IFACE_INFO info;
        
        if(SOCK_SOCKET_ERROR != xn_interface_info(g_RTIP_SOCKETS_Driver.m_interfaces[interfaceIndex].m_interfaceNumber, &info ))
        {
            config->ipaddr     = *(UINT32*)info.my_ip_address;
            config->subnetmask = *(UINT32*)info.ip_mask;
            config->gateway    = *(UINT32*)info.gateways[0];
            config->dnsServer1 = *(UINT32*)info.dns_servers[0];
            config->dnsServer2 = *(UINT32*)info.dns_servers[1];
        }
        else
        {
            config->ipaddr     = 0;
            config->subnetmask = 0;
            config->gateway    = 0;
        }
    }
    
    
    return S_OK;
}
Ejemplo n.º 2
0
int RTIP_SOCKETS_Driver::GetAddrInfo(  const char* nodename, 
                                            char* servname, 
                                            const SOCK_addrinfo* hints, 
                                            SOCK_addrinfo** res )
{ 
    if(res == NULL || nodename == NULL) 
    {
        set_errno(EINVAL);
        return SOCK_SOCKET_ERROR;
    }


    *res = NULL;

    PFHOSTENT pHost = NULL;
    struct hostentext localHost;

    if(nodename[0] == '\0')
    {
        IFACE_INFO info;

        if(SOCK_SOCKET_ERROR != xn_interface_info(g_RTIP_SOCKETS_Driver.m_interfaces[0].m_interfaceNumber, &info ))
        {
            memset(&localHost, 0, sizeof(localHost));

            localHost.ip_addr.s_un.S_addr = *(UINT32*)info.my_ip_address;

            pHost = &localHost;
        }
    }
    else
    {
        // this method will be called to get both IP address from name and name from IP address, so nodename
        // can either be "www.xxx.com" or "xxx.xxx.xxx.xxx".  Therefore we will need to first get the IP bytes
        // gethostbyname will do this for either name or IP format, then we will need to get the name
        // by calling gethostbyaddr to get the host name.

        // first call is to get the IP bytes from string version (name or IP)
        pHost = gethostbyname((RTP_PFCHAR)nodename);

        // second call to get the host name
        if(pHost != NULL)
        {
            pHost = gethostbyaddr((RTP_PFCHAR)&pHost->ip_addr.s_un.S_addr, sizeof(UINT32), PF_INET);

            if(!pHost)
            {
                DEBUG_HANDLE_SOCKET_ERROR( "gethostbyaddr", FALSE );
            }
        }
        else
        {
            DEBUG_HANDLE_SOCKET_ERROR( "gethostbyname", FALSE );

        }
    }

    if(pHost)
    {
        SOCK_addrinfo* pAddrInfo = (SOCK_addrinfo*) private_malloc(sizeof(SOCK_addrinfo));

        if(pAddrInfo)
        {
            memset(pAddrInfo, 0, sizeof(SOCK_addrinfo));

            pAddrInfo->ai_family = RTP_NET_AF_INET;

            SOCK_sockaddr_in *pSockaddr = (SOCK_sockaddr_in*) private_malloc(sizeof(SOCK_sockaddr_in));

            if(pSockaddr)
            {
                memset(pSockaddr, 0, sizeof(SOCK_sockaddr_in));
                
                pSockaddr->sin_addr.S_un.S_addr = pHost->ip_addr.s_un.S_addr;
                pSockaddr->sin_family           = RTP_NET_AF_INET;

                pAddrInfo->ai_addr    = (SOCK_sockaddr*)pSockaddr;
                pAddrInfo->ai_addrlen = sizeof(SOCK_sockaddr_in);
            }

            if(pHost->sz_name != NULL)
            {
                int len = hal_strlen_s(pHost->sz_name);

                if(len > 0)
                {
                    int buffer_size = sizeof(char) * len + 1;
                    
                    pAddrInfo->ai_canonname = (char*) private_malloc(buffer_size);

                    if(pAddrInfo->ai_canonname)
                    {
                        hal_strcpy_s(pAddrInfo->ai_canonname, buffer_size, pHost->sz_name);
                    }
                }
            }
            
            *res = pAddrInfo;
        }
    }
    
    return (*res == NULL? SOCK_SOCKET_ERROR: 0);
}
Ejemplo n.º 3
0
BOOL RTIP_SOCKETS_Driver::Initialize()
{
    NATIVE_PROFILE_PAL_NETWORK();
    IFACE_INFO info;

    memset(g_RTIP_SOCKETS_Driver.m_interfaces, 0, sizeof(g_RTIP_SOCKETS_Driver.m_interfaces));

    /* Initialize the network stack   */
    if (rtp_net_init() != 0)
    {
        DEBUG_HANDLE_SOCKET_ERROR("rtp_net_init", TRUE);
        return FALSE;
    }

#if defined(NETWORK_USE_LOOPBACK)
    // Bind and Open the loopback driver
    g_LOOPBACK_Driver.Bind();
    
    if (g_LOOPBACK_Driver.Open() == SOCK_SOCKET_ERROR)
    {
        DEBUG_HANDLE_SOCKET_ERROR("loopback init", FALSE);
    }
#endif        

    for(int i=0; i<g_NetworkConfig.NetworkInterfaceCount; i++)
    {
        int interfaceNumber;
        
        SOCK_NetworkConfiguration *pNetCfg = &g_NetworkConfig.NetworkInterfaces[i];

        Network_Interface_Bind(i);

        interfaceNumber = Network_Interface_Open(i);
        
        if (interfaceNumber == SOCK_SOCKET_ERROR)
        {
            DEBUG_HANDLE_SOCKET_ERROR("Network init", FALSE);
            debug_printf("SocketError: %d\n", xn_getlasterror());
            continue;
        }

        g_RTIP_SOCKETS_Driver.m_interfaces[i].m_interfaceNumber = interfaceNumber;

        
        UpdateAdapterConfiguration(i, SOCK_NETWORKCONFIGURATION_UPDATE_DHCP | SOCK_NETWORKCONFIGURATION_UPDATE_DNS, pNetCfg);

        // default debugger interface
        if(0 == i)
        {
            // add multicast addresses to the routing table
            UINT32 mcast1 = SOCK_htonl(SOCK_DISCOVERY_MULTICAST_IPADDR);
            UINT32 mcast2 = SOCK_htonl(SOCK_DISCOVERY_MULTICAST_IPADDR_SND);
            UINT32 mask   = SOCK_htonl(SOCK_MAKE_IP_ADDR(255,255,255,255));
            
            if(SOCK_SOCKET_ERROR == xn_rt_add((RTP_PFCUINT8)&mcast1, (RTP_PFUINT8)&mask, (RTP_PFUINT8)0, RT_USEIFACEMETRIC, interfaceNumber, RT_INF))
            {
                DEBUG_HANDLE_SOCKET_ERROR("Multicast xn_rt_add (recv)", FALSE);
            }
            if(SOCK_SOCKET_ERROR == xn_rt_add((RTP_PFCUINT8)&mcast2, (RTP_PFUINT8)&mask, (RTP_PFUINT8)0, RT_USEIFACEMETRIC, interfaceNumber, RT_INF))
            {
                DEBUG_HANDLE_SOCKET_ERROR("Multicast xn_rt_add (send)", FALSE);
            }

            /* JRT - TBD call xn_ip_set_option */
            default_mcast_iface = interfaceNumber;
            
            xn_interface_info(interfaceNumber, &info );

            debug_printf( "ip address from interface info: %d.%d.%d.%d\r\n", (UINT32)info.my_ip_address[0], 
                                                                             (UINT32)info.my_ip_address[1],                                                                 
                                                                             (UINT32)info.my_ip_address[2], 
                                                                             (UINT32)info.my_ip_address[3] );
            
            debug_printf( "mac addrress from interface info: %x.%x.%x.%x.%x.%x\r\n", (UINT32)info.my_ethernet_address[0], 
                                                                                     (UINT32)info.my_ethernet_address[1],                                                                 
                                                                                     (UINT32)info.my_ethernet_address[2], 
                                                                                     (UINT32)info.my_ethernet_address[3],                                                            
                                                                                     (UINT32)info.my_ethernet_address[4], 
                                                                                     (UINT32)info.my_ethernet_address[5] );
        }
    }
    
    return TRUE;
}
Ejemplo n.º 4
0
/**This method is called when the RTIP DHCP client receives an IP
* configuration from the DHCP server.
*
* It sets IP address, subnet mask and default gateway according to
* offer from DHCP server.
*/
void RTIPDHCPClient::dhcpNewIPCallback(int ifaceno)
{
  IFACE_INFO ifinfo;

  RTIPDHCPClient *me =
    static_cast<RTIPDHCPClient*>(RTIPDHCPClient::getInstance());

  if ( me->minterfaceno != ifaceno)
  {
    return;
  }
  if (!me->menabled)
  {
    me->mpipstackconfigurator->refreshIPConfig();	//Due to timing, rtip might set the ip address, when we dont want it
    //this will reset to previous configuration
    return;
  }

  xn_interface_info(me->minterfaceno, &ifinfo);

  IPAddress ipaddress(ifinfo.my_ip_address);
  me->mipaddress = ipaddress;

  IPAddress subnetmask(ifinfo.ip_mask);
  me->msubnetmask = subnetmask;

  //Default gateway from dhcp server?:
  if(me->msession.params.router_option && me->msession.params.router_option_len > 0)
  {
    IPAddress defaultgateway(reinterpret_cast<unsigned char*>(me->msession.params.router_option));	//Use first gateway
    me->mdefaultgateway = defaultgateway;
  }
  else
  {
    me->mdefaultgateway = IPAddress(0,0,0,0);
  }

  if(me->msession.params.dns_server && me->msession.params.dns_server_len > 0)
  {
    IPAddress primarydns(reinterpret_cast<unsigned char*>(me->msession.params.dns_server));
    me->mprimarydns = primarydns;

    if(me->msession.params.dns_server_len > 4)
    {
      IPAddress secondarydns(reinterpret_cast<unsigned char*>(me->msession.params.dns_server)+4);
      me->msecondarydns = secondarydns;
    }
    else
    {
      me->msecondarydns = IPAddress(0,0,0,0);
    }
  }
  else
  {
    me->mprimarydns = IPAddress(0,0,0,0);
    me->msecondarydns = IPAddress(0,0,0,0);
  }


  me->mgotlease = true;
  me->gotNewLease();
}