/* function: dns64_detection * does dns lookups to set the plat subnet or exits on failure, waits forever for a dns response with a query backoff timer */ void dns64_detection() { int backoff_sleep, status; struct in6_addr tmp_ptr; backoff_sleep = 1; while(1) { status = plat_prefix(Global_Clatd_Config.plat_from_dns64_hostname,&tmp_ptr); if(status > 0) { memcpy(&Global_Clatd_Config.plat_subnet, &tmp_ptr, sizeof(struct in6_addr)); return; } if(status < 0) { logmsg(ANDROID_LOG_FATAL, "dns64_detection/no dns64, giving up\n"); exit(1); } logmsg(ANDROID_LOG_WARN, "dns64_detection failed, sleeping for %d seconds", backoff_sleep); sleep(backoff_sleep); if(backoff_sleep >= 120) { backoff_sleep = 120; } else { backoff_sleep *= 2; } } }
/* function: dns64_detection * does dns lookups to set the plat subnet or exits on failure, waits forever for a dns response with a query backoff timer * net_id - (optional) netId to use, NETID_UNSET indicates use of default network */ void dns64_detection(unsigned net_id) { int backoff_sleep, status; struct in6_addr tmp_ptr; backoff_sleep = 1; while(1) { status = plat_prefix(Global_Clatd_Config.plat_from_dns64_hostname,net_id,&tmp_ptr); if(status > 0) { memcpy(&Global_Clatd_Config.plat_subnet, &tmp_ptr, sizeof(struct in6_addr)); return; } logmsg(ANDROID_LOG_WARN, "dns64_detection -- error, sleeping for %d seconds", backoff_sleep); sleep(backoff_sleep); backoff_sleep *= 2; if(backoff_sleep >= 120) { backoff_sleep = 120; } } }