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

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

display frequency too

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