source: src/router/httpd/modules/dd-wrt.c @ 9145

Last change on this file since 9145 was 9145, checked in by BrainSlayer, 5 years ago

some usefull debug infos

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