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

Last change on this file since 12250 was 12250, checked in by eko, 4 years ago

geotool support

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