Dual WAN latency based Failover

  • ATTENTION! As of November 1, 2020, you are not able to reply to threads 6 months after the thread is opened if there are more than 500 posts in the thread.
    Threads will not be locked, so posts may still be edited by their authors.
    Just start a new thread on the topic to post if you get an error message when trying to reply to a thread.

Colanta

Occasional Visitor
Hello,

Currently i have a problem with my main isp (300/10), where its connection node on my town, while working (0.2/10), gives an insane high latency (300ms+) to Google DNS Server, pretty away from the normal (20ms).

I'm looking to add a parameter to the falldown configuration, to be ping not responding or higher than XXX, but i really do not know if it is possible to do this in an User Script/WatchDog (haven't found it on source yet?) mod.

Any Ideas? or something already posted and done elsewhere?

Thank You

PD. Sorry for my English
 
Last edited by a moderator:

Colanta

Occasional Visitor
Hello,

Currently i have a problem with my main isp (300/10), where its connection node on my town, while working (0.2/10), gives an insane high latency (300ms+) to Google DNS Server, pretty away from the normal (20ms).

I'm looking to add a parameter to the falldown configuration, to be ping not responding or higher than XXX, but i really do not know if it is possible to do this in an User Script/WatchDog (haven't found it on source yet?) mod.

Any Ideas? or something already posted and done elsewhere?

Thank You

PD. Sorry for my English
I've found what i guess is the code responsible for checking the dual wan connectivity by ping, i've done a small (dirty) patch just to try on the next node failure:

Code:
int do_ping_detect(int wan_unit, const char *target)
{
	FILE *fp;
	char cmd[512];
	int count, ret = -1, validLatency;
	float latency = -1;
	int debug = nvram_get_int("ping_debug");

	/* can be default target, if necesary *//*
	if (!target)
		target = nvram_safe_get("ping_target");
	*/

	/* Check for valid domain to avoid shell escaping */
	if (!is_valid_domainname(target))
		return -1;
	if (debug)
		_dprintf("%s: %s %s\n", __FUNCTION__, "check", target);

	snprintf(cmd, sizeof(cmd), "ping -c1 -w2 -s32 %s -Mdont '%s' 2>/dev/null",
		 nvram_get_int("ttl_spoof_enable") ? "" : "-t128", target);
	if ((fp = popen(cmd, "r")) != NULL) {
		while (fgets(cmd, sizeof(cmd), fp) != NULL) {
			if (sscanf(cmd, "%*s %*s transmitted, %d %*s received", &count) == 1) {
				ret = (count > 0);
				if (debug)
					_dprintf("%s: %s %s\n", __FUNCTION__, target, ret ? "ret: ok" : "ret: fail");
			} else if (sscanf(cmd, "rtt %*s = %f/%*s ms", &latency) == 1){
			    //TODO: Get '100' from an NVRAM Value
				validLatency = (latency < 100);
				if (debug)
				    _dprintf("%s: %s %s\n", __FUNCTION__, target, validLatency ? "latency: ok" : "latency: fail");
				break;
			}
		}
		pclose(fp);
	}

	return ret && validPing;
}
 

Similar threads

Latest threads

Sign Up For SNBForums Daily Digest

Get an update of what's new every day delivered to your mailbox. Sign up here!
Top