Tool/software: TI-RTOS
I'm trying to get the DNS to work, but it seems to be not so easy. The function DNSGetHostByName fails always to resolve IP-address and that is why I have to use getaddrinfo. The only problem is that it only works if I create a task dynamically from networkIPAddrHook. If I create a task statically (means adding it to .cfg file) it fails to get address. Below all the code and output.
TI-RTOS: 2.16.1.14
XDCTools: 3.32.0.06
NDK: 2.25.00.09
.cfg
/* ================ NDK configuration ================ */ var Ndk = xdc.loadPackage('ti.ndk.config'); var Global = xdc.useModule('ti.ndk.config.Global'); var Ip = xdc.useModule('ti.ndk.config.Ip'); var Udp = xdc.useModule('ti.ndk.config.Udp'); var Tcp = xdc.useModule('ti.ndk.config.Tcp'); var Dns = xdc.useModule('ti.ndk.config.Dns'); Global.IPv6 = false; Global.stackLibType = Global.MIN; Global.networkOpenHook = "&TcpHooks_vNetOpenHook"; Global.networkIPAddrHook = "&TcpHooks_vIPAddrHook"; (This fails to resolve the ip-address) var task11Params = new Task.Params(); task11Params.instance.name = "hDnsTest"; task11Params.priority = 1; Program.global.hDnsTest = Task.create("&testTaskFxn", task11Params); /* automatically call fdOpen/CloseSession for our sockets Task */ Global.autoOpenCloseFD = true; Global.pktNumFrameBufs = 10; Global.memRawPageCount = 6; Global.ndkThreadStackSize = 1536; Global.lowTaskStackSize = 1024; Global.normTaskStackSize = 1024; Global.highTaskStackSize = 1024; //Global.stackBeginHook = "&TcpHooks_vReadIPAddress"; Tcp.transmitBufSize = 1024; Tcp.receiveBufSize = 1024; Ip.autoIp = true;
tcphooks.c
Task to resolve ip-address for to test #define HOSTNAME "www.google.de" static char strIp[INET_ADDRSTRLEN]; void testTaskFxn(UArg arg0, UArg arg1) { struct addrinfo *server_data = NULL; int result; Task_sleep(5000); while(1) { System_printf("!!!!!!!!!!\n", result); result = getaddrinfo(HOSTNAME, "0", NULL, &server_data); System_printf("getaddrinfo result: %d\n", result); if (result == 0 && server_data != NULL) { struct sockaddr addr = *(server_data->ai_addr); inet_ntop(AF_INET, &((struct sockaddr_in *)&addr)->sin_addr, strIp, INET_ADDRSTRLEN); System_printf("Resolved address:%s\n", strIp); freeaddrinfo(server_data); server_data = NULL; } Task_sleep(5000); } }
networkIPAddrHook: void TcpHooks_vIPAddrHook(IPN IPAddr, uint IfIdx, uint fAdd) { IPN IPTmp; CI_IPNET NA; HANDLE hCfg; int rc = 0; char IPString[16]; hCfg = CfgGetDefault(); /* Initialize the IP Address block. */ bzero(&NA, sizeof(CI_IPNET)); if (fAdd) { System_printf("networkIPAddrHook: Network Added\n"); } else { System_printf("networkIPAddrHook: Network Removed\n"); } IPTmp = ntohl(IPAddr); System_printf("networkIPAddrHook:\tIf-%d:%d.%d.%d.%d\n", IfIdx, (UINT8)(IPTmp>>24)&0xFF, (UINT8)(IPTmp>>16)&0xFF, (UINT8)(IPTmp>>8)&0xFF, (UINT8)IPTmp&0xFF); /* Print the IP address information only if one is present. */ if (CfgGetImmediate(hCfg, CFGTAG_IPNET, 1, 1, sizeof(NA), (UINT8 *)&NA) == sizeof(NA)) { /* Yes the device was configured and we got the IP address/Mask */ NtIPN2Str (NA.IPAddr, IPString); System_printf("IP Address: %s\n", IPString); NtIPN2Str (NA.IPMask, IPString); System_printf("IP Subnet Mask: %s\n", IPString); } else { System_printf("IP Address & SUBNET MASK NOT AVAILABLE\n"); } rc = CfgGetImmediate(hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER, 1, 4, (UINT8 *)&IPTmp ); if (rc == 4) { IPTmp = ntohl(IPTmp); System_printf("networkIPAddrHook:\tIf-%d: DNS = %d.%d.%d.%d\n", IfIdx, (UINT8)(IPTmp>>24)&0xFF, (UINT8)(IPTmp>>16)&0xFF, (UINT8)(IPTmp>>8)&0xFF, (UINT8)IPTmp&0xFF); } else { System_printf("networkIPAddrHook: DNS IP Fetch Failed!!\n"); } // This will be created if the task is not defined in .cfg file Task_Params taskParams; Error_Block eb; static bool init = false; static Task_Handle taskHandle; /* Create a HTTP task when the IP address is added */ if (fAdd && !init) { init = true; Error_init(&eb); Task_Params_init(&taskParams); taskParams.stackSize = 4096; taskParams.priority = 1; taskHandle = Task_create((Task_FuncPtr)testTaskFxn, &taskParams, &eb); if (taskHandle == NULL) { System_printf("Failed to create Task\n"); } else { System_printf("created a Task at prioirty 1\r\n"); } } }
Results:
When the task is created in ipaddhook:
,!!!!!!!!!!
,getaddrinfo result: 0
,Resolved address:216.58.213.195
When the task is created in .cfg
,!!!!!!!!!!
,00005.005 getaddrinfo: Error: couldn't resolve host name "www.google.de"
,
,getaddrinfo result: -2
,!!!!!!!!!!
,00010.005 getaddrinfo: Error: couldn't resolve host name "www.google.de"
,
,getaddrinfo result: -2
So the question is, why can I call the getaddrinfo successfully only from the task created dynamically from the ipaddrhook? And why the DNSGetHostByName doesn't work at all?
JHi