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

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

allow to disable ports on the vlan page

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