4G/LTE - add watchdog and more
[tomato.git] / release / src / router / httpd / tomato.c
blobf884e9035e2ce7ee430096818d6dd1dcab8049d4
1 /*
3 Tomato Firmware
4 Copyright (C) 2006-2010 Jonathan Zarate
6 */
8 #include "tomato.h"
10 #include <sys/sysinfo.h>
11 #include <sys/stat.h>
12 #include <sys/types.h>
13 #include <sys/socket.h>
14 #include <arpa/inet.h>
15 #include <time.h>
18 // #define DEBUG_NOEXECSERVICE
19 #define DEBUG_NVRAMSET(k, v) _dprintf("nvram set %s=%s\n", k, v);
22 char *post_buf = NULL;
23 int rboot = 0;
24 extern int post;
26 static void asp_css(int argc, char **argv);
27 static void asp_resmsg(int argc, char **argv);
30 static void wo_tomato(char *url);
31 static void wo_update(char *url);
32 static void wo_service(char *url);
33 static void wo_shutdown(char *url);
34 static void wo_nvcommit(char *url);
35 // static void wo_logout(char *url);
38 // ----------------------------------------------------------------------------
41 void exec_service(const char *action)
43 int i;
45 _dprintf("exec_service: %s\n", action);
47 i = 10;
48 while ((!nvram_match("action_service", "")) && (i-- > 0)) {
49 _dprintf("%s: waiting before %d\n", __FUNCTION__, i);
50 sleep(1);
53 nvram_set("action_service", action);
54 kill(1, SIGUSR1);
56 i = 3;
57 while ((nvram_match("action_service", (char *)action)) && (i-- > 0)) {
58 _dprintf("%s: waiting after %d\n", __FUNCTION__, i);
59 sleep(1);
63 if (atoi(webcgi_safeget("_service_wait", ""))) {
64 i = 10;
65 while ((nvram_match("action_service", (char *)action)) && (i-- > 0)) {
66 _dprintf("%s: waiting after %d\n", __FUNCTION__, i);
67 sleep(1);
73 static void wi_generic_noid(char *url, int len, char *boundary)
75 if (post == 1) {
76 if (len >= (32 * 1024)) {
77 // syslog(LOG_WARNING, "POST max");
78 exit(1);
81 if (post_buf) free(post_buf);
82 if ((post_buf = malloc(len + 1)) == NULL) {
83 // syslog(LOG_CRIT, "Unable to allocate post buffer");
84 exit(1);
87 if (web_read_x(post_buf, len) != len) {
88 exit(1);
90 post_buf[len] = 0;
91 webcgi_init(post_buf);
95 void wi_generic(char *url, int len, char *boundary)
97 wi_generic_noid(url, len, boundary);
98 check_id(url);
101 // !!TB - CGI Support
102 void wi_cgi_bin(char *url, int len, char *boundary)
104 if (post_buf) free(post_buf);
105 post_buf = NULL;
107 if (post) {
108 if (len >= (128 * 1024)) {
109 syslog(LOG_WARNING, "POST length exceeded maximum allowed");
110 exit(1);
113 if (len > 0) {
114 if ((post_buf = malloc(len + 1)) == NULL) {
115 exit(1);
117 if (web_read_x(post_buf, len) != len) {
118 exit(1);
120 post_buf[len] = 0;
125 static void _execute_command(char *url, char *command, char *query, wofilter_t wof)
127 char webExecFile[] = "/tmp/.wxXXXXXX";
128 char webQueryFile[] = "/tmp/.wqXXXXXX";
129 char cmd[sizeof(webExecFile) + 10];
130 FILE *f;
131 int fe, fq = -1;
133 if ((fe = mkstemp(webExecFile)) < 0)
134 exit(1);
135 if (query) {
136 if ((fq = mkstemp(webQueryFile)) < 0) {
137 close(fe);
138 unlink(webExecFile);
139 exit(1);
143 if ((f = fdopen(fe, "wb")) != NULL) {
144 fprintf(f,
145 "#!/bin/sh\n"
146 "export REQUEST_METHOD=\"%s\"\n"
147 "export PATH=%s\n"
148 ". /etc/profile\n"
149 "%s%s %s%s\n",
150 post ? "POST" : "GET", getenv("PATH"),
151 command ? "" : "./", command ? command : url,
152 query ? "<" : "", query ? webQueryFile : "");
153 fclose(f);
155 else {
156 close(fe);
157 unlink(webExecFile);
158 if (query) {
159 close(fq);
160 unlink(webQueryFile);
162 exit(1);
164 chmod(webExecFile, 0700);
166 if (query) {
167 if ((f = fdopen(fq, "wb")) != NULL) {
168 fprintf(f, "%s\n", query);
169 fclose(f);
171 else {
172 unlink(webExecFile);
173 close(fq);
174 unlink(webQueryFile);
175 exit(1);
179 sprintf(cmd, "%s 2>&1", webExecFile);
180 web_pipecmd(cmd, wof);
181 unlink(webQueryFile);
182 unlink(webExecFile);
185 static void wo_cgi_bin(char *url)
187 if (!header_sent) send_header(200, NULL, mime_html, 0);
188 _execute_command(url, NULL, post_buf, WOF_NONE);
189 if (post_buf) {
190 free(post_buf);
191 post_buf = NULL;
195 static void wo_shell(char *url)
197 web_puts("\ncmdresult = '");
198 _execute_command(NULL, webcgi_get("command"), NULL, WOF_JAVASCRIPT);
199 web_puts("';");
202 static void wo_blank(char *url)
204 web_puts("\n\n\n\n");
207 static void wo_favicon(char *url)
209 send_header(200, NULL, "image/vnd.microsoft.icon", 0);
210 do_file(url);
212 if (nvram_match("web_favicon", "1")) {
213 send_header(200, NULL, "image/vnd.microsoft.icon", 0);
214 do_file(url);
216 else {
217 send_error(404, NULL, NULL);
222 static void wo_cfe(char *url)
224 do_file(MTD_DEV(0ro));
227 static void wo_nvram(char *url)
229 web_pipecmd("nvram show", WOF_NONE);
232 static void wo_iptables(char *url)
234 web_pipecmd("iptables -nvL; echo; iptables -t nat -nvL; echo; iptables -t mangle -nvL", WOF_NONE);
237 #ifdef TCONFIG_IPV6
238 static void wo_ip6tables(char *url)
240 web_pipecmd("ip6tables -nvL; echo; ip6tables -t mangle -nvL", WOF_NONE);
242 #endif
245 static void wo_spin(char *url)
247 char s[64];
249 strlcpy(s, nvram_safe_get("web_css"), sizeof(s));
250 strlcat(s, "_spin.gif", sizeof(s));
251 if (f_exists(s)) do_file(s);
252 else do_file("_spin.gif");
256 void common_redirect(void)
258 if (atoi(webcgi_safeget("_ajax", ""))) {
259 send_header(200, NULL, mime_html, 0);
260 web_puts("OK");
262 else {
263 redirect(webcgi_safeget("_redirect", "/"));
267 // ----------------------------------------------------------------------------
269 const struct mime_handler mime_handlers[] = {
270 { "update.cgi", mime_javascript, 0, wi_generic, wo_update, 1 },
271 { "tomato.cgi", NULL, 0, wi_generic, wo_tomato, 1 },
273 { "debug.js", mime_javascript, 5, wi_generic_noid, wo_blank, 1 }, // while debugging
274 { "cfe/*.bin", mime_binary, 0, wi_generic, wo_cfe, 1 },
275 { "nvram/*.txt", mime_binary, 0, wi_generic, wo_nvram, 1 },
276 { "ipt/*.txt", mime_binary, 0, wi_generic, wo_iptables, 1 },
277 #ifdef TCONFIG_IPV6
278 { "ip6t/*.txt", mime_binary, 0, wi_generic, wo_ip6tables, 1 },
279 #endif
280 { "cfg/*.cfg", NULL, 0, wi_generic, wo_backup, 1 },
281 { "cfg/restore.cgi", mime_html, 0, wi_restore, wo_restore, 1 },
282 { "cfg/defaults.cgi", NULL, 0, wi_generic, wo_defaults, 1 },
284 { "bwm/*.gz", NULL, 0, wi_generic, wo_bwmbackup, 1 },
285 { "bwm/restore.cgi", NULL, 0, wi_bwmrestore, wo_bwmrestore, 1 },
287 { "ipt/*.gz", NULL, 0, wi_generic, wo_iptbackup, 1 },
288 { "ipt/restore.cgi", NULL, 0, wi_iptrestore, wo_iptrestore, 1 },
290 { "logs/view.cgi", NULL, 0, wi_generic, wo_viewlog, 1 },
291 { "logs/*.txt", NULL, 0, wi_generic, wo_syslog, 1 },
292 { "webmon_**", NULL, 0, wi_generic, wo_syslog, 1 },
294 { "logout.asp", NULL, 0, wi_generic, wo_asp, 1 },
295 { "clearcookies.asp", NULL, 0, wi_generic, wo_asp, 1 },
297 // { "spin.gif", NULL, 0, wi_generic_noid, wo_spin, 1 },
299 { "**.asp", NULL, 0, wi_generic_noid, wo_asp, 1 },
300 { "**.css", "text/css", 2, wi_generic_noid, do_file, 1 },
301 { "**.htm|**.html", mime_html, 2, wi_generic_noid, do_file, 1 },
302 { "**.gif", "image/gif", 5, wi_generic_noid, do_file, 1 },
303 { "**.jpg", "image/jpeg", 5, wi_generic_noid, do_file, 1 },
304 { "**.png", "image/png", 5, wi_generic_noid, do_file, 1 },
305 { "**.js", mime_javascript, 2, wi_generic_noid, do_file, 1 },
306 { "**.jsx", mime_javascript, 0, wi_generic, wo_asp, 1 },
307 { "**.svg", "image/svg+xml", 2, wi_generic_noid, do_file, 1 },
308 { "**.txt", mime_plain, 2, wi_generic_noid, do_file, 1 },
309 { "**.bin", mime_binary, 0, wi_generic_noid, do_file, 1 },
310 { "**.bino", mime_octetstream, 0, wi_generic_noid, do_file, 1 },
311 { "favicon.ico", NULL, 5, wi_generic_noid, wo_favicon, 1 },
312 // !!TB - CGI Support, enable downloading archives
313 { "**/cgi-bin/**|**.sh", NULL, 0, wi_cgi_bin, wo_cgi_bin, 1 },
314 { "**.tar|**.gz", mime_binary, 0, wi_generic_noid, do_file, 1 },
315 { "shell.cgi", mime_javascript, 0, wi_generic, wo_shell, 1 },
316 { "wpad.dat|proxy.pac", "application/x-ns-proxy-autoconfig", 0, wi_generic_noid, do_file, 0 },
318 { "webmon.cgi", mime_javascript, 0, wi_generic, wo_webmon, 1 },
319 { "dhcpc.cgi", NULL, 0, wi_generic, wo_dhcpc, 1 },
320 { "dhcpd.cgi", mime_javascript, 0, wi_generic, wo_dhcpd, 1 },
321 { "nvcommit.cgi", NULL, 0, wi_generic, wo_nvcommit, 1 },
322 { "ping.cgi", mime_javascript, 0, wi_generic, wo_ping, 1 },
323 { "trace.cgi", mime_javascript, 0, wi_generic, wo_trace, 1 },
324 { "upgrade.cgi", mime_html, 0, wi_upgrade, wo_flash, 1 },
325 { "upnp.cgi", NULL, 0, wi_generic, wo_upnp, 1 },
326 { "wakeup.cgi", NULL, 0, wi_generic, wo_wakeup, 1 },
327 { "wlmnoise.cgi", mime_html, 0, wi_generic, wo_wlmnoise, 1 },
328 { "wlradio.cgi", NULL, 0, wi_generic, wo_wlradio, 1 },
329 { "resolve.cgi", mime_javascript, 0, wi_generic, wo_resolve, 1 },
330 { "expct.cgi", mime_html, 0, wi_generic, wo_expct, 1 },
331 { "service.cgi", NULL, 0, wi_generic, wo_service, 1 },
332 // { "logout.cgi", NULL, 0, wi_generic, wo_logout, 0 },
333 // see httpd.c
334 { "shutdown.cgi", mime_html, 0, wi_generic, wo_shutdown, 1 },
335 #ifdef TCONFIG_OPENVPN
336 { "vpnstatus.cgi", mime_javascript, 0, wi_generic, wo_vpn_status, 1 },
337 #endif
338 #ifdef TCONFIG_PPTPD
339 { "pptpd.cgi", mime_javascript, 0, wi_generic, wo_pptpdcmd, 1 }, //!!AB - PPTPD
340 #endif
341 #ifdef TCONFIG_USB
342 { "usbcmd.cgi", mime_javascript, 0, wi_generic, wo_usbcommand, 1 }, //!!TB - USB
343 #endif
344 #ifdef BLACKHOLE
345 { "blackhole.cgi", NULL, 0, wi_blackhole, NULL, 1 },
346 #endif
347 #ifdef TCONFIG_NOCAT
348 { "uploadsplash.cgi", NULL, 0, wi_uploadsplash, wo_uploadsplash, 1 },
349 { "ext/uploadsplash.cgi", NULL, 0, wi_uploadsplash, wo_uploadsplash, 1 },
350 #endif
351 { NULL, NULL, 0, NULL, NULL, 1 }
354 const aspapi_t aspapi[] = {
355 { "activeroutes", asp_activeroutes },
356 { "arplist", asp_arplist },
357 { "bandwidth", asp_bandwidth },
358 { "build_time", asp_build_time },
359 { "cgi_get", asp_cgi_get },
360 { "compmac", asp_compmac },
361 { "ctcount", asp_ctcount },
362 { "ctdump", asp_ctdump },
363 { "ctrate", asp_ctrate },
364 { "ddnsx", asp_ddnsx },
365 { "devlist", asp_devlist },
366 { "webmon", asp_webmon },
367 { "dhcpc_time", asp_dhcpc_time },
368 { "dns", asp_dns },
369 { "ident", asp_ident },
370 { "lanip", asp_lanip },
371 { "layer7", asp_layer7 },
372 { "link_uptime", asp_link_uptime },
373 { "lipp", asp_lipp },
374 { "netdev", asp_netdev },
376 { "iptraffic", asp_iptraffic },
377 { "iptmon", asp_iptmon },
378 { "ipt_bandwidth", asp_ipt_bandwidth },
380 { "notice", asp_notice },
381 { "nv", asp_nv },
382 { "nvram", asp_nvram },
383 { "nvramseq", asp_nvramseq },
384 { "nvstat", asp_nvstat },
385 { "psup", asp_psup },
386 { "qrate", asp_qrate },
387 { "resmsg", asp_resmsg },
388 { "rrule", asp_rrule },
389 { "statfs", asp_statfs },
390 { "sysinfo", asp_sysinfo },
391 { "time", asp_time },
392 { "upnpinfo", asp_upnpinfo },
393 { "version", asp_version },
394 { "wanstatus", asp_wanstatus },
395 { "wanup", asp_wanup },
396 #ifdef TCONFIG_PPTPD
397 { "pptpd_userol", asp_pptpd_userol },
398 #endif
399 { "wlstats", asp_wlstats },
400 { "wlclient", asp_wlclient },
401 { "wlnoise", asp_wlnoise },
402 { "wlscan", asp_wlscan },
403 { "wlchannels", asp_wlchannels }, //!!TB
404 { "wlcountries", asp_wlcountries },
405 { "wlifaces", asp_wlifaces },
406 { "wlbands", asp_wlbands },
407 #ifdef TCONFIG_USB
408 { "usbdevices", asp_usbdevices }, //!!TB - USB Support
409 #endif
410 #ifdef TCONFIG_SDHC
411 { "mmcid", asp_mmcid }, //MMC Support
412 #endif
413 { "etherstates", asp_etherstates }, //Ethernet States
414 { "anonupdate", asp_anonupdate }, //Tomato update notification system
415 #ifdef TCONFIG_IPV6
416 { "calc6rdlocalprefix", asp_calc6rdlocalprefix },
417 #endif
419 { "css", asp_css },
420 { NULL, NULL }
423 // -----------------------------------------------------------------------------
425 static void asp_css(int argc, char **argv)
427 const char *css = nvram_safe_get("web_css");
428 const char *ttb = nvram_safe_get("ttb_css");
430 if( nvram_match( "web_css", "online" ) ) {
431 web_printf("<link rel='stylesheet' type='text/css' href='ext/%s.css'>", ttb);
432 } else {
433 if (strcmp(css, "tomato") != 0) {
434 web_printf("<link rel='stylesheet' type='text/css' href='%s.css'>", css);
439 // -----------------------------------------------------------------------------
441 const char *resmsg_get(void)
443 return webcgi_safeget("resmsg", "");
446 void resmsg_set(const char *msg)
448 webcgi_set("resmsg", strdup(msg)); // m ok
451 int resmsg_fread(const char *fname)
453 char s[256];
454 char *p;
456 f_read_string(fname, s, sizeof(s));
457 if ((p = strchr(s, '\n')) != NULL) *p = 0;
458 if (s[0]) {
459 resmsg_set(s);
460 return 1;
462 return 0;
465 static void asp_resmsg(int argc, char **argv)
467 char *p;
469 if ((p = js_string(webcgi_safeget("resmsg", (argc > 0) ? argv[0] : ""))) == NULL) return;
470 web_printf("\nresmsg='%s';\n", p);
471 free(p);
474 // ----------------------------------------------------------------------------
476 // verification... simple sanity checks. UI should verify all fields.
478 // todo: move and re-use for filtering - zzz
480 typedef union {
481 int i;
482 long l;
483 const char *s;
484 } nvset_varg_t;
486 typedef struct {
487 const char *name;
488 enum {
489 VT_NONE, // no checking
490 VT_LENGTH, // check length of string
491 VT_TEXT, // strip \r, check length of string
492 VT_RANGE, // expect an integer, check range
493 VT_IP, // expect an ip address
494 VT_MAC, // expect a mac address
495 #ifdef TCONFIG_IPV6
496 VT_IPV6, // expect an ipv6 address
497 #endif
498 VT_TEMP // no checks, no commit
499 } vtype;
500 nvset_varg_t va;
501 nvset_varg_t vb;
502 } nvset_t;
505 #define V_NONE VT_NONE, { }, { }
506 #define V_01 VT_RANGE, { .l = 0 }, { .l = 1 }
507 #define V_PORT VT_RANGE, { .l = 2 }, { .l = 65535 }
508 #define V_ONOFF VT_LENGTH, { .i = 2 }, { .i = 3 }
509 #define V_WORD VT_LENGTH, { .i = 1 }, { .i = 16 }
510 #define V_LENGTH(min, max) VT_LENGTH, { .i = min }, { .i = max }
511 #define V_TEXT(min, max) VT_TEXT, { .i = min }, { .i = max }
512 #define V_RANGE(min, max) VT_RANGE, { .l = min }, { .l = max }
513 #define V_IP VT_IP, { }, { }
514 #define V_OCTET VT_RANGE, { .l = 0 }, { .l = 255 }
515 #define V_NUM VT_RANGE, { .l = 0 }, { .l = 0x7FFFFFFF }
516 #define V_TEMP VT_TEMP, { }, { }
517 #ifdef TCONFIG_IPV6
518 #define V_IPV6(required) VT_IPV6, { .i = required }, { }
519 #endif
521 static const nvset_t nvset_list[] = {
523 // basic-ident
524 { "router_name", V_LENGTH(0, 32) },
525 { "wan_hostname", V_LENGTH(0, 32) },
526 { "wan_domain", V_LENGTH(0, 32) },
528 // basic-time
529 { "tm_tz", V_LENGTH(1, 64) }, // PST8PDT
530 { "tm_sel", V_LENGTH(1, 64) }, // PST8PDT
531 { "tm_dst", V_01 },
532 { "ntp_updates", V_RANGE(-1, 24) },
533 { "ntp_tdod", V_01 },
534 { "ntp_server", V_LENGTH(1, 150) }, // x y z
535 { "ntp_kiss", V_LENGTH(0, 255) },
537 // basic-static
538 { "dhcpd_static", V_LENGTH(0, 108*251) }, // 108 (max chars per entry) x 250 entries
539 { "dhcpd_static_only", V_01 },
541 // basic-ddns
542 { "ddnsx0", V_LENGTH(0, 2048) },
543 { "ddnsx1", V_LENGTH(0, 2048) },
544 { "ddnsx0_cache", V_LENGTH(0, 1) }, // only to clear
545 { "ddnsx1_cache", V_LENGTH(0, 1) },
546 { "ddnsx_ip", V_LENGTH(0, 32) },
547 { "ddnsx_save", V_01 },
548 { "ddnsx_refresh", V_RANGE(0, 365) },
550 // basic-network
551 // WAN
552 { "wan_proto", V_LENGTH(1, 16) }, // disabled, dhcp, static, pppoe, pptp, l2tp
553 { "wan_ipaddr", V_IP },
554 { "wan_netmask", V_IP },
555 { "wan_gateway", V_IP },
556 { "hb_server_ip", V_LENGTH(0, 32) },
557 { "l2tp_server_ip", V_LENGTH(0, 128) },
558 { "pptp_server_ip", V_LENGTH(0, 128) },
559 { "pptp_dhcp", V_01 },
560 { "ppp_username", V_LENGTH(0, 60) },
561 { "ppp_passwd", V_LENGTH(0, 60) },
562 { "ppp_service", V_LENGTH(0, 50) },
563 { "ppp_demand", V_01 },
564 { "ppp_custom", V_LENGTH(0, 256) },
565 { "ppp_idletime", V_RANGE(0, 1440) },
566 { "ppp_redialperiod", V_RANGE(1, 86400) },
567 { "ppp_mlppp", V_01 },
568 { "mtu_enable", V_01 },
569 { "wan_mtu", V_RANGE(576, 1500) },
570 { "wan_islan", V_01 },
571 { "modem_ipaddr", V_IP },
572 { "pppoe_lei", V_RANGE(1, 60) },
573 { "pppoe_lef", V_RANGE(1, 10) },
575 // LAN
576 { "lan_ipaddr", V_IP },
577 { "lan_netmask", V_IP },
578 { "lan_gateway", V_IP },
579 { "wan_dns", V_LENGTH(0, 50) }, // ip ip ip
581 #ifdef TCONFIG_DNSSEC
582 { "dnssec_enable", V_01 },
583 #endif
585 #ifdef TCONFIG_DNSCRYPT
586 { "dnscrypt_proxy", V_01 },
587 { "dnscrypt_priority", V_RANGE(0, 2) }, // 0=none, 1=preferred, 2=exclusive
588 { "dnscrypt_port", V_PORT },
589 { "dnscrypt_resolver", V_LENGTH(0, 40) },
590 { "dnscrypt_log", V_RANGE(0, 99) },
591 { "dnscrypt_manual", V_01 },
592 { "dnscrypt_provider_name", V_LENGTH(0, 60) },
593 { "dnscrypt_provider_key", V_LENGTH(0, 80) },
594 { "dnscrypt_resolver_address", V_LENGTH(0, 50) },
595 #endif
596 { "lan_state", V_01 },
597 { "lan_desc", V_01 },
598 { "lan_invert", V_01 },
599 { "lan_proto", V_WORD }, // static, dhcp
600 { "dhcp_start", V_LENGTH(0, 15) }, // remove !
601 { "dhcp_num", V_LENGTH(0, 4) }, // remove !
602 { "dhcpd_startip", V_LENGTH(0, 15) },
603 { "dhcpd_endip", V_LENGTH(0, 15) },
604 { "dhcp_lease", V_LENGTH(0, 5) },
605 { "wan_wins", V_IP },
607 #ifdef TCONFIG_USB
608 // 3G MODEM
609 { "modem_pin", V_LENGTH(0,6) },
610 { "modem_dev", V_LENGTH(0,8) },
611 { "modem_init", V_LENGTH(0,25) },
612 { "modem_apn", V_LENGTH(0,25) },
613 { "modem_watchdog", V_RANGE(0,30) },
614 #endif
616 // LAN networks
617 { "lan_ifname", V_LENGTH(0, 5) },
619 { "lan1_ifname", V_LENGTH(0, 5) },
620 { "lan1_ifnames", V_TEXT(0,64) },
621 { "lan1_ipaddr", V_LENGTH(0, 15) },
622 { "lan1_netmask", V_LENGTH(0, 15) },
623 { "lan1_proto", V_LENGTH(0, 6) },
624 { "lan1_stp", V_LENGTH(0, 1) },
625 { "dhcp1_start", V_LENGTH(0, 15) },
626 { "dhcp1_num", V_LENGTH(0, 4) },
627 { "dhcpd1_startip", V_LENGTH(0, 15) },
628 { "dhcpd1_endip", V_LENGTH(0, 15) },
629 { "dhcp1_lease", V_LENGTH(0, 5) },
631 { "lan2_ifname", V_LENGTH(0, 5) },
632 { "lan2_ifnames", V_TEXT(0,64) },
633 { "lan2_ipaddr", V_LENGTH(0, 15) },
634 { "lan2_netmask", V_LENGTH(0, 15) },
635 { "lan2_proto", V_LENGTH(0, 6) },
636 { "lan2_stp", V_LENGTH(0, 1) },
637 { "dhcp2_start", V_LENGTH(0, 15) },
638 { "dhcp2_num", V_LENGTH(0, 4) },
639 { "dhcpd2_startip", V_LENGTH(0, 15) },
640 { "dhcpd2_endip", V_LENGTH(0, 15) },
641 { "dhcp2_lease", V_LENGTH(0, 5) },
643 { "lan3_ifname", V_LENGTH(0, 5) },
644 { "lan3_ifnames", V_TEXT(0,64) },
645 { "lan3_ipaddr", V_LENGTH(0, 15) },
646 { "lan3_netmask", V_LENGTH(0, 15) },
647 { "lan3_proto", V_LENGTH(0, 6) },
648 { "lan3_stp", V_LENGTH(0, 1) },
649 { "dhcp3_start", V_LENGTH(0, 15) },
650 { "dhcp3_num", V_LENGTH(0, 4) },
651 { "dhcpd3_startip", V_LENGTH(0, 15) },
652 { "dhcpd3_endip", V_LENGTH(0, 15) },
653 { "dhcp3_lease", V_LENGTH(0, 5) },
655 // wireless
656 { "wl_radio", V_01 },
657 { "wl_mode", V_LENGTH(2, 3) }, // ap, sta, wet, wds
658 { "wl_net_mode", V_LENGTH(5, 8) }, // disabled, mixed, b-only, g-only, bg-mixed, n-only [speedbooster]
659 { "wl_ssid", V_LENGTH(1, 32) },
660 { "wl_closed", V_01 },
661 { "wl_channel", V_RANGE(0, 216) },
663 { "wl_vifs", V_LENGTH(0, 64) }, // multiple/virtual BSSIDs
664 #ifndef LINUX26
665 { "nas_alternate", V_01 }, // only meaningful for ND/K24 builds
666 #endif
668 { "wl_security_mode", V_LENGTH(1, 32) }, // disabled, radius, wep, wpa_personal, wpa_enterprise, wpa2_personal, wpa2_enterprise
669 { "wl_radius_ipaddr", V_IP },
670 { "wl_radius_port", V_PORT },
671 { "wl_radius_key", V_LENGTH(1, 64) },
672 { "wl_wep_bit", V_RANGE(64, 128) }, // 64 or 128
673 { "wl_passphrase", V_LENGTH(0, 20) },
674 { "wl_key", V_RANGE(1, 4) },
675 { "wl_key1", V_LENGTH(0, 26) },
676 { "wl_key2", V_LENGTH(0, 26) },
677 { "wl_key3", V_LENGTH(0, 26) },
678 { "wl_key4", V_LENGTH(0, 26) },
679 { "wl_crypto", V_LENGTH(3, 8) }, // tkip, aes, tkip+aes
680 { "wl_wpa_psk", V_LENGTH(8, 64) },
681 { "wl_wpa_gtk_rekey", V_RANGE(60, 7200) },
683 { "wl_lazywds", V_01 },
684 { "wl_wds", V_LENGTH(0, 180) }, // mac mac mac (x 10)
686 { "wl_wds_enable", V_01 },
687 { "wl_gmode", V_RANGE(-1, 6) },
688 { "wl_wep", V_LENGTH(1, 32) }, // off, on, restricted,tkip,aes,tkip+aes
689 { "wl_akm", V_LENGTH(0, 32) }, // wpa, wpa2, psk, psk2, wpa wpa2, psk psk2, ""
690 { "wl_auth_mode", V_LENGTH(4, 6) }, // none, radius
692 { "wl_nmode", V_NONE },
693 { "wl_nband", V_RANGE(0, 2) }, // 2 - 2.4GHz, 1 - 5GHz, 0 - Auto
694 { "wl_nreqd", V_NONE },
695 { "wl_nbw_cap", V_RANGE(0, 2) }, // 0 - 20MHz, 1 - 40MHz, 2 - Auto
696 { "wl_nbw", V_NONE },
697 { "wl_mimo_preamble", V_WORD }, // 802.11n Preamble: mm/gf/auto/gfbcm
698 { "wl_nctrlsb", V_NONE }, // none, lower, upper
700 #ifdef TCONFIG_IPV6
701 // basic-ipv6
702 { "ipv6_service", V_LENGTH(0, 16) }, // '', native, native-pd, 6to4, sit, other
703 { "ipv6_prefix", V_IPV6(0) },
704 { "ipv6_prefix_length", V_RANGE(3, 127) },
705 { "ipv6_rtr_addr", V_IPV6(0) },
706 { "ipv6_radvd", V_01 },
707 { "ipv6_dhcpd", V_01 },
708 { "ipv6_accept_ra", V_NUM },
709 { "ipv6_tun_addr", V_IPV6(1) },
710 { "ipv6_tun_addrlen", V_RANGE(3, 127) },
711 { "ipv6_ifname", V_LENGTH(0, 8) },
712 { "ipv6_tun_v4end", V_IP },
713 { "ipv6_relay", V_RANGE(1, 254) },
714 { "ipv6_tun_mtu", V_NUM }, // Tunnel MTU
715 { "ipv6_tun_ttl", V_NUM }, // Tunnel TTL
716 { "ipv6_dns", V_LENGTH(0, 40*3) }, // ip6 ip6 ip6
717 { "ipv6_6rd_prefix", V_IPV6(0) },
718 { "ipv6_6rd_prefix_length", V_RANGE(3, 127) },
719 { "ipv6_6rd_borderrelay", V_IP },
720 { "ipv6_6rd_ipv4masklen", V_RANGE(0, 32) },
721 { "ipv6_vlan", V_RANGE(0, 7) }, // Enable IPv6 on 1=LAN1 2=LAN2 4=LAN3
722 { "ipv6_isp_opt", V_01 }, // wan.c add eval option for dhcpd
723 #endif
725 // basic-wfilter
726 { "wl_macmode", V_NONE }, // allow, deny, disabled
727 { "wl_maclist", V_LENGTH(0, 18*201) }, // 18 x 200 (11:22:33:44:55:66 ...)
728 { "macnames", V_LENGTH(0, 62*201) }, // 62 (12+1+48+1) x 50 (112233445566<..>) todo: re-use -- zzz
730 // advanced-ctnf
731 { "ct_max", V_NUM },
732 { "ct_tcp_timeout", V_LENGTH(20, 70) },
733 { "ct_udp_timeout", V_LENGTH(5, 15) },
734 { "ct_timeout", V_LENGTH(5, 15) },
735 { "nf_ttl", V_LENGTH(1, 6) },
736 { "nf_l7in", V_01 },
737 #ifdef LINUX26
738 { "nf_sip", V_01 },
739 { "ct_hashsize", V_NUM },
740 #endif
741 { "nf_rtsp", V_01 },
742 { "nf_pptp", V_01 },
743 { "nf_h323", V_01 },
744 { "nf_ftp", V_01 },
746 // advanced-dhcpdns
747 { "dhcpd_slt", V_RANGE(-1, 43200) }, // -1=infinite, 0=follow normal lease time, >=1 custom
748 { "dhcpd_dmdns", V_01 },
749 { "dhcpd_lmax", V_NUM },
750 { "dhcpd_gwmode", V_NUM },
751 { "dns_addget", V_01 },
752 { "dns_intcpt", V_01 },
753 { "dhcpc_minpkt", V_01 },
754 { "dhcpc_custom", V_LENGTH(0, 80) },
755 { "dns_norebind", V_01 },
756 { "dnsmasq_custom", V_TEXT(0, 2048) },
757 { "dnsmasq_q", V_RANGE(0,7) }, //bitfield quiet bit0=dhcp, 1=dhcp6, 2=ra
758 // { "dnsmasq_norw", V_01 },
760 // advanced-firewall
761 { "block_wan", V_01 },
762 { "block_wan_limit", V_01 },
763 { "block_wan_limit_icmp", V_RANGE(1, 300) },
764 { "block_wan_limit_tr", V_RANGE(1, 300) },
765 { "multicast_pass", V_01 },
766 { "multicast_lan", V_01 },
767 { "multicast_lan1", V_01 },
768 { "multicast_lan2", V_01 },
769 { "multicast_lan3", V_01 },
770 { "block_loopback", V_01 },
771 { "udpxy_enable", V_01 },
772 { "udpxy_stats", V_01 },
773 { "udpxy_clients", V_RANGE(1, 5000) },
774 { "udpxy_port", V_RANGE(0, 65535) },
775 { "nf_loopback", V_NUM },
776 { "ne_syncookies", V_01 },
777 { "DSCP_fix_enable", V_01 },
778 { "ne_snat", V_01 },
779 { "dhcp_pass", V_01 },
780 #ifdef TCONFIG_EMF
781 { "emf_entry", V_NONE },
782 { "emf_uffp_entry", V_NONE },
783 { "emf_rtport_entry", V_NONE },
784 { "emf_enable", V_01 },
785 #endif
787 // advanced-misc
788 { "wait_time", V_RANGE(3, 20) },
789 { "wan_speed", V_RANGE(0, 4) },
790 { "jumbo_frame_enable", V_01 }, // Jumbo Frames support (for RT-N16/WNR3500L)
791 { "jumbo_frame_size", V_RANGE(1, 9720) },
792 #ifdef CONFIG_BCMWL5
793 { "ctf_disable", V_01 },
794 #endif
795 // advanced-vlan
796 { "vlan0ports", V_TEXT(0,16) },
797 { "vlan1ports", V_TEXT(0,16) },
798 { "vlan2ports", V_TEXT(0,16) },
799 { "vlan3ports", V_TEXT(0,16) },
800 { "vlan4ports", V_TEXT(0,16) },
801 { "vlan5ports", V_TEXT(0,16) },
802 { "vlan6ports", V_TEXT(0,16) },
803 { "vlan7ports", V_TEXT(0,16) },
804 { "vlan8ports", V_TEXT(0,16) },
805 { "vlan9ports", V_TEXT(0,16) },
806 { "vlan10ports", V_TEXT(0,16) },
807 { "vlan11ports", V_TEXT(0,16) },
808 { "vlan12ports", V_TEXT(0,16) },
809 { "vlan13ports", V_TEXT(0,16) },
810 { "vlan14ports", V_TEXT(0,16) },
811 { "vlan15ports", V_TEXT(0,16) },
812 { "vlan0hwname", V_TEXT(0,8) },
813 { "vlan1hwname", V_TEXT(0,8) },
814 { "vlan2hwname", V_TEXT(0,8) },
815 { "vlan3hwname", V_TEXT(0,8) },
816 { "vlan4hwname", V_TEXT(0,8) },
817 { "vlan5hwname", V_TEXT(0,8) },
818 { "vlan6hwname", V_TEXT(0,8) },
819 { "vlan7hwname", V_TEXT(0,8) },
820 { "vlan8hwname", V_TEXT(0,8) },
821 { "vlan9hwname", V_TEXT(0,8) },
822 { "vlan10hwname", V_TEXT(0,8) },
823 { "vlan11hwname", V_TEXT(0,8) },
824 { "vlan12hwname", V_TEXT(0,8) },
825 { "vlan13hwname", V_TEXT(0,8) },
826 { "vlan14hwname", V_TEXT(0,8) },
827 { "vlan15hwname", V_TEXT(0,8) },
828 { "wan_ifnameX", V_TEXT(0,8) },
829 { "lan_ifnames", V_TEXT(0,64) },
830 { "manual_boot_nv", V_01 },
831 { "trunk_vlan_so", V_01 },
832 { "vlan0tag", V_TEXT(0,5) },
833 { "vlan0vid", V_TEXT(0,5) },
834 { "vlan1vid", V_TEXT(0,5) },
835 { "vlan2vid", V_TEXT(0,5) },
836 { "vlan3vid", V_TEXT(0,5) },
837 { "vlan4vid", V_TEXT(0,5) },
838 { "vlan5vid", V_TEXT(0,5) },
839 { "vlan6vid", V_TEXT(0,5) },
840 { "vlan7vid", V_TEXT(0,5) },
841 { "vlan8vid", V_TEXT(0,5) },
842 { "vlan9vid", V_TEXT(0,5) },
843 { "vlan10vid", V_TEXT(0,5) },
844 { "vlan11vid", V_TEXT(0,5) },
845 { "vlan12vid", V_TEXT(0,5) },
846 { "vlan13vid", V_TEXT(0,5) },
847 { "vlan14vid", V_TEXT(0,5) },
848 { "vlan15vid", V_TEXT(0,5) },
850 // advanced-mac
851 { "mac_wan", V_LENGTH(0, 17) },
852 { "wl_macaddr", V_LENGTH(0, 17) },
853 { "wl_hwaddr", V_LENGTH(0, 17) },
855 // advanced-routing
856 { "routes_static", V_LENGTH(0, 2048) },
857 { "dhcp_routes", V_01 },
858 { "lan_stp", V_RANGE(0, 1) },
859 { "wk_mode", V_LENGTH(1, 32) }, // gateway, router
860 #ifdef TCONFIG_ZEBRA
861 { "dr_setting", V_RANGE(0, 3) },
862 { "dr_lan_tx", V_LENGTH(0, 32) },
863 { "dr_lan_rx", V_LENGTH(0, 32) },
864 { "dr_lan1_tx", V_LENGTH(0, 32) },
865 { "dr_lan1_rx", V_LENGTH(0, 32) },
866 { "dr_lan2_tx", V_LENGTH(0, 32) },
867 { "dr_lan2_rx", V_LENGTH(0, 32) },
868 { "dr_lan3_tx", V_LENGTH(0, 32) },
869 { "dr_lan3_rx", V_LENGTH(0, 32) },
870 { "dr_wan_tx", V_LENGTH(0, 32) },
871 { "dr_wan_rx", V_LENGTH(0, 32) },
872 #endif
874 // advanced-access
875 { "lan_access", V_LENGTH(0, 4096) },
877 // advanced-wireless
878 { "wl_country", V_LENGTH(0, 64) }, // !!TB - Country code
879 { "wl_country_code", V_LENGTH(0, 4) }, // !!TB - Country code
880 { "wl_btc_mode", V_RANGE(0, 2) }, // !!TB - BT Coexistence Mode: 0 (disable), 1 (enable), 2 (preemption)
881 { "wl_afterburner", V_LENGTH(2, 4) }, // off, on, auto
882 { "wl_auth", V_01 },
883 { "wl_rateset", V_LENGTH(2, 7) }, // all, default, 12
884 { "wl_rate", V_RANGE(0, 54 * 1000 * 1000) },
885 { "wl_mrate", V_RANGE(0, 54 * 1000 * 1000) },
886 { "wl_gmode_protection",V_LENGTH(3, 4) }, // off, auto
887 { "wl_frameburst", V_ONOFF }, // off, on
888 { "wl_bcn", V_RANGE(1, 65535) },
889 { "wl_dtim", V_RANGE(1, 255) },
890 { "wl_frag", V_RANGE(256, 2346) },
891 { "wl_rts", V_RANGE(0, 2347) },
892 { "wl_ap_isolate", V_01 },
893 { "wl_plcphdr", V_LENGTH(4, 5) }, // long, short
894 { "wl_antdiv", V_RANGE(0, 3) },
895 { "wl_txant", V_RANGE(0, 3) },
896 { "wl_txpwr", V_RANGE(0, 400) },
897 { "wl_wme", V_WORD }, // auto, off, on
898 { "wl_wme_no_ack", V_ONOFF }, // off, on
899 { "wl_wme_apsd", V_ONOFF }, // off, on
900 { "wl_maxassoc", V_RANGE(0, 255) },
901 { "wl_distance", V_LENGTH(0, 5) }, // "", 1-99999
902 { "wlx_hpamp", V_01 },
903 { "wlx_hperx", V_01 },
904 { "wl_reg_mode", V_LENGTH(1, 3) }, // !!TB - Regulatory: off, h, d
905 { "wl_mitigation", V_RANGE(0, 4) }, // Interference Mitigation Mode (0|1|2|3|4)
907 { "wl_nmode_protection", V_WORD, }, // off, auto
908 { "wl_nmcsidx", V_RANGE(-2, 32), }, // -2 - 32
909 { "wl_obss_coex", V_01 },
910 { "wl_wmf_bss_enable", V_01 }, // Toastman
912 // forward-dmz
913 { "dmz_enable", V_01 },
914 { "dmz_ipaddr", V_LENGTH(0, 15) },
915 { "dmz_sip", V_LENGTH(0, 512) },
916 { "dmz_ifname", V_LENGTH(0, 5) },
917 { "dmz_ra", V_01 },
919 // forward-upnp
920 { "upnp_enable", V_NUM },
921 { "upnp_secure", V_01 },
922 { "upnp_port", V_RANGE(0, 65535) },
923 { "upnp_ssdp_interval", V_RANGE(10, 9999) },
924 { "upnp_mnp", V_01 },
925 { "upnp_clean", V_01 },
926 { "upnp_clean_interval", V_RANGE(60, 65535) },
927 { "upnp_clean_threshold", V_RANGE(0, 9999) },
928 { "upnp_min_port_int", V_PORT },
929 { "upnp_max_port_int", V_PORT },
930 { "upnp_min_port_ext", V_PORT },
931 { "upnp_max_port_ext", V_PORT },
932 { "upnp_lan", V_01 },
933 { "upnp_lan1", V_01 },
934 { "upnp_lan2", V_01 },
935 { "upnp_lan3", V_01 },
936 { "upnp_custom", V_TEXT(0, 2048) },
938 // forward-basic
939 { "portforward", V_LENGTH(0, 4096) },
941 #ifdef TCONFIG_IPV6
942 // forward-basic-ipv6
943 { "ipv6_portforward", V_LENGTH(0, 4096) },
944 #endif
946 // forward-triggered
947 { "trigforward", V_LENGTH(0, 4096) },
950 // access restriction
951 { "rruleN", V_RANGE(0, 99) },
952 // { "rrule##", V_LENGTH(0, 2048) }, // in save_variables()
954 // admin-access
955 { "http_enable", V_01 },
956 { "https_enable", V_01 },
957 { "https_crt_save", V_01 },
958 { "https_crt_cn", V_LENGTH(0, 64) },
959 { "https_crt_gen", V_TEMP },
960 { "remote_management", V_01 },
961 { "remote_mgt_https", V_01 },
962 { "http_lanport", V_PORT },
963 { "https_lanport", V_PORT },
964 { "web_wl_filter", V_01 },
965 { "web_css", V_LENGTH(1, 32) },
966 { "web_dir", V_LENGTH(1, 32) },
967 { "ttb_css", V_LENGTH(0, 128) },
968 { "web_mx", V_LENGTH(0, 128) },
969 { "http_wanport", V_PORT },
970 { "telnetd_eas", V_01 },
971 { "telnetd_port", V_PORT },
972 { "sshd_eas", V_01 },
973 { "sshd_pass", V_01 },
974 { "sshd_port", V_PORT },
975 { "sshd_remote", V_01 },
976 { "sshd_motd", V_01 },
977 { "sshd_forwarding", V_01 },
978 { "sshd_rport", V_PORT },
979 { "sshd_authkeys", V_TEXT(0, 4096) },
980 { "rmgt_sip", V_LENGTH(0, 512) },
981 { "ne_shlimit", V_TEXT(1, 50) },
982 { "http_username", V_LENGTH(0, 32) },
983 { "http_root", V_01 },
985 // admin-bwm
986 { "rstats_enable", V_01 },
987 { "rstats_path", V_LENGTH(0, 48) },
988 { "rstats_stime", V_RANGE(1, 168) },
989 { "rstats_offset", V_RANGE(1, 31) },
990 { "rstats_exclude", V_LENGTH(0, 64) },
991 { "rstats_sshut", V_01 },
992 { "rstats_bak", V_01 },
994 // admin-ipt
995 { "cstats_enable", V_01 },
996 { "cstats_path", V_LENGTH(0, 48) },
997 { "cstats_stime", V_RANGE(1, 168) },
998 { "cstats_offset", V_RANGE(1, 31) },
999 { "cstats_labels", V_RANGE(0, 2) },
1000 { "cstats_exclude", V_LENGTH(0, 512) },
1001 { "cstats_include", V_LENGTH(0, 2048) },
1002 { "cstats_all", V_01 },
1003 { "cstats_sshut", V_01 },
1004 { "cstats_bak", V_01 },
1006 // admin-buttons
1007 { "sesx_led", V_RANGE(0, 255) }, // amber, white, aoss
1008 { "sesx_b0", V_RANGE(0, 5) }, // 0-5: toggle wireless, reboot, shutdown, script, usb unmount
1009 { "sesx_b1", V_RANGE(0, 5) }, // "
1010 { "sesx_b2", V_RANGE(0, 5) }, // "
1011 { "sesx_b3", V_RANGE(0, 5) }, // "
1012 { "sesx_script", V_TEXT(0, 1024) }, //
1013 { "script_brau", V_TEXT(0, 1024) }, //
1015 // admin-debug
1016 { "debug_nocommit", V_01 },
1017 { "debug_cprintf", V_01 },
1018 { "debug_cprintf_file", V_01 },
1019 // { "debug_keepfiles", V_01 },
1020 { "debug_ddns", V_01 },
1021 { "debug_norestart", V_TEXT(0, 128) },
1022 { "console_loglevel", V_RANGE(1, 8) },
1023 { "t_cafree", V_01 },
1024 { "t_hidelr", V_01 },
1026 // admin-sched
1027 { "sch_rboot", V_TEXT(0, 64) },
1028 { "sch_rcon", V_TEXT(0, 64) },
1029 { "sch_c1", V_TEXT(0, 64) },
1030 { "sch_c1_cmd", V_TEXT(0, 2048) },
1031 { "sch_c2", V_TEXT(0, 64) },
1032 { "sch_c2_cmd", V_TEXT(0, 2048) },
1033 { "sch_c3", V_TEXT(0, 64) },
1034 { "sch_c3_cmd", V_TEXT(0, 2048) },
1035 { "sch_c4", V_TEXT(0, 64) },
1036 { "sch_c4_cmd", V_TEXT(0, 2048) },
1037 { "sch_c5", V_TEXT(0, 64) },
1038 { "sch_c5_cmd", V_TEXT(0, 2048) },
1040 // admin-scripts
1041 { "script_init", V_TEXT(0, 4096) },
1042 { "script_shut", V_TEXT(0, 4096) },
1043 { "script_fire", V_TEXT(0, 8192) },
1044 { "script_wanup", V_TEXT(0, 4096) },
1046 // admin-log
1047 { "log_remote", V_01 },
1048 { "log_remoteip", V_LENGTH(0, 512) },
1049 { "log_remoteport", V_PORT },
1050 { "log_file", V_01 },
1051 { "log_file_custom", V_01 },
1052 { "log_file_path", V_TEXT(0, 4096) },
1053 { "log_file_size", V_RANGE(0, 99999) },
1054 { "log_file_keep", V_RANGE(0, 99) },
1055 { "log_limit", V_RANGE(0, 2400) },
1056 { "log_in", V_RANGE(0, 3) },
1057 { "log_out", V_RANGE(0, 3) },
1058 { "log_mark", V_RANGE(0, 99999) },
1059 { "log_events", V_TEXT(0, 32) }, // "acre,crond,ntp"
1061 // admin-log-webmonitor
1062 { "log_wm", V_01 },
1063 { "log_wmtype", V_RANGE(0, 2) },
1064 { "log_wmip", V_LENGTH(0, 512) },
1065 { "log_wmdmax", V_RANGE(0, 9999) },
1066 { "log_wmsmax", V_RANGE(0, 9999) },
1067 { "webmon_bkp", V_01 },
1068 { "webmon_dir", V_LENGTH(0, 256) },
1069 { "webmon_shrink", V_01 },
1072 // admin-cifs
1073 { "cifs1", V_LENGTH(1, 1024) },
1074 { "cifs2", V_LENGTH(1, 1024) },
1076 // admin-jffs2
1077 { "jffs2_on", V_01 },
1078 { "jffs2_exec", V_LENGTH(0, 64) },
1079 { "jffs2_format", V_01 },
1081 #ifdef TCONFIG_SDHC
1082 // admin-sdhc
1083 { "mmc_on", V_01 },
1084 { "mmc_cs", V_RANGE(1, 7) }, // GPIO pin
1085 { "mmc_clk", V_RANGE(1, 7) }, // GPIO pin
1086 { "mmc_din", V_RANGE(1, 7) }, // GPIO pin
1087 { "mmc_dout", V_RANGE(1, 7) }, // GPIO pin
1088 { "mmc_fs_partition", V_RANGE(1, 4) }, // partition number in partition table
1089 { "mmc_fs_type", V_LENGTH(4, 4) }, // ext2, ext3, vfat
1090 { "mmc_exec_mount", V_LENGTH(0, 64) },
1091 { "mmc_exec_umount", V_LENGTH(0, 64) },
1092 #endif
1094 // admin-tomatoanon
1095 { "tomatoanon_answer", V_RANGE(0, 1) },
1096 { "tomatoanon_enable", V_RANGE(-1, 1) },
1097 { "tomatoanon_id", V_LENGTH(0, 32) },
1098 { "tomatoanon_notify", V_01 },
1100 // nas-usb - !!TB
1101 #ifdef TCONFIG_USB
1102 { "usb_enable", V_01 },
1103 { "usb_uhci", V_RANGE(-1, 1) }, // -1 - disabled, 0 - off, 1 - on
1104 { "usb_ohci", V_RANGE(-1, 1) },
1105 { "usb_usb2", V_RANGE(-1, 1) },
1106 { "usb_irq_thresh", V_RANGE(0, 6) },
1107 { "usb_storage", V_01 },
1108 { "usb_printer", V_01 },
1109 { "usb_printer_bidirect", V_01 },
1110 { "usb_fs_ext3", V_01 },
1111 { "usb_fs_fat", V_01 },
1112 #ifdef TCONFIG_NTFS
1113 { "usb_fs_ntfs", V_01 },
1114 #endif
1115 #ifdef TCONFIG_HFS
1116 { "usb_fs_hfs", V_01 }, //!Victek
1117 #endif
1118 { "usb_automount", V_01 },
1119 { "script_usbhotplug", V_TEXT(0, 2048) },
1120 { "script_usbmount", V_TEXT(0, 2048) },
1121 { "script_usbumount", V_TEXT(0, 2048) },
1122 { "idle_enable", V_01 },
1123 { "usb_3g", V_01 },
1124 #endif
1126 // nas-ftp - !!TB
1127 #ifdef TCONFIG_FTP
1128 { "ftp_enable", V_RANGE(0, 2) },
1129 { "ftp_super", V_01 },
1130 { "ftp_anonymous", V_RANGE(0, 3) },
1131 { "ftp_dirlist", V_RANGE(0, 2) },
1132 { "ftp_port", V_PORT },
1133 { "ftp_max", V_RANGE(0, 12) },
1134 { "ftp_ipmax", V_RANGE(0, 12) },
1135 { "ftp_staytimeout", V_RANGE(0, 65535) },
1136 { "ftp_rate", V_RANGE(0, 99999) },
1137 { "ftp_anonrate", V_RANGE(0, 99999) },
1138 { "ftp_anonroot", V_LENGTH(0, 256) },
1139 { "ftp_pubroot", V_LENGTH(0, 256) },
1140 { "ftp_pvtroot", V_LENGTH(0, 256) },
1141 { "ftp_users", V_LENGTH(0, 4096) },
1142 { "ftp_custom", V_TEXT(0, 2048) },
1143 { "ftp_sip", V_LENGTH(0, 512) },
1144 { "ftp_limit", V_TEXT(1, 50) },
1145 { "log_ftp", V_01 },
1146 #endif
1148 #ifdef TCONFIG_SNMP
1149 { "snmp_enable", V_RANGE(0, 1) },
1150 { "snmp_port", V_RANGE(1, 65535) },
1151 { "snmp_remote", V_RANGE(0, 1) },
1152 { "snmp_remote_sip", V_LENGTH(0, 512) },
1153 { "snmp_location", V_LENGTH(0, 40) },
1154 { "snmp_contact", V_LENGTH(0, 40) },
1155 { "snmp_ro", V_LENGTH(0, 40) },
1156 #endif
1158 #ifdef TCONFIG_SAMBASRV
1159 // nas-samba - !!TB
1160 { "smbd_enable", V_RANGE(0, 2) },
1161 { "smbd_wgroup", V_LENGTH(0, 20) },
1162 { "smbd_master", V_01 },
1163 { "smbd_wins", V_01 },
1164 { "smbd_cpage", V_LENGTH(0, 4) },
1165 { "smbd_cset", V_LENGTH(0, 20) },
1166 { "smbd_custom", V_TEXT(0, 2048) },
1167 { "smbd_autoshare", V_RANGE(0, 3) },
1168 { "smbd_shares", V_LENGTH(0, 4096) },
1169 { "smbd_user", V_LENGTH(0, 50) },
1170 { "smbd_passwd", V_LENGTH(0, 50) },
1171 #endif
1173 #ifdef TCONFIG_MEDIA_SERVER
1174 // nas-media
1175 { "ms_enable", V_01 },
1176 { "ms_dirs", V_LENGTH(0, 1024) },
1177 { "ms_port", V_RANGE(0, 65535) },
1178 { "ms_dbdir", V_LENGTH(0, 256) },
1179 { "ms_tivo", V_01 },
1180 { "ms_stdlna", V_01 },
1181 { "ms_rescan", V_01 },
1182 { "ms_sas", V_01 },
1183 #endif
1185 // qos
1186 { "qos_enable", V_01 },
1187 { "qos_ack", V_01 },
1188 { "qos_syn", V_01 },
1189 { "qos_fin", V_01 },
1190 { "qos_rst", V_01 },
1191 { "qos_icmp", V_01 },
1192 { "qos_udp", V_01 },
1193 { "qos_reset", V_01 },
1194 { "qos_pfifo", V_01 }, // !!TB
1195 { "qos_obw", V_RANGE(10, 999999) },
1196 { "qos_ibw", V_RANGE(10, 999999) },
1197 { "qos_orules", V_LENGTH(0, 4096) },
1198 { "qos_default", V_RANGE(0, 9) },
1199 { "qos_irates", V_LENGTH(0, 128) },
1200 { "qos_orates", V_LENGTH(0, 128) },
1201 { "qos_classnames", V_LENGTH(10, 128) }, // !!TOASTMAN
1202 { "atm_overhead", V_RANGE(-127, 128) },
1203 { "ne_vegas", V_01 },
1204 { "ne_valpha", V_NUM },
1205 { "ne_vbeta", V_NUM },
1206 { "ne_vgamma", V_NUM },
1208 // new_qoslimit
1209 { "new_qoslimit_enable", V_01 },
1210 { "new_qoslimit_rules", V_LENGTH(0, 4096) },
1211 { "qosl_enable", V_01 },
1212 { "qosl_ulr", V_RANGE(0, 999999) },
1213 { "qosl_ulc", V_RANGE(0, 999999) },
1214 { "qosl_dlr", V_RANGE(0, 999999) },
1215 { "qosl_dlc", V_RANGE(0, 999999) },
1216 { "qosl_tcp", V_RANGE(0, 1000) },
1217 { "qosl_udp", V_RANGE(0, 100) },
1218 { "limit_br0_prio", V_RANGE(0, 5) },
1219 { "limit_br1_enable", V_01 },
1220 { "limit_br1_ulr", V_RANGE(0, 999999) },
1221 { "limit_br1_ulc", V_RANGE(0, 999999) },
1222 { "limit_br1_dlr", V_RANGE(0, 999999) },
1223 { "limit_br1_dlc", V_RANGE(0, 999999) },
1224 { "limit_br1_prio", V_RANGE(0, 5) },
1225 { "limit_br2_enable", V_01 },
1226 { "limit_br2_ulr", V_RANGE(0, 999999) },
1227 { "limit_br2_ulc", V_RANGE(0, 999999) },
1228 { "limit_br2_dlr", V_RANGE(0, 999999) },
1229 { "limit_br2_dlc", V_RANGE(0, 999999) },
1230 { "limit_br2_prio", V_RANGE(0, 5) },
1231 { "limit_br3_enable", V_01 },
1232 { "limit_br3_ulr", V_RANGE(0, 999999) },
1233 { "limit_br3_ulc", V_RANGE(0, 999999) },
1234 { "limit_br3_dlr", V_RANGE(0, 999999) },
1235 { "limit_br3_dlc", V_RANGE(0, 999999) },
1236 { "limit_br3_prio", V_RANGE(0, 5) },
1239 #ifdef TCONFIG_BT
1240 // nas-transmission
1241 { "bt_enable", V_01 },
1242 { "bt_binary", V_LENGTH(0, 50) },
1243 { "bt_binary_custom", V_LENGTH(0, 50) },
1244 { "bt_custom", V_TEXT(0, 2048) },
1245 { "bt_port", V_PORT },
1246 { "bt_dir", V_LENGTH(0, 50) },
1247 { "bt_settings", V_LENGTH(0, 50) },
1248 { "bt_settings_custom", V_LENGTH(0, 50) },
1249 { "bt_incomplete", V_01 },
1250 { "bt_rpc_enable", V_01 },
1251 { "bt_rpc_wan", V_01 },
1252 { "bt_auth", V_01 },
1253 { "bt_login", V_LENGTH(0, 50) },
1254 { "bt_password", V_LENGTH(0, 50) },
1255 { "bt_port_gui", V_PORT },
1256 { "bt_dl_enable", V_01 },
1257 { "bt_ul_enable", V_01 },
1258 { "bt_dl", V_RANGE(0, 999999) },
1259 { "bt_ul", V_RANGE(0, 999999) },
1260 { "bt_peer_limit_global", V_RANGE(10, 1000) },
1261 { "bt_peer_limit_per_torrent", V_RANGE(1, 200) },
1262 { "bt_ul_slot_per_torrent", V_RANGE(1, 50) },
1263 { "bt_ratio_enable", V_01 },
1264 { "bt_ratio", V_LENGTH(0, 999999) },
1265 { "bt_ratio_idle_enable", V_01 },
1266 { "bt_ratio_idle", V_RANGE(1, 55) },
1267 { "bt_dht", V_01 },
1268 { "bt_pex", V_01 },
1269 { "bt_lpd", V_01 },
1270 { "bt_utp", V_01 },
1271 { "bt_blocklist", V_01 },
1272 { "bt_blocklist_url", V_LENGTH(0, 80) },
1273 { "bt_sleep", V_RANGE(1, 60) },
1274 { "bt_check", V_01 },
1275 { "bt_check_time", V_RANGE(1, 55) },
1276 { "bt_dl_queue_enable", V_01 },
1277 { "bt_dl_queue_size", V_RANGE(1, 30) },
1278 { "bt_ul_queue_enable", V_01 },
1279 { "bt_ul_queue_size", V_RANGE(1, 30) },
1280 { "bt_message", V_RANGE(0, 3) },
1281 { "bt_log", V_01 },
1282 { "bt_log_path", V_LENGTH(0, 50) },
1284 #endif
1286 #ifdef TCONFIG_NFS
1287 { "nfs_enable", V_01 },
1288 { "nfs_exports", V_LENGTH(0, 4096) },
1289 #endif
1291 //NotCatSplash. Victek.
1292 #ifdef TCONFIG_NOCAT
1293 { "NC_enable", V_01 },
1294 { "NC_Verbosity", V_RANGE(0, 10) },
1295 { "NC_GatewayName", V_LENGTH(0, 255) },
1296 { "NC_GatewayPort", V_PORT },
1297 { "NC_ForcedRedirect", V_01 },
1298 { "NC_HomePage", V_LENGTH(0, 255) },
1299 { "NC_DocumentRoot", V_LENGTH(0, 255) },
1300 { "NC_SplashURL", V_LENGTH(0, 255) },
1301 { "NC_LoginTimeout", V_RANGE(0, 86400000) },
1302 { "NC_IdleTimeout", V_RANGE(0, 86400000) },
1303 { "NC_MaxMissedARP", V_RANGE(0, 10) },
1304 { "NC_PeerChecktimeout", V_RANGE(0, 60) },
1305 { "NC_ExcludePorts", V_LENGTH(0, 255) },
1306 { "NC_IncludePorts", V_LENGTH(0, 255) },
1307 { "NC_AllowedWebHosts", V_LENGTH(0, 255) },
1308 { "NC_MACWhiteList", V_LENGTH(0, 255) },
1309 { "NC_SplashFile", V_LENGTH(0, 8192) },
1310 { "NC_BridgeLAN", V_LENGTH(0, 50) },
1311 #endif
1313 // NGinX Roadkill-Victek
1314 #ifdef TCONFIG_NGINX
1315 {"nginx_enable", V_01 }, // NGinX enabled
1316 {"nginx_php", V_01 }, // PHP enabled
1317 {"nginx_keepconf", V_01 }, // NGinX configuration files overwrite flag
1318 {"nginx_docroot", V_LENGTH(0, 255) }, // root files path
1319 {"nginx_port", V_PORT }, // listening port
1320 {"nginx_fqdn", V_LENGTH(0, 255) }, // server name
1321 {"nginx_upload", V_LENGTH(1, 1000) }, // upload file size limit
1322 {"nginx_remote", V_01 },
1323 {"nginx_priority", V_LENGTH(0, 255) }, // server priority
1324 {"nginx_custom", V_TEXT(0, 4096) }, // user window to add parameters to nginx.conf
1325 {"nginx_httpcustom", V_TEXT(0, 4096) }, // user window to add parameters to nginx.conf
1326 {"nginx_servercustom", V_TEXT(0, 4096) }, // user window to add parameters to nginx.conf
1327 {"nginx_phpconf", V_TEXT(0, 4096) }, // user window to add parameters to php.ini
1328 {"nginx_user", V_LENGTH(0, 255) }, // user used to start nginx and spawn-fcgi
1329 {"nginx_override", V_01 },
1330 {"nginx_overridefile", V_TEXT(0, 4096) },
1332 // bwq518 - MySQL
1333 { "mysql_enable", V_01 },
1334 { "mysql_sleep", V_RANGE(1,60) },
1335 { "mysql_check", V_01 },
1336 { "mysql_check_time", V_RANGE(1,55) },
1337 { "mysql_binary", V_LENGTH(0, 50) },
1338 { "mysql_binary_custom", V_LENGTH(0, 50) },
1339 { "mysql_usb_enable", V_01 },
1340 { "mysql_dlroot", V_LENGTH(0,50) },
1341 { "mysql_datadir", V_LENGTH(0,64) },
1342 { "mysql_tmpdir", V_LENGTH(0,64) },
1343 { "mysql_server_custom", V_TEXT(0,1024) },
1344 { "mysql_port", V_PORT },
1345 { "mysql_allow_anyhost", V_01 },
1346 { "mysql_init_rootpass", V_01 },
1347 { "mysql_username", V_TEXT(0,50) }, // mysqladmin username
1348 { "mysql_passwd", V_TEXT(0,50) }, // mysqladmin password
1349 { "mysql_key_buffer", V_RANGE(0,1024) }, // MB
1350 { "mysql_max_allowed_packet", V_RANGE(0,1024) }, // MB
1351 { "mysql_thread_stack", V_RANGE(0,1024000) }, // KB
1352 { "mysql_thread_cache_size", V_RANGE(0,999999) },
1353 { "mysql_init_priv", V_01 },
1354 { "mysql_table_open_cache", V_RANGE(1,999999) },
1355 { "mysql_sort_buffer_size", V_RANGE(0,1024000) }, //KB
1356 { "mysql_read_buffer_size", V_RANGE(0,1024000) }, //KB
1357 { "mysql_query_cache_size", V_RANGE(0,1024) }, //MB
1358 { "mysql_read_rnd_buffer_size", V_RANGE(0,1024000) }, //KB
1359 { "mysql_net_buffer_length", V_RANGE(0,1024) }, //K
1360 { "mysql_max_connections", V_RANGE(0,999999) },
1361 #endif
1363 #ifdef TCONFIG_OPENVPN
1364 // vpn
1365 { "vpn_debug", V_01 },
1366 { "vpn_server_eas", V_NONE },
1367 { "vpn_server_dns", V_NONE },
1368 { "vpn_server1_poll", V_RANGE(0, 1440) },
1369 { "vpn_server1_if", V_TEXT(3, 3) }, // tap, tun
1370 { "vpn_server1_proto", V_TEXT(3, 10) }, // udp, tcp-server
1371 { "vpn_server1_port", V_PORT },
1372 { "vpn_server1_firewall", V_TEXT(0, 8) }, // auto, external, custom
1373 { "vpn_server1_crypt", V_TEXT(0, 6) }, // tls, secret, custom
1374 { "vpn_server1_comp", V_TEXT(0, 8) }, // yes, no, adaptive
1375 { "vpn_server1_cipher", V_TEXT(0, 16) },
1376 { "vpn_server1_dhcp", V_01 },
1377 { "vpn_server1_r1", V_IP },
1378 { "vpn_server1_r2", V_IP },
1379 { "vpn_server1_sn", V_IP },
1380 { "vpn_server1_nm", V_IP },
1381 { "vpn_server1_local", V_IP },
1382 { "vpn_server1_remote", V_IP },
1383 { "vpn_server1_reneg", V_RANGE(-1,2147483647)},
1384 { "vpn_server1_hmac", V_RANGE(-1, 2) },
1385 { "vpn_server1_plan", V_01 },
1386 { "vpn_server1_ccd", V_01 },
1387 { "vpn_server1_c2c", V_01 },
1388 { "vpn_server1_ccd_excl", V_01 },
1389 { "vpn_server1_ccd_val", V_NONE },
1390 { "vpn_server1_pdns", V_01 },
1391 { "vpn_server1_rgw", V_01 },
1392 { "vpn_server1_userpass", V_01 },
1393 { "vpn_server1_nocert", V_01 },
1394 { "vpn_server1_users_val",V_NONE },
1395 { "vpn_server1_custom", V_NONE },
1396 { "vpn_server1_static", V_NONE },
1397 { "vpn_server1_ca", V_NONE },
1398 { "vpn_server1_crt", V_NONE },
1399 { "vpn_server1_key", V_NONE },
1400 { "vpn_server1_dh", V_NONE },
1401 { "vpn_server1_br", V_LENGTH(0, 50) },
1402 { "vpn_server1_route", V_01 },
1403 { "vpn_server1_routing_val", V_NONE },
1404 { "vpn_server2_poll", V_RANGE(0, 1440) },
1405 { "vpn_server2_if", V_TEXT(3, 3) }, // tap, tun
1406 { "vpn_server2_proto", V_TEXT(3, 10) }, // udp, tcp-server
1407 { "vpn_server2_port", V_PORT },
1408 { "vpn_server2_firewall", V_TEXT(0, 8) }, // auto, external, custom
1409 { "vpn_server2_crypt", V_TEXT(0, 6) }, // tls, secret, custom
1410 { "vpn_server2_comp", V_TEXT(0, 8) }, // yes, no, adaptive
1411 { "vpn_server2_cipher", V_TEXT(0, 16) },
1412 { "vpn_server2_dhcp", V_01 },
1413 { "vpn_server2_r1", V_IP },
1414 { "vpn_server2_r2", V_IP },
1415 { "vpn_server2_sn", V_IP },
1416 { "vpn_server2_nm", V_IP },
1417 { "vpn_server2_local", V_IP },
1418 { "vpn_server2_remote", V_IP },
1419 { "vpn_server2_reneg", V_RANGE(-1,2147483647)},
1420 { "vpn_server2_hmac", V_RANGE(-1, 2) },
1421 { "vpn_server2_plan", V_01 },
1422 { "vpn_server2_pdns", V_01 },
1423 { "vpn_server2_rgw", V_01 },
1424 { "vpn_server2_userpass", V_01 },
1425 { "vpn_server2_nocert", V_01 },
1426 { "vpn_server2_users_val",V_NONE },
1427 { "vpn_server2_custom", V_NONE },
1428 { "vpn_server2_ccd", V_01 },
1429 { "vpn_server2_c2c", V_01 },
1430 { "vpn_server2_ccd_excl", V_01 },
1431 { "vpn_server2_ccd_val", V_NONE },
1432 { "vpn_server2_static", V_NONE },
1433 { "vpn_server2_ca", V_NONE },
1434 { "vpn_server2_crt", V_NONE },
1435 { "vpn_server2_key", V_NONE },
1436 { "vpn_server2_dh", V_NONE },
1437 { "vpn_server2_br", V_LENGTH(0, 50) },
1438 { "vpn_server2_route", V_01 },
1439 { "vpn_server2_routing_val", V_NONE },
1440 { "vpn_client_eas", V_NONE },
1441 { "vpn_client1_poll", V_RANGE(0, 1440) },
1442 { "vpn_client1_if", V_TEXT(3, 3) }, // tap, tun
1443 { "vpn_client1_bridge", V_01 },
1444 { "vpn_client1_nat", V_01 },
1445 { "vpn_client1_proto", V_TEXT(3, 10) }, // udp, tcp-server
1446 { "vpn_client1_addr", V_NONE },
1447 { "vpn_client1_port", V_PORT },
1448 { "vpn_client1_retry", V_RANGE(-1,32767) }, // -1 infinite, 0 disabled, >= 1 custom
1449 { "vpn_client1_firewall", V_TEXT(0, 6) }, // auto, custom
1450 { "vpn_client1_crypt", V_TEXT(0, 6) }, // tls, secret, custom
1451 { "vpn_client1_comp", V_TEXT(0, 8) }, // yes, no, adaptive
1452 { "vpn_client1_cipher", V_TEXT(0, 16) },
1453 { "vpn_client1_local", V_IP },
1454 { "vpn_client1_remote", V_IP },
1455 { "vpn_client1_nm", V_IP },
1456 { "vpn_client1_reneg", V_RANGE(-1,2147483647)},
1457 { "vpn_client1_hmac", V_RANGE(-1, 2) },
1458 { "vpn_client1_adns", V_RANGE(0, 3) },
1459 { "vpn_client1_rgw", V_01 },
1460 { "vpn_client1_gw", V_TEXT(0, 15) },
1461 { "vpn_client1_custom", V_NONE },
1462 { "vpn_client1_static", V_NONE },
1463 { "vpn_client1_ca", V_NONE },
1464 { "vpn_client1_crt", V_NONE },
1465 { "vpn_client1_key", V_NONE },
1466 { "vpn_client1_userauth", V_01 },
1467 { "vpn_client1_username", V_TEXT(0,50) },
1468 { "vpn_client1_password", V_TEXT(0,50) },
1469 { "vpn_client1_useronly", V_01 },
1470 { "vpn_client1_tlsremote",V_01 },
1471 { "vpn_client1_cn", V_NONE },
1472 { "vpn_client1_br", V_LENGTH(0, 50) },
1473 { "vpn_client1_nopull", V_01 },
1474 { "vpn_client1_route", V_01 },
1475 { "vpn_client1_routing_val", V_NONE },
1476 { "vpn_client2_poll", V_RANGE(0, 1440) },
1477 { "vpn_client2_if", V_TEXT(3, 3) }, // tap, tun
1478 { "vpn_client2_bridge", V_01 },
1479 { "vpn_client2_nat", V_01 },
1480 { "vpn_client2_proto", V_TEXT(3, 10) }, // udp, tcp-server
1481 { "vpn_client2_addr", V_NONE },
1482 { "vpn_client2_port", V_PORT },
1483 { "vpn_client2_retry", V_RANGE(-1,32767) }, // -1 infinite, 0 disabled, >= 1 custom
1484 { "vpn_client2_firewall", V_TEXT(0, 6) }, // auto, custom
1485 { "vpn_client2_crypt", V_TEXT(0, 6) }, // tls, secret, custom
1486 { "vpn_client2_comp", V_TEXT(0, 8) }, // yes, no, adaptive
1487 { "vpn_client2_cipher", V_TEXT(0, 16) },
1488 { "vpn_client2_local", V_IP },
1489 { "vpn_client2_remote", V_IP },
1490 { "vpn_client2_nm", V_IP },
1491 { "vpn_client2_reneg", V_RANGE(-1,2147483647)},
1492 { "vpn_client2_hmac", V_RANGE(-1, 2) },
1493 { "vpn_client2_adns", V_RANGE(0, 3) },
1494 { "vpn_client2_rgw", V_01 },
1495 { "vpn_client2_gw", V_TEXT(0, 15) },
1496 { "vpn_client2_custom", V_NONE },
1497 { "vpn_client2_static", V_NONE },
1498 { "vpn_client2_ca", V_NONE },
1499 { "vpn_client2_crt", V_NONE },
1500 { "vpn_client2_key", V_NONE },
1501 { "vpn_client2_userauth", V_01 },
1502 { "vpn_client2_username", V_TEXT(0,50) },
1503 { "vpn_client2_password", V_TEXT(0,50) },
1504 { "vpn_client2_useronly", V_01 },
1505 { "vpn_client2_tlsremote",V_01 },
1506 { "vpn_client2_cn", V_NONE },
1507 { "vpn_client2_br", V_LENGTH(0, 50) },
1508 { "vpn_client2_nopull", V_01 },
1509 { "vpn_client2_route", V_01 },
1510 { "vpn_client2_routing_val", V_NONE },
1511 #endif // vpn
1513 #ifdef TCONFIG_PPTPD
1514 // pptp server
1515 { "pptpd_enable", V_01 },
1516 { "pptpd_remoteip", V_TEXT(0,24) },
1517 { "pptpd_forcemppe", V_01 },
1518 { "pptpd_users", V_TEXT(0, 67*16) },
1519 { "pptpd_broadcast", V_TEXT(0,8) },
1520 { "pptpd_dns1", V_TEXT(0, 15) },
1521 { "pptpd_dns2", V_TEXT(0, 15) },
1522 { "pptpd_wins1", V_TEXT(0, 15) },
1523 { "pptpd_wins2", V_TEXT(0, 15) },
1524 { "pptpd_mtu", V_RANGE(576, 1500) },
1525 { "pptpd_mru", V_RANGE(576, 1500) },
1526 { "pptpd_custom", V_TEXT(0, 2048) },
1527 #endif
1529 #ifdef TCONFIG_TINC
1530 {"tinc_wanup", V_RANGE(0, 1) },
1531 {"tinc_name", V_LENGTH(0, 30) },
1532 {"tinc_devicetype", V_TEXT(3, 3) }, // tun, tap
1533 {"tinc_mode", V_TEXT(3, 6) }, // switch, hub
1534 {"tinc_vpn_netmask", V_IP },
1535 {"tinc_private_rsa", V_NONE },
1536 {"tinc_private_ed25519", V_NONE },
1537 {"tinc_custom", V_NONE },
1538 {"tinc_hosts", V_NONE },
1539 {"tinc_manual_firewall", V_RANGE(0, 2) },
1540 {"tinc_manual_tinc_up", V_RANGE(0, 1) },
1541 // scripts
1542 {"tinc_tinc_up", V_NONE },
1543 {"tinc_tinc_down", V_NONE },
1544 {"tinc_host_up", V_NONE },
1545 {"tinc_host_down", V_NONE },
1546 {"tinc_subnet_up", V_NONE },
1547 {"tinc_subnet_down", V_NONE },
1548 {"tinc_firewall", V_NONE },
1549 #endif
1551 #ifdef TCONFIG_TOR
1552 { "tor_enable", V_01 },
1553 { "tor_socksport", V_RANGE(1,65535) },
1554 { "tor_transport", V_RANGE(1,65535) },
1555 { "tor_dnsport", V_RANGE(1,65535) },
1556 { "tor_datadir", V_TEXT(0,24) },
1557 { "tor_iface", V_LENGTH(0, 50) },
1558 { "tor_users", V_LENGTH(0, 4096) },
1559 { "tor_custom", V_TEXT(0, 2048) },
1560 #endif
1563 ppp_static 0/1
1564 ppp_static_ip IP
1565 wl_enable 0/1
1566 wl_wds_timeout
1567 wl_maxassoc 1-256
1568 wl_phytype a,b,g
1569 wl_net_reauth
1570 wl_preauth
1571 wl_wme_ap_bk
1572 wl_wme_ap_be
1573 wl_wme_ap_vi
1574 wl_wme_ap_vo
1575 wl_wme_sta_bk
1576 wl_wme_sta_be
1577 wl_wme_sta_vi
1578 wl_wme_sta_vo
1580 port_priority_1 0-2
1581 port_flow_control_1 0,1
1582 port_rate_limit_1 0-8
1583 port_priority_2 0-2
1584 port_flow_control_2 0,1
1585 port_rate_limit_2 0-8
1586 port_priority_3 0-2
1587 port_flow_control_3 0,1
1588 port_rate_limit_3 0-8
1589 port_priority_4 0-2
1590 port_flow_control_4 0,1
1591 port_rate_limit_4 0-8
1592 wl_ap_ip
1593 wl_ap_ssid
1595 #ifdef TCONFIG_PPTPD
1596 { "pptp_client_enable", V_01 },
1597 { "pptp_client_peerdns", V_RANGE(0,2) },
1598 { "pptp_client_mtuenable",V_01 },
1599 { "pptp_client_mtu", V_RANGE(576, 1500) },
1600 { "pptp_client_mruenable",V_01 },
1601 { "pptp_client_mru", V_RANGE(576, 1500) },
1602 { "pptp_client_nat", V_01 },
1603 { "pptp_client_srvip", V_NONE },
1604 { "pptp_client_srvsub", V_IP },
1605 { "pptp_client_srvsubmsk",V_IP },
1606 { "pptp_client_username", V_TEXT(0,50) },
1607 { "pptp_client_passwd", V_TEXT(0,50) },
1608 { "pptp_client_crypt", V_RANGE(0, 3) },
1609 { "pptp_client_custom", V_NONE },
1610 { "pptp_client_dfltroute",V_01 },
1611 { "pptp_client_stateless",V_01 },
1612 #endif
1614 { NULL }
1618 static int webcgi_nvram_set(const nvset_t *v, const char *name, int write)
1620 char *p, *e;
1621 int n;
1622 long l;
1623 unsigned u[6];
1624 int ok;
1625 int dirty;
1626 #ifdef TCONFIG_IPV6
1627 struct in6_addr addr;
1628 #endif
1630 if ((p = webcgi_get((char*)name)) == NULL) return 0;
1632 _dprintf("[%s] %s=%s\n", v->name, (char*)name, p);
1633 dirty = 0;
1634 ok = 1;
1635 switch (v->vtype) {
1636 case VT_TEXT:
1637 p = unix_string(p); // NOTE: p = malloc'd
1638 // drop
1639 case VT_LENGTH:
1640 n = strlen(p);
1641 if ((n < v->va.i) || (n > v->vb.i)) ok = 0;
1642 break;
1643 case VT_RANGE:
1644 l = strtol(p, &e, 10);
1645 if ((p == e) || (*e) || (l < v->va.l) || (l > v->vb.l)) ok = 0;
1646 break;
1647 case VT_IP:
1648 if ((sscanf(p, "%3u.%3u.%3u.%3u", &u[0], &u[1], &u[2], &u[3]) != 4) ||
1649 (u[0] > 255) || (u[1] > 255) || (u[2] > 255) || (u[3] > 255)) ok = 0;
1650 break;
1651 case VT_MAC:
1652 if ((sscanf(p, "%2x:%2x:%2x:%2x:%2x:%2x", &u[0], &u[1], &u[2], &u[3], &u[4], &u[5]) != 6) ||
1653 (u[0] > 255) || (u[1] > 255) || (u[2] > 255) || (u[3] > 255) || (u[4] > 255) || (u[5] > 255)) ok = 0;
1654 break;
1655 #ifdef TCONFIG_IPV6
1656 case VT_IPV6:
1657 if (strlen(p) > 0 || v->va.i) {
1658 if (inet_pton(AF_INET6, p, &addr) != 1) ok = 0;
1660 break;
1661 #endif
1662 default:
1663 // shutup gcc
1664 break;
1666 if (!ok) {
1667 if (v->vtype == VT_TEXT) free(p);
1668 return -1;
1670 if (write) {
1671 if (!nvram_match((char *)name, p)) {
1672 if (v->vtype != VT_TEMP) dirty = 1;
1673 DEBUG_NVRAMSET(name, p);
1674 nvram_set(name, p);
1677 if (v->vtype == VT_TEXT) free(p);
1679 return dirty;
1682 typedef struct {
1683 const nvset_t *v;
1684 int write;
1685 int dirty;
1686 } nv_list_t;
1688 static int nv_wl_find(int idx, int unit, int subunit, void *param)
1690 nv_list_t *p = param;
1692 int ok = webcgi_nvram_set(p->v, wl_nvname(p->v->name + 3, unit, subunit), p->write);
1693 if (ok < 0)
1694 return 1;
1695 else {
1696 p->dirty |= ok;
1697 return 0;
1701 static int save_variables(int write)
1703 const nvset_t *v;
1704 char *p;
1705 int n;
1706 int ok;
1707 char s[256];
1708 int dirty;
1709 static const char *msgf = "The field \"%s\" is invalid. Please report this problem.";
1710 nv_list_t nv;
1712 dirty = 0;
1713 nv.write = write;
1714 for (v = nvset_list; v->name; ++v) {
1715 ok = webcgi_nvram_set(v, v->name, write);
1717 if ((ok >= 0) && (strncmp(v->name, "wl_", 3) == 0)) {
1718 nv.dirty = dirty;
1719 nv.v = v;
1720 if (foreach_wif(1, &nv, nv_wl_find) == 0)
1721 ok |= nv.dirty;
1722 else
1723 ok = -1;
1726 if (ok < 0) {
1727 sprintf(s, msgf, v->name);
1728 resmsg_set(s);
1729 return 0;
1731 dirty |= ok;
1734 // special cases
1736 char *p1, *p2;
1737 if (((p1 = webcgi_get("set_password_1")) != NULL) && (strcmp(p1, "**********") != 0)) {
1738 if (((p2 = webcgi_get("set_password_2")) != NULL) && (strcmp(p1, p2) == 0)) {
1739 if ((write) && (!nvram_match("http_passwd", p1))) {
1740 dirty = 1;
1741 nvram_set("http_passwd", p1);
1744 else {
1745 sprintf(s, msgf, "password");
1746 resmsg_set(s);
1747 return 0;
1751 for (n = 0; n < 50; ++n) {
1752 sprintf(s, "rrule%d", n);
1753 if ((p = webcgi_get(s)) != NULL) {
1754 if (strlen(p) > 2048) {
1755 sprintf(s, msgf, s);
1756 resmsg_set(s);
1757 return 0;
1759 if ((write) && (!nvram_match(s, p))) {
1760 dirty = 1;
1761 DEBUG_NVRAMSET(s, p);
1762 nvram_set(s, p);
1767 return (write) ? dirty : 1;
1770 static void wo_tomato(char *url)
1772 char *v;
1773 int i;
1774 int ajax;
1775 int nvset;
1776 const char *red;
1777 int commit;
1778 int force_commit;
1780 // _dprintf("tomato.cgi\n");
1782 red = webcgi_safeget("_redirect", "");
1783 if (!*red) send_header(200, NULL, mime_html, 0);
1785 commit = atoi(webcgi_safeget("_commit", "1"));
1786 force_commit = atoi(webcgi_safeget("_force_commit", "0"));
1787 ajax = atoi(webcgi_safeget("_ajax", "0"));
1789 nvset = atoi(webcgi_safeget("_nvset", "1"));
1790 if (nvset) {
1791 if (!save_variables(0)) {
1792 if (ajax) {
1793 web_printf("@msg:%s", resmsg_get());
1795 else {
1796 parse_asp("error.asp");
1798 return;
1800 commit = save_variables(1) && commit;
1802 resmsg_set("Settings saved.");
1805 rboot = atoi(webcgi_safeget("_reboot", "0"));
1806 if (rboot) {
1807 parse_asp("reboot.asp");
1809 else {
1810 if (ajax) {
1811 web_printf("@msg:%s", resmsg_get());
1813 else if (atoi(webcgi_safeget("_moveip", "0"))) {
1814 parse_asp("saved-moved.asp");
1816 else if (!*red) {
1817 parse_asp("saved.asp");
1821 if (commit || force_commit) {
1822 _dprintf("commit from tomato.cgi\n");
1823 nvram_commit_x();
1826 if ((v = webcgi_get("_service")) != NULL && *v != 0) {
1827 if (!*red) {
1828 if (ajax) web_printf(" Some services are being restarted...");
1829 web_close();
1831 sleep(1);
1833 if (*v == '*') {
1834 kill(1, SIGHUP);
1836 else {
1837 exec_service(v);
1841 for (i = atoi(webcgi_safeget("_sleep", "0")); i > 0; --i) sleep(1);
1843 if (*red) redirect(red);
1845 if (rboot) {
1846 web_close();
1847 sleep(1);
1848 kill(1, SIGTERM);
1853 // ----------------------------------------------------------------------------
1856 static void wo_update(char *url)
1858 const aspapi_t *api;
1859 const char *name;
1860 int argc;
1861 char *argv[16];
1862 char s[32];
1864 if ((name = webcgi_get("exec")) != NULL) {
1865 for (api = aspapi; api->name; ++api) {
1866 if (strcmp(api->name, name) == 0) {
1867 for (argc = 0; argc < 16; ++argc) {
1868 sprintf(s, "arg%d", argc);
1869 if ((argv[argc] = (char *)webcgi_get(s)) == NULL) break;
1871 api->exec(argc, argv);
1872 break;
1878 static void wo_service(char *url)
1880 int n;
1882 exec_service(webcgi_safeget("_service", ""));
1884 if ((n = atoi(webcgi_safeget("_sleep", "2"))) <= 0) n = 2;
1885 sleep(n);
1887 common_redirect();
1890 static void wo_shutdown(char *url)
1892 parse_asp("shutdown.asp");
1893 web_close();
1894 sleep(1);
1896 kill(1, SIGQUIT);
1899 static void wo_nvcommit(char *url)
1901 parse_asp("saved.asp");
1902 web_close();
1903 nvram_commit();