no way to compare when less than two revisions

Differences

This shows you the differences between two versions of the page.


sdk:set-default-route-based-on-current-ssid [2014/11/26 16:26] (current) – created - external edit 127.0.0.1
Line 1: Line 1:
 +====== Set fake default route dynamically based on SSID ======
 +This script checks every 5 seconds which interface should be used as default gateway. As the default gateway is managed by the link-manager, a fake default gateway is configured by this script. \\
 +Conditions could be any, here it depend on which WLAN SSID the router is connected.
 +<code c set-route.are>
 +/* DESC: set route to server depending on active WWAN / WLAN network
 + * Copyright (C) 2014 NetModule AG
 + *
 + */
 + 
 +nb_syslog("starting");
 + 
 +void restartIPsec(){ 
 +    nb_config_set("ipsec.status=0");
 +    sleep(6); // lower valus result in disabled ipsec admin status
 +    nb_config_set("ipsec.status=1");
 +}
 +void addRoute(int id, string interface, string destination, string netmask, string gateway){ 
 +    route = strcat("route." ,id, ".metric=", 0);
 +    route = strcat(route, " route." ,id, ".interface=", interface);
 +    route = strcat(route, " route." ,id, ".target=", destination);
 +    route = strcat(route, " route." ,id, ".netmask=", netmask);
 +    route = strcat(route, " route." ,id, ".gateway=", gateway);
 +    nb_config_set(route);
 +}   
  
 +
 +lastWanInterface = "";
 +while (1) {
 +    wanInterface = "";
 +    status = nb_status("wan");
 +    wwan_status = status.WANLINK1_STATE;
 +    wlan_status = status.WANLINK2_STATE;
 +    wlan_network = status.WANLINK2_NETWORK;
 +    SERVER = nb_config_get("ipsec.0.remote.serverIp");
 +    nb_syslog("WLAN is %s with %s", wlan_status, wlan_network);
 +    nb_syslog("WWAN is %s", wwan_status);
 +    nb_syslog("routing traffic over %s", lastWanInterface); 
 +
 +    if (wlan_status == "up" && wlan_network == "kis") { 
 +        // take wlan link for IPsec
 +        wanInterface = "wlan0";   
 +    } else if (wwan_status == "up" || wlan_status == "up" && wlan_network == "video") { 
 +        // take mobile link for IPsec
 +        wanInterface = "wwan0";
 +    }
 +    if (wanInterface != "" && wanInterface != lastWanInterface) {
 +        if (wanInterface == "wlan0") {
 +            addRoute(0, wanInterface, SERVER, "255.255.255.255", struct_get(status, "WANLINK2_GATEWAY"));
 +            addRoute(1, wanInterface, "0.0.0.0", "128.0.0.0", struct_get(status, "WANLINK2_GATEWAY"));
 +            addRoute(2, wanInterface, "128.0.0.0", "128.0.0.0", struct_get(status, "WANLINK2_GATEWAY"));
 +            nb_syslog("routing traffic over wlan"); 
 +        } else if (wanInterface == "wwan0") {    
 +            addRoute(0, wanInterface, SERVER, "255.255.255.255", struct_get(status, "WANLINK1_GATEWAY")); 
 +            addRoute(1, wanInterface, "0.0.0.0", "128.0.0.0", struct_get(status, "WANLINK1_GATEWAY"));
 +            addRoute(2, wanInterface, "128.0.0.0", "128.0.0.0", struct_get(status, "WANLINK1_GATEWAY"));
 +            nb_syslog("routing traffic over mobile"); 
 +        }
 +        restartIPsec();
 +        lastWanInterface = wanInterface;
 +    }
 +    sleep(5);
 +}
 +nb_syslog("exit");
 +exit(0);
 +</code>