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

Last change on this file since 7612 was 7612, checked in by BrainSlayer, 6 years ago

sha1 sum fixes

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