source: src/router/httpd/visuals/dd-wrt.c @ 13572

Last change on this file since 13572 was 13572, checked in by eko, 3 years ago

missing ng mode for broadcom

File size: 224.9 KB
Line 
1#define VISUALSOURCE 1
2/*
3 * dd-wrt.c
4 *
5 * Copyright (C) 2005 - 2007 Sebastian Gottschall <sebastian.gottschall@newmedia-net.de>
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20 *
21 * $Id:
22 */
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <stdarg.h>
27#include <string.h>
28#include <unistd.h>
29#include <ctype.h>
30#include <signal.h>
31
32#include <sys/ioctl.h>
33#include <sys/types.h>
34#include <sys/stat.h>
35#include <sys/socket.h>
36#include <sys/statfs.h>
37#include <netinet/in.h>
38#include <arpa/inet.h>
39#include <broadcom.h>
40#include <cymac.h>
41#include <wlutils.h>
42#include <bcmparams.h>
43#include <dirent.h>
44#include <netdb.h>
45#include <utils.h>
46#include <wlutils.h>
47#include <bcmnvram.h>
48#include <l7protocols.h>
49
50#ifdef HAVE_OVERCLOCKING
51static unsigned int type2_clocks[7] = { 200, 240, 252, 264, 300, 330, 0 };
52static unsigned int type3_clocks[3] = { 150, 200, 0 };
53static unsigned int type4_clocks[10] =
54    { 192, 200, 216, 228, 240, 252, 264, 280, 300, 0 };
55static unsigned int type7_clocks[10] =
56    { 183, 187, 198, 200, 216, 225, 233, 237, 250, 0 };
57#endif
58
59#ifdef HAVE_RT2880
60#define IFMAP(a) getRADev(a)
61#else
62#define IFMAP(a) (a)
63#endif
64
65void show_ipnetmask(webs_t wp, char *var)
66{
67        websWrite(wp, "<div class=\"setting\">\n");
68        websWrite(wp,
69                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.ip)</script></div>\n");
70
71        char *ipv = nvram_nget("%s_ipaddr", var);
72
73        websWrite(wp,
74                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,1,223,share.ip)\" name=\"%s_ipaddr_0\" value=\"%d\" />.",
75                  var, get_single_ip(ipv, 0));
76        websWrite(wp,
77                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.ip)\" name=\"%s_ipaddr_1\" value=\"%d\" />.",
78                  var, get_single_ip(ipv, 1));
79        websWrite(wp,
80                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.ip)\" name=\"%s_ipaddr_2\" value=\"%d\" />.",
81                  var, get_single_ip(ipv, 2));
82        websWrite(wp,
83                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.ip)\" name=\"%s_ipaddr_3\" value=\"%d\" />\n",
84                  var, get_single_ip(ipv, 3));
85        websWrite(wp, "</div>\n");
86
87        websWrite(wp, "<div class=\"setting\">\n");
88        websWrite(wp,
89                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.subnet)</script></div>\n");
90        ipv = nvram_nget("%s_netmask", var);
91
92        websWrite(wp,
93                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_netmask_0\" value=\"%d\" />.",
94                  var, get_single_ip(ipv, 0));
95        websWrite(wp,
96                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_netmask_1\" value=\"%d\" />.",
97                  var, get_single_ip(ipv, 1));
98        websWrite(wp,
99                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_netmask_2\" value=\"%d\" />.",
100                  var, get_single_ip(ipv, 2));
101        websWrite(wp,
102                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_netmask_3\" value=\"%d\" />",
103                  var, get_single_ip(ipv, 3));
104        websWrite(wp, "</div>\n<br />\n");
105
106}
107
108#ifdef HAVE_OVERCLOCKING
109void ej_show_clocks(webs_t wp, int argc, char_t ** argv)
110{
111        int rev = cpu_plltype();
112        unsigned int *c;
113
114        if (rev == 2)
115                c = type2_clocks;
116        else if (rev == 3)
117                c = type3_clocks;
118        else if (rev == 4)
119                c = type4_clocks;
120        else if (rev == 7)
121                c = type7_clocks;
122        else {
123                websWrite(wp,
124                          "<script type=\"text/javascript\">Capture(management.clock_support)</script>\n</div>\n");
125                return;
126        }
127
128        websWrite(wp,
129                  "<div class=\"label\"><script type=\"text/javascript\">Capture(management.clock_frq)</script></div>\n");
130        websWrite(wp, "<select name=\"overclocking\">\n");
131
132        char *oclk = nvram_safe_get("overclocking");
133
134        int cclk = atoi(oclk);
135
136        int i = 0;
137
138        while (c[i] != 0) {
139                websWrite(wp, "<option value=\"%d\" %s >%d MHz</option>\n",
140                          c[i], c[i] == cclk ? "selected=\"selected\"" :
141                          "", c[i]);
142                i++;
143        }
144        websWrite(wp, "</select>\n</div>\n");
145}
146#endif
147
148void ej_show_routing(webs_t wp, int argc, char_t ** argv)
149{
150        websWrite(wp, "<script type=\"text/javascript\">\n//<![CDATA[\n");
151        websWrite(wp,
152                  "document.write(\"<option value=\\\"gateway\\\" %s >\" + share.gateway + \"</option>\");\n",
153                  nvram_selmatch(wp, "wk_mode",
154                                 "gateway") ? "selected=\\\"selected\\\"" : "");
155#ifdef HAVE_BIRD
156        websWrite(wp,
157                  "document.write(\"<option value=\\\"bgp\\\" %s >BGP</option>\");\n",
158                  nvram_selmatch(wp, "wk_mode",
159                                 "bgp") ? "selected=\\\"selected\\\"" : "");
160        websWrite(wp,
161                  "document.write(\"<option value=\\\"router\\\" %s >\" + route.rip2_mod + \"</option>\");\n",
162                  nvram_selmatch(wp, "wk_mode",
163                                 "router") ? "selected=\\\"selected\\\"" : "");
164#endif
165#ifdef HAVE_QUAGGA
166        websWrite(wp,
167                  "document.write(\"<option value=\\\"bgp\\\" %s >BGP</option>\");\n",
168                  nvram_selmatch(wp, "wk_mode",
169                                 "bgp") ? "selected=\\\"selected\\\"" : "");
170        websWrite(wp,
171                  "document.write(\"<option value=\\\"router\\\" %s >\" + route.rip2_mod + \"</option>\");\n",
172                  nvram_selmatch(wp, "wk_mode",
173                                 "router") ? "selected=\\\"selected\\\"" : "");
174        websWrite(wp,
175                  "document.write(\"<option value=\\\"ospf\\\" %s >\" + route.ospf_mod + \"</option>\");\n",
176                  nvram_selmatch(wp, "wk_mode",
177                                 "ospf") ? "selected=\\\"selected\\\"" : "");
178#endif
179#ifdef HAVE_OLSRD
180        websWrite(wp,
181                  "document.write(\"<option value=\\\"olsr\\\" %s >\" + route.olsrd_mod + \"</option>\");\n",
182                  nvram_selmatch(wp, "wk_mode",
183                                 "olsr") ? "selected=\\\"selected\\\"" : "");
184#endif
185        websWrite(wp,
186                  "document.write(\"<option value=\\\"static\\\" %s >\" + share.router + \"</option>\");\n",
187                  nvram_selmatch(wp, "wk_mode",
188                                 "static") ? "selected=\\\"selected\\\"" : "");
189        websWrite(wp, "//]]>\n</script>\n");
190        return;
191
192}
193
194void ej_show_connectiontype(webs_t wp, int argc, char_t ** argv)
195{
196
197        websWrite(wp, "<script type=\"text/javascript\">\n//<![CDATA[\n");
198        websWrite(wp,
199                  "document.write(\"<option value=\\\"disabled\\\" %s >\" + share.disabled + \"</option>\");\n",
200                  nvram_selmatch(wp, "wan_proto",
201                                 "disabled") ? "selected=\\\"selected\\\"" :
202                  "");
203        websWrite(wp,
204                  "document.write(\"<option value=\\\"static\\\" %s >\" + idx.static_ip + \"</option>\");\n",
205                  nvram_selmatch(wp, "wan_proto",
206                                 "static") ? "selected=\\\"selected\\\"" : "");
207        websWrite(wp,
208                  "document.write(\"<option value=\\\"dhcp\\\" %s >\" + idx.dhcp + \"</option>\");\n",
209                  nvram_selmatch(wp, "wan_proto",
210                                 "dhcp") ? "selected=\\\"selected\\\"" : "");
211        websWrite(wp, "\n//]]>\n</script>\n");
212
213#ifdef HAVE_PPPOE
214        websWrite(wp, "<option value=\"pppoe\" %s >PPPoE</option>\n",
215                  nvram_selmatch(wp, "wan_proto",
216                                 "pppoe") ? "selected=\"selected\"" : "");
217#endif
218#ifdef HAVE_PPTP
219        websWrite(wp, "<option value=\"pptp\" %s >PPTP</option>\n",
220                  nvram_selmatch(wp, "wan_proto",
221                                 "pptp") ? "selected=\"selected\"" : "");
222#endif
223#ifdef HAVE_L2TP
224        websWrite(wp, "<option value=\"l2tp\" %s >L2TP</option>\n",
225                  nvram_selmatch(wp, "wan_proto",
226                                 "l2tp") ? "selected=\"selected\"" : "");
227#endif
228#ifdef HAVE_HEARTBEAT
229        websWrite(wp,
230                  "<option value=\"heartbeat\" %s >HeartBeat Signal</option>\n",
231                  nvram_selmatch(wp, "wan_proto",
232                                 "heartbeat") ? "selected=\"selected\"" : "");
233#endif
234#ifdef HAVE_3G
235        websWrite(wp,
236                  "<option value=\"3g\" %s >3G/UMTS</option>\n",
237                  nvram_selmatch(wp, "wan_proto",
238                                 "3g") ? "selected=\"selected\"" : "");
239#endif
240
241        return;
242}
243
244void ej_show_infopage(webs_t wp, int argc, char_t ** argv)
245{
246        /*
247         * #ifdef HAVE_NEWMEDIA websWrite(wp,"<dl>\n"); websWrite(wp,"<dd
248         * class=\"definition\">GGEW net GmbH</dd>\n"); websWrite(wp,"<dd
249         * class=\"definition\">Dammstrasse 68</dd>\n"); websWrite(wp,"<dd
250         * class=\"definition\">64625 Bensheim</dd>\n"); websWrite(wp,"<dd
251         * class=\"definition\"><a href=\"http://ggew-net.de\"><img
252         * src=\"images/ggewlogo.gif\" border=\"0\"/></a></dd>\n");
253         * websWrite(wp,"<dd class=\"definition\"> </dd>\n"); websWrite(wp,"<dd
254         * class=\"definition\"><a href=\"http://ggew-net.de\"/></dd>\n");
255         * websWrite(wp,"<dd class=\"definition\"> </dd>\n"); websWrite(wp,"<dd
256         * class=\"definition\">In Kooperation mit NewMedia-NET GmbH</dd>\n");
257         * websWrite(wp,"<dd class=\"definition\"><a
258         * href=\"http://www.newmedia-net.de\"/></dd>\n");
259         * websWrite(wp,"</dl>\n"); #endif
260         */
261        return;
262}
263
264void ej_dumpmeminfo(webs_t wp, int argc, char_t ** argv)
265{
266        FILE *fcpu = fopen("/proc/meminfo", "r");
267
268        if (fcpu == NULL) {
269                return;
270        }
271        char buf[128];
272        int n = 0;
273
274      rept:;
275        if (n == EOF) {
276                fclose(fcpu);
277                return;
278        }
279        if (n)
280                websWrite(wp, "'%s'", buf);
281        n = fscanf(fcpu, "%s", buf);
282        if (n != EOF)
283                websWrite(wp, ",");
284        goto rept;
285}
286
287#ifdef HAVE_RB500
288void ej_get_clkfreq(webs_t wp, int argc, char_t ** argv)
289{
290        FILE *fp = fopen("/proc/cpuinfo", "rb");
291
292        if (fp == NULL) {
293                websWrite(wp, "unknown");
294                return;
295        }
296        int cnt = 0;
297        int b = 0;
298
299        while (b != EOF) {
300                b = getc(fp);
301                if (b == ':')
302                        cnt++;
303
304                if (cnt == 4) {
305                        getc(fp);
306                        char cpuclk[4];
307
308                        cpuclk[0] = getc(fp);
309                        cpuclk[1] = getc(fp);
310                        cpuclk[2] = getc(fp);
311                        cpuclk[3] = 0;
312                        websWrite(wp, cpuclk);
313                        fclose(fp);
314                        return;
315                }
316        }
317
318        fclose(fp);
319        websWrite(wp, "unknown");
320        return;
321}
322
323#elif HAVE_STORM
324void ej_get_clkfreq(webs_t wp, int argc, char_t ** argv)
325{
326        websWrite(wp, "300");
327        return;
328}
329#elif HAVE_RT3052
330void ej_get_clkfreq(webs_t wp, int argc, char_t ** argv)
331{
332        websWrite(wp, "384");
333        return;
334}
335#elif HAVE_RT2880
336void ej_get_clkfreq(webs_t wp, int argc, char_t ** argv)
337{
338        websWrite(wp, "266");
339        return;
340}
341#elif HAVE_XSCALE
342void ej_get_clkfreq(webs_t wp, int argc, char_t ** argv)
343{
344        FILE *fp = fopen("/proc/cpuinfo", "rb");
345
346        if (fp == NULL) {
347                websWrite(wp, "unknown");
348                return;
349        }
350        int cnt = 0;
351        int b = 0;
352
353        while (b != EOF) {
354                b = getc(fp);
355                if (b == ':')
356                        cnt++;
357                if (cnt == 2) {
358                        getc(fp);
359                        char cpuclk[4];
360
361                        cpuclk[0] = getc(fp);
362                        cpuclk[1] = getc(fp);
363                        cpuclk[2] = getc(fp);
364                        cpuclk[3] = 0;
365                        websWrite(wp, cpuclk);
366                        fclose(fp);
367                        return;
368                }
369        }
370
371        fclose(fp);
372        websWrite(wp, "unknown");
373        return;
374}
375#elif HAVE_X86
376void ej_get_clkfreq(webs_t wp, int argc, char_t ** argv)
377{
378        FILE *fp = fopen("/proc/cpuinfo", "rb");
379
380        if (fp == NULL) {
381                websWrite(wp, "unknown");
382                return;
383        }
384        int cnt = 0;
385        int b = 0;
386
387        while (b != EOF) {
388                b = getc(fp);
389                if (b == ':')
390                        cnt++;
391                if (cnt == 7) {
392                        getc(fp);
393                        char cpuclk[32];
394                        int i = 0;
395
396                        b = getc(fp);
397                        while (b != 0xa && b != 0xd && b != 0x20) {
398                                cpuclk[i++] = b;
399                                b = getc(fp);
400                        }
401                        cpuclk[i++] = 0;
402                        websWrite(wp, cpuclk);
403                        fclose(fp);
404                        return;
405                }
406        }
407
408        fclose(fp);
409        websWrite(wp, "unknown");
410        return;
411}
412#elif HAVE_MAGICBOX
413void ej_get_clkfreq(webs_t wp, int argc, char_t ** argv)
414{
415        FILE *fp = fopen("/proc/cpuinfo", "rb");
416
417        if (fp == NULL) {
418                websWrite(wp, "unknown");
419                return;
420        }
421        int cnt = 0;
422        int b = 0;
423
424        while (b != EOF) {
425                b = getc(fp);
426                if (b == ':')
427                        cnt++;
428                if (cnt == 3) {
429                        getc(fp);
430                        char cpuclk[4];
431
432                        cpuclk[0] = getc(fp);
433                        cpuclk[1] = getc(fp);
434                        cpuclk[2] = getc(fp);
435                        cpuclk[3] = 0;
436                        websWrite(wp, cpuclk);
437                        fclose(fp);
438                        return;
439                }
440        }
441
442        fclose(fp);
443        websWrite(wp, "unknown");
444        return;
445}
446#elif defined(HAVE_FONERA) || defined(HAVE_SOLO51) || defined(HAVE_ADM5120) || defined(HAVE_MERAKI) || defined(HAVE_LS2) || defined(HAVE_LS5) || defined(HAVE_WHRAG108) || defined(HAVE_TW6600) || defined(HAVE_CA8)
447void ej_get_clkfreq(webs_t wp, int argc, char_t ** argv)
448{
449        FILE *fp = fopen("/proc/cpuinfo", "rb");
450
451        if (fp == NULL) {
452                websWrite(wp, "unknown");
453                return;
454        }
455        int cnt = 0;
456        int b = 0;
457
458        while (b != EOF) {
459                b = getc(fp);
460                if (b == ':')
461                        cnt++;
462                if (cnt == 4) {
463                        getc(fp);
464                        char cpuclk[4];
465
466                        cpuclk[0] = getc(fp);
467                        cpuclk[1] = getc(fp);
468                        cpuclk[2] = getc(fp);
469                        cpuclk[3] = 0;
470                        websWrite(wp, cpuclk);
471                        fclose(fp);
472                        return;
473                }
474        }
475
476        fclose(fp);
477        websWrite(wp, "unknown");
478        return;
479}
480#elif defined(HAVE_PB42) || defined(HAVE_LSX) || defined(HAVE_DANUBE)
481void ej_get_clkfreq(webs_t wp, int argc, char_t ** argv)
482{
483        FILE *fp = fopen("/proc/cpuinfo", "rb");
484
485        if (fp == NULL) {
486                websWrite(wp, "unknown");
487                return;
488        }
489        int cnt = 0;
490        int b = 0;
491
492        while (b != EOF) {
493                b = getc(fp);
494                if (b == ':')
495                        cnt++;
496                if (cnt == 5) {
497                        getc(fp);
498                        char cpuclk[4];
499
500                        cpuclk[0] = getc(fp);
501                        cpuclk[1] = getc(fp);
502                        cpuclk[2] = getc(fp);
503                        cpuclk[3] = 0;
504                        websWrite(wp, cpuclk);
505                        fclose(fp);
506                        return;
507                }
508        }
509
510        fclose(fp);
511        websWrite(wp, "unknown");
512        return;
513}
514
515#else
516
517void ej_get_clkfreq(webs_t wp, int argc, char_t ** argv)
518{
519        char *clk = nvram_get("clkfreq");
520
521        if (clk == NULL) {
522                if (getcpurev() == 0)   //BCM4710
523                        websWrite(wp, "125");
524                else if (getcpurev() == 29)     //BCM5354
525                        websWrite(wp, "240");
526                else
527                        websWrite(wp, "unknown");
528                return;
529        }
530        char buf[64];
531
532        strcpy(buf, clk);
533        int i = 0;
534
535        while (buf[i++] != 0) {
536                if (buf[i] == ',')
537                        buf[i] = 0;
538        }
539        websWrite(wp, buf);
540        return;
541}
542#endif
543
544void ej_show_cpuinfo(webs_t wp, int argc, char_t ** argv)
545{
546        FILE *fcpu = fopen("/proc/cpuinfo", "r");
547
548        if (fcpu == NULL) {
549                websWrite(wp, "Not Detected!\n");
550                return;
551        }
552        char buf[256];
553        int i;
554
555#ifdef HAVE_MAGICBOX
556        int cnt = 0;
557#endif
558#ifdef HAVE_X86
559        int cnt = 0;
560#endif
561        for (i = 0; i < 256; i++) {
562                int c = getc(fcpu);
563
564                if (c == EOF) {
565                        websWrite(wp, "Not Detected!\n");
566                        fclose(fcpu);
567                        return;
568                }
569                if (c == ':')
570#ifdef HAVE_MAGICBOX
571                        cnt++;
572                if (cnt == 2)
573                        break;
574#elif HAVE_X86
575                        cnt++;
576                if (cnt == 5)
577                        break;
578#else
579                        break;
580#endif
581        }
582        getc(fcpu);
583        for (i = 0; i < 256; i++) {
584                int c = getc(fcpu);
585
586                if (c == EOF) {
587                        websWrite(wp, "Not Detected!\n");
588                        fclose(fcpu);
589                        return;
590                }
591                if (c == 0xa || c == 0xd)
592                        break;
593                buf[i] = c;
594        }
595        buf[i] = 0;
596        websWrite(wp, buf);
597        fclose(fcpu);
598        return;
599}
600
601#define ASSOCLIST_TMP   "/tmp/.wl_assoclist"
602#define RSSI_TMP        "/tmp/.rssi"
603#define ASSOCLIST_CMD   "wl assoclist"
604#define RSSI_CMD        "wl rssi"
605#define NOISE_CMD       "wl noise"
606
607void ej_show_wds_subnet(webs_t wp, int argc, char_t ** argv)
608{
609        int index = -1;
610        char *interface;
611
612#ifdef FASTWEB
613        ejArgs(argc, argv, "%d %s", &index, &interface);
614#else
615        if (ejArgs(argc, argv, "%d %s", &index, &interface) < 2) {
616                websError(wp, 400, "Insufficient args\n");
617                return;
618        }
619#endif
620        char br1[32];
621
622        sprintf(br1, "%s_br1_enable", interface);
623        if (nvram_invmatch(br1, "1"))
624                return;
625        char buf[16];
626
627        sprintf(buf, "%s_wds%d_enable", interface, index);
628        websWrite(wp,
629                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option value=\\\"2\\\" %s >\" + wds.subnet + \"</option>\");\n//]]>\n</script>\n",
630                  nvram_selmatch(wp, buf,
631                                 "2") ? "selected=\\\"selected\\\"" : "");
632        return;
633}
634
635#ifdef HAVE_SKYTRON
636void ej_active_wireless2(webs_t wp, int argc, char_t ** argv)
637{
638        int rssi = 0, noise = 0;
639        FILE *fp, *fp2;
640        char *mode;
641        char mac[30];
642        char list[2][30];
643        char line[80];
644
645        unlink(ASSOCLIST_TMP);
646        unlink(RSSI_TMP);
647
648        mode = nvram_safe_get("wl_mode");
649        sysprintf("%s > %s", ASSOCLIST_CMD, ASSOCLIST_TMP);
650
651        int connected = 0;
652
653        if ((fp = fopen(ASSOCLIST_TMP, "r"))) {
654                while (fgets(line, sizeof(line), fp) != NULL) {
655                        if (sscanf(line, "%s %s", list[0], mac) != 2)   // assoclist
656                                // 00:11:22:33:44:55
657                                continue;
658
659                        if (strcmp(list[0], "assoclist"))
660                                break;
661
662                        rssi = 0;
663                        noise = 0;
664                        // get rssi value
665                        if (strcmp(mode, "ap"))
666                                sysprintf("%s > %s", RSSI_CMD, RSSI_TMP);
667                        else
668                                sysprintf("%s \"%s\" > %s", RSSI_CMD, mac,
669                                          RSSI_TMP);
670
671                        // get noise value if not ap mode
672                        if (strcmp(mode, "ap"))
673                                sysprintf("%s >> %s", NOISE_CMD, RSSI_TMP);
674
675                        fp2 = fopen(RSSI_TMP, "r");
676                        if (fgets(line, sizeof(line), fp2) != NULL) {
677
678                                // get rssi
679                                if (sscanf
680                                    (line, "%s %s %d", list[0], list[1],
681                                     &rssi) != 3)
682                                        continue;
683
684                                // get noise for client/wet mode
685                                if (strcmp(mode, "ap") &&
686                                    fgets(line, sizeof(line), fp2) != NULL &&
687                                    sscanf(line, "%s %s %d", list[0], list[1],
688                                           &noise) != 3)
689                                        continue;
690
691                                fclose(fp2);
692                        }
693                        if (nvram_match("maskmac", "1")) {
694                                mac[0] = 'x';
695                                mac[1] = 'x';
696                                mac[3] = 'x';
697                                mac[4] = 'x';
698                                mac[6] = 'x';
699                                mac[7] = 'x';
700                                mac[9] = 'x';
701                                mac[10] = 'x';
702                        }
703                        if (strcmp(mode, "ap") != 0) {
704                                connected = 1;
705                                websWrite(wp, "<tr>\n");
706                                websWrite(wp,
707                                          "<td bgcolor=\"#B2B2B2\" valign=\"middle\" align=\"right\" width=\"200\" height=\"25\"><font face=\"Arial\" color=\"#000000\" size=\"2\"><b>Verbindungsstatus</b></font></td>\n");
708                                websWrite(wp,
709                                          "<td bgcolor=\"#B2B2B2\"></td>\n");
710                                websWrite(wp,
711                                          "<td bgcolor=\"#FFFFFF\"></td>\n");
712                                websWrite(wp,
713                                          "<td colspan=\"2\" bgcolor=\"#FFFFFF\" valign=\"middle\" align=\"left\"><font face=\"Arial\" color=\"#000000\" size=\"2\">Verbunden</font></td>\n");
714                                websWrite(wp, "</tr>\n");
715                                websWrite(wp, "<tr>\n");
716                                websWrite(wp,
717                                          "<td bgcolor=\"#B2B2B2\" valign=\"middle\" align=\"right\" width=\"200\" height=\"25\"><font face=\"Arial\" color=\"#000000\" size=\"2\">Signal</font></td>\n");
718                                websWrite(wp,
719                                          "<td bgcolor=\"#B2B2B2\"></td>\n");
720                                websWrite(wp,
721                                          "<td bgcolor=\"#FFFFFF\"></td>\n");
722                                websWrite(wp,
723                                          "<td colspan=\"2\" bgcolor=\"#FFFFFF\" valign=\"middle\" align=\"left\"><font face=\"Arial\" color=\"#000000\" size=\"2\">%d dBm</font></td>\n",
724                                          rssi);
725                                websWrite(wp, "</tr>\n");
726                                websWrite(wp, "<tr>\n");
727                                websWrite(wp,
728                                          "<td bgcolor=\"#B2B2B2\" valign=\"middle\" align=\"right\" width=\"200\" height=\"25\"><font face=\"Arial\" color=\"#000000\" size=\"2\">Rauschen</font></td>\n");
729                                websWrite(wp,
730                                          "<td bgcolor=\"#B2B2B2\"></td>\n");
731                                websWrite(wp,
732                                          "<td bgcolor=\"#FFFFFF\"></td>\n");
733                                websWrite(wp,
734                                          "<td colspan=\"2\" bgcolor=\"#FFFFFF\" valign=\"middle\" align=\"left\"><font face=\"Arial\" color=\"#000000\" size=\"2\">%d dBm</font></td>\n",
735                                          noise);
736                                websWrite(wp, "</tr>\n");
737                        }
738                }
739                fclose(fp);
740        }
741
742        unlink(ASSOCLIST_TMP);
743        unlink(RSSI_TMP);
744        if (!connected) {
745                connected = 1;
746                websWrite(wp, "<tr>\n");
747                websWrite(wp,
748                          "<td bgcolor=\"#B2B2B2\" valign=\"middle\" align=\"right\" width=\"200\" height=\"25\"><font face=\"Arial\" color=\"#000000\" size=\"2\"><b>Verbindungsstatus</b></font></td>\n");
749                websWrite(wp, "<td bgcolor=\"#B2B2B2\"></td>\n");
750                websWrite(wp, "<td bgcolor=\"#FFFFFF\"></td>\n");
751                websWrite(wp,
752                          "<td colspan=\"2\" bgcolor=\"#FFFFFF\" valign=\"middle\" align=\"left\"><font face=\"Arial\" color=\"#000000\" size=\"2\">Nicht Verbunden</font></td>\n");
753                websWrite(wp, "</tr>\n");
754
755        }
756
757        return 0;
758}
759#endif
760
761void ej_show_paypal(webs_t wp, int argc, char_t ** argv)
762{
763#ifdef HAVE_DDLAN
764        websWrite(wp,
765                  "<a href=\"mailto:support@mcdd.de\">support@mcdd.de</a><br />");
766#endif
767#ifdef HAVE_CORENET
768        websWrite(wp,
769                  "<a href=\"http://www.corenetsolutions.com\">http://www.corenetsolutions.com</a><br />");
770#endif
771
772#ifndef CONFIG_BRANDING
773#ifndef HAVE_REGISTER
774        websWrite(wp, "<a href=\"http://www.dd-wrt.com/\">DD-WRT</a><br />");
775        websWrite(wp,
776                  "<form action=\"https://www.paypal.com/cgi-bin/webscr\" method=\"post\" target=\"_blank\">");
777        websWrite(wp,
778                  "<input type=\"hidden\" name=\"cmd\" value=\"_xclick\" />");
779        websWrite(wp,
780                  "<input type=\"hidden\" name=\"business\" value=\"paypal@dd-wrt.com\" />");
781        websWrite(wp,
782                  "<input type=\"hidden\" name=\"item_name\" value=\"DD-WRT Development Support\" />");
783        websWrite(wp, "<input type=\"hidden\" name=\"no_note\" value=\"1\" />");
784        websWrite(wp,
785                  "<input type=\"hidden\" name=\"currency_code\" value=\"EUR\" />");
786        websWrite(wp, "<input type=\"hidden\" name=\"lc\" value=\"en\" />");
787        websWrite(wp, "<input type=\"hidden\" name=\"tax\" value=\"0\" />");
788        websWrite(wp,
789                  "<input type=\"image\" src=\"images/paypal.gif\" name=\"submit\" />");
790        websWrite(wp, "</form>");
791        websWrite(wp,
792                  "<br /><script type=\"text/javascript\">Capture(donate.mb)</script><br />\n");
793        websWrite(wp,
794                  "<a href=\"https://www.moneybookers.com/app/send.pl\" target=\"_blank\">\n");
795        // #ifdef HAVE_MICRO
796        // websWrite (wp,
797        // "<img style=\"border-width: 1px; border-color: #8B8583;\"
798        // src=\"http://www.moneybookers.com/images/banners/88_en_interpayments.gif\"
799        // alt=\"donate thru moneybookers\" />\n");
800        // #else
801        websWrite(wp,
802                  "<img style=\"border-width: 1px; border-color: #8B8583;\" src=\"images/88_en_interpayments.png\" alt=\"donate thru interpayments\" />\n");
803        // #endif
804        websWrite(wp, "</a>\n");
805#endif
806#endif
807        return;
808}
809
810#ifdef HAVE_RADLOCAL
811
812void ej_show_iradius_check(webs_t wp, int argc, char_t ** argv)
813{
814        char *sln = nvram_safe_get("iradius_count");
815
816        if (sln == NULL || strlen(sln) == 0)
817                return;
818        int leasenum = atoi(sln);
819        int i;
820
821        for (i = 0; i < leasenum; i++) {
822                websWrite(wp, "if(F._iradius%d_active)\n", i);
823                websWrite(wp, "if(F._iradius%d_active.checked == true)\n", i);
824                websWrite(wp, "F.iradius%d_active.value=1\n", i);
825                websWrite(wp, "else\n");
826                websWrite(wp, "F.iradius%d_active.value=0\n", i);
827
828                websWrite(wp, "if(F._iradius%d_delete)\n", i);
829                websWrite(wp, "if(F._iradius%d_delete.checked == true)\n", i);
830                websWrite(wp, "F.iradius%d_delete.value=1\n", i);
831                websWrite(wp, "else\n");
832                websWrite(wp, "F.iradius%d_delete.value=0\n", i);
833        }
834
835}
836
837void ej_show_iradius(webs_t wp, int argc, char_t ** argv)
838{
839        char *sln = nvram_safe_get("iradius_count");
840
841        if (sln == NULL || strlen(sln) == 0)
842                return;
843        int leasenum = atoi(sln);
844
845        if (leasenum == 0)
846                return;
847        int i;
848        char username[32];
849        char *o, *userlist;
850
851        cprintf("get collection\n");
852        char *u = nvram_get_collection("iradius");
853
854        cprintf("collection result %s", u);
855        if (u != NULL) {
856                userlist = (char *)malloc(strlen(u) + 1);
857                strcpy(userlist, u);
858                free(u);
859                o = userlist;
860        } else {
861                userlist = NULL;
862                o = NULL;
863        }
864        cprintf("display = chain\n");
865        struct timeval now;
866
867        gettimeofday(&now, NULL);
868        for (i = 0; i < leasenum; i++) {
869                snprintf(username, 31, "iradius%d_name", i);
870                char *sep = NULL;
871
872                if (userlist)
873                        sep = strsep(&userlist, " ");
874                websWrite(wp, "<tr><td>\n");
875                websWrite(wp, "<input name=\"%s\" type=\"hidden\" />",
876                          username);
877                websWrite(wp,
878                          "<input name=\"%s\" value=\"%s\" size=\"25\" maxlength=\"63\" />\n",
879                          username, sep != NULL ? sep : "");
880                websWrite(wp, "</td>\n");
881                if (userlist)
882                        sep = strsep(&userlist, " ");
883
884                char active[32];
885
886                snprintf(active, 31, "iradius%d_active", i);
887
888                websWrite(wp, "<td>\n");
889                websWrite(wp, "<input name=\"%s\" type=\"hidden\" />", active);
890                websWrite(wp,
891                          "<input type=\"checkbox\" value=\"%s\" name=\"_%s\" %s />\n",
892                          sep, active, sep != NULL ? strcmp(sep,
893                                                            "1") ==
894                          0 ? "checked=\"checked\"" : "" : "");
895                websWrite(wp, "</td>\n");
896                websWrite(wp, "<td>\n");
897                if (userlist)
898                        sep = strsep(&userlist, " ");
899                long t = atol(sep);
900
901                if (t != -1) {
902                        t -= now.tv_sec;
903                        t /= 60;
904                }
905
906                snprintf(active, 31, "iradius%d_lease", i);
907                char st[32];
908
909                if (t >= 0)
910                        sprintf(st, "%d", t);
911                else
912                        sprintf(st, "over");
913                websWrite(wp, "<input type=\"num\" name=\"%s\" value='%s' />\n",
914                          active, st);
915                websWrite(wp, "</td>\n");
916
917                websWrite(wp, "<td>\n");
918                snprintf(active, 31, "iradius%d_delete", i);
919                websWrite(wp, "<input name=\"%s\" type=\"hidden\" />", active);
920                websWrite(wp, "<input type=\"checkbox\" name=\"_%s\"/>\n",
921                          active);
922                websWrite(wp, "</td></tr>\n");
923        }
924        if (o != NULL)
925                free(o);
926        return;
927}
928
929#endif
930
931#ifdef HAVE_CHILLILOCAL
932
933void ej_show_userlist(webs_t wp, int argc, char_t ** argv)
934{
935        char *sln = nvram_safe_get("fon_usernames");
936
937        if (sln == NULL || strlen(sln) == 0)
938                return;
939        int leasenum = atoi(sln);
940
941        if (leasenum == 0)
942                return;
943        int i;
944        char username[32];
945        char password[32];
946        char *u = nvram_safe_get("fon_userlist");
947        char *userlist = (char *)malloc(strlen(u) + 1);
948
949        strcpy(userlist, u);
950        char *o = userlist;
951
952        for (i = 0; i < leasenum; i++) {
953                snprintf(username, 31, "fon_user%d_name", i);
954                char *sep = strsep(&userlist, "=");
955
956                websWrite(wp, "<tr><td>\n");
957                websWrite(wp,
958                          "<input name=\"%s\" value=\"%s\" size=\"25\" maxlength=\"63\" />\n",
959                          username, sep != NULL ? sep : "");
960                websWrite(wp, "</td>\n");
961                sep = strsep(&userlist, " ");
962                snprintf(password, 31, "fon_user%d_password", i);
963                websWrite(wp, "<td>\n");
964                websWrite(wp,
965                          "<input type=\"password\" name=\"%s\" value=\"blahblahblah\" size=\"25\" maxlength=\"63\" />\n",
966                          password);
967                websWrite(wp, "</td></tr>\n");
968        }
969        free(o);
970        return;
971}
972
973#endif
974
975void ej_show_staticleases(webs_t wp, int argc, char_t ** argv)
976{
977        int i;
978
979        // cprintf("get static leasenum");
980
981        char *sln = nvram_safe_get("static_leasenum");
982
983        // cprintf("check null");
984        if (sln == NULL || strlen(sln) == 0)
985                return;
986        // cprintf("atoi");
987
988        int leasenum = atoi(sln);
989
990        // cprintf("leasenum==0");
991        if (leasenum == 0)
992                return;
993        // cprintf("get leases");
994        char *nvleases = nvram_safe_get("static_leases");
995        char *leases = (char *)malloc(strlen(nvleases) + 1);
996        char *originalpointer = leases; // strsep destroys the pointer by
997
998        // moving it
999        strcpy(leases, nvleases);
1000        for (i = 0; i < leasenum; i++) {
1001                char *sep = strsep(&leases, "=");
1002
1003                websWrite(wp,
1004                          "<tr><td><input name=\"lease%d_hwaddr\" value=\"%s\" size=\"18\" maxlength=\"18\" onblur=\"valid_name(this,share.mac,SPACE_NO)\" /></td>",
1005                          i, sep != NULL ? sep : "");
1006                sep = strsep(&leases, "=");
1007                websWrite(wp,
1008                          "<td><input name=\"lease%d_hostname\" value=\"%s\" size=\"24\" maxlength=\"24\" onblur=\"valid_name(this,share.hostname,SPACE_NO)\" /></td>",
1009                          i, sep != NULL ? sep : "");
1010                sep = strsep(&leases, " ");
1011                websWrite(wp,
1012                          "<td><input name=\"lease%d_ip\" value=\"%s\" size=\"15\" maxlength=\"15\" class=\"num\" onblur=\"valid_name(this,share.ip,SPACE_NO)\" /></td></tr>\n",
1013                          i, sep != NULL ? sep : "");
1014        }
1015        free(originalpointer);
1016        return;
1017}
1018
1019void ej_show_control(webs_t wp, int argc, char_t ** argv)
1020{
1021#ifdef CONFIG_BRANDING
1022        websWrite(wp, "Control Panel");
1023#else
1024        websWrite(wp, "DD-WRT Control Panel");
1025#endif
1026        return;
1027}
1028
1029#ifndef HAVE_AQOS
1030void ej_show_default_level(webs_t wp, int argc, char_t ** argv)
1031{
1032        return;
1033}
1034
1035#else
1036void ej_show_default_level(webs_t wp, int argc, char_t ** argv)
1037{
1038        websWrite(wp, "<fieldset>\n");
1039        websWrite(wp,
1040                  "<legend><script type=\"text/javascript\">Capture(qos.legend6)</script></legend>\n");
1041        websWrite(wp, "<div class=\"setting\">\n");
1042        websWrite(wp,
1043                  "<div class=\"label\"><script type=\"text/javascript\">Capture(qos.bandwidth)</script> Up</div>\n");
1044        websWrite(wp,
1045                  "<input type=\"num\" name=\"default_uplevel\" size=\"6\" value=\"%s\" /> Down\n",
1046                  nvram_safe_get("default_uplevel"));
1047        websWrite(wp,
1048                  "<input type=\"num\" name=\"default_downlevel\" size=\"6\" value=\"%s\" />\n",
1049                  nvram_safe_get("default_downlevel"));
1050        websWrite(wp, "</div>\n");
1051        websWrite(wp, "</fieldset><br />\n");
1052        return;
1053}
1054#endif
1055
1056#ifdef HAVE_MADWIFI
1057struct wifi_channels {
1058        int channel;
1059        int freq;
1060        int noise;
1061};
1062extern struct wifi_channels *list_channels(char *devnr);
1063extern struct wifi_channels *list_channels_11n(char *devnr);
1064
1065// extern int getchannelcount (void);
1066extern int getdevicecount(void);
1067#endif
1068
1069static char *selmatch(char *var, char *is, char *ret)
1070{
1071        if (nvram_match(var, is))
1072                return ret;
1073        return "";
1074}
1075
1076static void
1077show_security_prefix(webs_t wp, int argc, char_t ** argv, char *prefix,
1078                     int primary)
1079{
1080        static char var[80];
1081        static char sta[80];
1082
1083        // char p2[80];
1084        cprintf("show security prefix\n");
1085        sprintf(var, "%s_security_mode", prefix);
1086        // strcpy(p2,prefix);
1087        // rep(p2,'X','.');
1088        // websWrite (wp, "<input type=\"hidden\"
1089        // name=\"%s_security_mode\"/>\n",p2);
1090        websWrite(wp, "<div class=\"setting\">\n");
1091        websWrite(wp,
1092                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wpa.secmode)</script></div>\n");
1093        websWrite(wp,
1094                  "<select name=\"%s_security_mode\" onchange=\"SelMode('%s_security_mode',this.form.%s_security_mode.selectedIndex,this.form)\">\n",
1095                  prefix, prefix, prefix);
1096        websWrite(wp,
1097                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option value=\\\"disabled\\\" %s >\" + share.disabled + \"</option>\");\n//]]>\n</script>\n",
1098                  selmatch(var, "disabled", "selected=\\\"selected\\\""));
1099        websWrite(wp, "<option value=\"psk\" %s>WPA Personal</option>\n",
1100                  selmatch(var, "psk", "selected=\"selected\""));
1101        sprintf(sta, "%s_mode", prefix);
1102        if (!primary || nvram_match(sta, "ap") || nvram_match(sta, "wdsap")) {
1103                websWrite(wp,
1104                          "<option value=\"wpa\" %s>WPA Enterprise</option>\n",
1105                          selmatch(var, "wpa", "selected=\"selected\""));
1106        }
1107        websWrite(wp, "<option value=\"psk2\" %s>WPA2 Personal</option>\n",
1108                  selmatch(var, "psk2", "selected=\"selected\""));
1109        if (!primary || nvram_match(sta, "ap") || nvram_match(sta, "wdsap")) {
1110                websWrite(wp,
1111                          "<option value=\"wpa2\" %s>WPA2 Enterprise</option>\n",
1112                          selmatch(var, "wpa2", "selected=\"selected\""));
1113        }
1114#ifdef HAVE_RT2880
1115        if (!primary || nvram_match(sta, "ap"))
1116#endif
1117                websWrite(wp,
1118                          "<option value=\"psk psk2\" %s>WPA2 Personal Mixed</option>\n",
1119                          selmatch(var, "psk psk2", "selected=\"selected\""));
1120
1121        if (!primary || nvram_match(sta, "ap") || nvram_match(sta, "wdsap")) {
1122                websWrite(wp,
1123                          "<option value=\"wpa wpa2\" %s>WPA2 Enterprise Mixed</option>\n",
1124                          selmatch(var, "wpa wpa2", "selected=\"selected\""));
1125
1126                websWrite(wp, "<option value=\"radius\" %s>RADIUS</option>\n",
1127                          selmatch(var, "radius", "selected=\"selected\""));
1128        }
1129
1130        websWrite(wp, "<option value=\"wep\" %s>WEP</option>\n",
1131                  selmatch(var, "wep", "selected=\"selected\""));
1132#ifdef HAVE_WPA_SUPPLICANT
1133#ifndef HAVE_MICRO
1134#ifndef HAVE_RT2880
1135        if (!primary || nvram_match(sta, "sta") || nvram_match(sta, "wdssta")
1136            || nvram_match(sta, "apsta") || nvram_match(sta, "wet")) {
1137                websWrite(wp, "<option value=\"8021X\" %s>802.1x</option>\n",
1138                          selmatch(var, "8021X", "selected=\"selected\""));
1139        }
1140#else
1141        if (nvram_match(sta, "sta") || nvram_match(sta, "wet")) {
1142                websWrite(wp, "<option value=\"8021X\" %s>802.1x</option>\n",
1143                          selmatch(var, "8021X", "selected=\"selected\""));
1144        }
1145#endif
1146#endif
1147#endif
1148
1149        websWrite(wp, "</select></div>\n");
1150        rep(prefix, 'X', '.');
1151        cprintf("ej show wpa\n");
1152        ej_show_wpa_setting(wp, argc, argv, prefix);
1153
1154}
1155
1156static void
1157ej_show_security_single(webs_t wp, int argc, char_t ** argv, char *prefix)
1158{
1159        char *next;
1160        char var[80];
1161        char ssid[80];
1162        char mac[16];
1163
1164        sprintf(mac, "%s_hwaddr", prefix);
1165        char *vifs = nvram_nget("%s_vifs", prefix);
1166
1167        if (vifs == NULL)
1168                return;
1169        sprintf(ssid, "%s_ssid", prefix);
1170        websWrite(wp,
1171                  "<h2><script type=\"text/javascript\">Capture(wpa.h2)</script> %s</h2>\n",
1172                  prefix);
1173        websWrite(wp, "<fieldset>\n");
1174        // cprintf("getting %s %s\n",ssid,nvram_safe_get(ssid));
1175        websWrite(wp,
1176                  "<legend><script type=\"text/javascript\">Capture(share.pintrface)</script> %s SSID [",
1177                  IFMAP(prefix));
1178        tf_webWriteESCNV(wp, ssid);     // fix for broken html page if ssid
1179        // contains html tag
1180        websWrite(wp, "] HWAddr [%s]</legend>\n", nvram_safe_get(mac));
1181        show_security_prefix(wp, argc, argv, prefix, 1);
1182        websWrite(wp, "</fieldset>\n<br />\n");
1183        foreach(var, vifs, next) {
1184                sprintf(ssid, "%s_ssid", var);
1185                websWrite(wp, "<fieldset>\n");
1186                // cprintf("getting %s %s\n", ssid,nvram_safe_get(ssid));
1187                websWrite(wp,
1188                          "<legend><script type=\"text/javascript\">Capture(share.vintrface)</script> %s SSID [",
1189                          IFMAP(var));
1190                tf_webWriteESCNV(wp, ssid);     // fix for broken html page if ssid
1191                // contains html tag
1192                websWrite(wp, "]</legend>\n");
1193                rep(var, '.', 'X');
1194                show_security_prefix(wp, argc, argv, var, 0);
1195                websWrite(wp, "</fieldset>\n<br />\n");
1196        }
1197
1198}
1199
1200void ej_show_security(webs_t wp, int argc, char_t ** argv)
1201{
1202#ifndef HAVE_MADWIFI
1203        int c = get_wl_instances();
1204        int i;
1205
1206        for (i = 0; i < c; i++) {
1207                char buf[16];
1208
1209                sprintf(buf, "wl%d", i);
1210                ej_show_security_single(wp, argc, argv, buf);
1211        }
1212        return;
1213#else
1214        int c = getdevicecount();
1215        int i;
1216
1217        for (i = 0; i < c; i++) {
1218                char buf[16];
1219
1220                sprintf(buf, "ath%d", i);
1221                ej_show_security_single(wp, argc, argv, buf);
1222        }
1223        return;
1224#endif
1225}
1226
1227void ej_show_dhcpd_settings(webs_t wp, int argc, char_t ** argv)
1228{
1229        int i;
1230
1231        if (getWET())           // dhcpd settings disabled in client bridge mode, so we wont display it
1232                return;
1233
1234        websWrite(wp,
1235                  "<fieldset><legend><script type=\"text/javascript\">Capture(idx.dhcp_legend)</script></legend>\n");
1236        websWrite(wp, "<div class=\"setting\">\n");
1237        websWrite(wp,
1238                  "<div class=\"label\"><script type=\"text/javascript\">Capture(idx.dhcp_type)</script></div>\n");
1239        websWrite(wp,
1240                  "<select class=\"num\" size=\"1\" name=\"dhcpfwd_enable\" onchange=SelDHCPFWD(this.form.dhcpfwd_enable.selectedIndex,this.form)>\n");
1241        websWrite(wp, "<script type=\"text/javascript\">\n//<![CDATA[\n");
1242        websWrite(wp,
1243                  "document.write(\"<option value=\\\"0\\\" %s >\" + idx.dhcp_srv + \"</option>\");\n",
1244                  nvram_match("dhcpfwd_enable",
1245                              "0") ? "selected=\\\"selected\\\"" : "");
1246        websWrite(wp,
1247                  "document.write(\"<option value=\\\"1\\\" %s >\" + idx.dhcp_fwd + \"</option>\");\n",
1248                  nvram_match("dhcpfwd_enable",
1249                              "1") ? "selected=\\\"selected\\\"" : "");
1250        websWrite(wp, "//]]>\n</script>\n");
1251        websWrite(wp, "</select>\n");
1252        websWrite(wp, "</div>\n");
1253        if (nvram_match("dhcpfwd_enable", "1")) {
1254                websWrite(wp, "<div class=\"setting\">\n");
1255                websWrite(wp,
1256                          "<div class=\"label\"><script type=\"text/javascript\">Capture(idx.dhcp_srv)</script></div>\n");
1257                char *ipfwd = nvram_safe_get("dhcpfwd_ip");
1258
1259                websWrite(wp,
1260                          "<input type=\"hidden\" name=\"dhcpfwd_ip\" value=\"4\" /><input class=\"num\" maxlength=\"3\" size=\"3\" name=\"dhcpfwd_ip_0\" onblur=\"valid_range(this,0,255,idx.dhcp_srv)\" value=\"%d\" />.<input class=\"num\" maxlength=\"3\" size=\"3\" name=\"dhcpfwd_ip_1\" onblur=\"valid_range(this,0,255,idx.dhcp_srv)\" value=\"%d\" />.<input class=\"num\" maxlength=\"3\" name=\"dhcpfwd_ip_2\" size=\"3\" onblur=\"valid_range(this,0,255,idx.dhcp_srv)\" value=\"%d\" />.<input class=\"num\" maxlength=\"3\" name=\"dhcpfwd_ip_3\" size=\"3\" onblur=\"valid_range(this,0,254,idx.dhcp_srv)\" value=\"%d\"\" /></div>\n",
1261                          get_single_ip(ipfwd, 0), get_single_ip(ipfwd, 1),
1262                          get_single_ip(ipfwd, 2), get_single_ip(ipfwd, 3));
1263        } else {
1264                char buf[20];
1265
1266                prefix_ip_get("lan_ipaddr", buf, 1);
1267                websWrite(wp, "<div class=\"setting\">\n");
1268                // char *nv = nvram_safe_get ("wan_wins");
1269                websWrite(wp,
1270                          "<div class=\"label\"><script type=\"text/javascript\">Capture(idx.dhcp_srv)</script></div><input class=\"spaceradio\" type=\"radio\" name=\"lan_proto\" value=\"dhcp\" onclick=SelDHCP('dhcp',this.form) %s /><script type=\"text/javascript\">Capture(share.enable)</script>&nbsp;\n",
1271                          nvram_match("lan_proto",
1272                                      "dhcp") ? "checked=\"checked\"" : "");
1273                websWrite(wp,
1274                          "<input class=\"spaceradio\" type=\"radio\" name=\"lan_proto\" value=\"static\" onclick=\"SelDHCP('static',this.form)\" %s /><script type=\"text/javascript\">Capture(share.disable)</script></div><input type=\"hidden\" name=\"dhcp_check\" /><div class=\"setting\">\n",
1275                          nvram_match("lan_proto",
1276                                      "static") ? "checked=\"checked\"" : "");
1277                websWrite(wp,
1278                          "<div class=\"label\"><script type=\"text/javascript\">Capture(idx.dhcp_start)</script></div>%s",
1279                          buf);
1280                websWrite(wp,
1281                          "<input class=\"num\" name=\"dhcp_start\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,1,254,idx.dhcp_start)\" value=\"%s\" />",
1282                          nvram_safe_get("dhcp_start"));
1283                websWrite(wp, "</div>\n");
1284                websWrite(wp, "<div class=\"setting\">\n");
1285                websWrite(wp,
1286                          "<div class=\"label\"><script type=\"text/javascript\">Capture(idx.dhcp_maxusers)</script></div><input class=\"num\" name=\"dhcp_num\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,0,253,idx.dhcp_maxusers)\" value=\"%s\" /></div>\n",
1287                          nvram_safe_get("dhcp_num"));
1288                websWrite(wp, "<div class=\"setting\">\n");
1289                websWrite(wp,
1290                          "<div class=\"label\"><script type=\"text/javascript\">Capture(idx.dhcp_lease)</script></div><input class=\"num\" name=\"dhcp_lease\" size=\"5\" maxlength=\"5\" onblur=\"valid_range(this,0,99999,idx.dhcp_lease)\" value=\"%s\" > <script type=\"text/javascript\">Capture(share.minutes)</script></input></div>\n",
1291                          nvram_safe_get("dhcp_lease"));
1292                if (nvram_invmatch("wan_proto", "static")) {
1293                        websWrite(wp, "<div class=\"setting\">\n");
1294                        websWrite(wp,
1295                                  "<div class=\"label\"><script type=\"text/javascript\">Capture(idx_static.dns)</script> 1</div>");
1296                        websWrite(wp,
1297                                  "<input type=\"hidden\" name=\"wan_dns\" value=\"4\" />");
1298                        for (i = 0; i < 4; i++)
1299                                websWrite(wp,
1300                                          "<input class=\"num\" name=\"wan_dns0_%d\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,0,%d,idx_static.dns)\" value=\"%d\" />%s",
1301                                          i, i == 3 ? 254 : 255,
1302                                          get_dns_ip("wan_dns", 0, i),
1303                                          i < 3 ? "." : "");
1304
1305                        websWrite(wp, "\n</div>\n<div class=\"setting\">\n");
1306                        websWrite(wp,
1307                                  "<div class=\"label\"><script type=\"text/javascript\">Capture(idx_static.dns)</script> 2</div>");
1308                        for (i = 0; i < 4; i++)
1309                                websWrite(wp,
1310                                          "<input class=\"num\" name=\"wan_dns1_%d\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,0,%d,idx_static.dns)\" value=\"%d\" />%s",
1311                                          i, i == 3 ? 254 : 255,
1312                                          get_dns_ip("wan_dns", 1, i),
1313                                          i < 3 ? "." : "");
1314
1315                        websWrite(wp, "\n</div>\n<div class=\"setting\">\n");
1316                        websWrite(wp,
1317                                  "<div class=\"label\"><script type=\"text/javascript\">Capture(idx_static.dns)</script> 3</div>");
1318                        for (i = 0; i < 4; i++)
1319                                websWrite(wp,
1320                                          "<input class=\"num\" name=\"wan_dns2_%d\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,0,%d,idx_static.dns)\" value=\"%d\" />%s",
1321                                          i, i == 3 ? 254 : 255,
1322                                          get_dns_ip("wan_dns", 2, i),
1323                                          i < 3 ? "." : "");
1324                        websWrite(wp, "\n</div>");
1325                }
1326                websWrite(wp, "<div class=\"setting\">\n");
1327                websWrite(wp, "<div class=\"label\">WINS</div>\n");
1328                websWrite(wp,
1329                          "<input type=\"hidden\" name=\"wan_wins\" value=\"4\" />\n");
1330                char *wins = nvram_safe_get("wan_wins");
1331
1332                for (i = 0; i < 4; i++) {
1333                        websWrite(wp,
1334                                  "<input class=\"num\" name=\"wan_wins_%d\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,0,%d,&#34;WINS&#34;)\" value=\"%d\" />%s",
1335                                  i, i == 3 ? 254 : 255, get_single_ip(wins, i),
1336                                  i < 3 ? "." : "");
1337                }
1338
1339                websWrite(wp, "</div>\n<div class=\"setting\">\n");
1340                websWrite(wp,
1341                          "<div class=\"label\"><script type=\"text/javascript\">Capture(idx.dhcp_dnsmasq)</script></div>\n");
1342                websWrite(wp,
1343                          "<input type=\"checkbox\" name=\"_dhcp_dnsmasq\" value=\"1\" onclick=\"setDNSMasq(this.form)\" %s />\n",
1344                          nvram_match("dhcp_dnsmasq",
1345                                      "1") ? "checked=\"checked\"" : "");
1346                websWrite(wp, "</div>\n<div class=\"setting\">\n");
1347                websWrite(wp,
1348                          "<div class=\"label\"><script type=\"text/javascript\">Capture(idx.dns_dnsmasq)</script></div>\n");
1349                websWrite(wp,
1350                          "<input type=\"checkbox\" name=\"_dns_dnsmasq\" value=\"1\" %s />\n",
1351                          nvram_match("dns_dnsmasq",
1352                                      "1") ? "checked=\"checked\"" : "");
1353                websWrite(wp, "</div>\n<div class=\"setting\">\n");
1354                websWrite(wp,
1355                          "<div class=\"label\"><script type=\"text/javascript\">Capture(idx.auth_dnsmasq)</script></div>\n");
1356                websWrite(wp,
1357                          "<input type=\"checkbox\" name=\"_auth_dnsmasq\" value=\"1\" %s />\n",
1358                          nvram_match("auth_dnsmasq",
1359                                      "1") ? "checked=\"checked\"" : "");
1360                websWrite(wp, "</div>\n");
1361        }
1362
1363        websWrite(wp, "</fieldset><br />\n");
1364        return;
1365}
1366
1367#ifdef HAVE_MADWIFI
1368void ej_show_wifiselect(webs_t wp, int argc, char_t ** argv)
1369{
1370        char *next;
1371        char var[32];
1372        int count = getifcount("wifi");
1373
1374        if (count < 2)
1375                return;
1376        websWrite(wp, "<div class=\"setting\">\n");
1377        websWrite(wp,
1378                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.intrface)</script></div>\n");
1379        websWrite(wp,
1380                  "<select name=\"wifi_display\" onchange=\"refresh(this.form)\">\n");
1381        int i;
1382
1383        for (i = 0; i < count; i++) {
1384                sprintf(var, "ath%d", i);
1385                websWrite(wp, "<option value=\"%s\" %s >%s</option>\n",
1386                          var, nvram_match("wifi_display",
1387                                           var) ? "selected=\"selected\"" : "",
1388                          var);
1389                char *names = nvram_nget("ath%d_vifs", i);
1390
1391                foreach(var, names, next) {
1392                        websWrite(wp, "<option value=\"%s\" %s >%s</option>\n",
1393                                  var, nvram_match("wifi_display",
1394                                                   var) ?
1395                                  "selected=\"selected\"" : "", var);
1396                }
1397        }
1398        websWrite(wp, "</select>\n");
1399        websWrite(wp, "</div>\n");
1400
1401}
1402#else
1403void ej_show_wifiselect(webs_t wp, int argc, char_t ** argv)
1404{
1405        char *next;
1406        char var[32];
1407        int count = get_wl_instances();
1408
1409        if (count < 2)
1410                return;
1411        websWrite(wp, "<div class=\"setting\">\n");
1412        websWrite(wp,
1413                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.intrface)</script></div>\n");
1414        websWrite(wp,
1415                  "<select name=\"wifi_display\" onchange=\"refresh(this.form)\">\n");
1416        int i;
1417
1418        for (i = 0; i < count; i++) {
1419                sprintf(var, "wl%d", i);
1420                websWrite(wp, "<option value=\"%s\" %s >%s</option>\n",
1421                          var, nvram_match("wifi_display",
1422                                           var) ? "selected=\"selected\"" : "",
1423                          var);
1424        }
1425        websWrite(wp, "</select>\n");
1426        websWrite(wp, "</div>\n");
1427}
1428
1429#endif
1430#if 0
1431static void showOption(webs_t wp, char *propname, char *nvname)
1432{
1433        websWrite(wp, "<div class=\"setting\">\n");
1434        websWrite(wp,
1435                  "<div class=\"label\"><script type=\"text/javascript\">Capture(%s)</script></div>\n<select name=\"%s\">\n",
1436                  propname, nvname);
1437        websWrite(wp, "<script type=\"text/javascript\">\n//<![CDATA[\n");
1438        websWrite(wp,
1439                  "document.write(\"<option value=\\\"0\\\" %s >\" + share.disabled + \"</option>\");\n",
1440                  nvram_default_match(nvname, "0",
1441                                      "0") ? "selected=\\\"selected\\\"" : "");
1442        websWrite(wp,
1443                  "document.write(\"<option value=\\\"1\\\" %s >\" + share.enabled + \"</option>\");\n",
1444                  nvram_default_match(nvname, "1",
1445                                      "0") ? "selected=\\\"selected\\\"" : "");
1446        websWrite(wp, "//]]>\n</script>\n</select>\n</div>\n");
1447
1448}
1449#endif
1450static void showRadio(webs_t wp, char *propname, char *nvname)
1451{
1452        websWrite(wp, "<div class=\"setting\">\n");
1453        websWrite(wp,
1454                  "<div class=\"label\"><script type=\"text/javascript\">Capture(%s)</script></div>\n",
1455                  propname);
1456        websWrite(wp,
1457                  "<input class=\"spaceradio\" type=\"radio\" value=\"1\" name=\"%s\" %s><script type=\"text/javascript\">Capture(share.enable)</script></input>&nbsp;\n",
1458                  nvname, nvram_default_match(nvname, "1",
1459                                              "0") ? "checked=\"checked\"" :
1460                  "");
1461        websWrite(wp,
1462                  "<input class=\"spaceradio\" type=\"radio\" value=\"0\" name=\"%s\" %s><script type=\"text/javascript\">Capture(share.disable)</script></input>&nbsp;\n",
1463                  nvname, nvram_default_match(nvname, "0",
1464                                              "0") ? "checked=\"checked\"" :
1465                  "");
1466        websWrite(wp, "</div>\n");
1467}
1468
1469#ifdef HAVE_MADWIFI
1470static void showAutoOption(webs_t wp, char *propname, char *nvname)
1471{
1472        websWrite(wp, "<div class=\"setting\">\n");
1473        websWrite(wp,
1474                  "<div class=\"label\"><script type=\"text/javascript\">Capture(%s)</script></div>\n<select name=\"%s\">\n",
1475                  propname, nvname);
1476        websWrite(wp, "<script type=\"text/javascript\">\n//<![CDATA[\n");
1477        websWrite(wp,
1478                  "document.write(\"<option value=\\\"-1\\\" %s >\" + share.auto + \"</option>\");\n",
1479                  nvram_default_match(nvname, "0",
1480                                      "-1") ? "selected=\\\"selected\\\"" : "");
1481        websWrite(wp,
1482                  "document.write(\"<option value=\\\"1\\\" %s >\" + share.enabled + \"</option>\");\n",
1483                  nvram_default_match(nvname, "1",
1484                                      "-1") ? "selected=\\\"selected\\\"" : "");
1485        websWrite(wp,
1486                  "document.write(\"<option value=\\\"0\\\" %s >\" + share.disabled + \"</option>\");\n",
1487                  nvram_default_match(nvname, "0",
1488                                      "-1") ? "selected=\\\"selected\\\"" : "");
1489        websWrite(wp, "//]]>\n</script>\n</select>\n</div>\n");
1490
1491}
1492#endif
1493
1494static void showOptions(webs_t wp, char *propname, char *names, char *select)
1495{
1496        char *next;
1497        char var[80];
1498
1499        websWrite(wp, "<select name=\"%s\">\n", propname);
1500        websWrite(wp, "<script type=\"text/javascript\">\n//<![CDATA[\n");
1501        foreach(var, names, next) {
1502                websWrite(wp,
1503                          "document.write(\"<option value=\\\"%s\\\" %s >%s</option>\");\n",
1504                          var, !strcmp(var,
1505                                       select) ? "selected=\\\"selected\\\"" :
1506                          "", var);
1507        }
1508        websWrite(wp, "//]]>\n</script>\n</select>\n");
1509}
1510
1511static void
1512showOptionsChoose(webs_t wp, char *propname, char *names, char *select)
1513{
1514        char *next;
1515        char var[80];
1516
1517        websWrite(wp, "<select name=\"%s\">\n", propname);
1518        websWrite(wp, "<script type=\"text/javascript\">\n//<![CDATA[\n");
1519        websWrite(wp,
1520                  "document.write(\"<option value=\\\"null\\\" >Please choose...</option>\");\n");
1521        foreach(var, names, next) {
1522                websWrite(wp,
1523                          "document.write(\"<option value=\\\"%s\\\" %s >%s</option>\");\n",
1524                          var, !strcmp(var,
1525                                       select) ? "selected=\\\"selected\\\"" :
1526                          "", var);
1527        }
1528        websWrite(wp, "//]]>\n</script>\n</select>\n");
1529}
1530
1531static void
1532showOptionsLabel(webs_t wp, char *labelname, char *propname, char *names,
1533                 char *select)
1534{
1535        websWrite(wp, "<div class=\"setting\">\n");
1536        websWrite(wp,
1537                  "<div class=\"label\"><script type=\"text/javascript\">Capture(%s)</script></div>",
1538                  labelname);
1539        showOptions(wp, propname, names, select);
1540        websWrite(wp, "</div>\n");
1541
1542}
1543
1544void
1545show_inputlabel(webs_t wp, char *labelname, char *propertyname,
1546                int propertysize, char *inputclassname, int inputmaxlength)
1547{
1548        websWrite(wp, "<div class=\"setting\">\n");
1549        websWrite(wp,
1550                  "<div class=\"label\"><script type=\"text/javascript\">Capture(%s)</script></div>",
1551                  labelname);
1552        websWrite(wp,
1553                  "<input class=\"%s\" size=\"%d\" maxlength=\"%d\" name=\"%s\" value=\"%s\" />\n",
1554                  inputclassname, propertysize, inputmaxlength, propertyname,
1555                  nvram_safe_get(propertyname));
1556        websWrite(wp, "</div>\n");
1557}
1558
1559void
1560show_custominputlabel(webs_t wp, char *labelname, char *propertyname,
1561                      char *property, int propertysize)
1562{
1563        websWrite(wp, "<div class=\"setting\">\n");
1564        websWrite(wp, "<div class=\"label\">%s</div>", labelname);
1565        websWrite(wp, "<input size=\"%d\" name=\"%s\" value=\"%s\" />\n",
1566                  propertysize, propertyname, property);
1567        websWrite(wp, "</div>\n");
1568}
1569
1570#ifdef HAVE_USB
1571void ej_show_usb_diskinfo(webs_t wp, int argc, char_t ** argv)
1572{
1573        char buff[512];
1574        FILE *fp;
1575
1576        if (!nvram_match("usb_automnt", "1"))
1577                return;
1578
1579        if ((fp = fopen("/tmp/disktype.dump", "r"))) {
1580                while (fgets(buff, sizeof(buff), fp)) {
1581                        if (strcmp(buff, "\n"))
1582                                websWrite(wp, "%s<br />", buff);
1583                }
1584                fclose(fp);
1585        } else
1586                websWrite(wp, "%s", live_translate("status_router.notavail"));
1587
1588        return;
1589}
1590#endif
1591
1592#ifdef HAVE_MMC
1593void ej_show_mmc_cardinfo(webs_t wp, int argc, char_t ** argv)
1594{
1595        char buff[512];
1596        FILE *fp;
1597
1598        if (!nvram_match("mmc_enable0", "1"))
1599                return;
1600
1601        if ((fp = fopen("/proc/mmc/status", "rb"))) {
1602                while (fgets(buff, sizeof(buff), fp)) {
1603                        if (strcmp(buff, "\n"))
1604                                websWrite(wp, "%s<br />", buff);
1605                }
1606                fclose(fp);
1607        } else
1608                websWrite(wp, "%s", live_translate("status_router.notavail"));
1609
1610        return;
1611}
1612#endif
1613
1614void show_legend(webs_t wp, char *labelname, int translate)
1615{
1616        /*
1617         * char buf[2]; sprintf(buf,"%d",translate); websWrite (wp,
1618         * "<legend>%s%s%s</legend>\n", !strcmp (buf, "1") ? "<script
1619         * type=\"text/javascript\">Capture(" : "", labelname, !strcmp (buf, "1")
1620         * ? ")</script>" : "");
1621         */
1622        if (translate)
1623                websWrite(wp,
1624                          "<legend><script type=\"text/javascript\">Capture(%s)</script></legend>\n",
1625                          labelname);
1626        else
1627                websWrite(wp, "<legend>%s</legend>\n", labelname);
1628
1629}
1630
1631#ifdef HAVE_OLSRD
1632
1633void ej_show_olsrd(webs_t wp, int argc, char_t ** argv)
1634{
1635        char *var = websGetVar(wp, "wk_mode", NULL);
1636
1637        if (var == NULL)
1638                var = nvram_safe_get("wk_mode");
1639        if (!strcmp(var, "olsr")) {
1640                websWrite(wp, "<fieldset>\n");
1641                show_legend(wp, "route.olsrd_legend", 1);
1642                show_inputlabel(wp, "route.olsrd_hna", "olsrd_hna", 32, "num",
1643                                32);
1644                show_inputlabel(wp, "route.olsrd_poll", "olsrd_pollsize", 5,
1645                                "num", 5);
1646                showOptionsLabel(wp, "route.olsrd_tc", "olsrd_redundancy",
1647                                 "0 1 2", nvram_default_get("olsrd_redundancy",
1648                                                            "2"));
1649                show_inputlabel(wp, "route.olsrd_mpr", "olsrd_coverage", 5,
1650                                "num", 5);
1651                showRadio(wp, "route.olsrd_lqfe", "olsrd_lqfisheye");
1652                show_inputlabel(wp, "route.olsrd_lqag", "olsrd_lqaging", 5,
1653                                "num", 5);
1654
1655                websWrite(wp, "<div class=\"setting\">\n");
1656                websWrite(wp,
1657                          "<div class=\"label\"><script type=\"text/javascript\">Capture(route.olsrd_lqdmin)</script></div>");
1658                websWrite(wp,
1659                          "<input class=\"num\" size=\"5\" maxlength=\"5\" name=\"olsrd_lqdijkstramin\" onblur=\"olsrd_checkDijkstra(this.form)\" value=\"%s\" />\n",
1660                          nvram_safe_get("olsrd_lqdijkstramin"));
1661                websWrite(wp, "</div>\n");
1662                websWrite(wp, "<div class=\"setting\">\n");
1663                websWrite(wp,
1664                          "<div class=\"label\"><script type=\"text/javascript\">Capture(route.olsrd_lqdmax)</script></div>");
1665                websWrite(wp,
1666                          "<input class=\"num\" size=\"5\" maxlength=\"5\" name=\"olsrd_lqdijkstramax\" onblur=\"olsrd_checkDijkstra(this.form)\" value=\"%s\" />\n",
1667                          nvram_safe_get("olsrd_lqdijkstramax"));
1668                websWrite(wp, "</div>\n");
1669
1670                showOptionsLabel(wp, "route.olsrd_lqlvl", "olsrd_lqlevel",
1671                                 "0 1 2", nvram_default_get("olsrd_lqlevel",
1672                                                            "2"));
1673                showRadio(wp, "route.olsrd_hysteresis", "olsrd_hysteresis");
1674                char *wordlist = nvram_safe_get("olsrd_interfaces");
1675                char *next;
1676                char word[128];
1677                int count = 0;
1678
1679                foreach(word, wordlist, next) {
1680                        char *interface = word;
1681                        char *hellointerval = interface;
1682
1683                        strsep(&hellointerval, ">");
1684                        char *hellovaliditytime = hellointerval;
1685
1686                        strsep(&hellovaliditytime, ">");
1687                        char *tcinterval = hellovaliditytime;
1688
1689                        strsep(&tcinterval, ">");
1690                        char *tcvaliditytime = tcinterval;
1691
1692                        strsep(&tcvaliditytime, ">");
1693                        char *midinterval = tcvaliditytime;
1694
1695                        strsep(&midinterval, ">");
1696                        char *midvaliditytime = midinterval;
1697
1698                        strsep(&midvaliditytime, ">");
1699                        char *hnainterval = midvaliditytime;
1700
1701                        strsep(&hnainterval, ">");
1702                        char *hnavaliditytime = hnainterval;
1703
1704                        strsep(&hnavaliditytime, ">");
1705                        websWrite(wp, "<fieldset>\n");
1706                        show_legend(wp, interface, 0);
1707                        char valuename[32];
1708
1709                        sprintf(valuename, "%s_hellointerval", interface);
1710                        show_custominputlabel(wp, "Hello Interval", valuename,
1711                                              hellointerval, 5);
1712                        sprintf(valuename, "%s_hellovaliditytime", interface);
1713                        show_custominputlabel(wp, "Hello Validity Time",
1714                                              valuename, hellovaliditytime, 5);
1715
1716                        sprintf(valuename, "%s_tcinterval", interface);
1717                        show_custominputlabel(wp, "TC Interval", valuename,
1718                                              tcinterval, 5);
1719                        sprintf(valuename, "%s_tcvaliditytime", interface);
1720                        show_custominputlabel(wp, "TC Validity Time", valuename,
1721                                              tcvaliditytime, 5);
1722
1723                        sprintf(valuename, "%s_midinterval", interface);
1724                        show_custominputlabel(wp, "MID Interval", valuename,
1725                                              midinterval, 5);
1726                        sprintf(valuename, "%s_midvaliditytime", interface);
1727                        show_custominputlabel(wp, "MID Validity Time",
1728                                              valuename, midvaliditytime, 5);
1729
1730                        sprintf(valuename, "%s_hnainterval", interface);
1731                        show_custominputlabel(wp, "HNA Interval", valuename,
1732                                              hnainterval, 5);
1733                        sprintf(valuename, "%s_hnavaliditytime", interface);
1734                        show_custominputlabel(wp, "HNA Validity Time",
1735                                              valuename, hnavaliditytime, 5);
1736                        websWrite(wp,
1737                                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"olsrd_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n",
1738                                  count);
1739
1740                        websWrite(wp, "</fieldset>\n");
1741                        count++;
1742                }
1743                websWrite(wp, "<div class=\"setting\">\n");
1744                websWrite(wp,
1745                          "<div class=\"label\"><script type=\"text/javascript\">Capture(route.olsrd_newiface)</script></div>\n");
1746                char buffer[256];
1747
1748                memset(buffer, 0, 256);
1749                getIfList(buffer, NULL);
1750                showOptions(wp, "olsrd_ifname", buffer, "");
1751                websWrite(wp, "&nbsp;&nbsp;");
1752                websWrite(wp,
1753                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.add + \"\\\" onclick=\\\"olsrd_add_submit(this.form)\\\" />\");\n//]]>\n</script>\n");
1754                websWrite(wp, "</div>\n");
1755                websWrite(wp, "</fieldset><br />\n");
1756        }
1757}
1758#else                           //!HAVE_OLSRD
1759void ej_show_olsrd(webs_t wp, int argc, char_t ** argv)
1760{
1761        return;
1762}
1763#endif
1764
1765#ifdef HAVE_VLANTAGGING
1766#ifdef HAVE_BONDING
1767
1768void ej_show_bondings(webs_t wp, int argc, char_t ** argv)
1769{
1770        char buffer[256];
1771        char bufferif[512];
1772        char bondnames[256];
1773        int count = 0;
1774        static char word[256];
1775        char *next, *wordlist;
1776
1777        memset(buffer, 0, 256);
1778        memset(bondnames, 0, 256);
1779        memset(bufferif, 0, 512);
1780        websWrite(wp, "<h2>Bonding</h2>\n");
1781        websWrite(wp, "<fieldset>\n");
1782        websWrite(wp, "<legend>Bonding</legend>\n");
1783        websWrite(wp, "<div class=\"setting\">\n");
1784        websWrite(wp, "<div class=\"label\">Bonding Type</div>\n", count);
1785        showOptions(wp, "bonding_type",
1786                    "balance-rr active-backup balance-xor broadcast 802.3ad balance-tlb balance-alb weighted-rr duplex",
1787                    nvram_default_get("bonding_type", "balance-rr"));
1788        websWrite(wp, "&nbsp;Bonding Interfaces&nbsp;");
1789        websWrite(wp,
1790                  "<input class=\"num\" name=\"bonding_number\"size=\"5\" value=\"%s\" />\n",
1791                  nvram_default_get("bonding_number", "1"));
1792        websWrite(wp, "</div>\n");
1793
1794        getIfList(bufferif, "eth");
1795        int i;
1796
1797#ifdef HAVE_XSCALE
1798        memset(buffer, 0, 256);
1799        getIfList(buffer, "ixp");
1800        sprintf(bufferif, "%s %s", bufferif, buffer);
1801#endif
1802        memset(buffer, 0, 256);
1803        getIfList(buffer, "br");
1804        sprintf(bufferif, "%s %s", bufferif, buffer);
1805#ifdef HAVE_MADWIFI
1806        int c = getifcount("wifi");
1807
1808        for (i = 0; i < c; i++) {
1809                char ath[32];
1810
1811                sprintf(ath, "ath%d_bridged", i);
1812                if (nvram_default_match(ath, "0", "1")) {
1813                        sprintf(bufferif, "%s ath%d", bufferif, i);
1814                        char vifs[32];
1815
1816                        sprintf(vifs, "ath%d_vifs", i);
1817                        sprintf(bufferif, "%s %s", bufferif,
1818                                nvram_safe_get(vifs));
1819                }
1820        }
1821#endif
1822
1823        for (i = 0; i < atoi(nvram_safe_get("bonding_number")); i++) {
1824                sprintf(bondnames, "%s bond%d", bondnames, i);
1825        }
1826        int totalcount = 0;
1827        int realcount = atoi(nvram_default_get("bonding_count", "0"));
1828
1829        wordlist = nvram_safe_get("bondings");
1830        foreach(word, wordlist, next) {
1831                char *port = word;
1832                char *tag = strsep(&port, ">");
1833
1834                if (!tag || !port)
1835                        break;
1836                char vlan_name[32];
1837
1838                // sprintf (vlan_name, "%s.%s", tag, port);
1839                websWrite(wp, "<div class=\"setting\">\n");
1840                websWrite(wp,
1841                          "<div class=\"label\">Bonding %d Assignment</div>\n",
1842                          count);
1843                websWrite(wp, "&nbsp;Bond&nbsp;");
1844                sprintf(vlan_name, "bondingifname%d", count);
1845                showOptions(wp, vlan_name, bondnames, tag);
1846                sprintf(vlan_name, "bondingattach%d", count);
1847                websWrite(wp, "&nbsp;Slave&nbsp;");
1848                showOptions(wp, vlan_name, bufferif, port);
1849                websWrite(wp,
1850                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"bond_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n",
1851                          count);
1852                websWrite(wp, "</div>\n");
1853                count++;
1854        }
1855        totalcount = count;
1856        for (i = count; i < realcount; i++) {
1857                char vlan_name[32];
1858
1859                websWrite(wp, "<div class=\"setting\">\n");
1860                websWrite(wp,
1861                          "<div class=\"label\">Bonding %d Interface</div>\n",
1862                          i);
1863                websWrite(wp, "&nbsp;Bond&nbsp;");
1864                sprintf(vlan_name, "bondingifname%d", i);
1865                showOptions(wp, vlan_name, bondnames, "");
1866                sprintf(vlan_name, "bondingattach%d", i);
1867                websWrite(wp, "&nbsp;Slave&nbsp;");
1868                showOptions(wp, vlan_name, bufferif, "");
1869                websWrite(wp,
1870                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"bond_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n",
1871                          i);
1872                websWrite(wp, "</div>\n");
1873                totalcount++;
1874        }
1875        char var[32];
1876
1877        sprintf(var, "%d", totalcount);
1878        nvram_set("bonding_count", var);
1879        websWrite(wp,
1880                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.add + \"\\\" onclick=\\\"bond_add_submit(this.form)\\\" />\");\n//]]>\n</script>\n");
1881        websWrite(wp, "</fieldset><br />\n");
1882}
1883#else                           //!HAVE_BONDING
1884void ej_show_bondings(webs_t wp, int argc, char_t ** argv)
1885{
1886        return;
1887}
1888#endif
1889
1890void ej_show_vlantagging(webs_t wp, int argc, char_t ** argv)
1891{
1892        char buffer[256];
1893        int count = 0;
1894        static char word[256];
1895        char *next, *wordlist;
1896
1897        memset(buffer, 0, 256);
1898        getIfList(buffer, NULL);
1899        int totalcount = 0;
1900        int realcount = atoi(nvram_default_get("vlan_tagcount", "0"));
1901
1902        wordlist = nvram_safe_get("vlan_tags");
1903        foreach(word, wordlist, next) {
1904
1905                char *port = word;
1906                char *tag = strsep(&port, ">");
1907                char *prio = port;
1908                strsep(&prio, ">");
1909
1910                if (!tag || !port)
1911                        break;
1912                if (!prio)
1913                        prio = "0";
1914                char vlan_name[32];
1915
1916                // sprintf (vlan_name, "%s.%s", tag, port);
1917                websWrite(wp, "<div class=\"setting\">\n");
1918                websWrite(wp, "<div class=\"label\">VLAN%d Interface</div>\n",
1919                          count);
1920                sprintf(vlan_name, "vlanifname%d", count);
1921                showOptions(wp, vlan_name, buffer, tag);
1922                //tag number
1923                sprintf(vlan_name, "vlantag%d", count);
1924                websWrite(wp, "&nbsp;Tag Number&nbsp;");
1925                websWrite(wp,
1926                          "<input class=\"num\" name=\"%s\"size=\"5\" value=\"%s\" />\n",
1927                          vlan_name, port);
1928                //priority
1929                sprintf(vlan_name, "vlanprio%d", count);
1930                websWrite(wp, "&nbsp;Prio&nbsp;");
1931                showOptions(wp, vlan_name, "0 1 2 3 4 5 6 7", prio);
1932
1933                websWrite(wp,
1934                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"vlan_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n",
1935                          count);
1936                websWrite(wp, "</div>\n");
1937                count++;
1938        }
1939        totalcount = count;
1940        int i;
1941
1942        for (i = count; i < realcount; i++) {
1943                websWrite(wp, "<div class=\"setting\">\n");
1944                websWrite(wp, "<div class=\"label\">VLAN%d Interface</div>\n",
1945                          i);
1946                char vlan_name[32];
1947
1948                sprintf(vlan_name, "vlanifname%d", i);
1949                showOptions(wp, vlan_name, buffer, "");
1950                sprintf(vlan_name, "vlantag%d", i);
1951                //tag number
1952                websWrite(wp, "&nbsp;Tag Number&nbsp;");
1953                websWrite(wp,
1954                          "<input class=\"num\" name=\"%s\" size=\"5\" value=\"0\" />\n",
1955                          vlan_name);
1956                //priority
1957                sprintf(vlan_name, "vlanprio%d", count);
1958                websWrite(wp, "&nbsp;Prio&nbsp;");
1959                showOptions(wp, vlan_name, "0 1 2 3 4 5 6 7", "0");
1960                websWrite(wp,
1961                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"vlan_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n",
1962                          i);
1963                websWrite(wp, "</div>\n");
1964                totalcount++;
1965        }
1966        char var[32];
1967
1968        sprintf(var, "%d", totalcount);
1969        nvram_set("vlan_tagcount", var);
1970        websWrite(wp,
1971                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.add + \"\\\" onclick=\\\"vlan_add_submit(this.form)\\\" />\");\n//]]>\n</script>\n");
1972}
1973
1974void ej_show_mdhcp(webs_t wp, int argc, char_t ** argv)
1975{
1976        char buffer[256];
1977        int count = 0;
1978        static char word[256];
1979        char *next, *wordlist;
1980
1981        websWrite(wp, "<h2>%s</h2>\n<fieldset>\n",
1982                  live_translate("networking.h5"));
1983        websWrite(wp, "<legend>%s</legend>\n",
1984                  live_translate("networking.legend5"));
1985
1986        memset(buffer, 0, 256);
1987        getIfList(buffer, NULL);
1988        int totalcount = 0;
1989        int realcount = atoi(nvram_default_get("mdhcpd_count", "0"));
1990
1991        wordlist = nvram_safe_get("mdhcpd");
1992        foreach(word, wordlist, next) {
1993                char *interface = word;
1994                char *dhcpon = interface;
1995
1996                interface = strsep(&dhcpon, ">");
1997                char *start = dhcpon;
1998
1999                dhcpon = strsep(&start, ">");
2000                char *max = start;
2001
2002                start = strsep(&max, ">");
2003                char *leasetime = max;
2004
2005                max = strsep(&leasetime, ">");
2006                if (!interface || !start || !dhcpon || !max || !leasetime)
2007                        break;
2008                char vlan_name[32];
2009
2010                // interface
2011                char *ipaddr = nvram_nget("%s_ipaddr", interface);
2012                char *netmask = nvram_nget("%s_netmask", interface);
2013
2014                if (strlen(ipaddr) > 0 && strlen(netmask) > 0) {
2015                        websWrite(wp, "Interface %s: IP %s/%s\n", interface,
2016                                  ipaddr, netmask);
2017                }
2018                websWrite(wp, "<div class=\"setting\">\n");
2019                websWrite(wp, "<div class=\"label\">DHCP %d</div>\n", count);
2020                sprintf(vlan_name, "mdhcpifname%d", count);
2021                showOptions(wp, vlan_name, buffer, interface);
2022                // on off
2023                sprintf(vlan_name, "mdhcpon%d", count);
2024                showOptions(wp, vlan_name, "On Off", dhcpon);
2025                // start
2026                sprintf(vlan_name, "mdhcpstart%d", count);
2027                websWrite(wp, "&nbsp;Start&nbsp;");
2028                websWrite(wp,
2029                          "<input class=\"num\" name=\"%s\" size=\"3\" value=\"%s\" />\n",
2030                          vlan_name, start);
2031                // max
2032                sprintf(vlan_name, "mdhcpmax%d", count);
2033                websWrite(wp, "&nbsp;Max&nbsp;");
2034                websWrite(wp,
2035                          "<input class=\"num\" name=\"%s\" size=\"3\" value=\"%s\" />\n",
2036                          vlan_name, max);
2037                sprintf(vlan_name, "mdhcpleasetime%d", count);
2038                websWrite(wp, "&nbsp;Leasetime&nbsp;");
2039                websWrite(wp,
2040                          "<input class=\"num\" name=\"%s\" size=\"5\" value=\"%s\" />\n",
2041                          vlan_name, leasetime);
2042                //
2043                websWrite(wp,
2044                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"mdhcp_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n",
2045                          count);
2046                websWrite(wp, "</div>\n");
2047                count++;
2048        }
2049        totalcount = count;
2050        int i;
2051
2052        for (i = count; i < realcount; i++) {
2053                char vlan_name[32];
2054
2055                // sprintf (mdhcp_name, "%s.%s", tag, port);
2056                websWrite(wp, "<div class=\"setting\">\n");
2057                websWrite(wp, "<div class=\"label\">DHCP %d</div>\n", count);
2058                // interface
2059                sprintf(vlan_name, "mdhcpifname%d", count);
2060                showOptions(wp, vlan_name, buffer, "");
2061                // on off
2062                sprintf(vlan_name, "mdhcpon%d", count);
2063                showOptions(wp, vlan_name, "On Off", "");
2064                // start
2065                sprintf(vlan_name, "mdhcpstart%d", count);
2066                websWrite(wp, "&nbsp;Start&nbsp;");
2067                websWrite(wp,
2068                          "<input class=\"num\" name=\"%s\" size=\"3\" value=\"%s\" />\n",
2069                          vlan_name, "100");
2070                // max
2071                sprintf(vlan_name, "mdhcpmax%d", count);
2072                websWrite(wp, "&nbsp;Max&nbsp;");
2073                websWrite(wp,
2074                          "<input class=\"num\" name=\"%s\" size=\"3\" value=\"%s\" />\n",
2075                          vlan_name, "50");
2076                sprintf(vlan_name, "mdhcpleasetime%d", count);
2077                websWrite(wp, "&nbsp;Leasetime&nbsp;");
2078                websWrite(wp,
2079                          "<input class=\"num\" name=\"%s\" size=\"5\" value=\"%s\" />\n",
2080                          vlan_name, "3600");
2081                websWrite(wp,
2082                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"mdhcp_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n",
2083                          i);
2084                websWrite(wp, "</div>\n");
2085                totalcount++;
2086        }
2087        char var[32];
2088
2089        sprintf(var, "%d", totalcount);
2090        nvram_set("mdhcpd_count", var);
2091        websWrite(wp,
2092                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.add + \"\\\" onclick=\\\"mdhcp_add_submit(this.form)\\\" />\");\n//]]>\n</script>\n");
2093        websWrite(wp, "</fieldset><br />\n");
2094
2095}
2096
2097void ej_show_bridgenames(webs_t wp, int argc, char_t ** argv)
2098{
2099        char buffer[256];
2100        int count = 0;
2101        static char word[256];
2102        char *next, *wordlist;
2103
2104        memset(buffer, 0, 256);
2105        getIfList(buffer, NULL);
2106        int realcount = atoi(nvram_default_get("bridges_count", "0"));
2107
2108        wordlist = nvram_safe_get("bridges");
2109        foreach(word, wordlist, next) {
2110
2111                char *stp = word;
2112                char *bridge = strsep(&stp, ">");
2113                char *prio = stp;
2114
2115                stp = strsep(&prio, ">");
2116                char *mtu = prio;
2117
2118                prio = strsep(&mtu, ">");
2119                if (!prio) {
2120                        prio = mtu;
2121                        mtu = "1500";
2122                }
2123
2124/*      char *stp = word;
2125        char *bridge = strsep( &stp, ">" );
2126        char *mtu = stp;
2127        char *prio = strsep( &mtu, ">" );
2128*/
2129                if (!bridge || !stp)
2130                        break;
2131
2132                char vlan_name[32];
2133
2134                websWrite(wp, "<div class=\"setting\">\n");
2135                websWrite(wp, "<div class=\"label\">Bridge %d</div>\n", count);
2136                sprintf(vlan_name, "bridgename%d", count);
2137                websWrite(wp,
2138                          "<input class=\"num\" name=\"%s\"size=\"5\" value=\"%s\" />\n",
2139                          vlan_name, bridge);
2140                websWrite(wp, "&nbsp;STP&nbsp;");
2141                sprintf(vlan_name, "bridgestp%d", count);
2142                showOptions(wp, vlan_name, "On Off", stp);
2143                websWrite(wp, "&nbsp;Prio&nbsp;");
2144                sprintf(vlan_name, "bridgeprio%d", count);
2145                websWrite(wp,
2146                          "<input class=\"num\" name=\"%s\"size=\"5\" value=\"%s\" />\n",
2147                          vlan_name, prio != NULL ? prio : "32768");
2148                websWrite(wp, "&nbsp;MTU&nbsp;");
2149                sprintf(vlan_name, "bridgemtu%d", count);
2150                websWrite(wp,
2151                          "<input class=\"num\" name=\"%s\"size=\"5\" value=\"%s\" />\n",
2152                          vlan_name, mtu != NULL ? mtu : "1500");
2153                websWrite(wp,
2154                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"bridge_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n",
2155                          count);
2156                websWrite(wp, "</div>\n");
2157                show_ipnetmask(wp, bridge);
2158                count++;
2159        }
2160        int i;
2161        int totalcount = count;
2162
2163        for (i = count; i < realcount; i++) {
2164                char vlan_name[32];
2165
2166                websWrite(wp, "<div class=\"setting\">\n");
2167                websWrite(wp, "<div class=\"label\">Bridge %d</div>\n", i);
2168                sprintf(vlan_name, "bridgename%d", i);
2169                websWrite(wp, "<input class=\"num\" name=\"%s\"size=\"5\" />\n",
2170                          vlan_name);
2171                websWrite(wp, "&nbsp;STP&nbsp;");
2172                sprintf(vlan_name, "bridgestp%d", i);
2173                showOptions(wp, vlan_name, "On Off", "On");
2174                websWrite(wp, "&nbsp;Prio&nbsp;");
2175                sprintf(vlan_name, "bridgeprio%d", i);
2176                websWrite(wp,
2177                          "<input class=\"num\" name=\"%s\"size=\"5\" value=\"%s\" />\n",
2178                          vlan_name, "32768");
2179                websWrite(wp, "&nbsp;MTU&nbsp;");
2180                sprintf(vlan_name, "bridgemtu%d", count);
2181                websWrite(wp,
2182                          "<input class=\"num\" name=\"%s\"size=\"5\" value=\"%s\" />\n",
2183                          vlan_name, "1500");
2184                websWrite(wp,
2185                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"bridge_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n",
2186                          i);
2187                websWrite(wp, "</div>\n");
2188                totalcount++;
2189        }
2190        websWrite(wp,
2191                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.add + \"\\\" onclick=\\\"bridge_add_submit(this.form)\\\" />\");\n//]]>\n</script>\n");
2192        char var[32];
2193
2194        sprintf(var, "%d", totalcount);
2195        nvram_set("bridges_count", var);
2196}
2197
2198void ej_show_bridgetable(webs_t wp, int argc, char_t ** argv)
2199{
2200//#ifdef HAVE_MICRO             // brctl N/A in micro
2201//    return;
2202//#endif
2203
2204        FILE *f;
2205        char buf[128];
2206        char brname[32];
2207        char brstp[8];
2208        char brif[16];
2209        int count = 0;
2210
2211        system2("brctl show > /tmp/.brtable");
2212
2213        if ((f = fopen("/tmp/.brtable", "r")) != NULL) {
2214
2215                while (fgets(buf, sizeof(buf), f)) {
2216
2217                        if (count)      // skip line 0
2218                        {
2219                                strcpy(brname, "");
2220                                strcpy(brstp, "");
2221                                strcpy(brif, "");
2222
2223                                if (strncmp(buf, "\t\t\t", 3) != 0) {
2224                                        if (count != 1)
2225                                                websWrite(wp, "\',");   // close
2226                                        sscanf(buf, "%s %*s %s %s", brname,
2227                                               brstp, brif);
2228                                        websWrite(wp, "\'%s\',\'%s\',\'%s ",
2229                                                  brname, brstp, brif);
2230                                } else {
2231                                        sscanf(buf, "%s", brif);
2232                                        websWrite(wp, "%s ", brif);
2233                                }
2234                        }
2235                        count++;
2236                }
2237
2238                websWrite(wp, "\'");    // close
2239                fclose(f);
2240                unlink("/tmp/.brtable");
2241        }
2242        return;
2243}
2244
2245void ej_show_bridgeifnames(webs_t wp, int argc, char_t ** argv)
2246{
2247        char bufferif[512];
2248        char bufferif2[256];
2249        char finalbuffer[512];
2250        int count = 0;
2251        static char word[256];
2252        char *next, *wordlist;
2253
2254        memset(bufferif, 0, 512);
2255        memset(bufferif2, 0, 256);
2256        getIfList(bufferif, "eth");
2257#ifdef HAVE_GATEWORX
2258        getIfList(bufferif2, "ixp");
2259        sprintf(bufferif, "%s %s", bufferif, bufferif2);
2260#endif
2261
2262        memset(bufferif2, 0, 256);
2263        getIfList(bufferif2, "vlan");
2264        sprintf(bufferif, "%s %s", bufferif, bufferif2);
2265
2266        memset(bufferif2, 0, 256);
2267        getIfList(bufferif2, "wl");
2268        sprintf(bufferif, "%s %s", bufferif, bufferif2);
2269
2270        memset(bufferif2, 0, 256);
2271        getIfList(bufferif2, "ofdm");
2272        sprintf(bufferif, "%s %s", bufferif, bufferif2);
2273
2274#ifdef HAVE_RT2880
2275        memset(bufferif2, 0, 256);
2276        getIfList(bufferif2, "ra");
2277        sprintf(bufferif, "%s %s", bufferif, bufferif2);
2278#endif
2279        memset(bufferif2, 0, 256);
2280        getIfList(bufferif2, "br");
2281        foreach(word, bufferif2, next) {
2282                if (contains(word, '.'))
2283                        sprintf(bufferif, "%s %s", bufferif, word);
2284        }
2285        int i;
2286
2287#ifdef HAVE_MADWIFI
2288//      memset(bufferif2, 0, 256);
2289//      getIfList(bufferif2, "ath");
2290//      foreach(word, bufferif2, next) {
2291//              if (contains(word, '.'))
2292//                      sprintf(bufferif, "%s %s", bufferif, word);
2293//      }
2294        int c = getifcount("wifi");
2295
2296        for (i = 0; i < c; i++) {
2297                char ath[32];
2298
2299//              sprintf(ath, "ath%d_bridged", i);
2300//              if (nvram_default_match(ath, "1", "1"))
2301                {
2302                        sprintf(bufferif, "%s ath%d", bufferif, i);
2303                        char vifs[32];
2304
2305                        sprintf(vifs, "ath%d_vifs", i);
2306                        sprintf(bufferif, "%s %s", bufferif,
2307                                nvram_safe_get(vifs));
2308                }
2309        }
2310#endif
2311#ifdef HAVE_BONDING
2312        c = atoi(nvram_default_get("bonding_number", "1"));
2313        for (i = 0; i < c; i++) {
2314                sprintf(bufferif, "%s bond%d", bufferif, i);
2315        }
2316#endif
2317#ifdef HAVE_EOP_TUNNEL
2318        for (i = 1; i < 11; i++) {
2319                char EOP[32];
2320
2321                if (nvram_nmatch("1", "oet%d_en", i)
2322                    && nvram_nmatch("0", "oet%d_bridged", i)) {
2323                        sprintf(EOP, "oet%d", i);
2324                        sprintf(bufferif, "%s %s", bufferif, EOP);
2325                }
2326        }
2327#endif
2328        char buffer[256];
2329
2330        memset(buffer, 0, 256);
2331        getIfList(buffer, "br");
2332
2333        memset(finalbuffer, 0, 256);
2334        foreach(word, buffer, next) {
2335                if (!contains(word, '.'))
2336                        sprintf(finalbuffer, "%s %s", finalbuffer, word);
2337        }
2338        char *checkbuffer = malloc(strlen(finalbuffer) + 6);
2339        memset(checkbuffer, 0, strlen(finalbuffer) + 6);
2340        strcpy(checkbuffer, "none ");
2341        strcat(checkbuffer, finalbuffer);
2342        strcpy(finalbuffer, checkbuffer);
2343        free(checkbuffer);
2344        int realcount = atoi(nvram_default_get("bridgesif_count", "0"));
2345
2346        wordlist = nvram_safe_get("bridgesif");
2347        foreach(word, wordlist, next) {
2348                char *port = word;
2349                char *tag = strsep(&port, ">");
2350                char *prio = port;
2351
2352                strsep(&prio, ">");
2353                if (!tag || !port)
2354                        break;
2355                char vlan_name[32];
2356
2357                websWrite(wp, "<div class=\"setting\">\n");
2358                websWrite(wp, "<div class=\"label\">Assignment %d</div>\n",
2359                          count);
2360                sprintf(vlan_name, "bridge%d", count);
2361                showOptions(wp, vlan_name, finalbuffer, tag);
2362                websWrite(wp, "&nbsp;Interface&nbsp;");
2363                sprintf(vlan_name, "bridgeif%d", count);
2364                showOptions(wp, vlan_name, bufferif, port);
2365                websWrite(wp, "&nbsp;Prio&nbsp;");
2366                sprintf(vlan_name, "bridgeifprio%d", count);
2367                websWrite(wp,
2368                          "<input class=\"num\" name=\"%s\"size=\"3\" value=\"%s\" />\n",
2369                          vlan_name, prio != NULL ? prio : "63");
2370                websWrite(wp,
2371                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"bridgeif_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n",
2372                          count);
2373                websWrite(wp, "</div>\n");
2374                count++;
2375        }
2376        int totalcount = count;
2377
2378        for (i = count; i < realcount; i++) {
2379                char vlan_name[32];
2380
2381                websWrite(wp, "<div class=\"setting\">\n");
2382                websWrite(wp, "<div class=\"label\">Assignment %d</div>\n", i);
2383                sprintf(vlan_name, "bridge%d", i);
2384                showOptions(wp, vlan_name, finalbuffer, "");
2385                websWrite(wp, "&nbsp;Interface&nbsp;");
2386                sprintf(vlan_name, "bridgeif%d", i);
2387                showOptions(wp, vlan_name, bufferif, "");
2388                websWrite(wp, "&nbsp;Prio&nbsp;");
2389                sprintf(vlan_name, "bridgeifprio%d", i);
2390                websWrite(wp,
2391                          "<input class=\"num\" name=\"%s\"size=\"5\" value=\"%s\" />\n",
2392                          vlan_name, "63");
2393                websWrite(wp,
2394                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"bridgeif_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n",
2395                          i);
2396                websWrite(wp, "</div>\n");
2397                totalcount++;
2398        }
2399        websWrite(wp,
2400                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.add + \"\\\" onclick=\\\"bridgeif_add_submit(this.form)\\\" />\");\n//]]>\n</script>\n");
2401        char var[32];
2402
2403        sprintf(var, "%d", totalcount);
2404        nvram_set("bridgesif_count", var);
2405}
2406
2407#endif
2408#if 0
2409static void
2410showDynOption(webs_t wp, char *propname, char *nvname, char *options[],
2411              char *names[])
2412{
2413        int i;
2414
2415        websWrite(wp, "<div class=\"setting\">\n");
2416        websWrite(wp,
2417                  "<div class=\"label\">%s</div><select name=\"%s\">\n",
2418                  propname, nvname);
2419        for (i = 0; options[i] != NULL; i++) {
2420                websWrite(wp,
2421                          "<option value=\"%s\" %s>Off</option>\n",
2422                          names[i], nvram_match(nvname,
2423                                                options[i]) ?
2424                          "selected=\"selected\"" : "");
2425        }
2426        websWrite(wp, "</div>\n");
2427
2428}
2429#endif
2430
2431static void show_channel(webs_t wp, char *dev, char *prefix, int type)
2432{
2433        char wl_mode[16];
2434
2435        sprintf(wl_mode, "%s_mode", prefix);
2436        char wl_net_mode[16];
2437
2438        sprintf(wl_net_mode, "%s_net_mode", prefix);
2439        if (nvram_match(wl_net_mode, "disabled"))
2440                return;
2441#ifdef HAVE_RT2880
2442        if (nvram_match(wl_mode, "ap") || nvram_match(wl_mode, "wdsap")
2443            || nvram_match(wl_mode, "apsta") || nvram_match(wl_mode, "apstawet")
2444            || nvram_match(wl_mode, "infra"))
2445#else
2446        if (nvram_match(wl_mode, "ap") || nvram_match(wl_mode, "wdsap")
2447            || nvram_match(wl_mode, "infra"))
2448#endif
2449        {
2450                char wl_channel[16];
2451
2452                sprintf(wl_channel, "%s_channel", prefix);
2453                char wl_wchannel[16];
2454
2455                sprintf(wl_wchannel, "%s_wchannel", prefix);
2456                char wl_nbw[16];
2457
2458                nvram_default_get(wl_wchannel, "0");
2459                sprintf(wl_nbw, "%s_nbw", prefix);
2460
2461                websWrite(wp, "<div class=\"setting\">\n");
2462                websWrite(wp,
2463                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.label4)</script></div>\n<select name=\"%s\" onfocus=\"check_action(this,0)\"><script type=\"text/javascript\">\n//<![CDATA[\n",
2464                          wl_channel);
2465#ifdef HAVE_MADWIFI
2466                struct wifi_channels *chan;
2467                char cn[32];
2468                char fr[32];
2469
2470#ifdef HAVE_MADWIFI_MIMO
2471                if (is_ar5008(prefix)) {
2472                        chan = list_channels_11n(prefix);
2473                        if (chan == NULL)
2474                                chan = list_channels_11n(dev);
2475                } else
2476#endif
2477                {
2478                        chan = list_channels(prefix);
2479                        if (chan == NULL)
2480                                chan = list_channels(dev);
2481                }
2482
2483                if (chan != NULL) {
2484                        // int cnt = getchannelcount ();
2485                        websWrite(wp,
2486                                  "document.write(\"<option value=\\\"0\\\" %s>\" + share.auto + \"</option>\");\n",
2487                                  nvram_match(wl_channel,
2488                                              "0") ? "selected=\\\"selected\\\""
2489                                  : "");
2490                        int i = 0;
2491
2492                        while (chan[i].freq != -1) {
2493                                cprintf("%d\n", chan[i].channel);
2494                                cprintf("%d\n", chan[i].freq);
2495
2496                                sprintf(cn, "%d", chan[i].channel);
2497                                sprintf(fr, "%d", chan[i].freq);
2498                                int freq = get_wififreq(prefix, chan[i].freq);
2499                                if (freq != -1)
2500                                        websWrite(wp,
2501                                                  "document.write(\"<option value=\\\"%s\\\" %s>%s - %d MHz</option>\");\n",
2502                                                  fr, nvram_match(wl_channel,
2503                                                                  fr) ?
2504                                                  "selected=\\\"selected\\\"" :
2505                                                  "", cn, (freq));
2506                                // free (chan[i].freq);
2507                                i++;
2508                        }
2509                        free(chan);
2510                }
2511#else
2512                int instance = 0;
2513
2514                if (!strcmp(prefix, "wl1"))
2515                        instance = 1;
2516/*
2517#if 0
2518                if (type == 1 && !nvram_match(wl_net_mode, "g-only")
2519                    && !nvram_match(wl_net_mode, "a-only")
2520                    && !nvram_match(wl_net_mode, "na-only")
2521                    && !nvram_match(wl_net_mode, "bg-mixed")
2522                    && nvram_match(wl_nbw, "40")) {
2523                        int ch = atoi(nvram_nget("wl%d_wchannel", instance));
2524
2525                        websWrite(wp, "var max_channel = 2;\n");
2526                        websWrite(wp, "var wl%d_channel = '%s';\n", instance,
2527                                  nvram_safe_get(wl_wchannel));
2528                        websWrite(wp,
2529                                  "var freq = new Array(\"Auto\",\"2.412\",\"2.417\",\"2.422\",\"2.427\",\"2.432\",\"2.437\",\"2.442\",\"2.447\",\"2.452\",\"2.457\",\"2.462\",\"2.467\",\"2.472\",\"2.484\");\n");
2530                        char *sel = "";
2531
2532                        if (ch == 0)    //wchannel = Auto
2533                        {
2534                                websWrite(wp,
2535                                          " document.write(\"<option value=\\\"0\\\" selected=\\\"selected\\\">\"+ share.auto +\"</option>\");\n");
2536                        } else {
2537                                if (nvram_nmatch
2538                                    ("lower", "wl%d_nctrlsb", instance))
2539                                        sel = "selected=\\\"selected\\\"";
2540
2541                                websWrite(wp,
2542                                          " document.write(\"<option value=\\\"%d\\\" %s>%d - \"+freq[%d]+\" GHz</option>\");\n",
2543                                          ch - 2, sel, ch - 2, ch - 2);
2544                                sel = "";
2545                                if (nvram_nmatch
2546                                    ("upper", "wl%d_nctrlsb", instance))
2547                                        sel = "selected=\\\"selected\\\"";
2548                                websWrite(wp,
2549                                          " document.write(\"<option value=\\\"%d\\\" %s>%d - \"+freq[%d]+\" GHz</option>\");\n",
2550                                          ch + 2, sel, ch + 2, ch + 2);
2551                        }
2552
2553                } else
2554#endif
2555*/
2556                {
2557
2558                        unsigned int chanlist[128];
2559                        char *ifn = get_wl_instance_name(instance);
2560                        int chancount = getchannels(chanlist, ifn);
2561                        int net_is_a = 0;
2562
2563                        if (chanlist[0] > 25)
2564                                net_is_a = 1;
2565
2566//          websWrite( wp, "var max_channel = %d;\n", chancount );
2567//          websWrite( wp, "var wl%d_channel = '%s';\n", instance, nvram_safe_get( wl_channel ) );
2568//          websWrite( wp, "var offset = %d;\n", chanlist[0] );
2569//          websWrite( wp, "var buf = \"\";\n" );
2570//      websWrite( wp, "var freq = new Array(\"Auto\"" );
2571                        int i, j;
2572
2573                        // supported 5GHz channels for IEEE 802.11n 40Mhz
2574                        int na_upper[16] =
2575                            { 40, 48, 56, 64, 104, 112, 120, 128, 136, 153, 161,
2576                                0, 0, 0, 0, 0
2577                        };
2578                        int na_lower[16] =
2579                            { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
2580                                0, 0, 0, 0, 0
2581                        };
2582
2583                        websWrite(wp,
2584                                  "document.write(\"<option value=\\\"0\\\" %s>\" + share.auto + \"</option>\");\n",
2585                                  nvram_nmatch("0", "%s_channel",
2586                                               prefix) ?
2587                                  "selected=\\\"selected\\\"" : "");
2588                        for (i = 0; i < chancount; i++) {
2589                                float ofs;
2590
2591                                if (chanlist[i] < 25)
2592                                        ofs = 2.407f;
2593                                else
2594                                        ofs = 5.000f;
2595                                ofs += (float)(chanlist[i] * 0.005f);
2596                                if (ofs == 2.477f)
2597                                        ofs = 2.484f;   // fix: ch 14 is 2.484, not 2.477 GHz
2598//              websWrite( wp, ", \"%0.3f\"", ofs );
2599                                char channelstring[32];
2600
2601                                int showit = 1;
2602
2603                                if (nvram_match(wl_net_mode, "a-only")
2604                                    || nvram_match(wl_net_mode, "na-only")
2605                                    || nvram_match(wl_net_mode, "n5-only")
2606                                    || (net_is_a
2607                                        && nvram_match(wl_net_mode, "mixed"))) {
2608                                        if (chanlist[i] < 25)
2609                                                showit = 0;
2610                                } else {
2611                                        if (chanlist[i] > 25)
2612                                                showit = 0;
2613                                }
2614
2615                                if ((nvram_match(wl_net_mode, "na-only")
2616                                     || (net_is_a
2617                                         && nvram_match(wl_net_mode, "mixed"))
2618                                     || nvram_match(wl_net_mode, "n5-only"))
2619                                    && nvram_match(wl_nbw, "40")) {
2620                                        showit = 0;
2621                                        j = 0;
2622                                        if (nvram_nmatch
2623                                            ("upper", "%s_nctrlsb", prefix)) {
2624                                                while (na_upper[j]) {
2625                                                        if (chanlist[i] ==
2626                                                            na_upper[j]) {
2627                                                                showit = 1;
2628                                                                break;
2629                                                        }
2630                                                        j++;
2631                                                }
2632                                        } else
2633                                            if (nvram_nmatch
2634                                                ("lower", "%s_nctrlsb",
2635                                                 prefix)) {
2636                                                while (na_lower[j]) {
2637                                                        if (chanlist[i] ==
2638                                                            na_lower[j]) {
2639                                                                showit = 1;
2640                                                                break;
2641                                                        }
2642                                                        j++;
2643                                                }
2644                                        }
2645                                }
2646
2647                                if ((nvram_match(wl_net_mode, "n-only")
2648                                     || nvram_match(wl_net_mode, "n2-only")
2649                                     || nvram_match(wl_net_mode, "ng-only")
2650                                     || (!net_is_a
2651                                         && nvram_match(wl_net_mode, "mixed")))
2652                                    && nvram_match(wl_nbw, "40")) {
2653                                        showit = 0;
2654                                        if (nvram_nmatch
2655                                            ("upper", "%s_nctrlsb", prefix)) {
2656                                                if (chanlist[i] >= 5
2657                                                    && chanlist[i] <= 13) {
2658                                                        showit = 1;
2659                                                }
2660                                        } else
2661                                            if (nvram_nmatch
2662                                                ("lower", "%s_nctrlsb",
2663                                                 prefix)) {
2664                                                if (chanlist[i] <= 9) {
2665                                                        showit = 1;
2666                                                }
2667                                        }
2668                                }
2669
2670                                sprintf(channelstring, "%d", chanlist[i]);
2671                                if (showit) {
2672                                        websWrite(wp,
2673                                                  "document.write(\"<option value=\\\"%d\\\" %s>%d - %0.3f GHz</option>\");\n",
2674                                                  chanlist[i],
2675                                                  nvram_nmatch(channelstring,
2676                                                               "%s_channel",
2677                                                               prefix) ?
2678                                                  "selected=\\\"selected\\\"" :
2679                                                  "", chanlist[i], ofs);
2680                                }
2681                        }
2682//          websWrite( wp, ");\n" );
2683//          websWrite( wp, "for(i=0; i<=max_channel ; i++) {\n" );
2684//          websWrite( wp, "    if(i == wl%d_channel) buf = \"selected\";\n",
2685//                     instance );
2686//          websWrite( wp, "    else buf = \"\";\n" );
2687//          websWrite( wp, "    if (i==0)\n" );
2688//          websWrite( wp,
2689//                     "                document.write(\"<option value=\"+i+\" \"+buf+\">\" + share.auto + \"</option>\");\n" );
2690//          websWrite( wp, "    else\n" );
2691//          websWrite( wp,
2692//                     "                document.write(\"<option value=\"+i+\" \"+buf+\">\"+(i+offset-1)+\" - \"+freq[i]+\" GHz</option>\");\n" );
2693//          websWrite( wp, "}\n" );
2694                }
2695#endif
2696                websWrite(wp, "//]]>\n</script></select></div>\n");
2697        }
2698}
2699
2700#ifdef HAVE_MADWIFI
2701static char *ag_rates[] = { "6", "9", "12", "18", "24", "36", "48", "54" };
2702static char *turbo_rates[] =
2703    { "12", "18", "24", "36", "48", "72", "96", "108" };
2704static char *b_rates[] = { "1", "2", "5.5", "11" };
2705static char *bg_rates[] =
2706    { "1", "2", "5.5", "6", "9", "11", "12", "18", "24", "36", "48", "54" };
2707// static char *g_rates[] = { "1", "2", "5.5", "11", "12", "18", "24", "36",
2708// "48", "54" };
2709//static char *xr_rates[] =
2710//    { "0.25", "0.5", "1", "2", "3", "6", "9", "12", "18", "24", "36", "48",
2711//    "54"
2712//};
2713static char *half_rates[] = { "3", "4.5", "6", "9", "12", "18", "24", "27" };
2714static char *quarter_rates[] =
2715    { "1.5", "2", "3", "4.5", "6", "9", "12", "13.5" };
2716static char *subquarter_rates[] =
2717    { "0.75", "1", "1.5", "2.25", "3", "4.5", "6", "6.75" };
2718
2719void show_rates(webs_t wp, char *prefix, int maxrate)
2720{
2721        websWrite(wp, "<div class=\"setting\">\n");
2722        if (maxrate) {
2723                websWrite(wp,
2724                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.label21)</script></div>\n");
2725                websWrite(wp, "<select name=\"%s_maxrate\">\n", prefix);
2726        } else {
2727                websWrite(wp,
2728                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.label23)</script></div>\n");
2729                websWrite(wp, "<select name=\"%s_minrate\">\n", prefix);
2730        }
2731        websWrite(wp, "<script type=\"text/javascript\">\n");
2732        websWrite(wp, "//<![CDATA[\n");
2733        char srate[32];
2734
2735        sprintf(srate, "%s_minrate", prefix);
2736        char mxrate[32];
2737
2738        sprintf(mxrate, "%s_maxrate", prefix);
2739        websWrite(wp,
2740                  "document.write(\"<option value=\\\"0\\\" %s >\" + share.auto + \"</option>\");\n",
2741                  nvram_match(srate, "0") ? "selected=\\\"selected\\\"" : "");
2742        websWrite(wp, "//]]>\n");
2743        websWrite(wp, "</script>\n");
2744        char **rate;
2745        char **showrates = NULL;
2746        int len;
2747        char mode[32];
2748        char bw[16];
2749
2750        sprintf(bw, "%s_channelbw", prefix);
2751
2752        sprintf(mode, "%s_net_mode", prefix);
2753        if (nvram_match(mode, "b-only")) {
2754                rate = b_rates;
2755                len = sizeof(b_rates) / sizeof(char *);
2756        }
2757        if (nvram_match(mode, "g-only")) {
2758                rate = ag_rates;
2759                len = sizeof(ag_rates) / sizeof(char *);
2760                if (nvram_match(bw, "40")) {
2761                        showrates = turbo_rates;
2762                }
2763                if (nvram_match(bw, "10")) {
2764                        rate = half_rates;
2765                        len = sizeof(half_rates) / sizeof(char *);
2766                }
2767                if (nvram_match(bw, "5")) {
2768                        rate = quarter_rates;
2769                        len = sizeof(quarter_rates) / sizeof(char *);
2770                }
2771                if (nvram_match(bw, "2")) {
2772                        rate = subquarter_rates;
2773                        len = sizeof(subquarter_rates) / sizeof(char *);
2774                }
2775        }
2776        if (nvram_match(mode, "a-only")) {
2777                rate = ag_rates;
2778                len = sizeof(ag_rates) / sizeof(char *);
2779                if (nvram_match(bw, "40")) {
2780                        showrates = turbo_rates;
2781                }
2782                if (nvram_match(bw, "10")) {
2783                        rate = half_rates;
2784                        len = sizeof(half_rates) / sizeof(char *);
2785                }
2786                if (nvram_match(bw, "5")) {
2787                        rate = quarter_rates;
2788                        len = sizeof(quarter_rates) / sizeof(char *);
2789                }
2790                if (nvram_match(bw, "2")) {
2791                        rate = subquarter_rates;
2792                        len = sizeof(subquarter_rates) / sizeof(char *);
2793                }
2794        }
2795        if (nvram_match(mode, "bg-mixed")) {
2796                rate = bg_rates;
2797                len = sizeof(bg_rates) / sizeof(char *);
2798                if (nvram_match(bw, "10")) {
2799                        rate = half_rates;
2800                        len = sizeof(half_rates) / sizeof(char *);
2801                }
2802                if (nvram_match(bw, "5")) {
2803                        rate = quarter_rates;
2804                        len = sizeof(quarter_rates) / sizeof(char *);
2805                }
2806                if (nvram_match(bw, "2")) {
2807                        rate = subquarter_rates;
2808                        len = sizeof(subquarter_rates) / sizeof(char *);
2809                }
2810        }
2811        if (nvram_match(mode, "mixed")) {
2812                rate = bg_rates;
2813                len = sizeof(bg_rates) / sizeof(char *);
2814                if (nvram_match(bw, "40")) {
2815                        rate = ag_rates;
2816                        len = sizeof(ag_rates) / sizeof(char *);
2817                        showrates = turbo_rates;
2818                }
2819                if (nvram_match(bw, "10")) {
2820                        rate = half_rates;
2821                        len = sizeof(half_rates) / sizeof(char *);
2822                }
2823                if (nvram_match(bw, "5")) {
2824                        rate = quarter_rates;
2825                        len = sizeof(quarter_rates) / sizeof(char *);
2826                }
2827                if (nvram_match(bw, "2")) {
2828                        rate = subquarter_rates;
2829                        len = sizeof(subquarter_rates) / sizeof(char *);
2830                }
2831        }
2832        int i;
2833
2834        for (i = 0; i < len; i++) {
2835                if (maxrate) {
2836                        int offset = 0;
2837
2838                        if (nvram_match(mode, "g-only")
2839                            && nvram_match(bw, "20"))
2840                                offset = 4;
2841                        char comp[32];
2842
2843                        sprintf(comp, "%d", i + 1 + offset);
2844                        if (showrates)
2845                                websWrite(wp,
2846                                          "<option value=\"%d\" %s >%s Mbps</option>\n",
2847                                          i + 1 + offset, nvram_match(mxrate,
2848                                                                      comp) ?
2849                                          "selected=\"selected\"" : "",
2850                                          showrates[i]);
2851                        else
2852                                websWrite(wp,
2853                                          "<option value=\"%d\" %s >%s Mbps</option>\n",
2854                                          i + 1 + offset, nvram_match(mxrate,
2855                                                                      comp) ?
2856                                          "selected=\"selected\"" : "",
2857                                          rate[i]);
2858                } else {
2859                        int offset = 0;
2860
2861                        if (nvram_match(mode, "g-only")
2862                            && nvram_match(bw, "20"))
2863                                offset = 4;
2864                        char comp[32];
2865
2866                        sprintf(comp, "%d", i + 1 + offset);
2867                        if (showrates)
2868                                websWrite(wp,
2869                                          "<option value=\"%d\" %s >%s Mbps</option>\n",
2870                                          i + 1 + offset, nvram_match(srate,
2871                                                                      comp) ?
2872                                          "selected=\"selected\"" : "",
2873                                          showrates[i]);
2874                        else
2875                                websWrite(wp,
2876                                          "<option value=\"%d\" %s >%s Mbps</option>\n",
2877                                          i + 1 + offset, nvram_match(srate,
2878                                                                      comp) ?
2879                                          "selected=\"selected\"" : "",
2880                                          rate[i]);
2881
2882                }
2883        }
2884        websWrite(wp, "</select>\n");
2885        websWrite(wp, "<span class=\"default\">\n");
2886        websWrite(wp, "<script type=\"text/javascript\">\n");
2887        websWrite(wp, "//<![CDATA[\n");
2888        websWrite(wp,
2889                  "document.write(\"(\" + share.deflt + \": \" + share.auto + \")\");\n");
2890        websWrite(wp, "//]]\n");
2891        websWrite(wp, "</script></span></div>\n");
2892
2893}
2894#endif
2895static void show_netmode(webs_t wp, char *prefix)
2896{
2897        char wl_net_mode[16];
2898
2899        sprintf(wl_net_mode, "%s_net_mode", prefix);
2900
2901        websWrite(wp, "<div class=\"setting\">\n");
2902        websWrite(wp,
2903                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.label2)</script></div><select name=\"%s\">\n",
2904                  wl_net_mode);
2905        websWrite(wp, "<script type=\"text/javascript\">\n//<![CDATA[\n");
2906        websWrite(wp,
2907                  "document.write(\"<option value=\\\"disabled\\\" %s>\" + share.disabled + \"</option>\");\n",
2908                  nvram_match(wl_net_mode,
2909                              "disabled") ? "selected=\\\"selected\\\"" : "");
2910        websWrite(wp,
2911                  "document.write(\"<option value=\\\"mixed\\\" %s>\" + wl_basic.mixed + \"</option>\");\n",
2912                  nvram_match(wl_net_mode,
2913                              "mixed") ? "selected=\\\"selected\\\"" : "");
2914
2915        if (has_mimo(prefix) && has_2ghz(prefix)) {
2916                websWrite(wp,
2917                          "document.write(\"<option value=\\\"bg-mixed\\\" %s>\" + wl_basic.bg + \"</option>\");\n",
2918                          nvram_match(wl_net_mode,
2919                                      "bg-mixed") ? "selected=\\\"selected\\\""
2920                          : "");
2921        }
2922#ifdef HAVE_WHRAG108
2923        if (!strcmp(prefix, "ath1"))
2924#endif
2925#ifdef HAVE_TW6600
2926                if (!strcmp(prefix, "ath1"))
2927#endif
2928
2929                        if (has_2ghz(prefix)) {
2930                                websWrite(wp,
2931                                          "document.write(\"<option value=\\\"b-only\\\" %s>\" + wl_basic.b + \"</option>\");\n",
2932                                          nvram_match(wl_net_mode,
2933                                                      "b-only") ?
2934                                          "selected=\\\"selected\\\"" : "");
2935                        }
2936#ifdef HAVE_MADWIFI
2937        if (has_2ghz(prefix)) {
2938
2939#ifdef HAVE_WHRAG108
2940                if (!strcmp(prefix, "ath1"))
2941#endif
2942#ifdef HAVE_TW6600
2943                        if (!strcmp(prefix, "ath1"))
2944#endif
2945                                websWrite(wp,
2946                                          "document.write(\"<option value=\\\"g-only\\\" %s>\" + wl_basic.g + \"</option>\");\n",
2947                                          nvram_match(wl_net_mode,
2948                                                      "g-only") ?
2949                                          "selected=\\\"selected\\\"" : "");
2950#ifdef HAVE_WHRAG108
2951                if (!strcmp(prefix, "ath1"))
2952#endif
2953#ifdef HAVE_TW6600
2954                        if (!strcmp(prefix, "ath1"))
2955#endif
2956#if !defined(HAVE_LS5) || defined(HAVE_EOC5610)
2957                                websWrite(wp,
2958                                          "document.write(\"<option value=\\\"bg-mixed\\\" %s>\" + wl_basic.bg + \"</option>\");\n",
2959                                          nvram_match(wl_net_mode,
2960                                                      "bg-mixed") ?
2961                                          "selected=\\\"selected\\\"" : "");
2962#endif
2963        }
2964#else
2965#ifdef HAVE_WHRAG108
2966        if (!strcmp(prefix, "ath1"))
2967#endif
2968#if !defined(HAVE_LS5) || defined(HAVE_EOC5610)
2969
2970                if (has_2ghz(prefix)) {
2971                        websWrite(wp,
2972                                  "document.write(\"<option value=\\\"g-only\\\" %s>\" + wl_basic.g + \"</option>\");\n",
2973                                  nvram_match(wl_net_mode,
2974                                              "g-only") ?
2975                                  "selected=\\\"selected\\\"" : "");
2976                }
2977                if (has_mimo(prefix) && has_2ghz(prefix)) {
2978                        websWrite(wp,
2979                                  "document.write(\"<option value=\\\"ng-only\\\" %s>\" + wl_basic.ng + \"</option>\");\n",
2980                                  nvram_match(wl_net_mode,
2981                                              "ng-only") ?
2982                                  "selected=\\\"selected\\\"" : "");
2983                }
2984#endif
2985#endif
2986        if (has_mimo(prefix)) {
2987                if (has_5ghz(prefix)) {
2988                        websWrite(wp,
2989                                  "document.write(\"<option value=\\\"n2-only\\\" %s>\" + wl_basic.n2 + \"</option>\");\n",
2990                                  nvram_match(wl_net_mode,
2991                                              "n2-only") ?
2992                                  "selected=\\\"selected\\\"" : "");
2993                } else {
2994                        websWrite(wp,
2995                                  "document.write(\"<option value=\\\"n-only\\\" %s>\" + wl_basic.n + \"</option>\");\n",
2996                                  nvram_match(wl_net_mode,
2997                                              "n-only") ?
2998                                  "selected=\\\"selected\\\"" : "");
2999                }
3000        }
3001#if !defined(HAVE_FONERA) && !defined(HAVE_LS2) && !defined(HAVE_MERAKI)
3002#ifndef HAVE_MADWIFI
3003
3004        if (has_5ghz(prefix)) {
3005                websWrite(wp,
3006                          "document.write(\"<option value=\\\"a-only\\\" %s>\" + wl_basic.a + \"</option>\");\n",
3007                          nvram_match(wl_net_mode,
3008                                      "a-only") ?
3009                          "selected=\\\"selected\\\"" : "");
3010        }
3011        if (has_mimo(prefix) && has_5ghz(prefix)) {
3012                websWrite(wp,
3013                          "document.write(\"<option value=\\\"na-only\\\" %s>\" + wl_basic.na + \"</option>\");\n",
3014                          nvram_match(wl_net_mode,
3015                                      "na-only") ?
3016                          "selected=\\\"selected\\\"" : "");
3017                websWrite(wp,
3018                          "document.write(\"<option value=\\\"n5-only\\\" %s>\" + wl_basic.n5 + \"</option>\");\n",
3019                          nvram_match(wl_net_mode,
3020                                      "n5-only") ?
3021                          "selected=\\\"selected\\\"" : "");
3022        }
3023#else
3024#if HAVE_WHRAG108
3025        if (!strcmp(prefix, "ath0"))
3026#endif
3027#ifdef HAVE_TW6600
3028                if (!strcmp(prefix, "ath0"))
3029#endif
3030                        if (has_5ghz(prefix)) {
3031                                websWrite(wp,
3032                                          "document.write(\"<option value=\\\"a-only\\\" %s>\" + wl_basic.a + \"</option>\");\n",
3033                                          nvram_match(wl_net_mode,
3034                                                      "a-only") ?
3035                                          "selected=\\\"selected\\\"" : "");
3036                        }
3037#endif
3038
3039#endif
3040#ifdef HAVE_MADWIFI_MIMO
3041        if (is_ar5008(prefix)) {
3042                if (has_2ghz(prefix)) {
3043                        websWrite(wp,
3044                                  "document.write(\"<option value=\\\"ng-only\\\" %s>\" + wl_basic.ng + \"</option>\");\n",
3045                                  nvram_match(wl_net_mode,
3046                                              "ng-only") ?
3047                                  "selected=\\\"selected\\\"" : "");
3048                        websWrite(wp,
3049                                  "document.write(\"<option value=\\\"n2-only\\\" %s>\" + wl_basic.n2 + \"</option>\");\n",
3050                                  nvram_match(wl_net_mode,
3051                                              "n2-only") ?
3052                                  "selected=\\\"selected\\\"" : "");
3053                }
3054                if (has_5ghz(prefix)) {
3055                        websWrite(wp,
3056                                  "document.write(\"<option value=\\\"na-only\\\" %s>\" + wl_basic.na + \"</option>\");\n",
3057                                  nvram_match(wl_net_mode,
3058                                              "na-only") ?
3059                                  "selected=\\\"selected\\\"" : "");
3060                        websWrite(wp,
3061                                  "document.write(\"<option value=\\\"n5-only\\\" %s>\" + wl_basic.n5 + \"</option>\");\n",
3062                                  nvram_match(wl_net_mode,
3063                                              "n5-only") ?
3064                                  "selected=\\\"selected\\\"" : "");
3065                }
3066        }
3067#endif
3068
3069        websWrite(wp, "//]]>\n</script>\n");
3070        websWrite(wp, "</select>\n");
3071        websWrite(wp, "</div>\n");
3072
3073#ifdef HAVE_RT2880
3074        if (nvram_nmatch("n-only", "%s_net_mode", prefix)) {
3075                char wl_greenfield[32];
3076
3077                sprintf(wl_greenfield, "%s_greenfield", prefix);
3078                websWrite(wp, "<div class=\"setting\">\n");
3079                websWrite(wp,
3080                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.label7)</script></div><select name=\"%s\" >\n",
3081                          wl_greenfield);
3082                websWrite(wp,
3083                          "<script type=\"text/javascript\">\n//<![CDATA[\n");
3084                websWrite(wp,
3085                          "document.write(\"<option value=\\\"0\\\" %s>\" + wl_basic.mixed + \"</option>\");\n",
3086                          nvram_default_match(wl_greenfield, "0",
3087                                              "0") ? "selected=\\\"selected\\\""
3088                          : "");
3089                websWrite(wp,
3090                          "document.write(\"<option value=\\\"1\\\" %s>\" + wl_basic.greenfield + \"</option>\");\n",
3091                          nvram_default_match(wl_greenfield, "1",
3092                                              "0") ? "selected=\\\"selected\\\""
3093                          : "");
3094                websWrite(wp, "//]]>\n</script>\n");
3095                websWrite(wp, "</select>\n");
3096                websWrite(wp, "</div>\n");
3097        }
3098#endif
3099}
3100
3101#ifdef HAVE_MADWIFI
3102static void showrtssettings(webs_t wp, char *var)
3103{
3104        char ssid[32];
3105        char vvar[32];
3106
3107        strcpy(vvar, var);
3108        rep(vvar, '.', 'X');
3109        sprintf(ssid, "%s_rts", var);
3110        websWrite(wp,
3111                  "<div class=\"setting\">\n<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.rts)</script></div>\n");
3112        websWrite(wp,
3113                  "<input class=\"spaceradio\" type=\"radio\" value=\"1\" onclick=\"show_layer_ext(this, '%s_idrts', true);\" name=\"%s_rts\" %s><script type=\"text/javascript\">Capture(share.enable)</script></input>\n",
3114                  vvar, var, nvram_default_match(ssid, "1",
3115                                                 "0") ? "checked=\"checked\"" :
3116                  "");
3117        websWrite(wp,
3118                  "<input class=\"spaceradio\" type=\"radio\" value=\"0\" onclick=\"show_layer_ext(this, '%s_idrts', false);\" name=\"%s_rts\" %s><script type=\"text/javascript\">Capture(share.disable)</script></input>&nbsp;\n",
3119                  vvar, var, nvram_default_match(ssid, "0",
3120                                                 "0") ? "checked=\"checked\"" :
3121                  "");
3122        websWrite(wp, "</div>\n");
3123
3124        websWrite(wp, "<div id=\"%s_idrts\">\n", vvar);
3125        websWrite(wp, "<div class=\"setting\">\n");
3126        websWrite(wp,
3127                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.rtsvalue)</script></div>\n");
3128        char ip[32];
3129
3130        sprintf(ip, "%s_rtsvalue", var);
3131        websWrite(wp,
3132                  "<input class=\"num\" maxlength=\"4\" size=\"4\" onblur=\"valid_range(this,1,2346,share.ip)\" name=\"%s_rtsvalue\" value=\"%s\" />",
3133                  var, nvram_default_get(ip, "2346"));
3134        websWrite(wp, "</div>\n");
3135        websWrite(wp, "</div>\n");
3136
3137        websWrite(wp, "<script>\n//<![CDATA[\n ");
3138        websWrite(wp,
3139                  "show_layer_ext(document.getElementsByName(\"%s_rts\"), \"%s_idrts\", %s);\n",
3140                  var, vvar, nvram_match(ssid, "1") ? "true" : "false");
3141        websWrite(wp, "//]]>\n</script>\n");
3142
3143}
3144#endif
3145static void showbridgesettings(webs_t wp, char *var, int mcast, int dual)
3146{
3147
3148        char ssid[32];
3149
3150        sprintf(ssid, "%s_bridged", var);
3151        char vvar[32];
3152
3153        strcpy(vvar, var);
3154        rep(vvar, '.', 'X');
3155        websWrite(wp,
3156                  "<div class=\"setting\">\n<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.network)</script></div>\n");
3157        websWrite(wp,
3158                  "<input class=\"spaceradio\" type=\"radio\" value=\"0\" onclick=\"show_layer_ext(this, '%s_idnetvifs', true);\" name=\"%s_bridged\" %s><script type=\"text/javascript\">Capture(wl_basic.unbridged)</script></input>&nbsp;\n",
3159                  vvar, var, nvram_default_match(ssid, "0",
3160                                                 "1") ? "checked=\"checked\"" :
3161                  "");
3162        websWrite(wp,
3163                  "<input class=\"spaceradio\" type=\"radio\" value=\"1\" onclick=\"show_layer_ext(this, '%s_idnetvifs', false);\" name=\"%s_bridged\" %s><script type=\"text/javascript\">Capture(wl_basic.bridged)</script></input>\n",
3164                  vvar, var, nvram_default_match(ssid, "1",
3165                                                 "1") ? "checked=\"checked\"" :
3166                  "");
3167        websWrite(wp, "</div>\n");
3168
3169        websWrite(wp, "<div id=\"%s_idnetvifs\">\n", vvar);
3170        if (mcast) {
3171                char mcastvar[32];
3172
3173                sprintf(mcastvar, "%s_multicast", var);
3174                nvram_default_get(mcastvar, "0");
3175                showRadio(wp, "wl_basic.multicast", mcastvar);
3176        }
3177        if (nvram_match("wk_mode", "gateway")) {
3178                char natvar[32];
3179                sprintf(natvar, "%s_nat", var);
3180                nvram_default_get(natvar, "1");
3181                showRadio(wp, "wl_basic.masquerade", natvar);
3182        }
3183        websWrite(wp, "<div class=\"setting\">\n");
3184        websWrite(wp,
3185                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.ip)</script></div>\n");
3186        char ip[32];
3187
3188        sprintf(ip, "%s_ipaddr", var);
3189        char *ipv = nvram_safe_get(ip);
3190
3191        websWrite(wp,
3192                  "<input type=\"hidden\" name=\"%s_ipaddr\" value=\"4\" />\n",
3193                  var);
3194        websWrite(wp,
3195                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,1,223,share.ip)\" name=\"%s_ipaddr_0\" value=\"%d\" />.",
3196                  var, get_single_ip(ipv, 0));
3197        websWrite(wp,
3198                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.ip)\" name=\"%s_ipaddr_1\" value=\"%d\" />.",
3199                  var, get_single_ip(ipv, 1));
3200        websWrite(wp,
3201                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.ip)\" name=\"%s_ipaddr_2\" value=\"%d\" />.",
3202                  var, get_single_ip(ipv, 2));
3203        websWrite(wp,
3204                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.ip)\" name=\"%s_ipaddr_3\" value=\"%d\" />\n",
3205                  var, get_single_ip(ipv, 3));
3206        websWrite(wp, "</div>\n");
3207        websWrite(wp, "<div class=\"setting\">\n");
3208        websWrite(wp,
3209                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.subnet)</script></div>\n");
3210        sprintf(ip, "%s_netmask", var);
3211        ipv = nvram_safe_get(ip);
3212
3213        websWrite(wp,
3214                  "<input type=\"hidden\" name=\"%s_netmask\" value=\"4\" />\n",
3215                  var);
3216        websWrite(wp,
3217                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_netmask_0\" value=\"%d\" />.",
3218                  var, get_single_ip(ipv, 0));
3219        websWrite(wp,
3220                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_netmask_1\" value=\"%d\" />.",
3221                  var, get_single_ip(ipv, 1));
3222        websWrite(wp,
3223                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_netmask_2\" value=\"%d\" />.",
3224                  var, get_single_ip(ipv, 2));
3225        websWrite(wp,
3226                  "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_netmask_3\" value=\"%d\" />.",
3227                  var, get_single_ip(ipv, 3));
3228        websWrite(wp, "</div>\n");
3229
3230#ifdef HAVE_MADWIFI
3231/*if (dual)
3232{
3233    char dl[32];
3234    sprintf(dl,"%s_duallink",var);
3235    websWrite( wp,
3236               "<div class=\"setting\">\n<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.duallink)</script></div>\n" );
3237    websWrite( wp,
3238               "<input class=\"spaceradio\" type=\"radio\" value=\"1\" onclick=\"show_layer_ext(this, '%s_idduallink', true);\" name=\"%s_duallink\" %s><script type=\"text/javascript\">Capture(shared.enable)</script></input>&nbsp;\n",
3239               var, var, nvram_default_match( dl, "1",
3240                                               "0" ) ? "checked=\"checked\"" :
3241               "" );
3242    websWrite( wp,
3243               "<input class=\"spaceradio\" type=\"radio\" value=\"0\" onclick=\"show_layer_ext(this, '%s_idduallink', false);\" name=\"%s_duallink\" %s><script type=\"text/javascript\">Capture(shared.disable)</script></input>\n",
3244               var, var, nvram_default_match( dl, "0",
3245                                               "0" ) ? "checked=\"checked\"" :
3246               "" );
3247    websWrite( wp, "</div>\n" );
3248
3249    websWrite( wp, "<div id=\"%s_iddualink\">\n", var );
3250
3251    sprintf( ip, "%s_duallink_parent", var );
3252    websWrite( wp, "<div class=\"setting\">\n" );
3253    websWrite( wp,"<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.parent)</script></div>\n" );
3254    ipv = nvram_default_get( ip,"0.0.0.0" );
3255    websWrite( wp,
3256               "<input type=\"hidden\" name=\"%s_duallink_parent\" value=\"4\" />\n",
3257               var );
3258    websWrite( wp,
3259               "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_duallink_parent_0\" value=\"%d\" />.",
3260               var, get_single_ip( ipv, 0 ) );
3261    websWrite( wp,
3262               "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_duallink_parent_1\" value=\"%d\" />.",
3263               var, get_single_ip( ipv, 1 ) );
3264    websWrite( wp,
3265               "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_duallink_parent_2\" value=\"%d\" />.",
3266               var, get_single_ip( ipv, 2 ) );
3267    websWrite( wp,
3268               "<input class=\"num\" maxlength=\"3\" size=\"3\" onblur=\"valid_range(this,0,255,share.subnet)\" name=\"%s_duallink_parent_3\" value=\"%d\" />.",
3269               var, get_single_ip( ipv, 3 ) );
3270    websWrite( wp, "</div>\n" );
3271
3272    websWrite( wp, "</div>\n" );
3273
3274    websWrite( wp, "<script>\n//<![CDATA[\n " );
3275    websWrite( wp,
3276               "show_layer_ext(document.getElementsByName(\"%s_duallink\"), \"%s_idduallink\", %s);\n",
3277               var, vvar, nvram_match( dl, "1" ) ? "true" : "false" );
3278    websWrite( wp, "//]]>\n</script>\n" );
3279}*/
3280#endif
3281
3282        websWrite(wp, "</div>\n");
3283
3284        websWrite(wp, "<script>\n//<![CDATA[\n ");
3285        websWrite(wp,
3286                  "show_layer_ext(document.getElementsByName(\"%s_bridged\"), \"%s_idnetvifs\", %s);\n",
3287                  var, vvar, nvram_match(ssid, "0") ? "true" : "false");
3288        websWrite(wp, "//]]>\n</script>\n");
3289
3290}
3291
3292#ifdef HAVE_MADWIFI
3293static void show_chanshift(webs_t wp, char *prefix)
3294{
3295        char wl_chanshift[32];
3296        char wl_channelbw[32];
3297
3298        sprintf(wl_channelbw, "%s_channelbw", prefix);
3299        sprintf(wl_chanshift, "%s_chanshift", prefix);
3300        if (atoi(nvram_safe_get(wl_channelbw)) > 2
3301            && (atoi(nvram_safe_get(wl_chanshift)) & 0xf) > 10)
3302                nvram_set(wl_chanshift, "10");
3303        if (atoi(nvram_safe_get(wl_channelbw)) > 5
3304            && (atoi(nvram_safe_get(wl_chanshift)) & 0xf) > 10)
3305                nvram_set(wl_chanshift, "10");
3306        if (atoi(nvram_safe_get(wl_channelbw)) > 10
3307            && (atoi(nvram_safe_get(wl_chanshift)) & 0xf) > 0)
3308                nvram_set(wl_chanshift, "0");
3309
3310        if (nvram_match(wl_channelbw, "5")
3311            || nvram_match(wl_channelbw, "10")
3312            || nvram_match(wl_channelbw, "2")) {
3313
3314                websWrite(wp, "<div class=\"setting\">\n");
3315                websWrite(wp,
3316                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.chanshift)</script></div>\n<select name=\"%s\">\n",
3317                          wl_chanshift);
3318                websWrite(wp,
3319                          "<script type=\"text/javascript\">\n//<![CDATA[\n");
3320                if (nvram_match(wl_channelbw, "5")
3321                    || nvram_match(wl_channelbw, "2"))
3322                        websWrite(wp,
3323                                  "document.write(\"<option value=\\\"-15\\\" %s >-15 Mhz</option>\");\n",
3324                                  nvram_default_match(wl_chanshift, "-15",
3325                                                      "0") ?
3326                                  "selected=\\\"selected\\\"" : "");
3327                if (nvram_match(wl_channelbw, "5")
3328                    || nvram_match(wl_channelbw, "10")
3329                    || nvram_match(wl_channelbw, "2"))
3330                        websWrite(wp,
3331                                  "document.write(\"<option value=\\\"-10\\\" %s >-10 Mhz</option>\");\n",
3332                                  nvram_default_match(wl_chanshift, "-10",
3333                                                      "0") ?
3334                                  "selected=\\\"selected\\\"" : "");
3335                if (nvram_match(wl_channelbw, "5")
3336                    || nvram_match(wl_channelbw, "10")
3337                    || nvram_match(wl_channelbw, "2"))
3338                        websWrite(wp,
3339                                  "document.write(\"<option value=\\\"-5\\\" %s >-5 Mhz</option>\");\n",
3340                                  nvram_default_match(wl_chanshift, "-5",
3341                                                      "0") ?
3342                                  "selected=\\\"selected\\\"" : "");
3343                websWrite(wp,
3344                          "document.write(\"<option value=\\\"0\\\" %s >0 Mhz</option>\");\n",
3345                          nvram_default_match(wl_chanshift, "0",
3346                                              "0") ? "selected=\\\"selected\\\""
3347                          : "");
3348                if (nvram_match(wl_channelbw, "5")
3349                    || nvram_match(wl_channelbw, "10")
3350                    || nvram_match(wl_channelbw, "2"))
3351                        websWrite(wp,
3352                                  "document.write(\"<option value=\\\"5\\\" %s >+5 Mhz</option>\");\n",
3353                                  nvram_default_match(wl_chanshift, "5",
3354                                                      "0") ?
3355                                  "selected=\\\"selected\\\"" : "");
3356                if (nvram_match(wl_channelbw, "5")
3357                    || nvram_match(wl_channelbw, "10")
3358                    || nvram_match(wl_channelbw, "2"))
3359                        websWrite(wp,
3360                                  "document.write(\"<option value=\\\"10\\\" %s >+10 Mhz</option>\");\n",
3361                                  nvram_default_match(wl_chanshift, "10",
3362                                                      "0") ?
3363                                  "selected=\\\"selected\\\"" : "");
3364                if (nvram_match(wl_channelbw, "5")
3365                    || nvram_match(wl_channelbw, "2"))
3366                        websWrite(wp,
3367                                  "document.write(\"<option value=\\\"15\\\" %s >+15 Mhz</option>\");\n",
3368                                  nvram_default_match(wl_chanshift, "15",
3369                                                      "0") ?
3370                                  "selected=\\\"selected\\\"" : "");
3371                websWrite(wp, "//]]>\n</script>\n</select>\n</div>\n");
3372        }
3373}
3374#endif
3375static int show_virtualssid(webs_t wp, char *prefix)
3376{
3377        char *next;
3378        char var[80];
3379        char ssid[80];
3380        char vif[16];
3381        char power[32];
3382
3383#ifdef HAVE_MADWIFI
3384        char wmm[32];
3385        char wl_protmode[32];
3386#endif
3387        sprintf(vif, "%s_vifs", prefix);
3388        char *vifs = nvram_safe_get(vif);
3389
3390        if (vifs == NULL)
3391                return 0;
3392#ifndef HAVE_MADWIFI
3393        if (!nvram_nmatch("ap", "%s_mode", prefix)
3394            && !nvram_nmatch("apsta", "%s_mode", prefix)
3395            && !nvram_nmatch("apstawet", "%s_mode", prefix))
3396                return 0;
3397#endif
3398        int count = 1;
3399
3400        websWrite(wp,
3401                  "<h2><script type=\"text/javascript\">Capture(wl_basic.h2_vi)</script></h2>\n");
3402        foreach(var, vifs, next) {
3403                sprintf(ssid, "%s_ssid", var);
3404                websWrite(wp,
3405                          "<fieldset><legend><script type=\"text/javascript\">Capture(share.vintrface)</script> %s SSID [",
3406                          IFMAP(var));
3407                tf_webWriteESCNV(wp, ssid);     // fix for broken html page if ssid
3408                // contains html tag
3409                websWrite(wp, "]</legend>\n");
3410                websWrite(wp, "<div class=\"setting\">\n");
3411                websWrite(wp,
3412                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.label3)</script></div>\n");
3413
3414                websWrite(wp,
3415                          "<input name=\"%s_ssid\" size=\"20\" maxlength=\"32\" onblur=\"valid_name(this,wl_basic.label3)\" value=\"%s\" /></div>\n",
3416                          var, nvram_safe_get(ssid));
3417
3418#ifdef HAVE_MADWIFI
3419//      sprintf( wl_chanshift, "%s_chanshift", var );
3420//      show_chanshift( wp, wl_chanshift );
3421
3422                sprintf(wl_protmode, "%s_protmode", var);
3423                showOptionsLabel(wp, "wl_basic.protmode", wl_protmode,
3424                                 "None CTS RTS/CTS",
3425                                 nvram_default_get(wl_protmode, "None"));
3426                showrtssettings(wp, var);
3427#endif
3428
3429                websWrite(wp, "<div class=\"setting\">\n");
3430                websWrite(wp,
3431                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.label5)</script></div>");
3432                sprintf(ssid, "%s_closed", var);
3433                websWrite(wp,
3434                          "<input class=\"spaceradio\" type=\"radio\" value=\"0\" name=\"%s_closed\" %s><script type=\"text/javascript\">Capture(share.enable)</script></input>&nbsp;\n",
3435                          var, nvram_match(ssid,
3436                                           "0") ? "checked=\"checked\"" : "");
3437                websWrite(wp,
3438                          "<input class=\"spaceradio\" type=\"radio\" value=\"1\" name=\"%s_closed\" %s><script type=\"text/javascript\">Capture(share.disable)</script></input>\n",
3439                          var, nvram_match(ssid,
3440                                           "1") ? "checked=\"checked\"" : "");
3441                websWrite(wp, "</div>\n");
3442                char wl_mode[16];
3443
3444#ifdef HAVE_MADWIFI
3445                sprintf(wl_mode, "%s_mode", var);
3446                websWrite(wp,
3447                          "<div class=\"setting\">\n<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.label)</script></div><select name=\"%s\" >\n",
3448                          wl_mode);
3449                websWrite(wp,
3450                          "<script type=\"text/javascript\">\n//<![CDATA[\n");
3451                websWrite(wp,
3452                          "document.write(\"<option value=\\\"ap\\\" %s >\" + wl_basic.ap + \"</option>\");\n",
3453                          nvram_match(wl_mode,
3454                                      "ap") ? "selected=\\\"selected\\\"" : "");
3455                // websWrite (wp,
3456                // "document.write(\"<option value=\\\"wdssta\\\" %s >\" +
3457                // wl_basic.wdssta + \"</option>\");\n",
3458                // nvram_match (wl_mode,
3459                // "wdssta") ? "selected=\\\"selected\\\"" : "");
3460                websWrite(wp,
3461                          "document.write(\"<option value=\\\"wdsap\\\" %s >\" + wl_basic.wdsap + \"</option>\");\n",
3462                          nvram_match(wl_mode,
3463                                      "wdsap") ? "selected=\\\"selected\\\"" :
3464                          "");
3465                websWrite(wp, "//]]>\n</script>\n");
3466                websWrite(wp, "</select>\n");
3467                websWrite(wp, "</div>\n");
3468                sprintf(wmm, "%s_wmm", var);
3469                showRadio(wp, "wl_adv.label18", wmm);
3470#endif
3471                sprintf(ssid, "%s_ap_isolate", var);
3472                showRadio(wp, "wl_adv.label11", ssid);
3473#ifdef HAVE_MADWIFI
3474
3475                if (nvram_nmatch("ap", "%s_mode", var)
3476                    || nvram_nmatch("wdsap", "%s_mode", var)
3477                    || nvram_nmatch("infra", "%s_mode", var)) {
3478                        sprintf(power, "%s_maxassoc", var);
3479                        websWrite(wp, "<div class=\"setting\">\n");
3480                        websWrite(wp,
3481                                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.label10)</script></div>\n");
3482                        websWrite(wp,
3483                                  "<input class=\"num\" name=\"%s\" size=\"4\" maxlength=\"4\" onblur=\"valid_range(this,0,256,wl_adv.label10)\" value=\"%s\" />\n",
3484                                  power, nvram_default_get(power, "256"));
3485
3486                        websWrite(wp,
3487                                  "<span class=\"default\"><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"(\" + share.deflt + \": 256 \" + share.user + \")\");\n//]]>\n</script></span>\n");
3488                        websWrite(wp, "</div>\n");
3489                }
3490
3491                sprintf(power, "%s_mtikie", var);
3492                nvram_default_get(power, "0");
3493                showRadio(wp, "wl_basic.mtikie", power);
3494#endif
3495#ifdef HAVE_RT2880
3496                showbridgesettings(wp, getRADev(var), 1, 0);
3497#else
3498                showbridgesettings(wp, var, 1, 0);
3499#endif
3500                websWrite(wp, "</fieldset><br />\n");
3501                count++;
3502        }
3503
3504        websWrite(wp, "<div class=\"center\">\n");
3505#ifdef HAVE_MADWIFI
3506        if (count < 8)
3507#elif HAVE_RT2880
3508        if (count < 7)
3509#else
3510        if (count < WL_MAXBSSCFG)
3511#endif
3512                websWrite(wp,
3513                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.add + \"\\\" onclick=\\\"vifs_add_submit(this.form,'%s')\\\" />\");\n//]]>\n</script>\n",
3514                          prefix);
3515
3516        if (count > 1)
3517                websWrite(wp,
3518                          "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.remove + \"\\\" onclick=\\\"vifs_remove_submit(this.form,'%s')\\\" />\");\n//]]>\n</script>\n",
3519                          prefix);
3520
3521        websWrite(wp, "</div><br />\n");
3522
3523        return 0;
3524}
3525
3526void ej_showad(webs_t wp, int argc, char_t ** argv)
3527{
3528#ifndef HAVE_FON
3529#ifndef CONFIG_BRANDING
3530#ifdef HAVE_CHILLI
3531        // if (nvram_invmatch ("fon_enable", "1"))
3532        // websWrite (wp,
3533        // "<a href=\"fon.cgi\"><img src=\"images/turn.gif\" border=0 /></a>");
3534#endif
3535#endif
3536#endif
3537
3538#ifndef HAVE_NOAD
3539        /*
3540         * if (nvram_match("wanup","1")) { websWrite(wp,"<script
3541         * type=\"text/javascript\"><!--\n//<![CDATA[\n ");
3542         * websWrite(wp,"google_ad_client = \"pub-8308593183433068\";\n");
3543         * websWrite(wp,"google_ad_width = 728;\n");
3544         * websWrite(wp,"google_ad_height = 90;\n");
3545         * websWrite(wp,"google_ad_format = \"728x90_as\";\n");
3546         * websWrite(wp,"google_ad_type = \"text_image\";\n");
3547         * websWrite(wp,"google_ad_channel =\"8866414571\";\n");
3548         * websWrite(wp,"google_color_border = \"333333\";\n");
3549         * websWrite(wp,"google_color_bg = \"000000\";\n");
3550         * websWrite(wp,"google_color_link = \"FFFFFF\";\n");
3551         * websWrite(wp,"google_color_url = \"999999\";\n");
3552         * websWrite(wp,"google_color_text = \"CCCCCC\";\n");
3553         * websWrite(wp,"//-->//]]>\n</script>\n"); websWrite(wp,"<script
3554         * type=\"text/javascript\"\n"); websWrite(wp,"
3555         * src=\"http://pagead2.googlesyndication.com/pagead/show_ads.js\">\n");
3556         * websWrite(wp,"</script>\n"); }
3557         */
3558#endif
3559        return;
3560}
3561
3562#ifndef HAVE_SUPERCHANNEL
3563int inline issuperchannel(void)
3564{
3565#if defined(HAVE_MAKSAT) && defined(HAVE_MR3202A)
3566        return 0;
3567#elif defined(HAVE_MAKSAT) && defined(HAVE_ALPHA)
3568        return 0;
3569#elif HAVE_MAKSAT
3570        return 1;
3571#else
3572        return 0;
3573#endif
3574}
3575#endif
3576
3577void ej_show_countrylist(webs_t wp, int argc, char_t ** argv)
3578{
3579        if (argc < 1) {
3580                return;
3581        }
3582        char *list = getCountryList();
3583
3584        showOptionsChoose(wp, argv[0], list, nvram_safe_get(argv[0]));
3585}
3586
3587void ej_show_wireless_single(webs_t wp, char *prefix)
3588{
3589        char wl_mode[16];
3590        char wl_macaddr[16];
3591        char wl_ssid[16];
3592
3593        sprintf(wl_mode, "%s_mode", prefix);
3594        sprintf(wl_macaddr, "%s_hwaddr", prefix);
3595        sprintf(wl_ssid, "%s_ssid", prefix);
3596
3597        // wireless mode
3598        websWrite(wp,
3599                  "<h2><script type=\"text/javascript\">Capture(wl_basic.h2_v24)</script> %s</h2>\n",
3600                  prefix);
3601        websWrite(wp, "<fieldset>\n");
3602        websWrite(wp,
3603                  "<legend><script type=\"text/javascript\">Capture(share.pintrface)</script> %s - SSID [",
3604                  IFMAP(prefix));
3605        tf_webWriteESCNV(wp, wl_ssid);  // fix
3606        websWrite(wp, "] HWAddr [%s]</legend>\n", nvram_safe_get(wl_macaddr));
3607        char power[16];
3608
3609        // char maxpower[16];
3610#ifdef HAVE_MADWIFI
3611#ifndef HAVE_MAKSAT
3612#ifndef HAVE_DDLINK
3613
3614        if (isXR36(prefix)) {
3615                char wl_cardtype[32];
3616                sprintf(wl_cardtype, "%s_cardtype", prefix);
3617                websWrite(wp, "<div class=\"setting\">\n");
3618                websWrite(wp,
3619                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.cardtype)</script></div>\n<select name=\"%s\">\n",
3620                          wl_cardtype);
3621                websWrite(wp,
3622                          "<script type=\"text/javascript\">\n//<![CDATA[\n");
3623                websWrite(wp,
3624                          "document.write(\"<option value=\\\"0\\\" %s >Ubiquiti XR3.3</option>\");\n",
3625                          nvram_default_match(wl_cardtype, "0",
3626                                              "0") ? "selected=\\\"selected\\\""
3627                          : "");
3628                websWrite(wp,
3629                          "document.write(\"<option value=\\\"1\\\" %s >Ubiquiti XR3.6</option>\");\n",
3630                          nvram_default_match(wl_cardtype, "1",
3631                                              "0") ? "selected=\\\"selected\\\""
3632                          : "");
3633                websWrite(wp,
3634                          "document.write(\"<option value=\\\"2\\\" %s >Ubiquiti XR3.7</option>\");\n",
3635                          nvram_default_match(wl_cardtype, "2",
3636                                              "0") ? "selected=\\\"selected\\\""
3637                          : "");
3638                websWrite(wp, "//]]>\n</script>\n</select>\n</div>\n");
3639        }
3640
3641        if (isEMP(prefix)) {
3642                char wl_cardtype[32];
3643                sprintf(wl_cardtype, "%s_cardtype", prefix);
3644                websWrite(wp, "<div class=\"setting\">\n");
3645                websWrite(wp,
3646                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.cardtype)</script></div>\n<select name=\"%s\">\n",
3647                          wl_cardtype);
3648                websWrite(wp,
3649                          "<script type=\"text/javascript\">\n//<![CDATA[\n");
3650                websWrite(wp,
3651                          "document.write(\"<option value=\\\"0\\\" %s >Atheros Generic</option>\");\n",
3652                          nvram_default_match(wl_cardtype, "0",
3653                                              "0") ? "selected=\\\"selected\\\""
3654                          : "");
3655                websWrite(wp,
3656                          "document.write(\"<option value=\\\"5\\\" %s >Alfa Networks AWPCI085H</option>\");\n",
3657                          nvram_default_match(wl_cardtype, "5",
3658                                              "0") ? "selected=\\\"selected\\\""
3659                          : "");
3660                websWrite(wp,
3661                          "document.write(\"<option value=\\\"6\\\" %s >Alfa Networks AWPCI085P</option>\");\n",
3662                          nvram_default_match(wl_cardtype, "6",
3663                                              "0") ? "selected=\\\"selected\\\""
3664                          : "");
3665                websWrite(wp,
3666                          "document.write(\"<option value=\\\"7\\\" %s >Doodle Labs DLM105</option>\");\n",
3667                          nvram_default_match(wl_cardtype, "7",
3668                                              "0") ? "selected=\\\"selected\\\""
3669                          : "");
3670                websWrite(wp,
3671                          "document.write(\"<option value=\\\"4\\\" %s >MakSat MAK27</option>\");\n",
3672                          nvram_default_match(wl_cardtype, "4",
3673                                              "0") ? "selected=\\\"selected\\\""
3674                          : "");
3675                websWrite(wp,
3676                          "document.write(\"<option value=\\\"1\\\" %s >Senao EMP-8602</option>\");\n",
3677                          nvram_default_match(wl_cardtype, "1",
3678                                              "0") ? "selected=\\\"selected\\\""
3679                          : "");
3680                websWrite(wp,
3681                          "document.write(\"<option value=\\\"2\\\" %s >Senao EMP-8603-S</option>\");\n",
3682                          nvram_default_match(wl_cardtype, "2",
3683                                              "0") ? "selected=\\\"selected\\\""
3684                          : "");
3685                websWrite(wp,
3686                          "document.write(\"<option value=\\\"3\\\" %s >Senao EMP-8603</option>\");\n",
3687                          nvram_default_match(wl_cardtype, "3",
3688                                              "0") ? "selected=\\\"selected\\\""
3689                          : "");
3690                websWrite(wp, "//]]>\n</script>\n</select>\n</div>\n");
3691        }
3692#endif
3693#endif                          // ! HAVE MAKSAT
3694#ifndef HAVE_NOCOUNTRYSEL
3695        char wl_regdomain[16];
3696
3697        sprintf(wl_regdomain, "%s_regdomain", prefix);
3698        if (nvram_match("ath_regulatory", "1") || !issuperchannel()) {
3699                websWrite(wp,
3700                          "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.regdom)</script></div>\n");
3701                char *list = getCountryList();
3702
3703                showOptions(wp, wl_regdomain, list,
3704                            nvram_safe_get(wl_regdomain));
3705                websWrite(wp, "</div>\n");
3706        }
3707#endif                          // ! HAVE MAKSAT
3708        /*
3709         * while (regdomains[domcount].name != NULL) { char domcode[16]; sprintf
3710         * (domcode, "%d", regdomains[domcount].code); websWrite (wp, "<option
3711         * value=\"%d\" %s>%s</option>\n", regdomains[domcount].code, nvram_match
3712         * (wl_regdomain, domcode) ? " selected=\"selected\"" : "",
3713         * regdomains[domcount].name); domcount++; } websWrite (wp,
3714         * "</select>\n"); websWrite (wp, "</div>\n");
3715         */
3716        // power adjustment
3717        sprintf(power, "%s_txpwrdbm", prefix);
3718        // sprintf (maxpower, "%s_maxpower", prefix);
3719        if (!strcmp(prefix, "ath0") && issuperchannel())        // show
3720                // client
3721                // only on
3722                // first
3723                // interface
3724        {
3725
3726                websWrite(wp, "         <div class=\"setting\">\n");
3727                websWrite(wp,
3728                          "             <div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.regulatory)</script></div>\n");
3729                websWrite(wp,
3730                          "             <input class=\"spaceradio\" type=\"radio\" value=\"0\" name=\"ath_regulatory\" %s /><script type=\"text/javascript\">Capture(share.enable)</script>&nbsp;\n",
3731                          nvram_match("ath_regulatory", "0") ? "checked" : "");
3732                websWrite(wp,
3733                          "             <input class=\"spaceradio\" type=\"radio\" value=\"1\" name=\"ath_regulatory\" %s /><script type=\"text/javascript\">Capture(share.disable)</script>\n",
3734                          nvram_match("ath_regulatory", "1") ? "checked" : "");
3735                websWrite(wp, "         </div>\n");
3736
3737        }
3738        websWrite(wp, "<div class=\"setting\">\n");
3739        websWrite(wp,
3740                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.TXpower)</script></div><input class=\"num\" name=\"%s\" size=\"6\" maxlength=\"3\" value=\"%d\" /> dBm\n",
3741                  power,
3742                  atoi(nvram_safe_get(power)) + wifi_gettxpoweroffset(prefix));
3743        websWrite(wp, "</div>\n");
3744        sprintf(power, "%s_antgain", prefix);
3745#ifndef HAVE_MAKSAT
3746        if (nvram_match("ath_regulatory", "1"))
3747#endif
3748        {
3749                websWrite(wp, "<div class=\"setting\">\n");
3750                websWrite(wp,
3751                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.AntGain)</script></div><input class=\"num\" name=\"%s\" size=\"6\" maxlength=\"3\" value=\"%s\" /> dBi\n",
3752                          power, nvram_safe_get(power));
3753                websWrite(wp, "</div>\n");
3754        }
3755#endif
3756
3757#ifdef HAVE_MADWIFI
3758        // if (!strcmp (prefix, "ath0"))
3759#endif
3760        {
3761                // #ifdef HAVE_MADWIFI
3762                // if (!strcmp (prefix, "ath0")) //show client only on first
3763                // interface
3764                // #endif
3765                {
3766#ifdef HAVE_MADWIFI
3767                        // if (!strcmp (prefix, "ath0")) //show client only on first
3768                        // interface
3769                        // if (nvram_match ("ath0_mode", "wdsap")
3770                        // || nvram_match ("ath0_mode", "wdssta"))
3771                        // showOption (wp, "wl_basic.wifi_bonding", "wifi_bonding");
3772#endif
3773#ifdef HAVE_REGISTER
3774                        int cpeonly = iscpe();
3775#else
3776                        int cpeonly = 0;
3777#endif
3778                        websWrite(wp,
3779                                  "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.label)</script></div><select name=\"%s\" >\n",
3780                                  wl_mode);
3781                        websWrite(wp,
3782                                  "<script type=\"text/javascript\">\n//<![CDATA[\n");
3783                        if (!cpeonly) {
3784                                websWrite(wp,
3785                                          "document.write(\"<option value=\\\"ap\\\" %s >\" + wl_basic.ap + \"</option>\");\n",
3786                                          nvram_match(wl_mode,
3787                                                      "ap") ?
3788                                          "selected=\\\"selected\\\"" : "");
3789                        }
3790                        websWrite(wp,
3791                                  "document.write(\"<option value=\\\"sta\\\" %s >\" + wl_basic.client + \"</option>\");\n",
3792                                  nvram_match(wl_mode,
3793                                              "sta") ?
3794                                  "selected=\\\"selected\\\"" : "");
3795#ifndef HAVE_RT2880
3796                        websWrite(wp,
3797                                  "document.write(\"<option value=\\\"wet\\\" %s >\" + wl_basic.clientBridge + \"</option>\");\n",
3798                                  nvram_match(wl_mode,
3799                                              "wet") ?
3800                                  "selected=\\\"selected\\\"" : "");
3801#endif
3802                        if (!cpeonly)
3803                                websWrite(wp,
3804                                          "document.write(\"<option value=\\\"infra\\\" %s >\" + wl_basic.adhoc + \"</option>\");\n",
3805                                          nvram_match(wl_mode,
3806                                                      "infra") ?
3807                                          "selected=\\\"selected\\\"" : "");
3808#ifndef HAVE_MADWIFI
3809                        if (!cpeonly) {
3810                                websWrite(wp,
3811                                          "document.write(\"<option value=\\\"apsta\\\" %s >\" + wl_basic.repeater + \"</option>\");\n",
3812                                          nvram_match(wl_mode,
3813                                                      "apsta") ?
3814                                          "selected=\\\"selected\\\"" : "");
3815//#ifndef HAVE_RT2880
3816                                websWrite(wp,
3817                                          "document.write(\"<option value=\\\"apstawet\\\" %s >\" + wl_basic.repeaterbridge + \"</option>\");\n",
3818                                          nvram_match(wl_mode,
3819                                                      "apstawet") ?
3820                                          "selected=\\\"selected\\\"" : "");
3821                        }
3822//#endif
3823#else
3824                        websWrite(wp,
3825                                  "document.write(\"<option value=\\\"wdssta\\\" %s >\" + wl_basic.wdssta + \"</option>\");\n",
3826                                  nvram_match(wl_mode,
3827                                              "wdssta") ?
3828                                  "selected=\\\"selected\\\"" : "");
3829                        if (!cpeonly) {
3830                                websWrite(wp,
3831                                          "document.write(\"<option value=\\\"wdsap\\\" %s >\" + wl_basic.wdsap + \"</option>\");\n",
3832                                          nvram_match(wl_mode,
3833                                                      "wdsap") ?
3834                                          "selected=\\\"selected\\\"" : "");
3835                        }
3836#endif
3837                        websWrite(wp, "//]]>\n</script>\n");
3838                        websWrite(wp, "</select>\n");
3839                        websWrite(wp, "</div>\n");
3840                }
3841                /*
3842                 * #ifdef HAVE_MADWIFI else {
3843                 *
3844                 *
3845                 * websWrite (wp, "<div class=\"setting\"><div
3846                 * class=\"label\"><script
3847                 * type=\"text/javascript\">Capture(wl_basic.label)</script></div><select
3848                 * name=\"%s\">\n", wl_mode); websWrite (wp, "<script
3849                 * type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option
3850                 * value=\\\"ap\\\" %s >\" + wl_basic.ap +
3851                 * \"</option>\");\n//]]>\n</script>\n", nvram_match (wl_mode, "ap")
3852                 * ? "selected=\\\"selected\\\"" : ""); websWrite (wp, "<script
3853                 * type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option
3854                 * value=\\\"infra\\\" %s >\" + wl_basic.adhoc +
3855                 * \"</option>\");\n//]]>\n</script>\n", nvram_match (wl_mode,
3856                 * "infra") ? "selected=\\\"selected\\\"" : ""); websWrite (wp,
3857                 * "<script type=\"text/javascript\">\n//<![CDATA[\n
3858                 * document.write(\"<option value=\\\"wdssta\\\" %s >\" +
3859                 * wl_basic.wdssta + \"</option>\");\n//]]>\n</script>\n",
3860                 * nvram_match (wl_mode, "wdssta") ? "selected=\\\"selected\\\"" :
3861                 * ""); websWrite (wp, "<script
3862                 * type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option
3863                 * value=\\\"wdsap\\\" %s >\" + wl_basic.wdsap +
3864                 * \"</option>\");\n//]]>\n</script>\n", nvram_match (wl_mode,
3865                 * "wdsap") ? "selected=\\\"selected\\\"" : ""); websWrite (wp,
3866                 * "</select>\n"); websWrite (wp, "</div>\n"); } #endif
3867                 */
3868        }
3869        // writeless net mode
3870        show_netmode(wp, prefix);
3871        // turbo options
3872#ifdef HAVE_MADWIFI
3873
3874        // char wl_xchanmode[16];
3875        char wl_outdoor[16];
3876        char wl_diversity[16];
3877        char wl_rxantenna[16];
3878        char wl_txantenna[16];
3879        char wl_width[16];
3880        char wl_preamble[16];
3881        char wl_xr[16];
3882        char wl_comp[32];
3883        char wl_ff[16];
3884        char wmm[32];
3885        char wl_isolate[32];
3886        char wl_sifstime[32];
3887        char wl_preambletime[32];
3888        char wl_intmit[32];
3889        char wl_noise_immunity[32];
3890        char wl_ofdm_weak_det[32];
3891        char wl_protmode[32];
3892        char wl_doth[32];
3893        char wl_csma[32];
3894
3895        sprintf(wl_csma, "%s_csma", prefix);
3896        sprintf(wl_doth, "%s_doth", prefix);
3897        sprintf(wl_protmode, "%s_protmode", prefix);
3898        sprintf(wl_outdoor, "%s_outdoor", prefix);
3899        sprintf(wl_diversity, "%s_diversity", prefix);
3900        sprintf(wl_rxantenna, "%s_rxantenna", prefix);
3901        sprintf(wl_txantenna, "%s_txantenna", prefix);
3902        sprintf(wl_width, "%s_channelbw", prefix);
3903//    sprintf( wl_comp, "%s_compression", prefix );
3904        sprintf(wl_ff, "%s_ff", prefix);
3905        sprintf(wl_preamble, "%s_preamble", prefix);
3906        sprintf(wl_preambletime, "%s_preambletime", prefix);
3907        sprintf(wl_sifstime, "%s_sifstime", prefix);
3908        sprintf(wl_xr, "%s_xr", prefix);
3909
3910        sprintf(wl_intmit, "%s_intmit", prefix);
3911        sprintf(wl_noise_immunity, "%s_noise_immunity", prefix);
3912        sprintf(wl_ofdm_weak_det, "%s_ofdm_weak_det", prefix);
3913
3914#ifdef HAVE_MADWIFI_MIMO
3915        if (!is_ar5008(prefix))
3916#endif
3917        {
3918                showAutoOption(wp, "wl_basic.intmit", wl_intmit);
3919                websWrite(wp, "<div class=\"setting\">\n");
3920                websWrite(wp,
3921                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.noise_immunity)</script></div>\n<select name=\"%s\">\n",
3922                          wl_noise_immunity);
3923                websWrite(wp,
3924                          "<script type=\"text/javascript\">\n//<![CDATA[\n");
3925                websWrite(wp,
3926                          "document.write(\"<option value=\\\"0\\\" %s >0</option>\");\n",
3927                          nvram_default_match(wl_noise_immunity, "0",
3928                                              "4") ? "selected=\\\"selected\\\""
3929                          : "");
3930                websWrite(wp,
3931                          "document.write(\"<option value=\\\"1\\\" %s >1</option>\");\n",
3932                          nvram_default_match(wl_noise_immunity, "1",
3933                                              "4") ? "selected=\\\"selected\\\""
3934                          : "");
3935                websWrite(wp,
3936                          "document.write(\"<option value=\\\"2\\\" %s >2</option>\");\n",
3937                          nvram_default_match(wl_noise_immunity, "2",
3938                                              "4") ? "selected=\\\"selected\\\""
3939                          : "");
3940                websWrite(wp,
3941                          "document.write(\"<option value=\\\"3\\\" %s >3</option>\");\n",
3942                          nvram_default_match(wl_noise_immunity, "3",
3943                                              "4") ? "selected=\\\"selected\\\""
3944                          : "");
3945                websWrite(wp,
3946                          "document.write(\"<option value=\\\"4\\\" %s >4</option>\");\n",
3947                          nvram_default_match(wl_noise_immunity, "4",
3948                                              "4") ? "selected=\\\"selected\\\""
3949                          : "");
3950                websWrite(wp, "//]]>\n</script>\n</select>\n</div>\n");
3951
3952                showRadio(wp, "wl_basic.ofdm_weak_det", wl_ofdm_weak_det);
3953        }
3954
3955        showOptionsLabel(wp, "wl_basic.protmode", wl_protmode,
3956                         "None CTS RTS/CTS", nvram_default_get(wl_protmode,
3957                                                               "None"));
3958        showrtssettings(wp, prefix);
3959        show_rates(wp, prefix, 0);
3960        show_rates(wp, prefix, 1);
3961        showRadio(wp, "wl_basic.preamble", wl_preamble);
3962#ifdef HAVE_MADWIFI_MIMO
3963        if (!is_ar5008(prefix))
3964#endif
3965        {
3966                showRadio(wp, "wl_basic.extrange", wl_xr);
3967                showRadio(wp, "wl_basic.supergff", wl_ff);
3968        }
3969#if 0
3970        showRadio(wp, "wl_basic.csma", wl_csma);
3971#endif
3972        // showOption (wp, "wl_basic.extchannel", wl_xchanmode);
3973#if !defined(HAVE_FONERA) && !defined(HAVE_LS2) && !defined(HAVE_MERAKI)
3974        if (nvram_match("ath_regulatory", "1") || !issuperchannel()) {
3975                showRadio(wp, "wl_basic.outband", wl_outdoor);
3976        }
3977#endif
3978        websWrite(wp,
3979                  "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.channel_width)</script></div><select name=\"%s\" >\n",
3980                  wl_width);
3981        websWrite(wp, "<script type=\"text/javascript\">\n//<![CDATA[\n");
3982#ifdef HAVE_MADWIFI_MIMO
3983        if (is_ar5008(prefix)) {
3984                websWrite(wp,
3985                          "document.write(\"<option value=\\\"2040\\\" %s >\" + share.dynamicturbo + \"</option>\");\n",
3986                          nvram_match(wl_width,
3987                                      "2040") ? "selected=\\\"selected\\\"" :
3988                          "");
3989
3990        }
3991#endif
3992        websWrite(wp,
3993                  "document.write(\"<option value=\\\"40\\\" %s >\" + share.turbo + \"</option>\");\n",
3994                  nvram_match(wl_width,
3995                              "40") ? "selected=\\\"selected\\\"" : "");
3996        websWrite(wp,
3997                  "document.write(\"<option value=\\\"20\\\" %s >\" + share.full + \"</option>\");\n",
3998                  nvram_match(wl_width,
3999                              "20") ? "selected=\\\"selected\\\"" : "");
4000        websWrite(wp,
4001                  "document.write(\"<option value=\\\"10\\\" %s >\" + share.half + \"</option>\");\n",
4002                  nvram_match(wl_width,
4003                              "10") ? "selected=\\\"selected\\\"" : "");
4004        websWrite(wp,
4005                  "document.write(\"<option value=\\\"5\\\" %s >\" + share.quarter + \"</option>\");\n",
4006                  nvram_match(wl_width,
4007                              "5") ? "selected=\\\"selected\\\"" : "");
4008#ifdef HAVE_SUBQUARTER
4009        /* will be enabled once it is tested and the spectrum analyse is done */
4010        websWrite(wp,
4011                  "document.write(\"<option value=\\\"2\\\" %s >\" + share.subquarter + \"</option>\");\n",
4012                  nvram_match(wl_width,
4013                              "2") ? "selected=\\\"selected\\\"" : "");
4014#endif
4015        websWrite(wp, "//]]>\n</script>\n");
4016        websWrite(wp, "</select>\n");
4017        websWrite(wp, "</div>\n");
4018/*#if defined(HAVE_EOC5610)
4019        websWrite(wp,
4020                  "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.label25)</script></div><select name=\"%s\" >\n",
4021                  wl_txantenna);
4022        websWrite(wp, "<script type=\"text/javascript\">\n//<![CDATA[\n");
4023        websWrite(wp,
4024                  "document.write(\"<option value=\\\"1\\\" %s >\" + wl_basic.ghz5 + \"</option>\");\n",
4025                  nvram_match(wl_txantenna,
4026                              "1") ? "selected=\\\"selected\\\"" : "");
4027        websWrite(wp,
4028                  "document.write(\"<option value=\\\"2\\\" %s >\" + wl_basic.ghz24 + \"</option>\");\n",
4029                  nvram_match(wl_txantenna,
4030                              "2") ? "selected=\\\"selected\\\"" : "");
4031        websWrite(wp, "//]]>\n</script>\n");
4032
4033        websWrite(wp, "</select>\n");
4034        websWrite(wp, "</div>\n");*/
4035#if defined(HAVE_PICO2) || defined(HAVE_PICO2HP) || defined(HAVE_PICO5)
4036
4037/*    websWrite( wp,
4038               "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.label25)</script></div><select name=\"%s\" >\n",
4039               wl_txantenna );
4040    websWrite( wp, "<script type=\"text/javascript\">\n//<![CDATA[\n" );
4041    websWrite( wp,
4042               "document.write(\"<option value=\\\"1\\\" %s >\" + wl_basic.internal + \"</option>\");\n",
4043               nvram_match( wl_txantenna,
4044                            "1" ) ? "selected=\\\"selected\\\"" : "" );
4045    websWrite( wp,
4046               "document.write(\"<option value=\\\"2\\\" %s >\" + wl_basic.external + \"</option>\");\n",
4047               nvram_match( wl_txantenna,
4048                            "2" ) ? "selected=\\\"selected\\\"" : "" );
4049    websWrite( wp, "//]]>\n</script>\n" );
4050
4051    websWrite( wp, "</select>\n" );
4052    websWrite( wp, "</div>\n" );*/
4053//#elif defined(HAVE_EOC1650)
4054/*    websWrite( wp,
4055               "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.label25)</script></div><select name=\"%s\" >\n",
4056               wl_txantenna );
4057    websWrite( wp, "<script type=\"text/javascript\">\n//<![CDATA[\n" );
4058    websWrite( wp,
4059               "document.write(\"<option value=\\\"2\\\" %s >\" + wl_basic.internal + \"</option>\");\n",
4060               nvram_match( wl_txantenna,
4061                            "2" ) ? "selected=\\\"selected\\\"" : "" );
4062    websWrite( wp,
4063               "document.write(\"<option value=\\\"1\\\" %s >\" + wl_basic.external + \"</option>\");\n",
4064               nvram_match( wl_txantenna,
4065                            "1" ) ? "selected=\\\"selected\\\"" : "" );
4066    websWrite( wp, "//]]>\n</script>\n" );
4067
4068    websWrite( wp, "</select>\n" );
4069    websWrite( wp, "</div>\n" );*/
4070#elif defined(HAVE_NS2) || defined(HAVE_NS5) || defined(HAVE_LC2) || defined(HAVE_LC5) || defined(HAVE_NS3)
4071
4072        websWrite(wp,
4073                  "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.label24)</script></div><select name=\"%s\" >\n",
4074                  wl_txantenna);
4075        websWrite(wp, "<script type=\"text/javascript\">\n//<![CDATA[\n");
4076        websWrite(wp,
4077                  "document.write(\"<option value=\\\"0\\\" %s >\" + wl_basic.vertical + \"</option>\");\n",
4078                  nvram_match(wl_txantenna,
4079                              "0") ? "selected=\\\"selected\\\"" : "");
4080        websWrite(wp,
4081                  "document.write(\"<option value=\\\"1\\\" %s >\" + wl_basic.horizontal + \"</option>\");\n",
4082                  nvram_match(wl_txantenna,
4083                              "1") ? "selected=\\\"selected\\\"" : "");
4084#if defined(HAVE_NS5) || defined(HAVE_NS2) || defined(HAVE_NS3)
4085        websWrite(wp,
4086                  "document.write(\"<option value=\\\"3\\\" %s >\" + wl_basic.adaptive + \"</option>\");\n",
4087                  nvram_match(wl_txantenna,
4088                              "3") ? "selected=\\\"selected\\\"" : "");
4089        websWrite(wp,
4090                  "document.write(\"<option value=\\\"2\\\" %s >\" + wl_basic.external + \"</option>\");\n",
4091                  nvram_match(wl_txantenna,
4092                              "2") ? "selected=\\\"selected\\\"" : "");
4093#endif
4094        websWrite(wp, "//]]>\n</script>\n");
4095
4096        websWrite(wp, "</select>\n");
4097        websWrite(wp, "</div>\n");
4098
4099#else
4100#ifdef HAVE_MADWIFI_MIMO
4101        if (!is_ar5008(prefix))
4102#endif
4103        {
4104                showRadio(wp, "wl_basic.diversity", wl_diversity);
4105                websWrite(wp,
4106                          "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.label12)</script></div><select name=\"%s\" >\n",
4107                          wl_txantenna);
4108                websWrite(wp,
4109                          "<script type=\"text/javascript\">\n//<![CDATA[\n");
4110                websWrite(wp,
4111                          "document.write(\"<option value=\\\"0\\\" %s >\" + wl_basic.diversity + \"</option>\");\n",
4112                          nvram_match(wl_txantenna,
4113                                      "0") ? "selected=\\\"selected\\\"" : "");
4114                websWrite(wp,
4115                          "document.write(\"<option value=\\\"1\\\" %s >\" + wl_basic.primary + \"</option>\");\n",
4116                          nvram_match(wl_txantenna,
4117                                      "1") ? "selected=\\\"selected\\\"" : "");
4118                websWrite(wp,
4119                          "document.write(\"<option value=\\\"2\\\" %s >\" + wl_basic.secondary + \"</option>\");\n",
4120                          nvram_match(wl_txantenna,
4121                                      "2") ? "selected=\\\"selected\\\"" : "");
4122                websWrite(wp, "//]]>\n</script>\n");
4123                websWrite(wp, "</select>\n");
4124                websWrite(wp, "</div>\n");
4125
4126                websWrite(wp,
4127                          "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.label13)</script></div><select name=\"%s\" >\n",
4128                          wl_rxantenna);
4129                websWrite(wp,
4130                          "<script type=\"text/javascript\">\n//<![CDATA[\n");
4131                websWrite(wp,
4132                          "document.write(\"<option value=\\\"0\\\" %s >\" + wl_basic.diversity + \"</option>\");\n",
4133                          nvram_match(wl_rxantenna,
4134                                      "0") ? "selected=\\\"selected\\\"" : "");
4135                websWrite(wp,
4136                          "document.write(\"<option value=\\\"1\\\" %s >\" + wl_basic.primary + \"</option>\");\n",
4137                          nvram_match(wl_rxantenna,
4138                                      "1") ? "selected=\\\"selected\\\"" : "");
4139                websWrite(wp,
4140                          "document.write(\"<option value=\\\"2\\\" %s >\" + wl_basic.secondary + \"</option>\");\n",
4141                          nvram_match(wl_rxantenna,
4142                                      "2") ? "selected=\\\"selected\\\"" : "");
4143                websWrite(wp, "//]]>\n</script>\n");
4144                websWrite(wp, "</select>\n");
4145                websWrite(wp, "</div>\n");
4146        }
4147#ifdef HAVE_MADWIFI_MIMO
4148        else {
4149                websWrite(wp,
4150                          "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.txchainmask)</script></div><select name=\"%s\" >\n",
4151                          wl_txantenna);
4152                websWrite(wp,
4153                          "<script type=\"text/javascript\">\n//<![CDATA[\n");
4154                websWrite(wp,
4155                          "document.write(\"<option value=\\\"1\\\" %s >1</option>\");\n",
4156                          nvram_match(wl_txantenna,
4157                                      "1") ? "selected=\\\"selected\\\"" : "");
4158//      websWrite(wp,
4159//                "document.write(\"<option value=\\\"2\\\" %s >2</option>\");\n",
4160//                nvram_match(wl_txantenna,
4161//                            "2") ? "selected=\\\"selected\\\"" : "");
4162                websWrite(wp,
4163                          "document.write(\"<option value=\\\"3\\\" %s >1+2</option>\");\n",
4164                          nvram_match(wl_txantenna,
4165                                      "3") ? "selected=\\\"selected\\\"" : "");
4166//      websWrite(wp,
4167//                "document.write(\"<option value=\\\"4\\\" %s >3</option>\");\n",
4168//                nvram_match(wl_txantenna,
4169//                            "4") ? "selected=\\\"selected\\\"" : "");
4170                websWrite(wp,
4171                          "document.write(\"<option value=\\\"5\\\" %s >1+3</option>\");\n",
4172                          nvram_match(wl_txantenna,
4173                                      "5") ? "selected=\\\"selected\\\"" : "");
4174//      websWrite(wp,
4175//                "document.write(\"<option value=\\\"6\\\" %s >2+3</option>\");\n",
4176//                nvram_match(wl_txantenna,
4177//                            "6") ? "selected=\\\"selected\\\"" : "");
4178                websWrite(wp,
4179                          "document.write(\"<option value=\\\"7\\\" %s >1+2+3</option>\");\n",
4180                          nvram_match(wl_txantenna,
4181                                      "7") ? "selected=\\\"selected\\\"" : "");
4182                websWrite(wp, "//]]>\n</script>\n");
4183                websWrite(wp, "</select>\n");
4184                websWrite(wp, "</div>\n");
4185
4186                websWrite(wp,
4187                          "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.rxchainmask)</script></div><select name=\"%s\" >\n",
4188                          wl_rxantenna);
4189                websWrite(wp,
4190                          "<script type=\"text/javascript\">\n//<![CDATA[\n");
4191                websWrite(wp,
4192                          "document.write(\"<option value=\\\"1\\\" %s >1</option>\");\n",
4193                          nvram_match(wl_rxantenna,
4194                                      "1") ? "selected=\\\"selected\\\"" : "");
4195//      websWrite(wp,
4196//                "document.write(\"<option value=\\\"2\\\" %s >2</option>\");\n",
4197//                nvram_match(wl_rxantenna,
4198//                            "2") ? "selected=\\\"selected\\\"" : "");
4199                websWrite(wp,
4200                          "document.write(\"<option value=\\\"3\\\" %s >1+2</option>\");\n",
4201                          nvram_match(wl_rxantenna,
4202                                      "3") ? "selected=\\\"selected\\\"" : "");
4203//      websWrite(wp,
4204//                "document.write(\"<option value=\\\"4\\\" %s >3</option>\");\n",
4205//                nvram_match(wl_rxantenna,
4206//                            "4") ? "selected=\\\"selected\\\"" : "");
4207                websWrite(wp,
4208                          "document.write(\"<option value=\\\"5\\\" %s >1+3</option>\");\n",
4209                          nvram_match(wl_rxantenna,
4210                                      "5") ? "selected=\\\"selected\\\"" : "");
4211//      websWrite(wp,
4212//                "document.write(\"<option value=\\\"6\\\" %s >2+3</option>\");\n",
4213//                nvram_match(wl_rxantenna,
4214//                            "6") ? "selected=\\\"selected\\\"" : "");
4215                websWrite(wp,
4216                          "document.write(\"<option value=\\\"7\\\" %s >1+2+3</option>\");\n",
4217                          nvram_match(wl_rxantenna,
4218                                      "7") ? "selected=\\\"selected\\\"" : "");
4219                websWrite(wp, "//]]>\n</script>\n");
4220                websWrite(wp, "</select>\n");
4221                websWrite(wp, "</div>\n");
4222
4223        }
4224#endif
4225#endif
4226#endif
4227#ifdef HAVE_MADWIFI
4228        sprintf(wl_isolate, "%s_ap_isolate", prefix);
4229        showRadio(wp, "wl_adv.label11", wl_isolate);
4230
4231#if 0
4232        websWrite(wp, "<div class=\"setting\">\n");
4233        websWrite(wp,
4234                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.sifstime)</script></div>\n");
4235        websWrite(wp,
4236                  "<input class=\"num\" name=\"%s\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,0,99999999,wl_basic.sifstime)\" value=\"%s\" />\n",
4237                  wl_sifstime, nvram_default_get(wl_sifstime, "16"));
4238        websWrite(wp, "</div>\n");
4239
4240        websWrite(wp, "<div class=\"setting\">\n");
4241        websWrite(wp,
4242                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.preambletime)</script></div>\n");
4243        websWrite(wp,
4244                  "<input class=\"num\" name=\"%s\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,0,99999999,wl_basic.preambletime)\" value=\"%s\" />\n",
4245                  wl_preambletime, nvram_default_get(wl_preambletime, "20"));
4246        websWrite(wp, "</div>\n");
4247#endif
4248#ifdef HAVE_MADWIFI_MIMO
4249        if (!is_ar5008(prefix))
4250#endif
4251        {
4252                sprintf(wmm, "%s_wmm", prefix);
4253                showRadio(wp, "wl_adv.label18", wmm);
4254        }
4255#endif
4256
4257        websWrite(wp, "<div class=\"setting\">\n");
4258        websWrite(wp,
4259                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.label3)</script></div><input name=\"%s\" size=\"20\" maxlength=\"32\" onblur=\"valid_name(this,wl_basic.label3)\" value=\"%s\" /></div>\n",
4260                  wl_ssid, nvram_safe_get(wl_ssid));
4261
4262#ifdef HAVE_MADWIFI
4263        showRadio(wp, "wl_basic.radar", wl_doth);
4264        show_chanshift(wp, prefix);
4265#endif
4266#ifdef HAVE_RT2880
4267        if (nvram_match(wl_mode, "ap") || nvram_match(wl_mode, "wdsap")
4268            || nvram_match(wl_mode, "infra") || nvram_match(wl_mode, "apsta")
4269            || nvram_match(wl_mode, "apstawet"))
4270#else
4271        if (nvram_match(wl_mode, "ap") || nvram_match(wl_mode, "wdsap")
4272            || nvram_match(wl_mode, "infra"))
4273#endif
4274        {
4275
4276                if (has_mimo(prefix)
4277                    && (nvram_nmatch("n-only", "%s_net_mode", prefix)
4278                        || nvram_nmatch("ng-only", "%s_net_mode", prefix)
4279                        || nvram_nmatch("mixed", "%s_net_mode", prefix)
4280                        || nvram_nmatch("n2-only", "%s_net_mode", prefix)
4281                        || nvram_nmatch("n5-only", "%s_net_mode", prefix)
4282                        || nvram_nmatch("na-only", "%s_net_mode", prefix))) {
4283                        show_channel(wp, prefix, prefix, 1);
4284
4285                        websWrite(wp, "<div class=\"setting\">\n");
4286                        websWrite(wp,
4287                                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.channel_width)</script></div>\n");
4288                        websWrite(wp, "<select name=\"%s_nbw\">\n", prefix);
4289#ifdef HAVE_RT2880
4290                        websWrite(wp,
4291                                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option value=\\\"20\\\" %s >20 Mhz</option>\");\n//]]>\n</script>\n",
4292                                  nvram_nmatch("20", "%s_nbw",
4293                                               prefix) ?
4294                                  "selected=\\\"selected\\\"" : "");
4295                        websWrite(wp, "<option value=\"40\" %s>40 MHz</option>",
4296                                  nvram_nmatch("40", "%s_nbw",
4297                                               prefix) ?
4298                                  "selected=\\\"selected\\\"" : "");
4299#else
4300                        websWrite(wp,
4301                                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option value=\\\"0\\\" %s >\" + share.auto + \"</option>\");\n//]]>\n</script>\n",
4302                                  nvram_nmatch("0", "%s_nbw",
4303                                               prefix) ?
4304                                  "selected=\\\"selected\\\"" : "");
4305                        websWrite(wp,
4306                                  "<option value=\"10\" %s>10 MHz</option>\n",
4307                                  nvram_nmatch("10", "%s_nbw",
4308                                               prefix) ?
4309                                  "selected=\\\"selected\\\"" : "");
4310                        websWrite(wp,
4311                                  "<option value=\"20\" %s>20 MHz</option>\n",
4312                                  nvram_nmatch("20", "%s_nbw",
4313                                               prefix) ?
4314                                  "selected=\\\"selected\\\"" : "");
4315                        websWrite(wp,
4316                                  "<option value=\"40\" %s>40 MHz</option>\n",
4317                                  nvram_nmatch("40", "%s_nbw",
4318                                               prefix) ?
4319                                  "selected=\\\"selected\\\"" : "");
4320#endif
4321                        websWrite(wp, "</select>\n");
4322                        websWrite(wp, "</div>\n");
4323
4324                        if (nvram_nmatch("40", "%s_nbw", prefix)) {
4325                                websWrite(wp, "<div class=\"setting\">\n");
4326                                websWrite(wp,
4327                                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.channel_wide)</script></div>\n");
4328                                websWrite(wp, "<select name=\"%s_nctrlsb\" >\n",
4329                                          prefix);
4330                                websWrite(wp,
4331                                          "<option value=\"upper\" %s>upper</option>\n",
4332                                          nvram_nmatch("upper", "%s_nctrlsb",
4333                                                       prefix) ?
4334                                          "selected=\\\"selected\\\"" : "");
4335                                websWrite(wp,
4336                                          "<option value=\"lower\" %s>lower</option>\n",
4337                                          nvram_nmatch("lower", "%s_nctrlsb",
4338                                                       prefix) ?
4339                                          "selected=\\\"selected\\\"" : "");
4340                                websWrite(wp, "</select>\n");
4341
4342                                websWrite(wp, "</div>\n");
4343                        }
4344                } else {
4345
4346                        show_channel(wp, prefix, prefix, 0);
4347#ifdef HAVE_MADWIFI_MIMO
4348                        if (is_ar5008(prefix)
4349                            && (nvram_match(wl_width, "40")
4350                                || nvram_match(wl_width, "2040"))) {
4351                                websWrite(wp, "<div class=\"setting\">\n");
4352                                websWrite(wp,
4353                                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.channel_wide)</script></div>\n");
4354                                websWrite(wp, "<select name=\"%s_nctrlsb\" >\n",
4355                                          prefix);
4356                                websWrite(wp,
4357                                          "<option value=\"upper\" %s>upper</option>\n",
4358                                          nvram_nmatch("upper", "%s_nctrlsb",
4359                                                       prefix) ?
4360                                          "selected=\\\"selected\\\"" : "");
4361                                websWrite(wp,
4362                                          "<option value=\"lower\" %s>lower</option>\n",
4363                                          nvram_nmatch("lower", "%s_nctrlsb",
4364                                                       prefix) ?
4365                                          "selected=\\\"selected\\\"" : "");
4366                                websWrite(wp, "</select>\n");
4367
4368                                websWrite(wp, "</div>\n");
4369                        }
4370#endif
4371                }
4372
4373                char wl_closed[16];
4374
4375                sprintf(wl_closed, "%s_closed", prefix);
4376                websWrite(wp, "<div class=\"setting\">\n");
4377                websWrite(wp,
4378                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.label5)</script></div>\n");
4379                websWrite(wp,
4380                          "<input class=\"spaceradio\" type=\"radio\" value=\"0\" name=\"%s\" %s><script type=\"text/javascript\">Capture(share.enable)</script></input>&nbsp;\n",
4381                          wl_closed, nvram_match(wl_closed,
4382                                                 "0") ? "checked=\"checked\"" :
4383                          "");
4384                websWrite(wp,
4385                          "<input class=\"spaceradio\" type=\"radio\" value=\"1\" name=\"%s\" %s><script type=\"text/javascript\">Capture(share.disable)</script></input>\n",
4386                          wl_closed, nvram_match(wl_closed,
4387                                                 "1") ? "checked=\"checked\"" :
4388                          "");
4389                websWrite(wp, "</div>\n");
4390        }
4391#ifdef HAVE_MADWIFI
4392        // if (nvram_match (wl_mode, "sta") || nvram_match (wl_mode, "wdssta")
4393        // || nvram_match (wl_mode, "wet"))
4394        {
4395                char wl_scanlist[32];
4396
4397                sprintf(wl_scanlist, "%s_scanlist", prefix);
4398                websWrite(wp, "<div class=\"setting\">\n");
4399                websWrite(wp,
4400                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.scanlist)</script></div>\n");
4401                websWrite(wp,
4402                          "<input name=\"%s\" size=\"32\" maxlength=\"512\" value=\"%s\" />\n",
4403                          wl_scanlist, nvram_default_get(wl_scanlist,
4404                                                         "default"));
4405                websWrite(wp, "</div>\n");
4406        }
4407#endif
4408
4409        // ACK timing
4410#if defined(HAVE_ACK) || defined(HAVE_MADWIFI)  // temp fix for v24 broadcom
4411        // ACKnot working
4412
4413        sprintf(power, "%s_distance", prefix);
4414        websWrite(wp, "<br />\n");
4415        websWrite(wp, "<div class=\"setting\">\n");
4416        websWrite(wp,
4417                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.label6)</script></div>\n");
4418        websWrite(wp,
4419                  "<input class=\"num\" name=\"%s\" size=\"8\" maxlength=\"8\" onblur=\"valid_range(this,0,99999999,wl_basic.label6)\" value=\"%s\" />\n",
4420                  power, nvram_default_get(power, "2000"));
4421        websWrite(wp,
4422                  "<span class=\"default\"><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"(\" + share.deflt + \": 2000 \" + share.meters + \")\");\n//]]>\n</script></span>\n");
4423        websWrite(wp, "</div>\n");
4424        // end ACK timing
4425#endif
4426#ifdef HAVE_MADWIFI
4427        if (nvram_nmatch("ap", "%s_mode", prefix)
4428            || nvram_nmatch("wdsap", "%s_mode", prefix)
4429            || nvram_nmatch("infra", "%s_mode", prefix)) {
4430                sprintf(power, "%s_maxassoc", prefix);
4431                websWrite(wp, "<div class=\"setting\">\n");
4432                websWrite(wp,
4433                          "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.label10)</script></div>\n");
4434                websWrite(wp,
4435                          "<input class=\"num\" name=\"%s\" size=\"4\" maxlength=\"4\" onblur=\"valid_range(this,0,256,wl_basic.label6)\" value=\"%s\" />\n",
4436                          power, nvram_default_get(power, "256"));
4437                websWrite(wp,
4438                          "<span class=\"default\"><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"(\" + share.deflt + \": 256 \" + status_wireless.legend3 + \")\");\n//]]>\n</script></span>\n");
4439                websWrite(wp, "</div>\n");
4440        }
4441        sprintf(power, "%s_mtikie", prefix);
4442        nvram_default_get(power, "0");
4443        showRadio(wp, "wl_basic.mtikie", power);
4444
4445        showbridgesettings(wp, prefix, 1, 1);
4446#elif HAVE_RT2880
4447        showbridgesettings(wp, "ra0", 1, 1);
4448#else
4449        if (!strcmp(prefix, "wl0"))
4450                showbridgesettings(wp, get_wl_instance_name(0), 1, 1);
4451        if (!strcmp(prefix, "wl1"))
4452                showbridgesettings(wp, get_wl_instance_name(1), 1, 1);
4453#endif
4454        websWrite(wp, "</fieldset>\n");
4455        websWrite(wp, "<br />\n");
4456#ifdef HAVE_REGISTER
4457        if (!iscpe())
4458#endif
4459                show_virtualssid(wp, prefix);
4460}
4461
4462void ej_show_wireless(webs_t wp, int argc, char_t ** argv)
4463{
4464#ifdef HAVE_MADWIFI
4465        int c = getdevicecount();
4466        int i;
4467
4468        for (i = 0; i < c; i++) {
4469                char buf[16];
4470
4471                sprintf(buf, "ath%d", i);
4472                ej_show_wireless_single(wp, buf);
4473        }
4474#else
4475        int c = get_wl_instances();
4476        int i;
4477
4478        for (i = 0; i < c; i++) {
4479                char buf[16];
4480
4481                sprintf(buf, "wl%d", i);
4482                ej_show_wireless_single(wp, buf);
4483        }
4484#endif
4485        return;
4486}
4487
4488void show_preshared(webs_t wp, char *prefix)
4489{
4490        char var[80];
4491
4492        cprintf("show preshared");
4493        sprintf(var, "%s_crypto", prefix);
4494        websWrite(wp, "<div><div class=\"setting\">\n");
4495        websWrite(wp,
4496                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wpa.algorithms)</script></div>\n");
4497        websWrite(wp, "<select name=\"%s_crypto\">\n", prefix);
4498        websWrite(wp, "<option value=\"tkip\" %s>TKIP</option>\n",
4499                  selmatch(var, "tkip", "selected=\"selected\""));
4500        websWrite(wp, "<option value=\"aes\" %s>AES</option>\n",
4501                  selmatch(var, "aes", "selected=\"selected\""));
4502        websWrite(wp, "<option value=\"tkip+aes\" %s>TKIP+AES</option>\n",
4503                  selmatch(var, "tkip+aes", "selected=\"selected\""));
4504        websWrite(wp, "</select>\n");
4505        websWrite(wp, "</div>\n");
4506        websWrite(wp, "<div class=\"setting\">\n");
4507        websWrite(wp,
4508                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wpa.shared_key)</script></div>\n");
4509        sprintf(var, "%s_wpa_psk", prefix);
4510        websWrite(wp,
4511                  "<input type=\"password\" id=\"%s_wpa_psk\" name=\"%s_wpa_psk\" onblur=\"valid_psk_length(this)\" maxlength=\"64\" size=\"32\" value=\"",
4512                  prefix, prefix);
4513        tf_webWriteESCNV(wp, var);
4514        websWrite(wp, "\" />&nbsp;&nbsp;&nbsp;\n");
4515        websWrite(wp,
4516                  "<input type=\"checkbox\" name=\"%s_wl_unmask\" value=\"0\" onclick=\"setElementMask('%s_wpa_psk', this.checked)\" >&nbsp;<script type=\"text/javascript\">Capture(share.unmask)</script></input>\n",
4517                  prefix, prefix);
4518        websWrite(wp, "</div>\n");
4519        websWrite(wp, "<div class=\"setting\">\n");
4520        websWrite(wp,
4521                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wpa.rekey)</script></div>\n");
4522        sprintf(var, "%s_wpa_gtk_rekey", prefix);
4523        websWrite(wp,
4524                  "<input class=\"num\" name=\"%s_wpa_gtk_rekey\" maxlength=\"5\" size=\"5\" onblur=\"valid_range(this,0,99999,wpa.rekey)\" value=\"%s\" />\n",
4525                  prefix, nvram_default_get(var, "3600"));
4526        websWrite(wp,
4527                  "<span class=\"default\"><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"(\" + share.deflt + \": 3600, \" + share.range + \": 1 - 99999)\");\n//]]>\n</script></span>\n");
4528        websWrite(wp, "</div>\n");
4529        websWrite(wp, "</div>\n");
4530}
4531
4532void show_radius(webs_t wp, char *prefix, int showmacformat, int backup)
4533{
4534        char var[80];
4535
4536        cprintf("show radius\n");
4537        if (showmacformat) {
4538                websWrite(wp, "<div class=\"setting\">\n");
4539                websWrite(wp,
4540                          "<div class=\"label\"><script type=\"text/javascript\">Capture(radius.label2)</script></div>\n");
4541                websWrite(wp, "<select name=\"%s_radmactype\">\n", prefix);
4542                websWrite(wp,
4543                          "<option value=\"0\" %s >aabbcc-ddeeff</option>\n",
4544                          nvram_prefix_match("radmactype", prefix,
4545                                             "0") ? "selected" : "");
4546                websWrite(wp, "<option value=\"1\" %s >aabbccddeeff</option>\n",
4547                          nvram_prefix_match("radmactype", prefix,
4548                                             "1") ? "selected" : "");
4549                websWrite(wp,
4550                          "<option value=\"2\" %s >aa:bb:cc:dd:ee:ff</option>\n",
4551                          nvram_prefix_match("radmactype", prefix,
4552                                             "2") ? "selected" : "");
4553                websWrite(wp,
4554                          "<option value=\"3\" %s >aa-bb-cc-dd-ee-ff</option>\n",
4555                          nvram_prefix_match("radmactype", prefix,
4556                                             "3") ? "selected" : "");
4557                websWrite(wp, "</select>\n");
4558                websWrite(wp, "</div>\n");
4559        }
4560        char *rad = nvram_nget("%s_radius_ipaddr", prefix);
4561
4562        websWrite(wp, "<div class=\"setting\">\n");
4563        websWrite(wp,
4564                  "<div class=\"label\"><script type=\"text/javascript\">Capture(radius.label3)</script></div>\n");
4565        websWrite(wp,
4566                  "<input type=\"hidden\" name=\"%s_radius_ipaddr\" value=\"4\" />\n",
4567                  prefix);
4568        websWrite(wp,
4569                  "<input size=\"3\" maxlength=\"3\" name=\"%s_radius_ipaddr_0\" onblur=\"valid_range(this,0,255,radius.label3)\" class=\"num\" value=\"%d\" />.",
4570                  prefix, get_single_ip(rad, 0));
4571        websWrite(wp,
4572                  "<input size=\"3\" maxlength=\"3\" name=\"%s_radius_ipaddr_1\" onblur=\"valid_range(this,0,255,radius.label3)\" class=\"num\" value=\"%d\" />.",
4573                  prefix, get_single_ip(rad, 1));
4574        websWrite(wp,
4575                  "<input size=\"3\" maxlength=\"3\" name=\"%s_radius_ipaddr_2\" onblur=\"valid_range(this,0,255,radius.label3)\" class=\"num\" value=\"%d\" />.",
4576                  prefix, get_single_ip(rad, 2));
4577        websWrite(wp,
4578                  "<input size=\"3\" maxlength=\"3\" name=\"%s_radius_ipaddr_3\" onblur=\"valid_range(this,1,254,radius.label3)\" class=\"num\" value=\"%d\" />\n",
4579                  prefix, get_single_ip(rad, 3));
4580        websWrite(wp, "</div>\n");
4581
4582        websWrite(wp, "<div class=\"setting\">\n");
4583        websWrite(wp,
4584                  "<div class=\"label\"><script type=\"text/javascript\">Capture(radius.label4)</script></div>\n");
4585        sprintf(var, "%s_radius_port", prefix);
4586        websWrite(wp,
4587                  "<input name=\"%s_radius_port\" size=\"3\" maxlength=\"5\" onblur=\"valid_range(this,1,65535,radius.label4)\" value=\"%s\" />\n",
4588                  prefix, nvram_default_get(var, "1812"));
4589        websWrite(wp,
4590                  "<span class=\"default\"><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"(\" + share.deflt + \": 1812)\");\n//]]>\n</script></span>\n</div>\n");
4591        websWrite(wp, "<div class=\"setting\">\n");
4592        websWrite(wp,
4593                  "<div class=\"label\"><script type=\"text/javascript\">Capture(radius.label7)</script></div>\n");
4594        sprintf(var, "%s_radius_key", prefix);
4595        websWrite(wp,
4596                  "<input type=\"password\" id=\"%s_radius_key\" name=\"%s_radius_key\" maxlength=\"79\" size=\"32\" value=\"",
4597                  prefix, prefix);
4598
4599        tf_webWriteESCNV(wp, var);
4600        websWrite(wp, "\" />&nbsp;&nbsp;&nbsp;\n");
4601        websWrite(wp,
4602                  "<input type=\"checkbox\" name=\"%s_radius_unmask\" value=\"0\" onclick=\"setElementMask('%s_radius_key', this.checked)\" >&nbsp;<script type=\"text/javascript\">Capture(share.unmask)</script></input>\n",
4603                  prefix, prefix);
4604
4605        if (backup) {
4606                rad = nvram_nget("%s_radius2_ipaddr", prefix);
4607                websWrite(wp, "<div class=\"setting\">\n");
4608                websWrite(wp,
4609                          "<div class=\"label\"><script type=\"text/javascript\">Capture(radius.label23)</script></div>\n");
4610                websWrite(wp,
4611                          "<input type=\"hidden\" name=\"%s_radius2_ipaddr\" value=\"4\" />\n",
4612                          prefix);
4613                websWrite(wp,
4614                          "<input size=\"3\" maxlength=\"3\" name=\"%s_radius2_ipaddr_0\" onblur=\"valid_range(this,0,255,radius.label23)\" class=\"num\" value=\"%d\" />.",
4615                          prefix, get_single_ip(rad, 0));
4616                websWrite(wp,
4617                          "<input size=\"3\" maxlength=\"3\" name=\"%s_radius2_ipaddr_1\" onblur=\"valid_range(this,0,255,radius.label23)\" class=\"num\" value=\"%d\" />.",
4618                          prefix, get_single_ip(rad, 1));
4619                websWrite(wp,
4620                          "<input size=\"3\" maxlength=\"3\" name=\"%s_radius2_ipaddr_2\" onblur=\"valid_range(this,0,255,radius.label23)\" class=\"num\" value=\"%d\" />.",
4621                          prefix, get_single_ip(rad, 2));
4622                websWrite(wp,
4623                          "<input size=\"3\" maxlength=\"3\" name=\"%s_radius2_ipaddr_3\" onblur=\"valid_range(this,1,254,radius.label23)\" class=\"num\" value=\"%d\" />\n",
4624                          prefix, get_single_ip(rad, 3));
4625                websWrite(wp, "</div>\n");
4626
4627                websWrite(wp, "<div class=\"setting\">\n");
4628                websWrite(wp,
4629                          "<div class=\"label\"><script type=\"text/javascript\">Capture(radius.label24)</script></div>\n");
4630                sprintf(var, "%s_radius2_port", prefix);
4631                websWrite(wp,
4632                          "<input name=\"%s_radius2_port\" size=\"3\" maxlength=\"5\" onblur=\"valid_range(this,1,65535,radius.label24)\" value=\"%s\" />\n",
4633                          prefix, nvram_default_get(var, "1812"));
4634                websWrite(wp,
4635                          "<span class=\"default\"><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"(\" + share.deflt + \": 1812)\");\n//]]>\n</script></span>\n</div>\n");
4636                websWrite(wp, "<div class=\"setting\">\n");
4637                websWrite(wp,
4638                          "<div class=\"label\"><script type=\"text/javascript\">Capture(radius.label27)</script></div>\n");
4639                sprintf(var, "%s_radius2_key", prefix);
4640                websWrite(wp,
4641                          "<input type=\"password\" id=\"%s_radius2_key\" name=\"%s_radius2_key\" maxlength=\"79\" size=\"32\" value=\"",
4642                          prefix, prefix);
4643
4644                tf_webWriteESCNV(wp, var);
4645                websWrite(wp, "\" />&nbsp;&nbsp;&nbsp;\n");
4646        }
4647        websWrite(wp,
4648                  "<input type=\"checkbox\" name=\"%s_radius2_unmask\" value=\"0\" onclick=\"setElementMask('%s_radius2_key', this.checked)\" >&nbsp;<script type=\"text/javascript\">Capture(share.unmask)</script></input>\n",
4649                  prefix, prefix);
4650        websWrite(wp, "</div>\n");
4651#ifdef HAVE_MADWIFI
4652        if (!showmacformat) {
4653                char acct[32];
4654                char vvar[32];
4655
4656                strcpy(vvar, prefix);
4657                rep(vvar, '.', 'X');
4658                sprintf(acct, "%s_acct", var);
4659                websWrite(wp,
4660                          "<div class=\"setting\">\n<div class=\"label\"><script type=\"text/javascript\">Capture(radius.label18)</script></div>\n");
4661                websWrite(wp,
4662                          "<input class=\"spaceradio\" type=\"radio\" value=\"1\" onclick=\"show_layer_ext(this, '%s_idacct', true);\" name=\"%s_acct\" %s><script type=\"text/javascript\">Capture(share.enable)</script></input>\n",
4663                          vvar, prefix, nvram_default_match(acct, "1",
4664                                                            "0") ?
4665                          "checked=\"checked\"" : "");
4666                websWrite(wp,
4667                          "<input class=\"spaceradio\" type=\"radio\" value=\"0\" onclick=\"show_layer_ext(this, '%s_idacct', false);\" name=\"%s_acct\" %s><script type=\"text/javascript\">Capture(share.disable)</script></input>&nbsp;\n",
4668                          vvar, prefix, nvram_default_match(acct, "0",
4669                                                            "0") ?
4670                          "checked=\"checked\"" : "");
4671                websWrite(wp, "</div>\n");
4672                char *rad = nvram_nget("%s_acct_ipaddr", prefix);
4673
4674                websWrite(wp, "<div id=\"%s_idacct\">\n", vvar);
4675                websWrite(wp, "<div class=\"setting\">\n");
4676                websWrite(wp,
4677                          "<div class=\"label\"><script type=\"text/javascript\">Capture(radius.label13)</script></div>\n");
4678                websWrite(wp,
4679                          "<input type=\"hidden\" name=\"%s_acct_ipaddr\" value=\"4\" />\n",
4680                          prefix);
4681                websWrite(wp,
4682                          "<input size=\"3\" maxlength=\"3\" name=\"%s_acct_ipaddr_0\" onblur=\"valid_range(this,0,255,radius.label13)\" class=\"num\" value=\"%d\" />.",
4683                          prefix, get_single_ip(rad, 0));
4684                websWrite(wp,
4685                          "<input size=\"3\" maxlength=\"3\" name=\"%s_acct_ipaddr_1\" onblur=\"valid_range(this,0,255,radius.label13)\" class=\"num\" value=\"%d\" />.",
4686                          prefix, get_single_ip(rad, 1));
4687                websWrite(wp,
4688                          "<input size=\"3\" maxlength=\"3\" name=\"%s_acct_ipaddr_2\" onblur=\"valid_range(this,0,255,radius.label13)\" class=\"num\" value=\"%d\" />.",
4689                          prefix, get_single_ip(rad, 2));
4690                websWrite(wp,
4691                          "<input size=\"3\" maxlength=\"3\" name=\"%s_acct_ipaddr_3\" onblur=\"valid_range(this,1,254,radius.label13)\" class=\"num\" value=\"%d\" />\n",
4692                          prefix, get_single_ip(rad, 3));
4693                websWrite(wp, "</div>\n");
4694
4695                websWrite(wp, "<div class=\"setting\">\n");
4696                websWrite(wp,
4697                          "<div class=\"label\"><script type=\"text/javascript\">Capture(radius.label14)</script></div>\n");
4698                sprintf(var, "%s_acct_port", prefix);
4699                websWrite(wp,
4700                          "<input name=\"%s_acct_port\" size=\"3\" maxlength=\"5\" onblur=\"valid_range(this,1,65535,radius.label14)\" value=\"%s\" />\n",
4701                          prefix, nvram_default_get(var, "1813"));
4702                websWrite(wp,
4703                          "<span class=\"default\"><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"(\" + share.deflt + \": 1812)\");\n//]]>\n</script></span>\n</div>\n");
4704                websWrite(wp, "<div class=\"setting\">\n");
4705                websWrite(wp,
4706                          "<div class=\"label\"><script type=\"text/javascript\">Capture(radius.label17)</script></div>\n");
4707                sprintf(var, "%s_acct_key", prefix);
4708                websWrite(wp,
4709                          "<input type=\"password\" id=\"%s_acct_key\" name=\"%s_acct_key\" maxlength=\"79\" size=\"32\" value=\"",
4710                          prefix, prefix);
4711                tf_webWriteESCNV(wp, var);
4712                websWrite(wp, "\" />&nbsp;&nbsp;&nbsp;\n");
4713                websWrite(wp,
4714                          "<input type=\"checkbox\" name=\"%s_acct_unmask\" value=\"0\" onclick=\"setElementMask('%s_acct_key', this.checked)\" >&nbsp;<script type=\"text/javascript\">Capture(share.unmask)</script></input>\n",
4715                          prefix, prefix);
4716                websWrite(wp, "</div>\n");
4717                websWrite(wp, "</div>\n");
4718                websWrite(wp, "<script>\n//<![CDATA[\n ");
4719                websWrite(wp,
4720                          "show_layer_ext(document.getElementsByName(\"%s_acct\"), \"%s_idacct\", %s);\n",
4721                          prefix, vvar, nvram_match(acct,
4722                                                    "1") ? "true" : "false");
4723                websWrite(wp, "//]]>\n</script>\n");
4724        }
4725#endif
4726}
4727
4728#ifdef HAVE_WPA_SUPPLICANT
4729
4730static void init_80211x_layers(webs_t wp, char *prefix)
4731{
4732        if (nvram_prefix_match("8021xtype", prefix, "tls")) {
4733                websWrite(wp, "enable_idtls(\"%s\");\n", prefix);
4734        }
4735        if (nvram_prefix_match("8021xtype", prefix, "leap")) {
4736                websWrite(wp, "enable_idleap(\"%s\");\n", prefix);
4737        }
4738        if (nvram_prefix_match("8021xtype", prefix, "ttls")) {
4739                websWrite(wp, "enable_idttls(\"%s\");\n", prefix);
4740        }
4741        if (nvram_prefix_match("8021xtype", prefix, "peap")) {
4742                websWrite(wp, "enable_idpeap(\"%s\");\n", prefix);
4743        }
4744}
4745
4746void ej_init_80211x_layers(webs_t wp, int argc, char_t ** argv)
4747{
4748#ifndef HAVE_MADWIFI
4749        int c = get_wl_instances();
4750        int i;
4751
4752        for (i = 0; i < c; i++) {
4753                char buf[16];
4754
4755                sprintf(buf, "wl%d", i);
4756                init_80211x_layers(wp, buf);
4757        }
4758        return;
4759#else
4760        int c = getdevicecount();
4761        int i;
4762
4763        for (i = 0; i < c; i++) {
4764                char buf[16];
4765
4766                sprintf(buf, "ath%d", i);
4767                if (nvram_nmatch("8021X", "%s_security_mode", buf))
4768                        init_80211x_layers(wp, buf);
4769        }
4770        return;
4771#endif
4772
4773}
4774
4775void show_80211X(webs_t wp, char *prefix)
4776{
4777        /*
4778         * fields
4779         * _8021xtype
4780         * _8021xuser
4781         * _8021xpasswd
4782         * _8021xca
4783         * _8021xpem
4784         * _8021xprv
4785         * _8021xaddopt
4786         */
4787        char type[32];
4788
4789        sprintf(type, "%s_8021xtype", prefix);
4790        nvram_default_get(type, "ttls");
4791        websWrite(wp, "<div class=\"setting\">\n");
4792        websWrite(wp,
4793                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.xsuptype)</script></div>\n");
4794        websWrite(wp,
4795                  "<input class=\"spaceradio\" type=\"radio\" name=\"%s_8021xtype\" value=\"peap\" onclick=\"enable_idpeap('%s')\" %s />Peap&nbsp;\n",
4796                  prefix, prefix, nvram_prefix_match("8021xtype", prefix,
4797                                                     "peap") ?
4798                  "checked=\"checked\"" : "");
4799        websWrite(wp,
4800                  "<input class=\"spaceradio\" type=\"radio\" name=\"%s_8021xtype\" value=\"leap\" onclick=\"enable_idleap('%s')\" %s />Leap&nbsp;\n",
4801                  prefix, prefix, nvram_prefix_match("8021xtype", prefix,
4802                                                     "leap") ?
4803                  "checked=\"checked\"" : "");
4804        websWrite(wp,
4805                  "<input class=\"spaceradio\" type=\"radio\" name=\"%s_8021xtype\" value=\"tls\" onclick=\"enable_idtls('%s')\" %s />TLS&nbsp;\n",
4806                  prefix, prefix, nvram_prefix_match("8021xtype", prefix,
4807                                                     "tls") ?
4808                  "checked=\"checked\"" : "");
4809        websWrite(wp,
4810                  "<input class=\"spaceradio\" type=\"radio\" name=\"%s_8021xtype\" value=\"ttls\" onclick=\"enable_idttls('%s')\" %s />TTLS&nbsp;\n",
4811                  prefix, prefix, nvram_prefix_match("8021xtype", prefix,
4812                                                     "ttls") ?
4813                  "checked=\"checked\"" : "");
4814        websWrite(wp, "</div>\n");
4815        // ttls authentication
4816        websWrite(wp, "<div id=\"idttls%s\">\n", prefix);
4817        websWrite(wp, "<div class=\"setting\">\n");
4818        websWrite(wp,
4819                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.user)</script></div>\n");
4820        websWrite(wp,
4821                  "<input name=\"%s_ttls8021xuser\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4822                  prefix, nvram_prefix_get("ttls8021xuser", prefix));
4823
4824        websWrite(wp, "<div class=\"setting\">\n");
4825        websWrite(wp,
4826                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.anon)</script></div>\n");
4827        websWrite(wp,
4828                  "<input name=\"%s_ttls8021xanon\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4829                  prefix, nvram_prefix_get("ttls8021xanon", prefix));
4830
4831        websWrite(wp, "<div class=\"setting\">\n");
4832        websWrite(wp,
4833                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.passwd)</script></div>\n");
4834        websWrite(wp,
4835                  "<input name=\"%s_ttls8021xpasswd\" type=\"password\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4836                  prefix, nvram_prefix_get("ttls8021xpasswd", prefix));
4837
4838        websWrite(wp, "<div class=\"setting\">\n");
4839        websWrite(wp,
4840                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.phase2)</script></div>\n");
4841        websWrite(wp,
4842                  "<input name=\"%s_ttls8021xphase2\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4843                  prefix, nvram_prefix_get("ttls8021xphase2", prefix));
4844
4845        websWrite(wp, "<div class=\"setting\">\n");
4846        websWrite(wp,
4847                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.servercertif)</script></div>\n");
4848        websWrite(wp,
4849                  "<textarea cols=\"60\" rows=\"6\" id=\"%s_ttls8021xca\" name=\"%s_ttls8021xca\"></textarea>\n<script type=\"text/javascript\">\n//<![CDATA[\n ",
4850                  prefix, prefix);
4851        websWrite(wp, "var %s_ttls8021xca = fix_cr( '", prefix);
4852        char namebuf[64];
4853        sprintf(namebuf, "%s_ttls8021xca", prefix);
4854        tf_webWriteESCNV(wp, namebuf);
4855        websWrite(wp, "' );\n");
4856        websWrite(wp,
4857                  "document.getElementById(\"%s_ttls8021xca\").value = %s_ttls8021xca;\n",
4858                  prefix, prefix);
4859        websWrite(wp, "//]]>\n</script>\n");
4860        websWrite(wp, "</div>\n");
4861
4862        websWrite(wp, "<div class=\"setting\">\n");
4863        websWrite(wp,
4864                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.options)</script></div>\n");
4865        websWrite(wp,
4866                  "<textarea cols=\"60\" rows=\"3\" id=\"%s_ttls8021xaddopt\" name=\"%s_ttls8021xaddopt\"></textarea>\n<script type=\"text/javascript\">\n//<![CDATA[\n ",
4867                  prefix, prefix);
4868        websWrite(wp, "var %s_ttls8021xaddopt = fix_cr( '", prefix);
4869        sprintf(namebuf, "%s_ttls8021xaddopt", prefix);
4870        tf_webWriteESCNV(wp, namebuf);
4871        websWrite(wp, "' );\n");
4872        websWrite(wp,
4873                  "document.getElementById(\"%s_ttls8021xaddopt\").value = %s_ttls8021xaddopt;\n",
4874                  prefix, prefix);
4875        websWrite(wp, "//]]>\n</script>\n");
4876        websWrite(wp, "</div>\n");
4877
4878        websWrite(wp, "</div>\n");
4879
4880        // peap authentication
4881        websWrite(wp, "<div id=\"idpeap%s\">\n", prefix);
4882        websWrite(wp, "<div class=\"setting\">\n");
4883        websWrite(wp,
4884                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.user)</script></div>\n");
4885        websWrite(wp,
4886                  "<input name=\"%s_peap8021xuser\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4887                  prefix, nvram_prefix_get("peap8021xuser", prefix));
4888
4889        websWrite(wp, "<div class=\"setting\">\n");
4890        websWrite(wp,
4891                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.anon)</script></div>\n");
4892        websWrite(wp,
4893                  "<input name=\"%s_peap8021xanon\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4894                  prefix, nvram_prefix_get("peap8021xanon", prefix));
4895
4896        websWrite(wp, "<div class=\"setting\">\n");
4897        websWrite(wp,
4898                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.passwd)</script></div>\n");
4899        websWrite(wp,
4900                  "<input name=\"%s_peap8021xpasswd\" type=\"password\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4901                  prefix, nvram_prefix_get("peap8021xpasswd", prefix));
4902
4903        websWrite(wp, "<div class=\"setting\">\n");
4904        websWrite(wp,
4905                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.phase2)</script></div>\n");
4906        websWrite(wp,
4907                  "<input name=\"%s_peap8021xphase2\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4908                  prefix, nvram_prefix_get("peap8021xphase2", prefix));
4909
4910        websWrite(wp, "<div class=\"setting\">\n");
4911        websWrite(wp,
4912                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.servercertif)</script></div>\n");
4913        websWrite(wp,
4914                  "<textarea cols=\"60\" rows=\"6\" id=\"%s_peap8021xca\" name=\"%s_peap8021xca\"></textarea>\n<script type=\"text/javascript\">\n//<![CDATA[\n ",
4915                  prefix, prefix);
4916
4917        websWrite(wp, "var %s_peap8021xca = fix_cr( '", prefix);
4918        sprintf(namebuf, "%s_peap8021xca", prefix);
4919        tf_webWriteESCNV(wp, namebuf);
4920        websWrite(wp, "' );\n");
4921        websWrite(wp,
4922                  "document.getElementById(\"%s_peap8021xca\").value = %s_peap8021xca;\n",
4923                  prefix, prefix);
4924        websWrite(wp, "//]]>\n</script>\n");
4925        websWrite(wp, "</div>\n");
4926
4927        websWrite(wp, "<div class=\"setting\">\n");
4928        websWrite(wp,
4929                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.options)</script></div>\n");
4930        websWrite(wp,
4931                  "<textarea cols=\"60\" rows=\"3\" id=\"%s_peap8021xaddopt\" name=\"%s_peap8021xaddopt\"></textarea>\n<script type=\"text/javascript\">\n//<![CDATA[\n ",
4932                  prefix, prefix);
4933        websWrite(wp, "var %s_peap8021xaddopt = fix_cr( '", prefix);
4934        sprintf(namebuf, "%s_peap8021xaddopt", prefix);
4935        tf_webWriteESCNV(wp, namebuf);
4936        websWrite(wp, "' );\n");
4937        websWrite(wp,
4938                  "document.getElementById(\"%s_peap8021xaddopt\").value = %s_peap8021xaddopt;\n",
4939                  prefix, prefix);
4940        websWrite(wp, "//]]>\n</script>\n");
4941        websWrite(wp, "</div>\n");
4942
4943        websWrite(wp, "</div>\n");
4944        // leap authentication
4945        websWrite(wp, "<div id=\"idleap%s\">\n", prefix);
4946        websWrite(wp, "<div class=\"setting\">\n");
4947        websWrite(wp,
4948                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.user)</script></div>\n");
4949        websWrite(wp,
4950                  "<input name=\"%s_leap8021xuser\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4951                  prefix, nvram_prefix_get("leap8021xuser", prefix));
4952
4953        websWrite(wp, "<div class=\"setting\">\n");
4954        websWrite(wp,
4955                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.anon)</script></div>\n");
4956        websWrite(wp,
4957                  "<input name=\"%s_leap8021xanon\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4958                  prefix, nvram_prefix_get("leap8021xanon", prefix));
4959
4960        websWrite(wp, "<div class=\"setting\">\n");
4961        websWrite(wp,
4962                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.passwd)</script></div>\n");
4963        websWrite(wp,
4964                  "<input name=\"%s_leap8021xpasswd\" type=\"password\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4965                  prefix, nvram_prefix_get("leap8021xpasswd", prefix));
4966
4967        websWrite(wp, "<div class=\"setting\">\n");
4968        websWrite(wp,
4969                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.phase2)</script></div>\n");
4970        websWrite(wp,
4971                  "<input name=\"%s_leap8021xphase2\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4972                  prefix, nvram_prefix_get("leap8021xphase2", prefix));
4973
4974        websWrite(wp, "<div class=\"setting\">\n");
4975        websWrite(wp,
4976                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.options)</script></div>\n");
4977        websWrite(wp,
4978                  "<textarea cols=\"60\" rows=\"3\" id=\"%s_leap8021xaddopt\" name=\"%s_leap8021xaddopt\"></textarea>\n<script type=\"text/javascript\">\n//<![CDATA[\n ",
4979                  prefix, prefix);
4980        websWrite(wp, "var %s_leap8021xaddopt = fix_cr( '", prefix);
4981        sprintf(namebuf, "%s_leap8021xaddopt", prefix);
4982        tf_webWriteESCNV(wp, namebuf);
4983        websWrite(wp, "' );\n");
4984        websWrite(wp,
4985                  "document.getElementById(\"%s_leap8021xaddopt\").value = %s_leap8021xaddopt;\n",
4986                  prefix, prefix);
4987        websWrite(wp, "//]]>\n</script>\n");
4988        websWrite(wp, "</div>\n");
4989
4990        websWrite(wp, "</div>\n");
4991
4992        // tls authentication
4993        websWrite(wp, "<div id=\"idtls%s\">\n", prefix);
4994        websWrite(wp, "<div class=\"setting\">\n");
4995        websWrite(wp,
4996                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.user)</script></div>\n");
4997        websWrite(wp,
4998                  "<input name=\"%s_tls8021xuser\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
4999                  prefix, nvram_prefix_get("tls8021xuser", prefix));
5000
5001        websWrite(wp, "<div class=\"setting\">\n");
5002        websWrite(wp,
5003                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.anon)</script></div>\n");
5004        websWrite(wp,
5005                  "<input name=\"%s_tls8021xanon\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
5006                  prefix, nvram_prefix_get("tls8021xanon", prefix));
5007
5008        websWrite(wp, "<div class=\"setting\">\n");
5009        websWrite(wp,
5010                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.passwd)</script></div>\n");
5011        websWrite(wp,
5012                  "<input name=\"%s_tls8021xpasswd\" type=\"password\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
5013                  prefix, nvram_prefix_get("tls8021xpasswd", prefix));
5014
5015        websWrite(wp, "<div class=\"setting\">\n");
5016        websWrite(wp,
5017                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.phase2)</script></div>\n");
5018        websWrite(wp,
5019                  "<input name=\"%s_tls8021xphase2\" size=\"20\" maxlength=\"79\" value=\"%s\" /></div>\n",
5020                  prefix, nvram_prefix_get("tls8021xphase2", prefix));
5021
5022        websWrite(wp, "<div class=\"setting\">\n");
5023        websWrite(wp,
5024                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.servercertif)</script></div>\n");
5025        websWrite(wp,
5026                  "<textarea cols=\"60\" rows=\"6\" id=\"%s_tls8021xca\" name=\"%s_tls8021xca\"></textarea>\n<script type=\"text/javascript\">\n//<![CDATA[\n ",
5027                  prefix, prefix);
5028        websWrite(wp, "var %s_tls8021xca = fix_cr( '", prefix);
5029        sprintf(namebuf, "%s_tls8021xca", prefix);
5030        tf_webWriteESCNV(wp, namebuf);
5031        websWrite(wp, "' );\n");
5032        websWrite(wp,
5033                  "document.getElementById(\"%s_tls8021xca\").value = %s_tls8021xca;\n",
5034                  prefix, prefix);
5035        websWrite(wp, "//]]>\n</script>\n");
5036        websWrite(wp, "</div>\n");
5037
5038        websWrite(wp, "<div class=\"setting\">\n");
5039        websWrite(wp,
5040                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.clientcertif)</script></div>\n");
5041        websWrite(wp,
5042                  "<textarea cols=\"60\" rows=\"6\" id=\"%s_tls8021xpem\" name=\"%s_tls8021xpem\"></textarea>\n<script type=\"text/javascript\">\n//<![CDATA[\n ",
5043                  prefix, prefix);
5044        websWrite(wp, "var %s_tls8021xpem = fix_cr( '", prefix);
5045        sprintf(namebuf, "%s_tls8021xpem", prefix);
5046        tf_webWriteESCNV(wp, namebuf);
5047        websWrite(wp, "' );\n");
5048        websWrite(wp,
5049                  "document.getElementById(\"%s_tls8021xpem\").value = %s_tls8021xpem;\n",
5050                  prefix, prefix);
5051        websWrite(wp, "//]]>\n</script>\n");
5052        websWrite(wp, "</div>\n");
5053
5054        websWrite(wp, "<div class=\"setting\">\n");
5055        websWrite(wp,
5056                  "<div class=\"label\"><script type=\"text/javascript\">Capture(share.privatekey)</script></div>\n");
5057        websWrite(wp,
5058                  "<textarea cols=\"60\" rows=\"6\" id=\"%s_tls8021xprv\" name=\"%s_tls8021xprv\"></textarea>\n<script type=\"text/javascript\">\n//<![CDATA[\n ",
5059                  prefix, prefix);
5060        websWrite(wp, "var %s_tls8021xprv = fix_cr( '", prefix);
5061        sprintf(namebuf, "%s_tls8021xprv", prefix);
5062        tf_webWriteESCNV(wp, namebuf);
5063        websWrite(wp, "' );\n");
5064        websWrite(wp,
5065                  "document.getElementById(\"%s_tls8021xprv\").value = %s_tls8021xprv;\n",
5066                  prefix, prefix);
5067        websWrite(wp, "//]]>\n</script>\n");
5068        websWrite(wp, "</div>\n");
5069
5070        websWrite(wp, "<div class=\"setting\">\n");
5071        websWrite(wp,
5072                  "<div class=\"label\"><script type=\"text/javascript\">Capture(sec80211x.options)</script></div>\n");
5073        websWrite(wp,
5074                  "<textarea cols=\"60\" rows=\"3\" id=\"%s_tls8021xaddopt\" name=\"%s_tls8021xaddopt\"></textarea>\n<script type=\"text/javascript\">\n//<![CDATA[\n ",
5075                  prefix, prefix);
5076        websWrite(wp, "var %s_tls8021xaddopt = fix_cr( '", prefix);
5077        sprintf(namebuf, "%s_tls8021xaddopt", prefix);
5078        tf_webWriteESCNV(wp, namebuf);
5079        websWrite(wp, "' );\n");
5080        websWrite(wp,
5081                  "document.getElementById(\"%s_tls8021xaddopt\").value = %s_tls8021xaddopt;\n",
5082                  prefix, prefix);
5083        websWrite(wp, "//]]>\n</script>\n");
5084        websWrite(wp, "</div>\n");
5085
5086        websWrite(wp, "</div>\n");
5087        websWrite(wp, "<script>\n//<![CDATA[\n ");
5088        // websWrite
5089        // (wp,"show_layer_ext(document.getElementsByName(\"%s_bridged\"),
5090        // \"%s_idnetvifs\", %s);\n",var, vvar, nvram_match (ssid, "0") ? "true"
5091        // : "false");
5092        char peap[32];
5093
5094        sprintf(peap, "%s_8021xtype", prefix);
5095        websWrite(wp,
5096                  "show_layer_ext(document.wpa.%s_8021xtype, 'idpeap%s', %s);\n",
5097                  prefix, prefix, nvram_match(peap, "peap") ? "true" : "false");
5098        websWrite(wp,
5099                  "show_layer_ext(document.wpa.%s_8021xtype, 'idtls%s', %s);\n",
5100                  prefix, prefix, nvram_match(peap, "tls") ? "true" : "false");
5101        websWrite(wp,
5102                  "show_layer_ext(document.wpa.%s_8021xtype, 'idleap%s', %s);\n",
5103                  prefix, prefix, nvram_match(peap, "leap") ? "true" : "false");
5104        websWrite(wp, "//]]>\n</script>\n");
5105
5106}
5107#endif
5108
5109#ifndef HAVE_WPA_SUPPLICANT
5110void ej_init_80211x_layers(webs_t wp, int argc, char_t ** argv)
5111{
5112        return;
5113}
5114#endif
5115
5116void show_wparadius(webs_t wp, char *prefix)
5117{
5118        char var[80];
5119
5120        websWrite(wp, "<div>\n");
5121        websWrite(wp, "<div class=\"setting\">\n");
5122        websWrite(wp,
5123                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wpa.algorithms)</script></div>\n");
5124        websWrite(wp, "<select name=\"%s_crypto\">\n", prefix);
5125        sprintf(var, "%s_crypto", prefix);
5126        websWrite(wp, "<option value=\"tkip\" %s>TKIP</option>\n",
5127                  selmatch(var, "tkip", "selected=\"selected\""));
5128        websWrite(wp, "<option value=\"aes\" %s>AES</option>\n",
5129                  selmatch(var, "aes", "selected=\"selected\""));
5130        websWrite(wp, "<option value=\"tkip+aes\" %s>TKIP+AES</option>\n",
5131                  selmatch(var, "tkip+aes", "selected=\"selected\""));
5132        websWrite(wp, "</select></div>\n");
5133#ifdef HAVE_MADWIFI
5134        show_radius(wp, prefix, 0, 1);
5135#else
5136        show_radius(wp, prefix, 0, 0);
5137#endif
5138        websWrite(wp, "<div class=\"setting\">\n");
5139        websWrite(wp,
5140                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wpa.rekey)</script></div>\n");
5141        sprintf(var, "%s_wpa_gtk_rekey", prefix);
5142        websWrite(wp,
5143                  "<input name=\"%s_wpa_gtk_rekey\" maxlength=\"5\" size=\"10\" onblur=\"valid_range(this,0,99999,wpa.rekey)\" value=\"%s\" />",
5144                  prefix, nvram_default_get(var, "3600"));
5145        websWrite(wp, "</div>\n");
5146        websWrite(wp, "</div>\n");
5147}
5148
5149void show_wep(webs_t wp, char *prefix)
5150{
5151        char var[80];
5152        char *bit;
5153
5154        cprintf("show wep\n");
5155#ifdef HAVE_MADWIFI
5156        char wl_authmode[16];
5157
5158        sprintf(wl_authmode, "%s_authmode", prefix);
5159        nvram_default_get(wl_authmode, "open");
5160        websWrite(wp, "<div class=\"setting\">\n");
5161        websWrite(wp,
5162                  "<div class=\"label\"><script type=\"text/javascript\">Capture(wl_adv.label)</script></div>\n");
5163        websWrite(wp,
5164                  "<input class=\"spaceradio\" type=\"radio\" value=\"open\" name=\"%s\" %s><script type=\"text/javascript\">Capture(share.openn)</script></input>&nbsp;\n",
5165                  wl_authmode, nvram_match(wl_authmode,
5166                                           "open") ? "checked=\"checked\"" :
5167                  "");
5168        websWrite(wp,
5169                  "<input class=\"spaceradio\" type=\"radio\" value=\"shared\" name=\"%s\" %s><script type=\"text/javascript\">Capture(share.share_key)</script></input>\n",
5170                  wl_authmode, nvram_match(wl_authmode,
5171                                           "shared") ? "checked=\"checked\"" :
5172                  "");
5173        websWrite(wp, "</div>\n");
5174#endif
5175        websWrite(wp,
5176                  "<div><div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(wep.defkey)</script></div>");
5177        websWrite(wp, "<input type=\"hidden\" name=\"%s_WEP_key\" />", prefix);
5178        websWrite(wp,
5179                  "<input type=\"hidden\" name=\"%s_wep\" value=\"restricted\" />",
5180                  prefix);
5181        sprintf(var, "%s_key", prefix);
5182        nvram_default_get(var, "1");
5183        websWrite(wp,
5184                  "<input class=\"spaceradio\" type=\"radio\" value=\"1\" name=\"%s_key\" %s />1&nbsp;\n",
5185                  prefix, selmatch(var, "1", "checked=\"checked\""));
5186        websWrite(wp,
5187                  "<input class=\"spaceradio\" type=\"radio\" value=\"2\" name=\"%s_key\" %s />2&nbsp;\n",
5188                  prefix, selmatch(var, "2", "checked=\"checked\""));
5189        websWrite(wp,
5190                  "<input class=\"spaceradio\" type=\"radio\" value=\"3\" name=\"%s_key\" %s />3&nbsp;\n",
5191                  prefix, selmatch(var, "3", "checked=\"checked\""));
5192        websWrite(wp,
5193                  "<input class=\"spaceradio\" type=\"radio\" value=\"4\" name=\"%s_key\" %s />4&nbsp;\n",
5194                  prefix, selmatch(var, "4", "checked=\"checked\""));
5195        websWrite(wp, "</div>");
5196        websWrite(wp,
5197                  "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(share.encrypt)</script></div>");
5198
5199        sprintf(var, "%s_wep_bit", prefix);
5200        bit = nvram_safe_get(var);
5201
5202        cprintf("bit %s\n", bit);
5203
5204        websWrite(wp,
5205                  "<select name=\"%s_wep_bit\" size=\"1\" onchange=keyMode(this.form)>",
5206                  prefix);
5207        websWrite(wp, "<option value=\"64\" %s >64 bits 10 hex digits</option>",
5208                  selmatch(var, "64", "selected=\"selected\""));
5209        websWrite(wp,
5210                  "<option value=\"128\" %s >128 bits 26 hex digits</option>",
5211                  selmatch(var, "128", "selected=\"selected\""));
5212        websWrite(wp,
5213                  "</select>\n</div>\n<div class=\"setting\">\n<div class=\"label\"><script type=\"text/javascript\">Capture(wep.passphrase)</script></div>\n");
5214        websWrite(wp,
5215                  "<input name=%s_passphrase maxlength=\"16\" size=\"20\" value=\"",
5216                  prefix);
5217
5218        char p_temp[128];
5219        char temp[256];
5220
5221        sprintf(p_temp, "%s", get_wep_value(temp, "passphrase", bit, prefix));
5222        nvram_set("passphrase_temp", p_temp);
5223        tf_webWriteESCNV(wp, "passphrase_temp");
5224        nvram_unset("passphrase_temp");
5225
5226        websWrite(wp, "\" />");
5227        websWrite(wp,
5228                  "<input type=\"hidden\" value=\"Null\" name=\"generateButton\" />\n");
5229        websWrite(wp,
5230                  "<input class=\"button\" type=\"button\" value=\"Generate\" onclick=generateKey(this.form,\"%s\") name=wepGenerate />\n</div>",
5231                  prefix);
5232
5233        char *mlen = "10";
5234        char *mlen2 = "12";
5235
5236        if (!strcmp(bit, "128")) {
5237                mlen = "26";
5238                mlen2 = "30";
5239        }
5240        websWrite(wp,
5241                  "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(share.key)</script> 1</div>\n");
5242        websWrite(wp,
5243                  "<input name=%s_key1 size=\"%s\" maxlength=\"%s\" value=\"%s\" /></div>\n",
5244                  prefix, mlen2, mlen, get_wep_value(temp, "key1", bit,
5245                                                     prefix));
5246        websWrite(wp,
5247                  "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(share.key)</script> 2</div>\n");
5248        websWrite(wp,
5249                  "<input name=%s_key2 size=\"%s\" maxlength=\"%s\" value=\"%s\" /></div>\n",
5250                  prefix, mlen2, mlen, get_wep_value(temp, "key2", bit,
5251                                                     prefix));
5252        websWrite(wp,
5253                  "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(share.key)</script> 3</div>\n");
5254        websWrite(wp,
5255                  "<input name=%s_key3 size=\"%s\" maxlength=\"%s\" value=\"%s\" /></div>\n",
5256                  prefix, mlen2, mlen, get_wep_value(temp, "key3", bit,
5257                                                     prefix));
5258        websWrite(wp,
5259                  "<div class=\"setting\"><div class=\"label\"><script type=\"text/javascript\">Capture(share.key)</script> 4</div>\n");
5260        websWrite(wp,
5261                  "<input name=%s_key4 size=\"%s\" maxlength=\"%s\" value=\"%s\" /></div>\n",
5262                  prefix, mlen2, mlen, get_wep_value(temp, "key4", bit,
5263                                                     prefix));
5264        websWrite(wp, "</div>\n");
5265}
5266
5267void ej_get_wds_mac(webs_t wp, int argc, char_t ** argv)
5268{
5269        int mac = -1, wds_idx = -1, mac_idx = -1;
5270        char *c, wds_var[32] = "";
5271
5272        char *interface;
5273
5274        if (ejArgs(argc, argv, "%d %d %s", &wds_idx, &mac_idx, &interface) < 3) {
5275                websError(wp, 400, "Insufficient args\n");
5276                return;
5277        } else if (wds_idx < 1 || wds_idx > MAX_WDS_DEVS)
5278                return;
5279        else if (mac_idx < 0 || mac_idx > 5)
5280                return;
5281
5282        snprintf(wds_var, 31, "%s_wds%d_hwaddr", interface, wds_idx);
5283
5284        c = nvram_safe_get(wds_var);
5285
5286        if (c) {
5287                mac = get_single_mac(c, mac_idx);
5288                websWrite(wp, "%02X", mac);
5289        } else
5290                websWrite(wp, "00");
5291
5292        return;
5293
5294}
5295
5296void ej_showbridgesettings(webs_t wp, int argc, char_t ** argv)
5297{
5298        char *interface;
5299        int mcast;
5300
5301#ifdef FASTWEB
5302        ejArgs(argc, argv, "%s %d", &interface, &mcast);
5303#else
5304        if (ejArgs(argc, argv, "%s %d", &interface, &mcast) < 2) {
5305                websError(wp, 400, "Insufficient args\n");
5306                return;
5307        }
5308#endif
5309        showbridgesettings(wp, interface, mcast, 0);
5310}
5311
5312void ej_get_wds_ip(webs_t wp, int argc, char_t ** argv)
5313{
5314        int ip = -1, wds_idx = -1, ip_idx = -1;
5315        char *c, wds_var[32] = "";
5316
5317        char *interface;
5318
5319#ifdef FASTWEB
5320        ejArgs(argc, argv, "%d %d %s", &wds_idx, &ip_idx, &interface);
5321#else
5322        if (ejArgs(argc, argv, "%d %d %s", &wds_idx, &ip_idx, &interface) < 3) {
5323                websError(wp, 400, "Insufficient args\n");
5324                return;
5325        }
5326#endif
5327        if (wds_idx < 1 || wds_idx > MAX_WDS_DEVS)
5328                return;
5329        else if (ip_idx < 0 || ip_idx > 3)
5330                return;
5331
5332        snprintf(wds_var, 31, "%s_wds%d_ipaddr", interface, wds_idx);
5333
5334        c = nvram_safe_get(wds_var);
5335
5336        if (c) {
5337                ip = get_single_ip(c, ip_idx);
5338                websWrite(wp, "%d", ip);
5339        } else
5340                websWrite(wp, "0");
5341
5342        return;
5343
5344}
5345
5346void ej_get_wds_netmask(webs_t wp, int argc, char_t ** argv)
5347{
5348        int nm = -1, wds_idx = -1, nm_idx = -1;
5349        char *c, wds_var[32] = "";
5350
5351        char *interface;
5352
5353#ifdef FASTWEB
5354        ejArgs(argc, argv, "%d %d %s", &wds_idx, &nm_idx, &interface);
5355#else
5356        if (ejArgs(argc, argv, "%d %d %s", &wds_idx, &nm_idx, &interface) < 3) {
5357                websError(wp, 400, "Insufficient args\n");
5358                return;
5359        }
5360#endif
5361
5362        if (wds_idx < 1 || wds_idx > 6)
5363                return;
5364        else if (nm_idx < 0 || nm_idx > 3)
5365                return;
5366
5367        snprintf(wds_var, 31, "%s_wds%d_netmask", interface, wds_idx);
5368
5369        c = nvram_safe_get(wds_var);
5370
5371        if (c) {
5372                nm = get_single_ip(c, nm_idx);
5373                websWrite(wp, "%d", nm);
5374        } else
5375                websWrite(wp, "255");
5376
5377        return;
5378
5379}
5380
5381void ej_get_wds_gw(webs_t wp, int argc, char_t ** argv)
5382{
5383        int gw = -1, wds_idx = -1, gw_idx = -1;
5384        char *c, wds_var[32] = "";
5385
5386        char *interface;
5387
5388#ifdef FASTWEB
5389        ejArgs(argc, argv, "%d %d %s", &wds_idx, &gw_idx, &interface);
5390#else
5391        if (ejArgs(argc, argv, "%d %d %s", &wds_idx, &gw_idx, &interface) < 3) {
5392                websError(wp, 400, "Insufficient args\n");
5393                return;
5394        }
5395#endif
5396
5397        if (wds_idx < 1 || wds_idx > MAX_WDS_DEVS)
5398                return;
5399        else if (gw_idx < 0 || gw_idx > 3)
5400                return;
5401
5402        snprintf(wds_var, 31, "%s_wds%d_gw", interface, wds_idx);
5403
5404        c = nvram_safe_get(wds_var);
5405
5406        if (c) {
5407                gw = get_single_ip(c, gw_idx);
5408                websWrite(wp, "%d", gw);
5409        } else
5410                websWrite(wp, "0");
5411
5412        return;
5413
5414}
5415
5416void ej_get_br1_ip(webs_t wp, int argc, char_t ** argv)
5417{
5418        int ip = -1, ip_idx = -1;
5419        char *c;
5420
5421        char *interface;
5422
5423#ifdef FASTWEB
5424        ejArgs(argc, argv, "%d %s", &ip_idx, &interface);
5425#else
5426        if (ejArgs(argc, argv, "%d %s", &ip_idx, &interface) < 2) {
5427                websError(wp, 400, "Insufficient args\n");
5428                return;
5429        }
5430#endif
5431        if (ip_idx < 0 || ip_idx > 3)
5432                return;
5433        char br1[32];
5434
5435        sprintf(br1, "%s_br1_ipaddr", interface);
5436        c = nvram_safe_get(br1);
5437
5438        if (c) {
5439                ip = get_single_ip(c, ip_idx);
5440                websWrite(wp, "%d", ip);
5441        } else
5442                websWrite(wp, "0");
5443
5444        return;
5445
5446}
5447
5448void ej_get_br1_netmask(webs_t wp, int argc, char_t ** argv)
5449{
5450        int nm = -1, nm_idx = -1;
5451        char *c;
5452
5453        char *interface;
5454
5455#ifdef FASTWEB
5456        ejArgs(argc, argv, "%d %s", &nm_idx, &interface);
5457#else
5458        if (ejArgs(argc, argv, "%d %s", &nm_idx, &interface) < 2) {
5459                websError(wp, 400, "Insufficient args\n");
5460                return;
5461        }
5462#endif
5463        if (nm_idx < 0 || nm_idx > 3)
5464                return;
5465        char nms[32];
5466
5467        sprintf(nms, "%s_br1_netmask", interface);
5468        c = nvram_safe_get(nms);
5469
5470        if (c) {
5471                nm = get_single_ip(c, nm_idx);
5472                websWrite(wp, "%d", nm);
5473        } else
5474                websWrite(wp, "255");
5475
5476        return;
5477
5478}
5479
5480void ej_get_uptime(webs_t wp, int argc, char_t ** argv)
5481{
5482        char line[256];
5483        FILE *fp;
5484
5485        if ((fp = popen("uptime", "r"))) {
5486                fgets(line, sizeof(line), fp);
5487                line[strlen(line) - 1] = '\0';  // replace new line with null
5488                websWrite(wp, "%s", line);
5489                pclose(fp);
5490        }
5491        return;
5492}
5493
5494void ej_get_wan_uptime(webs_t wp, int argc, char_t ** argv)
5495{
5496        float sys_uptime;
5497        float uptime;
5498        int days, minutes;
5499        FILE *fp, *fp2;
5500
5501        if (nvram_match("wan_proto", "disabled"))
5502                return;
5503        if (nvram_match("wan_ipaddr", "0.0.0.0")) {
5504                websWrite(wp, "%s", live_translate("status_router.notavail"));
5505                return;
5506        }
5507        if (!(fp = fopen("/tmp/.wanuptime", "r"))) {
5508                websWrite(wp, "%s", live_translate("status_router.notavail"));
5509                return;
5510        }
5511        if (!feof(fp) && fscanf(fp, "%f", &uptime) == 1) {
5512                fp2 = fopen("/proc/uptime", "r");
5513                fscanf(fp2, "%f", &sys_uptime);
5514                fclose(fp2);
5515                uptime = sys_uptime - uptime;
5516                days = (int)uptime / (60 * 60 * 24);
5517                if (days)
5518                        websWrite(wp, "%d day%s, ", days,
5519                                  (days == 1 ? "" : "s"));
5520                minutes = (int)uptime / 60;
5521                websWrite(wp, "%d:%02d:%02d", (minutes / 60) % 24, minutes % 60,
5522                          (int)uptime % 60);
5523        }
5524        fclose(fp);
5525
5526        return;
5527
5528}
5529
5530void ej_get_wdsp2p(webs_t wp, int argc, char_t ** argv)
5531{
5532        int index = -1, ip[4] = { 0, 0, 0, 0 }, netmask[4] = {
5533        0, 0, 0, 0};
5534        char nvramvar[32] = { 0 };
5535        char *interface;
5536
5537#ifdef FASTWEB
5538        ejArgs(argc, argv, "%d %s", &index, &interface);
5539#else
5540        if (ejArgs(argc, argv, "%d %s", &index, &interface) < 2) {
5541                websError(wp, 400, "Insufficient args\n");
5542                return;
5543        }
5544#endif
5545        char wlwds[32];
5546
5547        sprintf(wlwds, "%s_wds1_enable", interface);
5548        if (nvram_selmatch(wp, "wk_mode", "ospf") &&
5549            nvram_selmatch(wp, "expert_mode", "1") &&
5550            nvram_selmatch(wp, wlwds, "1")) {
5551                char buf[16];
5552
5553                sprintf(buf, "%s_wds%d_ospf", interface, index);
5554                websWrite(wp,
5555                          "<input name=\"%s\" size=\"2\" maxlength=\"5\" value=\"%s\" />\n",
5556                          buf, nvram_safe_get(buf));
5557        }
5558
5559        snprintf(nvramvar, 31, "%s_wds%d_ipaddr", interface, index);
5560        sscanf(nvram_safe_get(nvramvar), "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2],
5561               &ip[3]);
5562        snprintf(nvramvar, 31, "%s_wds%d_netmask", interface, index);
5563        sscanf(nvram_safe_get(nvramvar), "%d.%d.%d.%d", &netmask[0],
5564               &netmask[1], &netmask[2], &netmask[3]);
5565        snprintf(nvramvar, 31, "%s_wds%d_enable", interface, index);
5566
5567        // set netmask to a suggested default if blank
5568        if (netmask[0] == 0 &&
5569            netmask[1] == 0 && netmask[2] == 0 && netmask[3] == 0) {
5570                netmask[0] = 255;
5571                netmask[1] = 255;
5572                netmask[2] = 255;
5573                netmask[3] = 252;
5574        }
5575
5576        if (nvram_match(nvramvar, "1")) {
5577                websWrite(wp, "\
5578        <div class=\"setting\">\n\
5579                  <input type=\"hidden\" name=\"%s_wds%d_ipaddr\" value=\"4\">\n\
5580                  <div class=\"label\"><script type=\"text/javascript\">Capture(share.ip)</script></div>\n\
5581                  <input size=\"3\" maxlength=\"3\" name=\"%s_wds%d_ipaddr0\" value=\"%d\" onblur=\"valid_range(this,0,255,'IP')\" class=\"num\">.<input size=\"3\" maxlength=\"3\" name=\"%s_wds%d_ipaddr1\" value=\"%d\" onblur=\"valid_range(this,0,255,'IP')\" class=\"num\">.<input size=\"3\" maxlength=\"3\" name=\"%s_wds%d_ipaddr2\" value=\"%d\" onblur=\"valid_range(this,0,255,'IP')\" class=\"num\">.<input size=\"3\" maxlength=\"3\" name=\"%s_wds%d_ipaddr3\" value=\"%d\" onblur=\"valid_range(this,1,254,'IP')\" class=\"num\">\n\
5582       </div>\n", interface, index, interface, index, ip[0], interface, index, ip[1], interface, index, ip[2], interface, index, ip[3]);
5583
5584                websWrite(wp, "\
5585          <div class=\"setting\">\n\
5586          <div class=\"label\"><script type=\"text/javascript\">Capture(share.subnet)</script></div>\n\
5587          <input type=\"hidden\" name=\"%s_wds%d_netmask\" value=\"4\">\n\
5588          <input name=\"%s_wds%d_netmask0\" value=\"%d\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,0,255,'IP')\" class=num>.<input name=\"%s_wds%d_netmask1\" value=\"%d\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,0,255,'IP')\" class=num>.<input name=\"%s_wds%d_netmask2\" value=\"%d\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,0,255,'IP')\" class=num>.<input name=\"%s_wds%d_netmask3\" value=\"%d\" size=\"3\" maxlength=\"3\" onblur=\"valid_range(this,0,255,'IP')\" class=num>\n\
5589          </div>\n", interface, index, interface, index, netmask[0], interface, index, netmask[1], interface, index, netmask[2], interface, index, netmask[3]);
5590
5591        }
5592
5593        return;
5594
5595}
5596
5597/*
5598 * void ej_get_services_options (webs_t wp, int argc, char_t ** argv) { char
5599 * word[1024], *next, *services; char delim[] = "<&nbsp;>";
5600 *
5601 * //services = nvram_safe_get("filter_services"); services =
5602 * get_filter_services ();
5603 *
5604 * split (word, services, next, delim) { int len = 0; char *name, *prot,
5605 * *port; char protocol[100], ports[100]; int from = 0, to = 0; //int proto;
5606 *
5607 * if ((name = strstr (word, "$NAME:")) == NULL || (prot = strstr (word,
5608 * "$PROT:")) == NULL || (port = strstr (word, "$PORT:")) == NULL) continue;
5609 *
5610 * // $NAME if (sscanf (name, "$NAME:%3d:", &len) != 1) continue;
5611 *
5612 * strncpy (name, name + sizeof ("$NAME:nnn:") - 1, len); name[len] = '\0';
5613 *
5614 * // $PROT if (sscanf (prot, "$PROT:%3d:", &len) != 1) continue;
5615 *
5616 * strncpy (protocol, prot + sizeof ("$PROT:nnn:") - 1, len); protocol[len] =
5617 * '\0';
5618 *
5619 * // $PORT if (sscanf (port, "$PORT:%3d:", &len) != 1) continue;
5620 *
5621 * strncpy (ports, port + sizeof ("$PORT:nnn:") - 1, len); ports[len] = '\0';
5622 *
5623 * if (sscanf (ports, "%d:%d", &from, &to) != 2) continue;
5624 *
5625 * //cprintf("match:: name=%s, protocol=%s, ports=%s\n", // word, protocol,
5626 * ports);
5627 *
5628 * websWrite (wp, "<option value=\"%s\">%s</option>", name, name);
5629 *
5630 * }
5631 *
5632 * return; }
5633 */
5634
5635void ej_get_clone_wmac(webs_t wp, int argc, char_t ** argv)
5636{
5637#ifdef HAVE_RB500
5638        return 0;
5639#else
5640
5641        char *c;
5642        int mac, which;
5643        int dofree = 0;
5644
5645#ifdef FASTWEB
5646        ejArgs(argc, argv, "%d", &which);
5647#else
5648        if (ejArgs(argc, argv, "%d", &which) < 1) {
5649                websError(wp, 400, "Insufficient args\n");
5650                return;
5651        }
5652#endif
5653
5654        if (nvram_match("def_whwaddr", "00:00:00:00:00:00")) {
5655                // if (strlen (nvram_safe_get ("il0macaddr")) == 0)
5656                // {
5657                // if (nvram_match ("port_swap", "1"))
5658                // c = strdup (nvram_safe_get ("et1macaddr"));
5659                // else
5660                // c = strdup (nvram_safe_get ("et0macaddr"));
5661                // MAC_ADD (c);
5662                // }
5663                // else
5664                // {
5665                // c = strdup (nvram_safe_get ("il0macaddr"));
5666                // }
5667                // dofree = 1;
5668
5669                if (nvram_match("port_swap", "1")) {
5670                        if (strlen(nvram_safe_get("et1macaddr")) != 0)  // safe:
5671                                // maybe
5672                                // et1macaddr
5673                                // not there?
5674                        {
5675                                c = strdup(nvram_safe_get("et1macaddr"));
5676                        } else {
5677                                c = strdup(nvram_safe_get("et0macaddr"));
5678                                MAC_ADD(c);     // et0macaddr +3
5679                        }
5680                } else {
5681                        c = strdup(nvram_safe_get("et0macaddr"));
5682                }
5683
5684                dofree = 1;
5685                if (c) {
5686                        MAC_ADD(c);
5687                        MAC_ADD(c);
5688                }
5689
5690        } else
5691                c = nvram_safe_get("def_whwaddr");
5692
5693        if (c) {
5694                mac = get_single_mac(c, which);
5695                websWrite(wp, "%02X", mac);
5696                if (dofree)
5697                        free(c);
5698        } else
5699                websWrite(wp, "00");
5700
5701        return;
5702#endif
5703}
5704
5705/*
5706 * todo stylesheet compatible code
5707 */
5708/*
5709 * lonewolf additions
5710 */
5711
5712// Note that there is no VLAN #16.  It's just a convieniant way of denoting a
5713// "Tagged" port
5714void ej_port_vlan_table(webs_t wp, int argc, char_t ** argv)
5715{
5716        /*
5717         * vlans[x][y] where x 0-15 are VLANS x 16 is tagging, 17 is
5718         * auto-negotiation, 18 is 100/10 Mbit, and 19 is Full/Half duplex y 0-4
5719         * are switch ports (port 5 is set automaticly) y 5 it the bridge device
5720         * (x 16 dosn't apply)
5721         */
5722
5723        int i, j, vlans[21][6], tmp, wl_br;
5724        char *c, *next, buff[32], portvlan[32];
5725
5726        for (i = 0; i < 21; i++)
5727                for (j = 0; j < 6; j++)
5728                        vlans[i][j] = -1;
5729
5730        wl_br = -1;
5731
5732        for (i = 0; i < 8; i++) {
5733                if (i < 5)
5734                        snprintf(buff, 31, "port%dvlans", i);
5735                else if (i == 5)
5736                        snprintf(buff, 31, "%s", "lan_ifnames");
5737                else
5738                        snprintf(buff, 31, "ub%d_ifnames", i - 5);
5739
5740                c = nvram_safe_get(buff);
5741
5742                if (c) {
5743                        foreach(portvlan, c, next) {
5744                                if (portvlan[0] == 'e' && portvlan[1] == 't'
5745                                    && portvlan[2] == 'h' && portvlan[3] == '1')
5746                                        wl_br = i - 5;
5747                                if (ISDIGIT(portvlan, 1)
5748                                    || (portvlan[0] == 'v' && portvlan[1] == 'l'
5749                                        && portvlan[2] == 'a'
5750                                        && portvlan[3] == 'n')) {
5751                                        if (ISDIGIT(portvlan, 1))
5752                                                tmp = atoi(portvlan);
5753                                        else {
5754                                                portvlan[0] = portvlan[4];
5755                                                portvlan[1] = portvlan[5];
5756                                                portvlan[2] = '\0';
5757                                                if (ISDIGIT(portvlan, 1))
5758                                                        tmp = atoi(portvlan);
5759                                                else
5760                                                        continue;
5761                                        }
5762
5763                                        if (i < 5) {
5764                                                vlans[tmp][i] = 1;
5765                                        } else {
5766                                                vlans[tmp][5] = i - 5;
5767                                        }
5768                                }
5769                        }
5770                }
5771        }
5772
5773        for (i = 0; i < 21; i++) {
5774                websWrite(wp, "              <tr>\n");
5775                websWrite(wp, "<td>");
5776
5777                switch (i) {
5778                case 16:
5779                        websWrite(wp,
5780                                  "<script type=\"text/javascript\">Capture(vlan.tagged)</script>");
5781                        break;
5782                case 17:
5783                        websWrite(wp,
5784                                  "<script type=\"text/javascript\">Capture(vlan.negociate)</script>");
5785                        break;
5786                case 18:
5787                        websWrite(wp, "100 Mbit");
5788                        break;
5789                case 19:
5790                        websWrite(wp, "Full-Duplex");
5791                        break;
5792                case 20:
5793                        websWrite(wp, "Enabled");
5794                        break;
5795                default:
5796                        snprintf(buff, 31, "%d", i);
5797                        websWrite(wp, buff);
5798                        break;
5799                }
5800
5801                websWrite(wp, "</td>\n");
5802
5803                for (j = 0; j < 5; j++) {
5804                        snprintf(buff, 31, "\"port%dvlan%d\"", j, i);
5805                        websWrite(wp, "<td");
5806
5807                        if (j % 2 == 0)
5808                                websWrite(wp, " bgcolor=\"#CCCCCC\"");
5809
5810                        websWrite(wp,
5811                                  " height=\"20\"><div align=\"center\"><input type=\"checkbox\" value=\"on\" name=");
5812                        websWrite(wp, buff);
5813
5814                        if (i < 17 || i > 20) {
5815                                if (vlans[i][j] == 1)
5816                                        websWrite(wp, " checked=\"checked\"");
5817                        } else {
5818                                if (vlans[i][j] == -1)
5819                                        websWrite(wp, " checked=\"checked\"");
5820                        }
5821
5822                        if (i < 17) {
5823                                websWrite(wp, " onclick=");
5824                                snprintf(buff, sizeof(buff),
5825                                         "\"SelVLAN(this.form,'port%d')\"", j);
5826                                websWrite(wp, buff);
5827                        } else if (i == 17 || i == 20) {
5828                                websWrite(wp, " onclick=");
5829                                snprintf(buff, sizeof(buff),
5830                                         "\"SelSpeed(this.form,'port%d')\"", j);
5831                                websWrite(wp, buff);
5832                        }
5833                        websWrite(wp, " /></div></td>\n");
5834                }
5835
5836                if (i < 16) {
5837                        websWrite(wp, "                 <td><select name=");
5838                        snprintf(buff, 31, "\"vlan%d\"", i);
5839                        websWrite(wp, buff);
5840                        websWrite(wp,
5841                                  "><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option value=\\\"-1\\\"");
5842                        if (vlans[i][5] < 0)
5843                                websWrite(wp, " selected=\\\"selected\\\"");
5844                        websWrite(wp,
5845                                  ">\" + share.none + \"</option>\");\n//]]>\n</script><option value=\"0\"");
5846                        if (vlans[i][5] == 0)
5847                                websWrite(wp, " selected=\"selected\"");
5848                        websWrite(wp, ">LAN</option></select></td>\n");
5849                } else {
5850                        websWrite(wp, "<td>&nbsp;</td>\n");
5851                }
5852
5853                websWrite(wp, "</tr>\n");
5854
5855                if (i == 16 || i == 20) {
5856                        websWrite(wp, "<tr><td>&nbsp;</td></tr>\n");
5857                }
5858        }
5859
5860        websWrite(wp, "<tr>\n");
5861        websWrite(wp,
5862                  "<td><script type=\"text/javascript\">Capture(share.wireless)</script></td>\n");
5863
5864        websWrite(wp,
5865                  "<td colspan=\"6\"><select name=\"wireless\"><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option value=\\\"-1\\\"");
5866        if (wl_br < 0)
5867                websWrite(wp, " selected=\\\"selected\\\"");
5868        websWrite(wp,
5869                  ">\" + share.none + \"</option>\");\n//]]>\n</script><option value=\"0\"");
5870        if (wl_br == 0)
5871                websWrite(wp, " selected=\"selected\"");
5872        websWrite(wp, ">LAN</option></select></td>\n");
5873        websWrite(wp, "</tr>\n");
5874
5875        websWrite(wp, "<tr><td>&nbsp;</td></tr>\n");
5876
5877        websWrite(wp, "<tr>\n");
5878        websWrite(wp,
5879                  "<td><script type=\"text/javascript\">Capture(vlan.aggregation)</script></td>\n");
5880
5881        websWrite(wp,
5882                  "<td colspan=\"6\"><select name=\"trunking\"><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option value=\\\"0\\\">\" + share.no + \"</option>\");\n//]]>\n</script><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option value=\\\"1\\\"");
5883
5884        c = nvram_safe_get("trunking");
5885
5886        snprintf(buff, 5, "%s", c);
5887
5888        if (atoi(buff) == 1)
5889                websWrite(wp, " selected=\\\"selected\\\"");
5890
5891        websWrite(wp,
5892                  ">\" + vlan.trunk + \"</option>\");\n//]]>\n</script></select></td>\n");
5893        websWrite(wp, "              </tr>");
5894
5895        return;
5896}
5897
5898/*
5899 * Note: VLAN #16 designates tagging.  There is no VLAN #16 (only 0-15)
5900 */
5901
5902void ej_get_qossvcs(webs_t wp, int argc, char_t ** argv)
5903{
5904        char *qos_svcs = nvram_safe_get("svqos_svcs");
5905        char name[32], type[32], data[32], level[32];
5906        int no_svcs = 0, i = 0;
5907
5908        // calc # of services
5909        // no_svcs = strspn(qos_svcs,"|");
5910
5911        while ((qos_svcs = strpbrk(qos_svcs, "|"))) {
5912                no_svcs++;
5913                qos_svcs++;
5914        }
5915
5916        // write HTML data
5917
5918        websWrite(wp,
5919                  "<tr><td colspan=\"3\"><input type=\"hidden\" name=\"svqos_nosvcs\" value=\"%d\" /></td></tr>",
5920                  no_svcs);
5921
5922        qos_svcs = nvram_safe_get("svqos_svcs");
5923
5924        /*
5925         * services format is "name type data level | name type data level |"
5926         * ..etc
5927         */
5928        for (i = 0; i < no_svcs && qos_svcs && qos_svcs[0]; i++) {
5929                if (sscanf
5930                    (qos_svcs, "%31s %31s %31s %31s ", name, type, data,
5931                     level) < 4)
5932                        break;
5933
5934                websWrite(wp, "<tr>\n\
5935                                        <td>\n\
5936                                                <input type=\"checkbox\" name=\"svqos_svcdel%d\" />\n\
5937                                                <input type=\"hidden\" name=\"svqos_svcname%d\" value=\"%s\" />\n\
5938                                                <input type=\"hidden\" name=\"svqos_svctype%d\" value=\"%s\" />\n\
5939                                        </td>\n\
5940                                        <td><em>%s</em></td>\n\
5941                                        <td >\n", i, i, name, i, type, name);
5942                websWrite(wp, "<select name=\"svqos_svcprio%d\"> \n\
5943                                                        <script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option value=\\\"100\\\" %s >\" + qos.prio_x + \"</option>\");\n\
5944                                                        document.write(\"<option value=\\\"10\\\" %s >\" + qos.prio_p + \"</option>\");\n\
5945                                                        document.write(\"<option value=\\\"20\\\" %s >\" + qos.prio_e + \"</option>\");\n\
5946                                                        document.write(\"<option value=\\\"30\\\" %s >\" + share.standard + \"</option>\");\n\
5947                                                        document.write(\"<option value=\\\"40\\\" %s >\" + qos.prio_b + \"</option>\");\n//]]>\n</script>\n\
5948                                                </select>\n\
5949                           </td>\n\
5950                                </tr>\n", i, strcmp(level, "100") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "10") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "20") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "30") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "40") == 0 ? "selected=\\\"selected\\\"" : "");
5951
5952                qos_svcs = strpbrk(++qos_svcs, "|");
5953                qos_svcs++;
5954
5955        }
5956
5957        return;
5958}
5959
5960#ifndef HAVE_AQOS
5961void ej_get_qosips(webs_t wp, int argc, char_t ** argv)
5962{
5963        char *qos_ips = nvram_safe_get("svqos_ips");
5964        char ip[32], level[32];
5965        int no_ips = 0, i = 0;
5966
5967        // calc # of ips
5968        while ((qos_ips = strpbrk(qos_ips, "|"))) {
5969                no_ips++;
5970                qos_ips++;
5971        }
5972        websWrite(wp, "<tr>\n\
5973                                        <th><script type=\"text/javascript\">Capture(share.del)</script></th>\n\
5974                                        <th><script type=\"text/javascript\">Capture(qos.ipmask)</script></th>\n\
5975                                        <th><script type=\"text/javascript\">Capture(share.priority)</script></th>\n\
5976                                </tr>\n");
5977
5978        // write HTML data
5979
5980        websWrite(wp,
5981                  "<tr><td colspan=\"3\"><input type=\"hidden\" name=\"svqos_noips\" value=\"%d\" /></td></tr>",
5982                  no_ips);
5983
5984        qos_ips = nvram_safe_get("svqos_ips");
5985
5986        /*
5987         * IP format is "data level | data level |" ..etc
5988         */
5989        for (i = 0; i < no_ips && qos_ips && qos_ips[0]; i++) {
5990                if (sscanf(qos_ips, "%31s %31s ", ip, level) < 2)
5991                        break;
5992
5993                websWrite(wp, "<tr>\n\
5994                                        <td>\n\
5995                                                <input type=\"checkbox\" name=\"svqos_ipdel%d\" />\n\
5996                                                <input type=\"hidden\" name=\"svqos_ip%d\" value=\"%s\" />\n\
5997                                        </td>\n\
5998                                        <td><em>%s</em></td>\n\
5999                                        <td>\n", i, i, ip, ip);
6000                websWrite(wp, "<select name=\"svqos_ipprio%d\"> \n\
6001                                                        <script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option value=\\\"100\\\" %s >\" + qos.prio_x + \"</option>\");\n\
6002                                                        document.write(\"<option value=\\\"10\\\" %s >\" + qos.prio_p + \"</option>\");\n\
6003                                                        document.write(\"<option value=\\\"20\\\" %s >\" + qos.prio_e + \"</option>\");\n\
6004                                                        document.write(\"<option value=\\\"30\\\" %s >\" + share.standard + \"</option>\");\n\
6005                                                        document.write(\"<option value=\\\"40\\\" %s >\" + qos.prio_b + \"</option>\");\n//]]>\n</script>\n\
6006                                                </select>\n\
6007                                        </td>\n\
6008                                </tr>\n", i, strcmp(level, "100") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "10") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "20") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "30") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "40") == 0 ? "selected=\\\"selected\\\"" : "");
6009
6010                qos_ips = strpbrk(++qos_ips, "|");
6011                qos_ips++;
6012
6013        }
6014
6015        return;
6016}
6017#else
6018void ej_get_qosips(webs_t wp, int argc, char_t ** argv)
6019{
6020        char *qos_ips = nvram_safe_get("svqos_ips");
6021        char ip[32], level[32], level2[32];
6022        int no_ips = 0, i = 0;
6023
6024        // calc # of ips
6025        while ((qos_ips = strpbrk(qos_ips, "|"))) {
6026                no_ips++;
6027                qos_ips++;
6028        }
6029        websWrite(wp, "<tr>\n\
6030                                        <th><script type=\"text/javascript\">Capture(share.del)</script></th>\n\
6031                                        <th><script type=\"text/javascript\">Capture(qos.ipmask)</script></th>\n\
6032                                        <th><script type=\"text/javascript\">Capture(qos.maxuprate_b)</script></th>\n\
6033                                        <th><script type=\"text/javascript\">Capture(qos.maxdownrate_b)</script></th>\n\
6034                                </tr>\n");
6035
6036        // write HTML data
6037
6038        websWrite(wp,
6039                  "<tr><td colspan=\"3\"><input type=\"hidden\" name=\"svqos_noips\" value=\"%d\" /></td></tr>",
6040                  no_ips);
6041
6042        qos_ips = nvram_safe_get("svqos_ips");
6043
6044        /*
6045         * IP format is "data level | data level |" ..etc
6046         */
6047        for (i = 0; i < no_ips && qos_ips && qos_ips[0]; i++) {
6048                if (sscanf(qos_ips, "%31s %31s %31s ", ip, level, level2) < 3)
6049                        break;
6050                websWrite(wp, "<tr>\n\
6051                                        <td>\n\
6052                                                <input type=\"checkbox\" name=\"svqos_ipdel%d\" />\n\
6053                                                <input type=\"hidden\" name=\"svqos_ip%d\" value=\"%s\" />\n\
6054                                        </td>\n\
6055                                        <td><em>%s</em></td>\n\
6056                                        <td>\n\
6057                                                <input name=\"svqos_ipup%d\" class=\"num\" size=\"5\" maxlength=\"5\" value=\"%s\" /> \n\
6058                                        </td>\n\
6059                                        <td>\n\
6060                                                <input name=\"svqos_ipdown%d\" class=\"num\" size=\"5\" maxlength=\"5\" value=\"%s\" /> \n\
6061                                        </td>\n\
6062                                </tr>\n", i, i, ip, ip, i, level, i, level2);
6063
6064                qos_ips = strpbrk(++qos_ips, "|");
6065                qos_ips++;
6066
6067        }
6068
6069        return;
6070}
6071#endif
6072#ifndef HAVE_AQOS
6073void ej_get_qosmacs(webs_t wp, int argc, char_t ** argv)
6074{
6075        char *qos_macs = nvram_safe_get("svqos_macs");
6076        char mac[32], level[32];
6077        int no_macs = 0, i = 0;
6078
6079        // calc # of ips
6080        while ((qos_macs = strpbrk(qos_macs, "|"))) {
6081                no_macs++;
6082                qos_macs++;
6083        }
6084
6085        websWrite(wp, "<tr>\n\
6086                                        <th><script type=\"text/javascript\">Capture(share.del)</script></th>\n\
6087                                        <th><script type=\"text/javascript\">Capture(share.mac)</script></th>\n\
6088                                        <th><script type=\"text/javascript\">Capture(share.priority)</script></th>\n\
6089                                </tr>\n");
6090
6091        // write HTML data
6092        websWrite(wp,
6093                  "<input type=\"hidden\" name=\"svqos_nomacs\" value=\"%d\" />",
6094                  no_macs);
6095
6096        qos_macs = nvram_safe_get("svqos_macs");
6097
6098        /*
6099         * IP format is "data level | data level |" ..etc
6100         */
6101        for (i = 0; i < no_macs && qos_macs && qos_macs[0]; i++) {
6102                if (sscanf(qos_macs, "%31s %31s ", mac, level) < 2)
6103                        break;
6104
6105                websWrite(wp, "<tr>\n\
6106                                        <td>\n\
6107                                                <input type=\"checkbox\" name=\"svqos_macdel%d\" />\n\
6108                                                <input type=\"hidden\" name=\"svqos_mac%d\" value=\"%s\" />\n\
6109                                        </td>\n\
6110                                        <td><em>%s</em></td>\n\
6111                                        <td>\n", i, i, mac, mac);
6112                websWrite(wp, "<select name=\"svqos_macprio%d\"> \n\
6113                                                        <script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<option value=\\\"100\\\" %s >\" + qos.prio_x + \"</option>\");\n\
6114                                                        document.write(\"<option value=\\\"10\\\" %s >\" + qos.prio_p + \"</option>\");\n\
6115                                                        document.write(\"<option value=\\\"20\\\" %s >\" + qos.prio_e + \"</option>\");\n\
6116                                                        document.write(\"<option value=\\\"30\\\" %s >\" + share.standard + \"</option>\");\n\
6117                                                        document.write(\"<option value=\\\"40\\\" %s >\" + qos.prio_b + \"</option>\");\n//]]>\n</script>\n\
6118                                                </select>\n\
6119                                        </td>\n\
6120                                </tr>\n", i, strcmp(level, "100") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "10") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "20") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "30") == 0 ? "selected=\\\"selected\\\"" : "", strcmp(level, "40") == 0 ? "selected=\\\"selected\\\"" : "");
6121
6122                qos_macs = strpbrk(++qos_macs, "|");
6123                qos_macs++;
6124
6125        }
6126
6127        return;
6128}
6129
6130#else
6131void ej_get_qosmacs(webs_t wp, int argc, char_t ** argv)
6132{
6133        char *qos_macs = nvram_safe_get("svqos_macs");
6134        char mac[32], level[32], level2[32];
6135        int no_macs = 0, i = 0;
6136
6137        // calc # of ips
6138        while ((qos_macs = strpbrk(qos_macs, "|"))) {
6139                no_macs++;
6140                qos_macs++;
6141        }
6142        websWrite(wp, "<tr>\n\
6143                                        <th><script type=\"text/javascript\">Capture(share.del)</script></th>\n\
6144                                        <th><script type=\"text/javascript\">Capture(share.mac)</script></th>\n\
6145                                        <th><script type=\"text/javascript\">Capture(qos.maxuprate_b)</script></th>\n\
6146                                        <th><script type=\"text/javascript\">Capture(qos.maxdownrate_b)</script></th>\n\
6147                                </tr>\n");
6148
6149        // write HTML data
6150        websWrite(wp,
6151                  "<input type=\"hidden\" name=\"svqos_nomacs\" value=\"%d\" />",
6152                  no_macs);
6153
6154        qos_macs = nvram_safe_get("svqos_macs");
6155
6156        /*
6157         * IP format is "data level | data level |" ..etc
6158         */
6159        for (i = 0; i < no_macs && qos_macs && qos_macs[0]; i++) {
6160                if (sscanf(qos_macs, "%31s %31s %31s ", mac, level, level2) < 3)
6161                        break;
6162                websWrite(wp, "<tr>\n\
6163                                        <td>\n\
6164                                                <input type=\"checkbox\" name=\"svqos_macdel%d\" />\n\
6165                                                <input type=\"hidden\" name=\"svqos_mac%d\" value=\"%s\" />\n\
6166                                        </td>\n\
6167                                        <td><em>%s</em></td>\n\
6168                                        <td>\n\
6169                                                <input name=\"svqos_macup%d\" class=\"num\" size=\"5\" maxlength=\"5\" value=\"%s\" /> \n\
6170                                        </td>\n\
6171                                        <td>\n\
6172                                                <input name=\"svqos_macdown%d\" class=\"num\" size=\"5\" maxlength=\"5\" value=\"%s\" /> \n\
6173                                        </td>\n\
6174                                </tr>\n", i, i, mac, mac, i, level, i, level2);
6175
6176                qos_macs = strpbrk(++qos_macs, "|");
6177                qos_macs++;
6178
6179        }
6180
6181        return;
6182}
6183#endif
6184
6185/*
6186 * Added by Botho 03.April.06
6187 */
6188void ej_dumpip_conntrack(webs_t wp, int argc, char_t ** argv)
6189{
6190        int ip_count = 0;
6191        FILE *fp;
6192        int c;
6193
6194        fp = fopen("/proc/net/ip_conntrack", "rb");
6195        if (fp == NULL)
6196                return;
6197        while (!feof(fp)) {
6198                c = getc(fp);
6199                if (c == EOF)
6200                        break;
6201                if (c == 0xa)
6202                        ip_count++;
6203        }
6204
6205        websWrite(wp, "%d", ip_count);
6206
6207        fclose(fp);
6208
6209        return;
6210}
6211
6212/*
6213 * Added by Botho 28.Oct.06
6214 */
6215static int search_hit(char *search, char *line, char *ret)
6216{
6217        unsigned int searchLen;
6218        unsigned int i;
6219        unsigned int j;
6220        unsigned int lineLen;
6221
6222        if (line == NULL || search == NULL || ret == NULL)
6223                return 1;
6224        lineLen = strlen(line);
6225        searchLen = strlen(search);
6226
6227        if (searchLen > lineLen)
6228                return (1);     // this can't match, invalid data?
6229
6230        for (i = 0; i < lineLen - searchLen; i++) {
6231                if (!strncasecmp((char *)&line[i], search, searchLen))
6232                        break;  // we got hit
6233        }
6234
6235        for (j = i + searchLen; j < i + 15 + searchLen; j++) {
6236                if (j >= lineLen)
6237                        break;  // end of line may be a delimiter too
6238                // return(1); // incomplete data
6239                if (line[j] == ' ')
6240                        break;  // we reach _space_ delimiter
6241        }
6242        memcpy(ret, &line[i + searchLen], j - (i + searchLen));
6243        ret[j - (i + searchLen)] = 0;
6244        return (0);
6245}
6246
6247static int string_search(char *string, char *search)
6248{
6249        int searchLen;
6250        int i;
6251
6252        if (search == NULL)
6253                return 0;
6254        searchLen = strlen(search);
6255        if (string == NULL)
6256                return 0;
6257        if (searchLen > strlen(string)) {
6258                return (0);     // this can't match
6259        }
6260        int slen = strlen(string);
6261
6262        for (i = 0; i < slen - searchLen; i++) {        // +1 removed.
6263                if (!strncasecmp((char *)&string[i], search, searchLen)) {
6264                        return (1);     // we got hit
6265                }
6266        }
6267        return (0);
6268}
6269
6270void ej_ip_conntrack_table(webs_t wp, int argc, char_t ** argv)
6271{
6272        FILE *fp;
6273        int ip_count = 1;
6274        char line[512];
6275        char protocol[16] = "";
6276        int timeout = 0;
6277        char srcip[16] = "";
6278        char dstip[16] = "";
6279        int _dport;
6280        struct servent *servp;
6281        char dstport[6] = "";
6282        char state[12] = "";
6283        char dum1[32];
6284        int dum2;
6285        char *lanip = nvram_get("lan_ipaddr");
6286
6287        fp = fopen("/proc/net/ip_conntrack", "rb");
6288        if (fp == NULL)
6289                return;
6290
6291        while (fgets(line, sizeof(line), fp) != NULL) {
6292
6293                websWrite(wp, "<tr>\n");
6294
6295                // Nb
6296                websWrite(wp, "<td align=\"right\">%d</td>", ip_count);
6297
6298                // Proto
6299                if (string_search(line, "tcp"))
6300                        sprintf(protocol, "TCP");
6301                else if (string_search(line, "udp"))
6302                        sprintf(protocol, "UDP");
6303                else if (string_search(line, "icmp"))
6304                        sprintf(protocol, "ICMP");
6305                else
6306                        sprintf(protocol, live_translate("share.unknown"));
6307                websWrite(wp, "<td>%s</td>", protocol);
6308
6309                // Timeout
6310                sscanf(line, "%s %d %d", &dum1[0], &dum2, &timeout);
6311                websWrite(wp, "<td align=\"right\">%d</td>", timeout);
6312
6313                // src
6314                search_hit("src=", line, srcip);
6315                // char buf[200];
6316                // getHostName (buf, srcip);
6317                // websWrite (wp, "<td align=\"right\" onmouseover='DisplayDiv(this,
6318                // event, 15, 15, \"%s\")' onmouseout=\"unDisplayDiv()\">%s</td>",
6319                // buf != "unknown" ? buf : live_translate ("share.unknown") ,
6320                // srcip);
6321                if (!strcmp(srcip, lanip))
6322                        websWrite(wp, "<td align=\"right\">%s</td>", srcip);
6323                else
6324                        websWrite(wp,
6325                                  "<td align=\"right\"><a title=\"Geotool\" href=\"javascript:openGeotool('%s')\">%s</a></td>",
6326                                  srcip, srcip);
6327
6328                // dst
6329                search_hit("dst=", line, dstip);
6330                // getHostName (buf, dstip);
6331                // websWrite (wp, "<td align=\"right\" onmouseover='DisplayDiv(this,
6332                // event, 15, 15, \"%s\")' onmouseout=\"unDisplayDiv()\">%s</td>",
6333                // buf != "unknown" ? buf : live_translate ("share.unknown") ,
6334                // dstip);
6335                if (!strcmp(dstip, lanip))
6336                        websWrite(wp, "<td align=\"right\">%s</td>", dstip);
6337                else
6338                        websWrite(wp,
6339                                  "<td align=\"right\"><a title=\"Geotool\" href=\"javascript:openGeotool('%s')\">%s</a></td>",
6340                                  dstip, dstip);
6341
6342                // service
6343                search_hit("dport=", line, dstport);
6344                _dport = atoi(dstport);
6345                servp = my_getservbyport(htons(_dport), protocol);
6346                websWrite(wp, "<td align=\"right\">%s</td>",
6347                          servp ? servp->s_name : dstport);
6348
6349                // State
6350                if (string_search(line, "ESTABLISHED"))
6351                        sprintf(state, "ESTABLISHED");
6352                else if (string_search(line, "TIME_WAIT"))
6353                        sprintf(state, "TIME_WAIT");
6354                else if (string_search(line, "UNREPLIED"))
6355                        sprintf(state, "UNREPLIED");
6356                else if (string_search(line, "CLOSE"))
6357                        sprintf(state, "CLOSE");
6358                else if (string_search(line, "ASSURED"))
6359                        sprintf(state, "ASSURED");
6360                else {
6361                        if (string_search(line, "udp"))
6362                                sprintf(state, "UNREPLIED");
6363                        else
6364                                sprintf(state, "&nbsp;");
6365                }
6366                websWrite(wp, "<td>%s</td>\n", state);
6367                websWrite(wp, "</tr>\n");
6368
6369                ip_count++;
6370        }
6371
6372        fclose(fp);
6373
6374        return;
6375}
6376
6377void ej_gethostnamebyip(webs_t wp, int argc, char_t ** argv)
6378{
6379        char buf[200];
6380        char *argument;
6381
6382#ifdef FASTWEB
6383        ejArgs(argc, argv, "%s", &argument);
6384#else
6385        if (ejArgs(argc, argv, "%s", &argument) < 1) {
6386                websError(wp, 400, "Insufficient args\n");
6387                return;
6388        }
6389#endif
6390
6391        if (argc == 1) {
6392                getHostName(buf, argument);
6393                websWrite(wp, "%s",
6394                          strcmp(buf,
6395                                 "unknown") ? buf :
6396                          live_translate("share.unknown"));
6397        }
6398
6399        return;
6400}
6401
6402/*
6403 * BEGIN Added by Botho 10.May.06
6404 */
6405void ej_show_wan_to_switch(webs_t wp, int argc, char_t ** argv)
6406{
6407
6408        if (nvram_match("wan_proto", "disabled") || getSTA() || getWET())       // WAN
6409                // disabled
6410                // OR
6411                // Wirelles
6412                // is
6413                // not
6414                // AP
6415        {
6416                websWrite(wp, "<fieldset>\n\
6417                                                        <legend><script type=\"text/javascript\">Capture(idx.legend2)</script></legend>\n\
6418                                                                <div class=\"setting\">\n\
6419                                                                        <div class=\"label\"><script type=\"text/javascript\">Capture(idx.wantoswitch)</script></div>\n\
6420                                                                        <input class=\"spaceradio\" type=\"checkbox\" name=\"_fullswitch\" value=\"1\" %s />\n\
6421                                                                </div>\n\
6422                                                        </fieldset><br />\n", nvram_match("fullswitch", "1") ? "checked=\"checked\"" : "");
6423        }
6424
6425        return;
6426}
6427
6428#define PROC_DEV "/proc/net/dev"
6429
6430void ej_wl_packet_get(webs_t wp, int argc, char_t ** argv)
6431{
6432        char line[256];
6433        FILE *fp;
6434
6435#ifdef HAVE_MADWIFI
6436        char *ifname = nvram_safe_get("wifi_display");
6437#elif HAVE_RT2880
6438        char *ifname = "ra0";
6439#else
6440        char name[32];
6441        sprintf(name, "%s_ifname", nvram_safe_get("wifi_display"));
6442        char *ifname = nvram_safe_get(name);
6443#endif
6444        struct dev_info {
6445                // unsigned long rx_bytes;
6446                unsigned long rx_pks;
6447                unsigned long rx_errs;
6448                unsigned long rx_drops;
6449                // unsigned long rx_fifo;
6450                // unsigned long rx_frame;
6451                // unsigned long rx_com;
6452                // unsigned long rx_mcast;
6453                // unsigned long tx_bytes;
6454                unsigned long tx_pks;
6455                unsigned long tx_errs;
6456                unsigned long tx_drops;
6457                // unsigned long tx_fifo;
6458                unsigned long tx_colls;
6459                // unsigned long tx_carr;
6460                // unsigned long tx_com;
6461        } info;
6462
6463        info.rx_pks = info.rx_errs = info.rx_drops = 0;
6464        info.tx_pks = info.tx_errs = info.tx_drops = info.tx_colls = 0;
6465
6466        if ((fp = fopen(PROC_DEV, "r")) == NULL) {
6467                return;
6468        } else {
6469                /*
6470                 * Inter-| Receive | Transmit face |bytes packets errs drop fifo
6471                 * frame compressed multicast|bytes packets errs drop fifo colls
6472                 * carrier compressed lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 eth0:
6473                 * 674829 5501 0 0 0 0 0 0 1249130 1831 0 0 0 0 0 0 eth1: 0 0 0 0 0 0
6474                 * 0 0 0 0 0 0 0 0 0 0 eth2: 0 0 0 0 0 719 0 0 1974 16 295 0 0 0 0 0
6475                 * br0: 107114 1078 0 0 0 0 0 0 910094 1304 0 0 0 0 0 0
6476                 *
6477                 */
6478                while (fgets(line, sizeof(line), fp) != NULL) {
6479                        int ifl = 0;
6480
6481                        if (!strchr(line, ':'))
6482                                continue;
6483                        while (line[ifl] != ':')
6484                                ifl++;
6485                        line[ifl] = 0;  /* interface */
6486                        char ifnamecopy[32];
6487                        int l = 0;
6488                        int i;
6489                        int len = strlen(line);
6490                        for (i = 0; i < len; i++) {
6491                                if (line[i] == ' ')
6492                                        continue;
6493                                ifnamecopy[l++] = line[i];
6494                        }
6495                        ifnamecopy[l] = 0;
6496                        if (!strcmp(ifnamecopy, ifname)) {
6497                                /*
6498                                 * sscanf (line + ifl + 1, "%ld %ld %ld %ld %ld %ld %ld %ld
6499                                 * %ld %ld %ld %ld %ld %ld %ld %ld", &info.rx_bytes,
6500                                 * &info.rx_pks, &info.rx_errs, &info.rx_drops,
6501                                 * &info.rx_fifo, &info.rx_frame, &info.rx_com,
6502                                 * &info.rx_mcast, &info.tx_bytes, &info.tx_pks,
6503                                 * &info.tx_errs, &info.tx_drops, &info.tx_fifo,
6504                                 * &info.tx_colls, &info.tx_carr, &info.tx_com);
6505                                 */
6506                                sscanf(line + ifl + 1,
6507                                       "%*ld %ld %ld %ld %*ld %*ld %*ld %*ld %*ld %ld %ld %ld %*ld %ld %*ld %*ld",
6508                                       &info.rx_pks, &info.rx_errs,
6509                                       &info.rx_drops,
6510                                       &info.tx_pks, &info.tx_errs,
6511                                       &info.tx_drops, &info.tx_colls);
6512                        }
6513
6514                }
6515                fclose(fp);
6516        }
6517
6518        websWrite(wp, "SWRXgoodPacket=%ld;", info.rx_pks);
6519        websWrite(wp, "SWRXerrorPacket=%ld;", info.rx_errs + info.rx_drops);
6520
6521        websWrite(wp, "SWTXgoodPacket=%ld;", info.tx_pks);
6522        websWrite(wp, "SWTXerrorPacket=%ld;",
6523                  info.tx_errs + info.tx_drops + info.tx_colls);
6524
6525        return;
6526}
6527
6528/*
6529 * END Added by Botho 10.May.06
6530 */
6531
6532void ej_statfs(webs_t wp, int argc, char_t ** argv)
6533{
6534        struct statfs sizefs;
6535
6536        if (argc != 2)
6537                return;
6538
6539        if ((statfs(argv[0], &sizefs) != 0)
6540            || (sizefs.f_type == 0x73717368))
6541                memset(&sizefs, 0, sizeof(sizefs));
6542
6543        websWrite(wp, "var %s = {\n\
6544        size: %llu,\n\
6545        free: %llu\n\
6546        };\n", argv[1], ((uint64_t) sizefs.f_bsize * sizefs.f_blocks), ((uint64_t) sizefs.f_bsize * sizefs.f_bfree));
6547}
6548
6549#ifdef HAVE_RSTATS
6550/*
6551 *
6552 * rstats Copyright (C) 2006 Jonathan Zarate
6553 *
6554 * Licensed under GNU GPL v2 or later.
6555 *
6556 */
6557
6558void ej_bandwidth(webs_t wp, int argc, char_t ** argv)
6559{
6560        char *name;
6561        int sig;
6562        char *argument;
6563
6564#ifdef FASTWEB
6565        ejArgs(argc, argv, "%s", &argument);
6566#else
6567        if (ejArgs(argc, argv, "%s", &argument) < 1) {
6568                websError(wp, 400, "Insufficient args\n");
6569                return;
6570        }
6571#endif
6572
6573        if (argc == 1) {
6574                if (strcmp(argument, "speed") == 0) {
6575                        sig = SIGUSR1;
6576                        name = "/var/spool/rstats-speed.js";
6577                } else {
6578                        sig = SIGUSR2;
6579                        name = "/var/spool/rstats-history.js";
6580                }
6581                unlink(name);
6582                killall("rstats", sig);
6583                wait_file_exists(name, 5, 0);
6584                do_file(name, wp, NULL);
6585                unlink(name);
6586        }
6587}
6588#endif
6589
6590#ifdef HAVE_PORTSETUP
6591void ej_portsetup(webs_t wp, int argc, char_t ** argv)
6592{
6593        char ssid[64];
6594        char *next;
6595        char var[64];
6596        char eths[256];
6597
6598        websWrite(wp,
6599                  "<h2><script type=\"text/javascript\">Capture(idx.portsetup)</script></h2>\n");
6600        websWrite(wp, "<fieldset>\n");
6601
6602        char *wanifname = nvram_safe_get("wan_ifname2");
6603
6604        if (strlen(wanifname) == 0)
6605                wanifname = nvram_safe_get("wan_ifname");
6606        memset(eths, 0, 256);
6607        getIfLists(eths, 256);
6608        if (strlen(wanifname) > 0) {
6609
6610                websWrite(wp,
6611                          "<legend><script type=\"text/javascript\">Capture(idx.portsetup)</script></legend>\n");
6612                websWrite(wp,
6613                          "<div class=\"setting\">\n<div class=\"label\"><script type=\"text/javascript\">Capture(idx.wanport)</script></div>\n");
6614                websWrite(wp, "<select name=\"wan_ifname\">\n");
6615
6616                websWrite(wp, "<option value=\"\" %s >Disabled</option>\n",
6617                          strlen(wanifname) ==
6618                          0 ? "selected=\"selected\"" : "");
6619                foreach(var, eths, next) {
6620                        websWrite(wp, "<option value=\"%s\" %s >%s</option>\n",
6621                                  var, !strcmp(wanifname,
6622                                               var) ? "selected=\"selected\"" :
6623                                  "", var);
6624                }
6625                websWrite(wp, "</select></div>\n");
6626        }
6627        foreach(var, eths, next) {
6628                if (!strcmp(get_wan_face(), var))
6629                        continue;
6630                if (!strcmp(nvram_safe_get("lan_ifname"), var))
6631                        continue;
6632                if (!strncmp(var, "br", 2) && !contains(var, '.'))
6633                        continue;
6634
6635                sprintf(ssid, "%s_bridged", var);
6636                websWrite(wp,
6637                          "<div class=\"setting\">\n<div class=\"label\"><script type=\"text/javascript\">Capture(wl_basic.network)</script> %s</div>\n",
6638                          var);
6639                char layer[64];
6640
6641                strcpy(layer, var);
6642                rep(layer, '.', 'X');
6643                websWrite(wp,
6644                          "<input class=\"spaceradio\" type=\"radio\" value=\"0\" onclick=\"show_layer_ext(this, '%s_idnet', true);\" name=\"%s_bridged\" %s /><script type=\"text/javascript\">Capture(wl_basic.unbridged)</script>&nbsp;\n",
6645                          layer, var, nvram_default_match(ssid,
6646                                                          "0",
6647                                                          "1") ?
6648                          "checked=\"checked\"" : "");
6649                websWrite(wp,
6650                          "<input class=\"spaceradio\" type=\"radio\" value=\"1\" onclick=\"show_layer_ext(this, '%s_idnet', false);\" name=\"%s_bridged\" %s /><script type=\"text/javascript\">Capture(share.deflt)</script>\n",
6651                          layer, var, nvram_default_match(ssid, "1",
6652                                                          "1") ?
6653                          "checked=\"checked\"" : "");
6654                websWrite(wp, "</div>\n");
6655
6656                websWrite(wp, "<div id=\"%s_idnet\">\n", layer);
6657
6658                websWrite(wp, "<div class=\"setting\">\n");
6659                websWrite(wp, "<div class=\"label\">%s</div>\n",
6660                          live_translate("idx.mtu"));
6661                char mtu[32];
6662                sprintf(mtu, "%s_mtu", var);
6663                websWrite(wp,
6664                          "<input class=\"num\" maxlength=\"4\" onblur=\"valid_mtu(this)\" size=\"5\" name=\"%s_mtu\" value=\"%s\" />\n",
6665                          var, nvram_default_get(mtu, "1500"));
6666                websWrite(wp, "</div>\n");
6667
6668                char mcast[32];
6669
6670                sprintf(mcast, "%s_multicast", var);
6671                nvram_default_get(mcast, "0");
6672                showRadio(wp, "wl_basic.multicast", mcast);
6673
6674                if (nvram_match("wk_mode", "gateway")) {
6675                        sprintf(mcast, "%s_nat", var);
6676                        nvram_default_get(mcast, "1");
6677                        showRadio(wp, "wl_basic.masquerade", mcast);
6678                }
6679                show_ipnetmask(wp, var);
6680                websWrite(wp, "</div>\n");
6681                websWrite(wp,
6682                          "<script type=\"text/javascript\">\n//<![CDATA[\n ");
6683                websWrite(wp,
6684                          "show_layer_ext(document.getElementsByName(\"%s_bridged\"), \"%s_idnet\", %s);\n",
6685                          var, layer, nvram_match(ssid,
6686                                                  "0") ? "true" : "false");
6687                websWrite(wp, "//]]>\n</script>\n");
6688        }
6689        websWrite(wp, "</fieldset><br />\n");
6690}
6691#endif
6692
6693static void show_macfilter_if(webs_t wp, char *ifname)
6694{
6695        websWrite(wp, "<fieldset>\n");
6696        websWrite(wp, "<legend>%s - %s</legend>\n", IFMAP(ifname),
6697                  live_translate("wl_mac.legend"));
6698        websWrite(wp, "<div class=\"setting\">\n");
6699        websWrite(wp, "<div class=\"label\">%s</div>\n",
6700                  live_translate("wl_mac.label"));
6701        char macmode[32];
6702
6703        sprintf(macmode, "%s_macmode1", ifname);
6704        rep(macmode, '.', 'X');
6705        if (nvram_get(macmode) == NULL)
6706                nvram_set(macmode, "disabled");
6707        char id[32];
6708
6709        sprintf(id, "idmac%s", ifname);
6710        rep(id, '.', 'X');
6711        char mycopy[256];
6712
6713        strcpy(mycopy, live_translate("share.enable"));
6714        websWrite(wp,
6715                  "<input class=\"spaceradio\" type=\"radio\" value=\"other\" name=\"%s\" %s onclick=\"show_layer_ext(this, '%s', true)\" />%s&nbsp;\n",
6716                  macmode, nvram_match(macmode,
6717                                       "other") ? "checked=\"checked\"" : "",
6718                  id, mycopy);
6719        strcpy(mycopy, live_translate("share.disable"));
6720        websWrite(wp,
6721                  "<input class=\"spaceradio\" type=\"radio\" value=\"disabled\" name=\"%s\" %s onclick=\"show_layer_ext(this, '%s', false)\" />%s\n",
6722                  macmode, nvram_match(macmode,
6723                                       "disabled") ? "checked=\"checked\"" :
6724                  "", id, mycopy);
6725        websWrite(wp, "</div>\n");
6726        websWrite(wp, "<div class=\"setting\" id=\"%s\">\n", id);
6727        websWrite(wp, "<div class=\"label\">%s<br />&nbsp;</div>\n",
6728                  live_translate("wl_mac.label2"));
6729        sprintf(macmode, "%s_macmode", ifname);
6730        if (nvram_get(macmode) == NULL)
6731                nvram_set(macmode, "disabled");
6732        strcpy(mycopy, live_translate("wl_mac.deny"));
6733        websWrite(wp,
6734                  "<input class=\"spaceradio\" type=\"radio\" value=\"deny\" name=\"%s\" %s />%s&nbsp;\n",
6735                  macmode, nvram_invmatch(macmode,
6736                                          "allow") ? "checked=\"checked\"" :
6737                  "", mycopy);
6738        websWrite(wp, "<br />\n");
6739        strcpy(mycopy, live_translate("wl_mac.allow"));
6740        websWrite(wp,
6741                  "<input class=\"spaceradio\" type=\"radio\" value=\"allow\" name=\"%s\" %s />%s\n",
6742                  macmode, nvram_match(macmode,
6743                                       "allow") ? "checked=\"checked\"" : "",
6744                  mycopy);
6745        websWrite(wp, "</div><br />\n");
6746        websWrite(wp, "<div class=\"center\">\n");
6747        websWrite(wp, "<script type=\"text/javascript\">\n");
6748        websWrite(wp, "//<![CDATA[\n");
6749        websWrite(wp,
6750                  "document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" name=\\\"mac_filter_button\\\" value=\\\"\" + sbutton.filterMac + \"\\\" onclick=\\\"openWindow('WL_FilterTable-%s.asp', 930, 740,'MACList');\\\" />\");\n",
6751                  ifname);
6752        websWrite(wp, "//]]>\n");
6753        websWrite(wp, "</script>\n");
6754        websWrite(wp, "</div>\n");
6755        websWrite(wp, "</fieldset><br />\n");
6756}
6757
6758void ej_list_mac_layers(webs_t wp, int argc, char_t ** argv)
6759{
6760#ifndef HAVE_MADWIFI
6761        int c = get_wl_instances();
6762        char devs[32];
6763        int i;
6764
6765        for (i = 0; i < c; i++) {
6766                char macmode[32];
6767                char id[32];
6768
6769                sprintf(devs, "wl%d", i);
6770                sprintf(macmode, "%s_macmode1", devs);
6771                sprintf(id, "idmac%s", devs);
6772                rep(id, '.', 'X');
6773                rep(macmode, '.', 'X');
6774                websWrite(wp,
6775                          "show_layer_ext(document.wireless.%s, '%s', \"%s\" == \"other\");\n",
6776                          macmode, id, nvram_match(macmode,
6777                                                   "other") ? "other" :
6778                          "disabled");
6779        }
6780
6781#else
6782
6783        int c = getdevicecount();
6784        char devs[32];
6785        int i;
6786
6787        for (i = 0; i < c; i++) {
6788                char macmode[32];
6789                char id[32];
6790
6791                sprintf(devs, "ath%d", i);
6792                sprintf(macmode, "%s_macmode1", devs);
6793                sprintf(id, "idmac%s", devs);
6794                rep(id, '.', 'X');
6795                rep(macmode, '.', 'X');
6796                websWrite(wp,
6797                          "show_layer_ext(document.wireless.%s, '%s', \"%s\" == \"other\");\n",
6798                          macmode, id, nvram_match(macmode,
6799                                                   "other") ? "other" :
6800                          "disabled");
6801                // show_macfilter_if (wp, devs);
6802                char vif[32];
6803
6804                sprintf(vif, "%s_vifs", devs);
6805                char var[80], *next;
6806                char *vifs = nvram_safe_get(vif);
6807
6808                if (vifs != NULL)
6809                        foreach(var, vifs, next) {
6810                        sprintf(macmode, "%s_macmode1", var);
6811                        sprintf(id, "idmac%s", var);
6812                        rep(id, '.', 'X');
6813                        rep(macmode, '.', 'X');
6814                        websWrite(wp,
6815                                  "show_layer_ext(document.wireless.%s, '%s', \"%s\" == \"other\");\n",
6816                                  macmode, id, nvram_match(macmode,
6817                                                           "other") ? "other" :
6818                                  "disabled");
6819                        }
6820        }
6821
6822#endif
6823}
6824
6825void ej_show_macfilter(webs_t wp, int argc, char_t ** argv)
6826{
6827#ifndef HAVE_MADWIFI
6828        int c = get_wl_instances();
6829        char devs[32];
6830        int i;
6831
6832        for (i = 0; i < c; i++) {
6833                sprintf(devs, "wl%d", i);
6834                show_macfilter_if(wp, devs);
6835        }
6836#else
6837        int c = getdevicecount();
6838        char devs[32];
6839        int i;
6840
6841        for (i = 0; i < c; i++) {
6842                sprintf(devs, "ath%d", i);
6843                show_macfilter_if(wp, devs);
6844                char vif[32];
6845
6846                sprintf(vif, "%s_vifs", devs);
6847                char var[80], *next;
6848                char *vifs = nvram_safe_get(vif);
6849
6850                if (vifs != NULL)
6851                        foreach(var, vifs, next) {
6852                        show_macfilter_if(wp, var);
6853                        }
6854        }
6855
6856#endif
6857}
6858
6859void ej_show_ifselect(webs_t wp, int argc, char_t ** argv)
6860{
6861        if (argc < 1)
6862                return;
6863        char *ifname = argv[0];
6864        websWrite(wp, "<select name=\"%s\">\n", ifname);
6865        websWrite(wp, "<option value=\"%s\" %s >LAN</option>\n",
6866                  nvram_safe_get("lan_ifname"),
6867                  nvram_match(ifname,
6868                              nvram_safe_get("lan_ifname")) ?
6869                  "selected=\"selected\"" : "");
6870        char *next;
6871        char var[80];
6872        char eths[256];
6873
6874        memset(eths, 0, 256);
6875        getIfLists(eths, 256);
6876        foreach(var, eths, next) {
6877                if (!strcmp(get_wan_face(), var))
6878                        continue;
6879                if (!strcmp(nvram_safe_get("lan_ifname"), var))
6880                        continue;
6881                websWrite(wp, "<option value=\"%s\" %s >%s</option>\n", var,
6882                          nvram_match(ifname, var) ? "selected" : "", var);
6883        }
6884
6885        websWrite(wp, "</select>\n");
6886}
6887
6888#ifdef HAVE_RFLOW
6889void ej_show_rflowif(webs_t wp, int argc, char_t ** argv)
6890{
6891        websWrite(wp, "<option value=\"%s\" %s >LAN &amp; WLAN</option>\n",
6892                  nvram_safe_get("lan_ifname"), nvram_match("rflow_if",
6893                                                            nvram_safe_get
6894                                                            ("lan_ifname"))
6895                  ? "selected=\"selected\"" : "");
6896
6897        char *lanifs = nvram_safe_get("lan_ifnames");
6898        char *next;
6899        char var[80];
6900
6901        foreach(var, lanifs, next) {
6902                if (nvram_match("wan_ifname", var))
6903                        continue;
6904                if (!ifexists(var))
6905                        continue;
6906                websWrite(wp, "<option value=\"%s\" %s >%s</option>\n",
6907                          var, nvram_match("rflow_if",
6908                                           var) ? "selected=\"selected\"" :
6909                          "", var);
6910        }
6911#if !defined(HAVE_MADWIFI) && !defined(HAVE_RT2880)
6912        int cnt = get_wl_instances();
6913        int c;
6914
6915        for (c = 0; c < cnt; c++) {
6916                sprintf(var, "wl%d_ifname", c);
6917                websWrite(wp, "<option value=\"%s\" %s >WLAN%d</option>\n",
6918                          nvram_safe_get(var), nvram_match("rflow_if",
6919                                                           nvram_safe_get(var))
6920                          ? "selected=\"selected\"" : "", c);
6921        }
6922#endif
6923
6924        char *wanif = nvram_safe_get("wan_ifname");
6925
6926        if (strlen(wanif) != 0) {
6927                websWrite(wp, "<option value=\"%s\" %s >WAN</option>\n",
6928                          wanif, nvram_match("rflow_if",
6929                                             wanif) ? "selected=\"selected\"" :
6930                          "");
6931        }
6932}
6933#endif
6934
6935#ifdef HAVE_FREERADIUS
6936
6937void ej_show_certificate_status(webs_t wp, int argc, char_t ** argv)
6938{
6939        int percent = 0;
6940        if (f_exists("/jffs/etc/freeradius/certs/dh"))
6941                percent += 60;
6942        if (f_exists("/jffs/etc/freeradius/certs/server.csr"))
6943                percent += 5;
6944        if (f_exists("/jffs/etc/freeradius/certs/server.key"))
6945                percent += 5;
6946        if (f_exists("/jffs/etc/freeradius/certs/ca.pem"))
6947                percent += 5;
6948        if (f_exists("/jffs/etc/freeradius/certs/ca.key"))
6949                percent += 5;
6950        if (f_exists("/jffs/etc/freeradius/certs/server.crt"))
6951                percent += 5;
6952        if (f_exists("/jffs/etc/freeradius/certs/server.p12"))
6953                percent += 5;
6954        if (f_exists("/jffs/etc/freeradius/certs/server.pem"))
6955                percent += 5;
6956        if (f_exists("/jffs/etc/freeradius/certs/ca.der"))
6957                percent += 5;
6958
6959        if (percent == 100) {
6960                websWrite(wp, "certicate generation done<br />\n");
6961        } else {
6962                websWrite(wp,
6963                          "generating %d%%, this may take a long time<br />\n",
6964                          percent);
6965        }
6966}
6967
6968#include <radiusdb.h>
6969
6970/*struct radiususer {
6971        unsigned int fieldlen;
6972        unsigned int usersize;
6973        unsigned char *user;
6974        unsigned int passwordsize;
6975        unsigned char *passwd;
6976        unsigned int downstream;
6977        unsigned int upstream;
6978//more fields can be added in future
6979};
6980
6981struct radiusdb {
6982        unsigned int usercount;
6983        struct radiususer *users;
6984};
6985*/
6986void ej_show_radius_users(webs_t wp, int argc, char_t ** argv)
6987{
6988        websWrite(wp, "<table class=\"table\" summary=\"Radius Users\">\n");
6989
6990        websWrite(wp, "<tr>\n\
6991                                        <th><script type=\"text/javascript\">Capture(freeradius.username)</script></th>\n\
6992                                        <th><script type=\"text/javascript\">Capture(freeradius.password)</script></th>\n\
6993                                        <th><script type=\"text/javascript\">Capture(freeradius.downstream)</script></th>\n\
6994                                        <th><script type=\"text/javascript\">Capture(freeradius.upstream)</script></th>\n\
6995                                        <th><script type=\"text/javascript\">Capture(freeradius.expiration)</script></th>\n\
6996                                        <th>&nbsp;</th>\n\
6997                                        <th>&nbsp;</th>\n\
6998                                </tr>\n");
6999
7000        unsigned int i;
7001        struct radiusdb *db = loadradiusdb();
7002        time_t tm;
7003        time(&tm);
7004        if (db != NULL)         // empty
7005        {
7006                for (i = 0; i < db->usercount; i++) {
7007                        websWrite(wp, "<tr>\n");
7008                        char vlan_name[32];
7009                        sprintf(vlan_name, "username%d", i);
7010                        websWrite(wp,
7011                                  "<td><input name=\"%s\" size=\"8\" value=\"%s\" /></td>\n",
7012                                  vlan_name, (db->users[i].user != NULL
7013                                              && db->users[i].
7014                                              usersize) ? db->users[i].
7015                                  user : "");
7016
7017                        sprintf(vlan_name, "password%d", i);
7018                        websWrite(wp,
7019                                  "<td><input name=\"%s\" size=\"8\" value=\"%s\" /></td>\n",
7020                                  vlan_name, (db->users[i].passwd != NULL
7021                                              && db->
7022                                              users[i].passwordsize) ? db->
7023                                  users[i].passwd : "");
7024
7025                        sprintf(vlan_name, "downstream%d", i);
7026                        websWrite(wp,
7027                                  "<td><input class=\"num\" name=\"%s\" size=\"5\" value=\"%d\" /></td>\n",
7028                                  vlan_name, db->users[i].downstream);
7029
7030                        sprintf(vlan_name, "upstream%d", i);
7031                        websWrite(wp,
7032                                  "<td><input class=\"num\" name=\"%s\" size=\"5\" value=\"%d\" /></td>\n",
7033                                  vlan_name, db->users[i].upstream);
7034
7035                        sprintf(vlan_name, "expiration%d", i);
7036                        long expiration = 0;    //never
7037                        if (db->users[i].expiration) {
7038                                long curtime = ((tm / 60) / 60) / 24;   //in days
7039                                expiration = db->users[i].expiration - curtime;
7040                        }
7041                        websWrite(wp,
7042                                  "<td><input class=\"num\" name=\"%s\" size=\"3\" value=\"%d\" /></td>\n",
7043                                  vlan_name, expiration);
7044
7045                        websWrite(wp,
7046                                  "<td><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"user_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script>\n</td>",
7047                                  i);
7048                        websWrite(wp,
7049                                  "<td><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + freeradius.cert + \"\\\" onclick=\\\"openWindow('FreeRadiusCert-%d.asp', 630, 430,'Certificate');\\\" />\");\n//]]>\n</script></td>\n",
7050                                  i);
7051                        websWrite(wp, "</tr>\n");
7052                }
7053                freeradiusdb(db);
7054        }
7055        websWrite(wp, "</table>\n");
7056        websWrite(wp,
7057                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.add + \"\\\" onclick=\\\"user_add_submit(this.form)\\\" />\");\n//]]>\n</script>\n");
7058}
7059
7060void ej_show_radius_clients(webs_t wp, int argc, char_t ** argv)
7061{
7062        websWrite(wp, "<table class=\"table\" summary=\"Radius Clients\">\n");
7063
7064        websWrite(wp, "<tr>\n\
7065                                        <th>IP/NET</th>\n\
7066                                        <th><script type=\"text/javascript\">Capture(freeradius.sharedkey)</script></th>\n\
7067                                        <th>&nbsp;</th>\n\
7068                                </tr>\n");
7069        unsigned int i;
7070        struct radiusclientdb *db = loadradiusclientdb();
7071        if (db != NULL)         // empty
7072        {
7073                for (i = 0; i < db->usercount; i++) {
7074                        websWrite(wp, "<tr>\n");
7075                        char vlan_name[32];
7076                        sprintf(vlan_name, "client%d", i);
7077                        websWrite(wp,
7078                                  "<td><input name=\"%s\" size=\"20\" value=\"%s\" /></td>\n",
7079                                  vlan_name, (db->users[i].client != NULL
7080                                              && db->users[i].
7081                                              clientsize) ? db->users[i].
7082                                  client : "");
7083
7084                        sprintf(vlan_name, "shared%d", i);
7085                        websWrite(wp,
7086                                  "<td><input name=\"%s\" size=\"20\" value=\"%s\" /></td>\n",
7087                                  vlan_name, (db->users[i].passwd != NULL
7088                                              && db->
7089                                              users[i].passwordsize) ? db->
7090                                  users[i].passwd : "");
7091
7092                        websWrite(wp,
7093                                  "<td><script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.del + \"\\\" onclick=\\\"client_del_submit(this.form,%d)\\\" />\");\n//]]>\n</script></td>\n",
7094                                  i);
7095                        websWrite(wp, "</tr>\n");
7096                }
7097                freeradiusclientdb(db);
7098        }
7099        websWrite(wp, "</table>\n");
7100        websWrite(wp,
7101                  "<script type=\"text/javascript\">\n//<![CDATA[\n document.write(\"<input class=\\\"button\\\" type=\\\"button\\\" value=\\\"\" + sbutton.add + \"\\\" onclick=\\\"client_add_submit(this.form)\\\" />\");\n//]]>\n</script>\n");
7102}
7103
7104#endif
Note: See TracBrowser for help on using the repository browser.