source: src/router/libutils/utils.c @ 13522

Last change on this file since 13522 was 13522, checked in by eko, 3 years ago

ses blue for wrt310nv1

File size: 86.5 KB
Line 
1/*
2 * utils.c
3 *
4 * Copyright (C) 2007 Sebastian Gottschall <gottschall@dd-wrt.com>
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 <errno.h>
27#include <net/if.h>
28#include <dirent.h>
29#include <unistd.h>
30#include <ctype.h>
31#include <syslog.h>
32#include <sys/socket.h>
33#include <sys/stat.h>
34#include <fcntl.h>
35#include <netinet/in.h>
36#include <stdarg.h>
37#include <sys/ioctl.h>
38#include <sys/sysinfo.h>
39#include <arpa/inet.h>
40#include <netdb.h>
41#include <resolv.h>
42#include <signal.h>
43
44#include <utils.h>
45#include <wlutils.h>
46#include <bcmnvram.h>
47#include <shutils.h>
48#include <cy_conf.h>
49#include <code_pattern.h>
50#include <bcmdevs.h>
51#include <net/route.h>
52#include <cy_conf.h>
53#include <bcmdevs.h>
54#include <linux/if_ether.h>
55// #include <linux/mii.h>
56#include <linux/sockios.h>
57#include <cymac.h>
58#include <broadcom.h>
59#define SIOCGMIIREG     0x8948  /* Read MII PHY register.  */
60#define SIOCSMIIREG     0x8949  /* Write MII PHY register.  */
61
62struct mii_ioctl_data {
63        unsigned short phy_id;
64        unsigned short reg_num;
65        unsigned short val_in;
66        unsigned short val_out;
67};
68
69#ifdef HAVE_FONERA
70static void inline getBoardMAC(char *mac)
71{
72        // 102
73        int i;
74        char op[32];
75        unsigned char data[256];
76        FILE *in;
77
78        sprintf(op, "/dev/mtdblock/%d", getMTD("board_config"));
79        in = fopen(op, "rb");
80        if (in == NULL)
81                return;
82        fread(data, 256, 1, in);
83        fclose(in);
84        sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", data[102] & 0xff,
85                data[103] & 0xff, data[104] & 0xff, data[105] & 0xff,
86                data[106] & 0xff, data[107] & 0xff);
87}
88#endif
89
90int count_processes(char *pidName)
91{
92        FILE *fp;
93        char line[254];
94        char safename[64];
95
96        sprintf(safename, " %s ", pidName);
97        char zombie[64];
98
99        sprintf(zombie, "Z   [%s]", pidName);   // do not count zombies
100        int i = 0;
101
102        cprintf("Search for %s\n", pidName);
103        if ((fp = popen("ps", "r"))) {
104                while (fgets(line, sizeof(line), fp) != NULL) {
105                        if (strstr(line, safename) && !strstr(line, zombie)) {
106                                i++;
107                        }
108                }
109                pclose(fp);
110        }
111        cprintf("Search done... %d\n", i);
112
113        return i;
114}
115
116/*
117 * This function returns the number of days for the given month in the given
118 * year
119 */
120unsigned int daysformonth(unsigned int month, unsigned int year)
121{
122        return (30 + (((month & 9) == 8) || ((month & 9) == 1)) -
123                (month == 2) - (!(((year % 4) == 0)
124                                  && (((year % 100) != 0)
125                                      || ((year % 400) == 0)))
126                                && (month == 2)));
127}
128
129#ifdef HAVE_AQOS
130
131static char *get_wshaper_dev(void)
132{
133        if (nvram_match("wshaper_dev", "WAN"))
134                return get_wan_face();
135        else
136                return "br0";
137}
138
139void add_userip(char *ip, int idx, char *upstream, char *downstream)
140{
141        int base = 120 + idx;
142        char up[32];
143        char down[32];
144        char ups[32];
145        char downs[32];
146
147        if (nvram_match("qos_type", "1")) {
148                sprintf(up, "1:%d", base);
149                sprintf(down, "1:%d", base + 1);
150                sprintf(ups, "%skbit", upstream);
151                sprintf(downs, "%skbit", downstream);
152                sysprintf
153                    ("tc class add dev %s parent 1:1 classid 1:%d htb rate %skbit ceil %skbit",
154                     "imq0", base, upstream, upstream);
155                sysprintf
156                    ("tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
157                     "imq0", base);
158                sysprintf
159                    ("tc filter add dev %s protocol ip parent 1:0 prio 1 u32 match ip src %s flowid 1:%d",
160                     "imq0", ip, base);
161
162                sysprintf
163                    ("tc class add dev imq0 parent 1:1 classid 1:%d htb rate %skbit ceil %skbit",
164                     base + 1, downstream, downstream);
165                sysprintf
166                    ("tc qdisc add dev imq0 parent 1:%d sfq quantum 1514b perturb 15",
167                     base + 1, base + 1);
168                sysprintf
169                    ("tc filter add dev imq0 protocol ip parent 1:0 prio 1 u32 match ip dst %s flowid 1:%d",
170                     ip, base + 1);
171
172        } else {
173                sprintf(up, "1:%d", base);
174                sprintf(down, "1:%d", base + 1);
175                sprintf(ups, "%skbit", upstream);
176                sprintf(downs, "%skbit", downstream);
177                sysprintf
178                    ("tc class add dev %s parent 1:2 classid 1:%d htb rate %skbit ceil %skbit",
179                     "imq0", base, upstream, upstream);
180                sysprintf
181                    ("tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
182                     "imq0", base);
183                sysprintf
184                    ("tc filter add dev %s protocol ip parent 1:0 prio 1 u32 match ip src %s flowid 1:%d",
185                     "imq0", ip, base);
186
187                sysprintf
188                    ("tc class add dev imq0 parent 1:2 classid 1:%d htb rate %skbit ceil %skbit",
189                     base + 1, downstream, downstream);
190                sysprintf
191                    ("tc qdisc add dev imq0 parent 1:%d sfq quantum 1514b perturb 15",
192                     base + 1, base + 1);
193                sysprintf
194                    ("tc filter add dev imq0 protocol ip parent 1:0 prio 1 u32 match ip dst %s flowid 1:%d",
195                     ip, base + 1);
196        }
197}
198
199void add_usermac(char *mac, int idx, char *upstream, char *downstream)
200{
201        unsigned char octet[6];
202
203        ether_atoe(mac, octet);
204        int base = 120 + idx;
205        char up[32];
206        char down[32];
207        char ups[32];
208        char downs[32];
209        char oct2[32];
210        char oct4[32];
211        char doct2[32];
212        char doct4[32];
213
214        sprintf(up, "1:%d", base);
215        sprintf(down, "1:%d", base + 1);
216        sprintf(ups, "%skbit", upstream);
217        sprintf(downs, "%skbit", downstream);
218
219        sprintf(oct2, "%02X%02X", octet[4], octet[5]);
220        sprintf(oct4, "%02X%02X%02X%02X", octet[0], octet[1], octet[2],
221                octet[3]);
222
223        sprintf(doct4, "%02X%02X%02X%02X", octet[2], octet[3], octet[4],
224                octet[5]);
225        sprintf(doct2, "%02X%02X", octet[0], octet[1]);
226
227        if (nvram_match("qos_type", "1")) {
228                // up
229                sysprintf("tc class add dev %s parent 1:1 classid 1:%d htb rate %skbit ceil %skbit", "imq0", base, upstream, upstream); //
230                sysprintf
231                    ("tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
232                     "imq0", base);
233                sysprintf
234                    ("tc filter add dev %s protocol ip parent 1:0 prio 1 u32 match u16 0x0800 0xFFFF at -2 match u16 0x%s 0xFFFF at -4 match u32 0x%s 0xFFFFFFFF at -8 flowid 1:%d",
235                     "imq0", oct2, oct4, base);
236
237                // down
238                if (strcmp(get_wshaper_dev(), "br0")) {
239                        /*
240                         * use separate root class, since no other class is created for br0
241                         * if qos is wan based
242                         */
243                        sysprintf
244                            ("tc class add dev br0 parent 1: classid 1:%d htb rate %skbit ceil %skbit",
245                             base + 1, downstream, downstream);
246                        sysprintf
247                            ("tc qdisc add dev br0 parent 1:%d sfq quantum 1514b perturb 15",
248                             base + 1, base + 1);
249                        sysprintf
250                            ("tc filter add dev br0 protocol ip parent 1:0 prio 1 u32 match u16 0x0800 0xFFFF at -2 match u32 0x%s 0xFFFFFFFF at -12 match u16 0x%s 0xFFFF at -14 flowid 1:%d",
251                             doct4, doct2, base + 1);
252                } else {
253                        /*
254                         * use root class of br0 interface which was created by the wshaper
255                         */
256                        // br0 -> imq0 changed, in lan-briding, we need to use IMQ
257                        sysprintf
258                            ("tc class add dev imq0 parent 1:1 classid 1:%d htb rate %skbit ceil %skbit",
259                             base + 1, downstream, downstream);
260                        sysprintf
261                            ("tc qdisc add dev imq0 parent 1:%d sfq quantum 1514b perturb 15",
262                             base + 1, base + 1);
263                        sysprintf
264                            ("tc filter add dev imq0 protocol ip parent 1:0 prio 1 u32 match u16 0x0800 0xFFFF at -2 match u32 0x%s 0xFFFFFFFF at -12 match u16 0x%s 0xFFFF at -14 flowid 1:%d",
265                             doct4, doct2, base + 1);
266                }
267
268        } else {
269                // up
270                sysprintf("tc class add dev %s parent 1:2 classid 1:%d htb rate %skbit ceil %skbit", "imq0", base, upstream, upstream); //
271                sysprintf
272                    ("tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
273                     "imq0", base);
274                sysprintf
275                    ("tc filter add dev %s protocol ip parent 1:0 prio 1 u32 match u16 0x0800 0xFFFF at -2 match u16 0x%s 0xFFFF at -4 match u32 0x%s 0xFFFFFFFF at -8 flowid 1:%d",
276                     "imq0", oct2, oct4, base);
277
278                // down
279                if (strcmp(get_wshaper_dev(), "br0")) {
280                        /*
281                         * use separate root class, since no other class is created for br0
282                         * if qos is wan based
283                         */
284                        sysprintf
285                            ("tc class add dev br0 parent 1: classid 1:%d htb rate %skbit ceil %skbit",
286                             base + 1, downstream, downstream);
287                        sysprintf
288                            ("tc qdisc add dev br0 parent 1:%d sfq quantum 1514b perturb 15",
289                             base + 1, base + 1);
290                        sysprintf
291                            ("tc filter add dev br0 protocol ip parent 1:0 prio 1 u32 match u16 0x0800 0xFFFF at -2 match u32 0x%s 0xFFFFFFFF at -12 match u16 0x%s 0xFFFF at -14 flowid 1:%d",
292                             doct4, doct2, base + 1);
293                } else {
294                        /*
295                         * use root class of br0 interface which was created by the wshaper
296                         */
297                        // br0 -> imq0 changed, in lan-briding, we need to use IMQ
298                        sysprintf
299                            ("tc class add dev imq0 parent 1:2 classid 1:%d htb rate %skbit ceil %skbit",
300                             base + 1, downstream, downstream);
301                        sysprintf
302                            ("tc qdisc add dev imq0 parent 1:%d sfq quantum 1514b perturb 15",
303                             base + 1, base + 1);
304                        sysprintf
305                            ("tc filter add dev imq0 protocol ip parent 1:0 prio 1 u32 match u16 0x0800 0xFFFF at -2 match u32 0x%s 0xFFFFFFFF at -12 match u16 0x%s 0xFFFF at -14 flowid 1:%d",
306                             doct4, doct2, base + 1);
307                }
308        }
309        /*
310         * mac downstream matching can only be made directly on the connected
311         * interface
312         */
313        char iflist[256];
314
315        getIfList(iflist, NULL);
316        static char word[256];
317        char *next, *wordlist;
318
319        foreach(word, iflist, next) {
320                if (nvram_nmatch("0", "%s_bridged", word)) {
321                        sysprintf
322                            ("tc class add dev %s parent 1: classid 1:%d htb rate %skbit ceil %skbit",
323                             word, base + 1, downstream, downstream);
324                        sysprintf
325                            ("tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
326                             word, base + 1, base + 1);
327                        sysprintf
328                            ("tc filter add dev %s protocol ip parent 1:0 prio 1 u32 match u16 0x0800 0xFFFF at -2 match u32 0x%s 0xFFFFFFFF at -12 match u16 0x%s 0xFFFF at -14 flowid 1:%d",
329                             word, doct4, doct2, base + 1);
330                }
331        }
332
333}
334
335#endif
336int buf_to_file(char *path, char *buf)
337{
338        FILE *fp;
339
340        if ((fp = fopen(path, "w"))) {
341                fprintf(fp, "%s", buf);
342                fclose(fp);
343                return 1;
344        }
345
346        return 0;
347}
348
349int check_action(void)
350{
351        char buf[80] = "";
352
353        if (file_to_buf(ACTION_FILE, buf, sizeof(buf))) {
354                if (!strcmp(buf, "ACT_TFTP_UPGRADE")) {
355                        fprintf(stderr, "Upgrading from tftp now ...\n");
356                        return ACT_TFTP_UPGRADE;
357                }
358#ifdef HAVE_HTTPS
359                else if (!strcmp(buf, "ACT_WEBS_UPGRADE")) {
360                        fprintf(stderr, "Upgrading from web (https) now ...\n");
361                        return ACT_WEBS_UPGRADE;
362                }
363#endif
364                else if (!strcmp(buf, "ACT_WEB_UPGRADE")) {
365                        fprintf(stderr, "Upgrading from web (http) now ...\n");
366                        return ACT_WEB_UPGRADE;
367                } else if (!strcmp(buf, "ACT_SW_RESTORE")) {
368                        fprintf(stderr,
369                                "Receiving restore command from web ...\n");
370                        return ACT_SW_RESTORE;
371                } else if (!strcmp(buf, "ACT_HW_RESTORE")) {
372                        fprintf(stderr,
373                                "Receiving restore command from resetbutton ...\n");
374                        return ACT_HW_RESTORE;
375                } else if (!strcmp(buf, "ACT_NVRAM_COMMIT")) {
376                        fprintf(stderr, "Committing nvram now ...\n");
377                        return ACT_NVRAM_COMMIT;
378                } else if (!strcmp(buf, "ACT_ERASE_NVRAM")) {
379                        fprintf(stderr, "Erasing nvram now ...\n");
380                        return ACT_ERASE_NVRAM;
381                }
382        }
383        // fprintf(stderr, "Waiting for upgrading....\n");
384        return ACT_IDLE;
385}
386
387int check_vlan_support(void)
388{
389#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA) || defined(HAVE_MERAKI) || defined(HAVE_LS2) || defined(HAVE_WHRAG108) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_TW6600) || defined(HAVE_PB42) || defined(HAVE_LS5) || defined(HAVE_LSX) || defined(HAVE_DANUBE) || defined(HAVE_STORM) || defined(HAVE_ADM5120) || defined(HAVE_RT2880)
390        return 0;
391#else
392
393        int brand = getRouterBrand();
394
395        switch (brand) {
396#ifndef HAVE_BUFFALO
397        case ROUTER_ASUS_WL500GD:
398                return 1;
399                break;
400#endif
401        case ROUTER_BUFFALO_WLAG54C:
402        case ROUTER_BUFFALO_WLA2G54C:
403#ifndef HAVE_BUFFALO
404        case ROUTER_LINKSYS_WRT55AG:
405        case ROUTER_MOTOROLA_V1:
406        case ROUTER_MOTOROLA_WE800G:
407        case ROUTER_WAP54G_V1:
408        case ROUTER_SITECOM_WL105B:
409        case ROUTER_SITECOM_WL111:
410        case ROUTER_BUFFALO_WLI2_TX1_G54:
411        case ROUTER_BUFFALO_WLI_TX4_G54HP:
412        case ROUTER_BRCM4702_GENERIC:
413        case ROUTER_ASUS_WL500G:
414        case ROUTER_BELKIN_F5D7230_V2000:
415        case ROUTER_ASKEY_RT220XD:
416#endif
417                return 0;
418                break;
419        }
420
421        unsigned long boardflags =
422            strtoul(nvram_safe_get("boardflags"), NULL, 0);
423
424        if (boardflags & BFL_ENETVLAN)
425                return 1;
426
427        if (nvram_match("boardtype", "bcm94710dev")
428            || nvram_match("boardtype", "0x0101") || (boardflags & 0x0100))
429                return 1;
430        else
431                return 0;
432#endif
433}
434
435void setRouter(char *name)
436{
437#ifdef HAVE_POWERNOC_WORT54G
438        nvram_set(NVROUTER, "WORT54G");
439#elif HAVE_POWERNOC_WOAP54G
440        nvram_set(NVROUTER, "WOAP54G");
441#elif HAVE_ERC
442        nvram_set(NVROUTER, "ServiceGate v1.0");
443#elif HAVE_OMNI
444        nvram_set(NVROUTER, "Omni Wifi Router");
445#elif HAVE_ALFA_BRANDING
446        nvram_set(NVROUTER, "WLAN base-station");
447        if (name)
448                nvram_set("DD_BOARD2", name);
449#elif HAVE_MAKSAT
450        if (name)
451                nvram_set("DD_BOARD2", name);
452#ifdef HAVE_MAKSAT_BLANK
453        nvram_set(NVROUTER, "default");
454#else
455        nvram_set(NVROUTER, "MAKSAT");
456#endif
457#elif HAVE_TMK
458        if (name)
459                nvram_set("DD_BOARD2", name);
460        nvram_set(NVROUTER, "KMT-WAS");
461#elif HAVE_TRIMAX
462        if (name)
463                nvram_set("DD_BOARD2", name);
464        nvram_set(NVROUTER, "Trimax Wireless");
465#elif HAVE_WIKINGS
466        if (name)
467                nvram_set("DD_BOARD2", name);
468        nvram_set(NVROUTER, "Obelix Series");
469#else
470        if (name)
471                nvram_set(NVROUTER, name);
472#endif
473}
474
475char *getRouter()
476{
477        char *n = nvram_get(NVROUTER);
478
479        return n != NULL ? n : "Unknown Model";
480}
481
482int internal_getRouterBrand()
483{
484#if defined(HAVE_ALLNETWRT) && !defined(HAVE_ECB9750)
485        unsigned long boardnum = strtoul(nvram_safe_get("boardnum"), NULL, 0);
486
487        if (boardnum == 8 && nvram_match("boardtype", "0x048e")
488            && nvram_match("boardrev", "0x11")) {
489                cprintf("router is ALLNET01\n");
490                setRouter("ALLNET EUROWRT 54");
491                return ROUTER_ALLNET01;
492        }
493        eval("event", "3", "1", "15");
494        return 0;
495#elif defined(HAVE_ALLNETWRT) && defined(HAVE_EOC5610)
496        setRouter("Allnet Outdoor A/B/G CPE");
497        return ROUTER_BOARD_LS2;
498#else
499#ifdef HAVE_NP28G
500        setRouter("Compex NP28G");
501        return ROUTER_BOARD_NP28G;
502#elif HAVE_WP54G
503        setRouter("Compex WP54G");
504        return ROUTER_BOARD_WP54G;
505#elif HAVE_ADM5120
506        setRouter("Tonze AP-120");
507        return ROUTER_BOARD_ADM5120;
508#elif HAVE_RB500
509        setRouter("Mikrotik RB500");
510        return ROUTER_BOARD_500;
511#elif HAVE_GEMTEK
512        setRouter("SuperGerry");
513        return ROUTER_SUPERGERRY;
514#elif HAVE_MI424WR
515        setRouter("Actiontec MI424WR");
516        return ROUTER_BOARD_GATEWORX_GW2345;
517#elif HAVE_TONZE
518        setRouter("Tonze AP-425");
519        return ROUTER_BOARD_GATEWORX;
520#elif HAVE_NOP8670
521        setRouter("Senao NOP-8670");
522        return ROUTER_BOARD_GATEWORX;
523#elif HAVE_WRT300NV2
524        setRouter("Linksys WRT300N v2");
525        return ROUTER_BOARD_GATEWORX;
526#elif HAVE_WG302V1
527        setRouter("Netgear WG302v1");
528        return ROUTER_BOARD_GATEWORX;
529#elif HAVE_WG302
530        setRouter("Netgear WG302v2");
531        return ROUTER_BOARD_GATEWORX;
532#elif HAVE_GATEWORX
533        char *filename = "/sys/devices/platform/IXP4XX-I2C.0/i2c-adapter:i2c-0/0-0051/eeprom";  /* bank2=0x100
534                                                                                                 */
535        FILE *file = fopen(filename, "r");
536
537        if (file)               // new detection scheme
538        {
539                fseek(file, 32, SEEK_SET);
540                char gwid[9];
541
542                gwid[8] = 0;
543                int ret = fread(gwid, 8, 1, file);
544
545                if (ret < 1) {
546                        fclose(file);
547                        goto old_way;
548                }
549                fclose(file);
550                if (!strncmp(gwid, "GW2347", 6)) {
551                        setRouter("Gateworks Avila GW2347");
552                        return ROUTER_BOARD_GATEWORX_SWAP;
553                }
554                if (!strncmp(gwid, "GW2357", 6)) {
555                        setRouter("Gateworks Avila GW2357");
556                        return ROUTER_BOARD_GATEWORX_SWAP;
557                }
558                if (!strncmp(gwid, "GW2353", 6)) {
559                        setRouter("Gateworks Avila GW2353");
560                        return ROUTER_BOARD_GATEWORX;
561                }
562                if (!strncmp(gwid, "GW2348-2", 8)) {
563                        setRouter("Gateworks Avila GW2348-2");
564                        return ROUTER_BOARD_GATEWORX;
565                }
566                if (!strncmp(gwid, "GW2348-4", 8)) {
567                        setRouter("Gateworks Avila GW2348-4");
568                        return ROUTER_BOARD_GATEWORX;
569                }
570                if (!strncmp(gwid, "GW2348", 6)) {
571                        setRouter("Gateworks Avila GW2348-4/2");
572                        return ROUTER_BOARD_GATEWORX;
573                }
574                if (!strncmp(gwid, "GW2358", 6)) {
575                        setRouter("Gateworks Cambria GW2358-4");
576                        return ROUTER_BOARD_GATEWORX;
577                }
578                if (!strncmp(gwid, "GW2350", 6)) {
579                        setRouter("Gateworks Cambria GW2350");
580                        return ROUTER_BOARD_GATEWORX;
581                }
582                if (!strncmp(gwid, "GW2369", 6)) {
583                        setRouter("Gateworks Avila GW2369");
584                        return ROUTER_BOARD_GATEWORX_GW2369;
585                }
586                if (!strncmp(gwid, "GW2355", 6)) {
587                        setRouter("Gateworks Avila GW2355");
588                        return ROUTER_BOARD_GATEWORX_GW2345;
589                }
590                if (!strncmp(gwid, "GW2345", 6)) {
591                        setRouter("Gateworks Avila GW2345");
592                        return ROUTER_BOARD_GATEWORX_GW2345;
593                }
594        }
595      old_way:;
596        struct mii_ioctl_data *data;
597        struct ifreq iwr;
598        int s = socket(AF_INET, SOCK_DGRAM, 0);
599
600        if (s < 0) {
601                fprintf(stderr, "socket(SOCK_DRAGM)\n");
602                setRouter("Gateworks Avila");
603                return ROUTER_BOARD_GATEWORX;
604        }
605        (void)strncpy(iwr.ifr_name, "ixp0", sizeof("ixp0"));
606        data = (struct mii_ioctl_data *)&iwr.ifr_data;
607        data->phy_id = 1;
608#define IX_ETH_ACC_MII_PHY_ID1_REG  0x2 /* PHY identifier 1 Register */
609#define IX_ETH_ACC_MII_PHY_ID2_REG  0x3 /* PHY identifier 2 Register */
610        data->reg_num = IX_ETH_ACC_MII_PHY_ID1_REG;
611        ioctl(s, SIOCGMIIREG, &iwr);
612        data->phy_id = 1;
613        data->reg_num = IX_ETH_ACC_MII_PHY_ID1_REG;
614        ioctl(s, SIOCGMIIREG, &iwr);
615        int reg1 = data->val_out;
616
617        data->phy_id = 1;
618        data->reg_num = IX_ETH_ACC_MII_PHY_ID2_REG;
619        ioctl(s, SIOCGMIIREG, &iwr);
620        int reg2 = data->val_out;
621
622        close(s);
623        fprintf(stderr, "phy id %X:%X\n", reg1, reg2);
624        if (reg1 == 0x2000 && reg2 == 0x5c90) {
625                setRouter("Avila GW2347");
626                return ROUTER_BOARD_GATEWORX_SWAP;
627        } else if (reg1 == 0x13 && reg2 == 0x7a11) {
628#if HAVE_ALFA_BRANDING
629                setRouter("WLAN base-station");
630#else
631                setRouter("Gateworks Avila GW2348-4/2");
632#endif
633                return ROUTER_BOARD_GATEWORX;
634        } else if (reg1 == 0x143 && reg2 == 0xbc31)     // broadcom phy
635        {
636                setRouter("ADI Engineering Pronghorn Metro");
637                return ROUTER_BOARD_GATEWORX;
638        } else if (reg1 == 0x22 && reg2 == 0x1450)      // kendin switch
639        {
640                setRouter("Gateworks Avila GW2345");
641                return ROUTER_BOARD_GATEWORX_GW2345;
642        } else if (reg1 == 0x0 && reg2 == 0x8201)       // realtek
643        {
644                setRouter("Compex WP188");
645                return ROUTER_BOARD_GATEWORX;
646        } else {
647                setRouter("Unknown");
648                return ROUTER_BOARD_GATEWORX;
649        }
650#elif HAVE_RT2880
651
652#ifdef HAVE_ECB9750
653#ifdef HAVE_ALLNETWRT
654        setRouter("Allnet 802.11n Router");
655#else
656        setRouter("Senao ECB-9750");
657#endif
658        return ROUTER_BOARD_ECB9750;
659#elif HAVE_ALLNET11N
660        setRouter("Allnet 802.11n Router");
661        return ROUTER_BOARD_WHRG300N;
662#elif HAVE_AR670W
663        setRouter("Airlink 101 AR670W");
664        return ROUTER_BOARD_AR670W;
665#elif HAVE_BR6574N
666        setRouter("Edimax BR-6574N");
667        return ROUTER_BOARD_BR6574N;
668#elif HAVE_ESR6650
669        setRouter("Senao ESR-6650");
670        return ROUTER_BOARD_ESR6650;
671#elif HAVE_EAP9550
672        setRouter("Senao EAP-9550");
673        return ROUTER_BOARD_EAP9550;
674#elif HAVE_ESR9752
675        setRouter("Senao ESR-9752");
676        return ROUTER_BOARD_ESR9752;
677#elif HAVE_ACXNR22
678        setRouter("Aceex NR22");
679        return ROUTER_BOARD_ACXNR22;
680#elif HAVE_DIR600
681#ifdef HAVE_DIR300
682        setRouter("Dlink-DIR300 rev b");
683#elif HAVE_DIR615
684        setRouter("Dlink-DIR615 rev d2");
685#else
686        setRouter("Dlink-DIR600 rev b");
687#endif
688        return ROUTER_BOARD_DIR600B;
689#elif HAVE_WHRG300N
690        setRouter("Buffalo WHR-G300N");
691        return ROUTER_BOARD_WHRG300N;
692#else
693        setRouter("Generic RT2880");
694        return ROUTER_BOARD_RT2880;
695#endif
696#elif HAVE_X86
697#ifdef HAVE_CORENET
698        setRouter("CORENET X86i");
699        return ROUTER_BOARD_X86;
700#else
701        setRouter("Generic X86");
702        return ROUTER_BOARD_X86;
703#endif
704#elif HAVE_XSCALE
705        setRouter("NewMedia Dual A/B/G");
706        return ROUTER_BOARD_XSCALE;
707#elif HAVE_MAGICBOX
708        setRouter("OpenRB PowerPC Board");
709        return ROUTER_BOARD_MAGICBOX;
710#elif HAVE_GWMF54G2
711        setRouter("Planex GW-MF54G2");
712        char mac[32];
713        getBoardMAC(mac);
714        if (!strncmp(mac, "00:19:3B", 8) || !strncmp(mac, "00:02:6F", 8)
715            || !strncmp(mac, "00:15:6D", 8)) {
716                fprintf(stderr, "unsupported board\n");
717                sys_reboot();
718        }
719        return ROUTER_BOARD_FONERA;
720#elif HAVE_WRT54GV7
721        setRouter("Linksys WRT54G v7");
722        return ROUTER_BOARD_FONERA;
723#elif HAVE_WRK54G
724        setRouter("Linksys WRK54G v3");
725        return ROUTER_BOARD_FONERA;
726#elif HAVE_WGT624
727        setRouter("Netgear WGT624 v4");
728        return ROUTER_BOARD_FONERA;
729#elif HAVE_NP25G
730        setRouter("Compex NP25G");
731        return ROUTER_BOARD_FONERA;
732#elif HAVE_MR3202A
733        setRouter("MR3202A");
734        return ROUTER_BOARD_FONERA;
735#elif HAVE_DLM101
736        setRouter("Doodle Labs DLM-101");
737        return ROUTER_BOARD_FONERA;
738#elif HAVE_AR430W
739        setRouter("Airlink-101 AR430W");
740        return ROUTER_BOARD_FONERA;
741#elif HAVE_DIR400
742        setRouter("D-Link DIR-400");
743        return ROUTER_BOARD_FONERA2200;
744#elif HAVE_WRT54G2
745        setRouter("Linksys WRT54G2 v1.1");
746        return ROUTER_BOARD_FONERA;
747#elif HAVE_RTG32
748        setRouter("Asus RT-G32");
749        return ROUTER_BOARD_FONERA;
750#elif HAVE_DIR300
751        setRouter("D-Link DIR-300");
752        return ROUTER_BOARD_FONERA;
753#elif HAVE_CNC
754        setRouter("WiFi4You Outdoor AP");
755        return ROUTER_BOARD_FONERA;
756#elif defined(HAVE_CORENET) && defined(HAVE_NS2)
757        setRouter("CORENET XNS2");
758        return ROUTER_BOARD_LS2;
759#elif defined(HAVE_CORENET) && defined(HAVE_LC2)
760        setRouter("CORENET XLO2");
761        return ROUTER_BOARD_LS2;
762#elif defined(HAVE_CORENET) && defined(HAVE_EOC2610)
763        setRouter("CORENET XC61");
764        return ROUTER_BOARD_FONERA;
765#elif defined(HAVE_CORENET) && defined(HAVE_EOC1650)
766        setRouter("CORENET XC65");
767        return ROUTER_BOARD_FONERA;
768#elif defined(HAVE_CORENET) && defined(HAVE_BS2)
769        setRouter("CORENET XBU2");
770        return ROUTER_BOARD_LS2;
771#elif defined(HAVE_CORENET) && defined(HAVE_BS2HP)
772        setRouter("CORENET MBU2i");
773        return ROUTER_BOARD_LS2;
774#elif HAVE_WBD500
775        setRouter("Wiligear WBD-500");
776        return ROUTER_BOARD_FONERA;
777#elif HAVE_EOC1650
778        setRouter("Senao EOC-1650");
779        return ROUTER_BOARD_FONERA;
780#elif HAVE_EOC2610
781#ifdef HAVE_TRIMAX
782        setRouter("TMAX-1200");
783#else
784        setRouter("Senao EOC-2610");
785#endif
786        return ROUTER_BOARD_FONERA;
787#elif HAVE_ECB3500
788        setRouter("Senao ECB-3500");
789        return ROUTER_BOARD_FONERA;
790#elif HAVE_EAP3660
791        setRouter("Senao EAP-3660");
792        return ROUTER_BOARD_FONERA;
793#elif HAVE_MR3201A
794        setRouter("Accton MR3201A");
795        return ROUTER_BOARD_FONERA;
796#elif HAVE_FONERA
797        struct mii_ioctl_data *data;
798        struct ifreq iwr;
799        char mac[32];
800        getBoardMAC(mac);
801        if (!strncmp(mac, "00:19:3B", 8) || !strncmp(mac, "00:02:6F", 8)
802            || !strncmp(mac, "00:15:6D", 8) || !strncmp(mac, "00:C0:CA", 8)) {
803                fprintf(stderr, "unsupported board\n");
804                sys_reboot();
805        }
806        int s = socket(AF_INET, SOCK_DGRAM, 0);
807
808        if (s < 0) {
809                fprintf(stderr, "socket(SOCK_DRAGM)\n");
810                setRouter("Fonera 2100/2200");
811                return ROUTER_BOARD_FONERA;
812        }
813        (void)strncpy(iwr.ifr_name, "eth0", sizeof("eth0"));
814        data = (struct mii_ioctl_data *)&iwr.ifr_data;
815        data->phy_id = 0x10;
816        data->reg_num = 0x2;
817        ioctl(s, SIOCGMIIREG, &iwr);
818        data->phy_id = 0x10;
819        data->reg_num = 0x2;
820        ioctl(s, SIOCGMIIREG, &iwr);
821        if (data->val_out == 0x0141) {
822                data->phy_id = 0x10;
823                data->reg_num = 0x3;
824                ioctl(s, SIOCGMIIREG, &iwr);
825                close(s);
826                if ((data->val_out & 0xfc00) != 0x0c00) // marvell phy
827                {
828                        setRouter("Fonera 2100/2200");
829                        return ROUTER_BOARD_FONERA;
830                } else {
831                        setRouter("Fonera 2201");
832                        return ROUTER_BOARD_FONERA2200;
833                }
834        } else {
835                setRouter("Fonera 2100/2200");
836                return ROUTER_BOARD_FONERA;
837        }
838#elif HAVE_MERAKI
839        setRouter("Meraki Mini");
840        return ROUTER_BOARD_MERAKI;
841#elif HAVE_BWRG1000
842        setRouter("Bountiful BWRG-1000");
843        return ROUTER_BOARD_LS2;
844#elif HAVE_WHRHPG300N
845        setRouter("Buffalo WHR-HP-G300N");
846        nvram_default_get("ath0_rxantenna", "3");
847        nvram_default_get("ath0_txantenna", "3");
848        return ROUTER_BOARD_WHRHPGN;
849#elif HAVE_WHRHPGN
850        setRouter("Buffalo WHR-HP-GN");
851        nvram_default_get("ath0_rxantenna", "1");
852        nvram_default_get("ath0_txantenna", "1");
853        return ROUTER_BOARD_WHRHPGN;
854#elif HAVE_UBNTM
855        typedef struct UBNTDEV {
856                char *devicename;       // device name
857                unsigned short devid;   // pci subdevice id
858                char *rxchain;  // rx chainmask
859                char *txchain;  // tx chainmask
860                int dddev;      // dd-wrt device id
861        };
862
863        struct UBNTDEV dev[] = {
864                {"Ubiquiti Nanostation M2", 0xe002, "3", "3", ROUTER_BOARD_NS2M},       //
865                {"Ubiquiti Nanostation M2", 0xe012, "3", "3", ROUTER_BOARD_NS2M},       //
866                {"Ubiquiti Nanostation M5", 0xe005, "3", "3", ROUTER_BOARD_NS5M},       //
867                {"Ubiquiti Rocket M2", 0xe102, "3", "3", ROUTER_BOARD_R2M},     //
868                {"Ubiquiti Rocket M2", 0xe112, "3", "3", ROUTER_BOARD_R2M},     //
869                {"Ubiquiti Rocket M5", 0xe105, "3", "3", ROUTER_BOARD_R5M},     //
870                {"Ubiquiti Bullet M2", 0xe202, "1", "1", ROUTER_BOARD_BS5M},    //
871                {"Ubiquiti Bullet M5", 0xe202, "1", "1", ROUTER_BOARD_BS5M},    //
872                {"Ubiquiti Airgrid 2M", 0xe212, "1", "1", ROUTER_BOARD_BS2M},   //
873                {"Ubiquiti Airgrid 5M", 0xe215, "1", "1", ROUTER_BOARD_BS5M},   //
874                {"Ubiquiti Pico M2", 0xe302, "1", "1", ROUTER_BOARD_BS2M},      //
875                {"Ubiquiti Pico M5", 0xe305, "1", "1", ROUTER_BOARD_BS5M},      //
876                {"Ubiquiti Airwire", 0xe405, "3", "3", ROUTER_BOARD_BS5M},      //
877                {"Ubiquiti Loco M5", 0xe0a5, "3", "3", ROUTER_BOARD_NS5M},      //
878                {"Ubiquiti Litestation M25", 0xe115, "3", "3", ROUTER_BOARD_NS5M},      //
879                {"Ubiquiti AP 1000N", 0xe402, "3", "3", ROUTER_BOARD_R2M},      //
880                {NULL, 0, NULL, NULL, 0},       //
881        };
882
883        FILE *fp =
884            fopen("/sys/bus/pci/devices/0000:00:00.0/subsystem_device", "rb");
885        if (fp == NULL)
886                return ROUTER_BOARD_PB42;
887        int device;
888        fscanf(fp, "0x%04X", &device);
889        fclose(fp);
890        int devcnt = 0;
891        while (dev[devcnt].devicename != NULL) {
892                if (dev[devcnt].devid == device) {
893                        nvram_set("ath0_rxantenna", dev[devcnt].rxchain);
894                        nvram_set("ath0_txantenna", dev[devcnt].txchain);
895                        setRouter(dev[devcnt].devicename);
896                        return dev[devcnt].dddev;
897                }
898                devcnt++;
899        }
900        setRouter("Ubiquiti Unknown Model");
901        return ROUTER_BOARD_PB42;
902#elif HAVE_NS2
903        setRouter("Ubiquiti Nanostation 2");
904        return ROUTER_BOARD_LS2;
905#elif HAVE_EOC5610
906        setRouter("Senao EOC-5610");
907        return ROUTER_BOARD_LS2;
908#elif HAVE_NS5
909        setRouter("Ubiquiti Nanostation 5");
910        return ROUTER_BOARD_LS2;
911#elif HAVE_SOLO51
912        setRouter("Alfa SoLo48-N");
913        return ROUTER_BOARD_LS2;
914#elif HAVE_NS3
915        setRouter("Ubiquiti Nanostation 3");
916        return ROUTER_BOARD_LS2;
917#elif HAVE_BS5
918        setRouter("Ubiquiti Bullet 5");
919        return ROUTER_BOARD_LS2;
920#elif HAVE_BS2
921        setRouter("Ubiquiti Bullet 2");
922        return ROUTER_BOARD_LS2;
923#elif HAVE_PICO2
924        setRouter("Ubiquiti PicoStation 2");
925        return ROUTER_BOARD_LS2;
926#elif HAVE_PICO2HP
927        setRouter("Ubiquiti PicoStation 2 HP");
928        return ROUTER_BOARD_LS2;
929#elif HAVE_PICO5
930        setRouter("Ubiquiti PicoStation 5");
931        return ROUTER_BOARD_LS2;
932#elif HAVE_MS2
933        setRouter("Ubiquiti MiniStation");
934        return ROUTER_BOARD_LS2;
935#elif HAVE_BS2HP
936        setRouter("Ubiquiti Bullet 2 HP");
937        return ROUTER_BOARD_LS2;
938#elif HAVE_LC2
939        setRouter("Ubiquiti Nanostation Loco 2");
940        return ROUTER_BOARD_LS2;
941#elif HAVE_LC5
942        setRouter("Ubiquiti Nanostation Loco 5");
943        return ROUTER_BOARD_LS2;
944#elif HAVE_PS2
945        setRouter("Ubiquiti Powerstation 2");
946        return ROUTER_BOARD_LS2;
947#elif HAVE_PS5
948        setRouter("Ubiquiti Powerstation 5");
949        return ROUTER_BOARD_LS2;
950#elif HAVE_LS2
951        setRouter("Ubiquiti Litestation 2");
952        return ROUTER_BOARD_LS2;
953#elif HAVE_LS5
954        setRouter("Ubiquiti Litestation 5");
955        return ROUTER_BOARD_LS2;
956#elif HAVE_WHRAG108
957        setRouter("Buffalo WHR-HP-AG108");
958        return ROUTER_BOARD_WHRAG108;
959#elif HAVE_PB42
960        setRouter("Atheros PB42");
961        return ROUTER_BOARD_PB42;
962#elif HAVE_RSPRO
963        setRouter("Ubiquiti RouterStation Pro");
964        return ROUTER_BOARD_PB42;
965#elif HAVE_RS
966#ifdef HAVE_DDLINK
967        setRouter("ddlink1x1");
968#else
969        setRouter("Ubiquiti RouterStation");
970#endif
971        return ROUTER_BOARD_PB42;
972#elif HAVE_WZRG300NH
973        setRouter("Buffalo WZR-G300NH");
974        return ROUTER_BOARD_PB42;
975#elif HAVE_DIR825
976        setRouter("Dlink DIR-825");
977        return ROUTER_BOARD_PB42;
978#elif HAVE_AP83
979        setRouter("Atheros AP83");
980        return ROUTER_BOARD_PB42;
981#elif HAVE_WP543
982        setRouter("Compex WP543");
983        return ROUTER_BOARD_PB42;
984#elif HAVE_LSX
985        setRouter("Ubiquiti Litestation-SR71");
986        return ROUTER_BOARD_PB42;
987#elif HAVE_DANUBE
988        setRouter("Infineon Danube");
989        return ROUTER_BOARD_DANUBE;
990#elif HAVE_STORM
991        setRouter("Wiligear WBD-111");
992        return ROUTER_BOARD_STORM;
993#elif HAVE_TW6600
994        setRouter("AW-6660");
995        return ROUTER_BOARD_TW6600;
996#elif HAVE_ALPHA
997        setRouter("Alfa Networks AP48");
998        return ROUTER_BOARD_CA8;
999#elif HAVE_USR5453
1000        setRouter("US Robotics USR5453");
1001        return ROUTER_BOARD_CA8;
1002#elif HAVE_RDAT81
1003        setRouter("Wistron RDAT-81");
1004        return ROUTER_BOARD_RDAT81;
1005#elif HAVE_RCAA01
1006        setRouter("Airlive WLA-9000AP");
1007        return ROUTER_BOARD_RCAA01;
1008#elif HAVE_CA8PRO
1009        setRouter("Wistron CA8-4 PRO");
1010        return ROUTER_BOARD_CA8PRO;
1011#elif HAVE_CA8
1012#ifdef HAVE_WHA5500CPE
1013        setRouter("Airlive WHA-5500CPE");
1014#elif HAVE_AIRMAX5
1015        setRouter("Airlive AirMax 5");
1016#else
1017        setRouter("Airlive WLA-5000AP");
1018#endif
1019        return ROUTER_BOARD_CA8;
1020#else
1021
1022        unsigned long boardnum = strtoul(nvram_safe_get("boardnum"), NULL, 0);
1023        unsigned long melco_id = strtoul(nvram_safe_get("melco_id"), NULL, 0);
1024
1025        if (boardnum == 42 && nvram_match("boardtype", "bcm94710ap")) {
1026                cprintf("router is buffalo\n");
1027                setRouter("Buffalo WBR-G54 / WLA-G54");
1028                return ROUTER_BUFFALO_WBR54G;
1029        }
1030#ifndef HAVE_BUFFALO
1031        if (nvram_match("boardnum", "mn700") &&
1032            nvram_match("boardtype", "bcm94710ap")) {
1033                cprintf("router is Microsoft MN-700\n");
1034                setRouter("Microsoft MN-700");
1035                return ROUTER_MICROSOFT_MN700;
1036        }
1037
1038        if (nvram_match("boardnum", "asusX") &&
1039            nvram_match("boardtype", "bcm94710dev")) {
1040                cprintf("router is Asus WL300g / WL500g\n");
1041                setRouter("Asus WL-300g / WL-500g");
1042                return ROUTER_ASUS_WL500G;
1043        }
1044
1045        if (boardnum == 44 && nvram_match("boardtype", "bcm94710ap")) {
1046                cprintf("router is Dell TrueMobile 2300\n");
1047                setRouter("Dell TrueMobile 2300");
1048                return ROUTER_DELL_TRUEMOBILE_2300;
1049        }
1050#endif
1051
1052        if (boardnum == 100 && nvram_match("boardtype", "bcm94710dev")) {
1053                cprintf("router is buffalo\n");
1054                setRouter("Buffalo WLA-G54C");
1055                return ROUTER_BUFFALO_WLAG54C;
1056        }
1057#ifndef HAVE_BUFFALO
1058        if (boardnum == 45 && nvram_match("boardtype", "bcm95365r")) {
1059                cprintf("router is Asus WL-500GD\n");
1060                setRouter("Asus WL-500g Deluxe");
1061                return ROUTER_ASUS_WL500GD;
1062        }
1063
1064        if (boardnum == 45 && nvram_match("boardtype", "0x04EC")
1065            && nvram_match("boardrev", "0x1402")) {
1066                cprintf("router is Asus RT-N10\n");
1067                setRouter("Asus RT-N10");
1068                return ROUTER_ASUS_RTN10;
1069        }
1070
1071        if (boardnum == 45 && nvram_match("boardtype", "0x04CD")
1072            && nvram_match("boardrev", "0x1201")) {
1073                cprintf("router is Asus RT-N12\n");
1074                setRouter("Asus RT-N12");
1075                return ROUTER_ASUS_RTN12;
1076        }
1077
1078        if (boardnum == 45 && nvram_match("boardtype", "0x04cf")
1079            && nvram_match("boardrev", "0x1218")) {
1080                cprintf("router is Asus RT-N16\n");
1081                setRouter("Asus RT-N16");
1082                return ROUTER_ASUS_RTN16;
1083        }
1084
1085        if (boardnum == 45 && nvram_match("boardtype", "0x0472")
1086            && nvram_match("boardrev", "0x23") && nvram_match("parkid", "1")) {
1087                cprintf("router is Asus WL-500W\n");
1088                setRouter("Asus WL-500W");
1089                return ROUTER_ASUS_WL500W;
1090        }
1091
1092        if (boardnum == 45 && nvram_match("boardtype", "0x467")) {
1093                char *hwver0 = nvram_safe_get("hardware_version");
1094
1095                if (startswith(hwver0, "WL320G")) {
1096                        cprintf("router is Asus WL-320gE/gP\n");
1097                        setRouter("Asus WL-320gE/gP");
1098                        return ROUTER_ASUS_WL550GE;
1099                } else {
1100                        cprintf("router is Asus WL-550gE\n");
1101                        setRouter("Asus WL-550gE");
1102                        return ROUTER_ASUS_WL550GE;
1103                }
1104        }
1105#endif
1106        if (nvram_match("boardnum", "00") && nvram_match("boardtype", "0x0101")
1107            && nvram_match("boardrev", "0x10")) {
1108                cprintf("router is Buffalo wbr2\n");
1109                setRouter("Buffalo WBR2-G54 / WBR2-G54S");
1110                return ROUTER_BUFFALO_WBR2G54S;
1111        }
1112
1113        if (boardnum == 2 && nvram_match("boardtype", "0x0101")
1114            && nvram_match("boardrev", "0x10")) {
1115                cprintf("router is buffalo wla2-g54c\n");
1116                setRouter("Buffalo WLA2-G54C / WLI3-TX1-G54");
1117                return ROUTER_BUFFALO_WLA2G54C;
1118        }
1119        if (boardnum == 0 && melco_id == 29090
1120            && nvram_match("boardrev", "0x10")) {
1121                cprintf("router is Buffalo WLAH-G54\n");
1122                setRouter("Buffalo WLAH-G54");
1123                return ROUTER_BUFFALO_WLAH_G54;
1124
1125        }
1126        if (boardnum == 0 && melco_id == 31070
1127            && nvram_match("boardflags", "0x2288")
1128            && nvram_match("boardrev", "0x10")) {
1129                cprintf("router is Buffalo WAPM-HP-AM54G54\n");
1130                setRouter("Buffalo WAPM-HP-AM54G54");
1131                return ROUTER_BUFFALO_WAPM_HP_AM54G54;
1132        }
1133        if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x11")
1134            && nvram_match("boardtype", "0x048e") && melco_id == 32093) {
1135                cprintf("router is Buffalo WHR-G125\n");
1136                setRouter("Buffalo WHR-G125");
1137                return ROUTER_BUFFALO_WHRG54S;
1138        }
1139
1140        if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x10")
1141            && nvram_match("boardtype", "0x048e") && melco_id == 32139) {
1142                cprintf("router is Buffalo WCA-G\n");
1143                setRouter("Buffalo WCA-G");
1144                return ROUTER_BUFFALO_WCAG;     //vlan1 is lan, vlan0 is unused, implementation not done. will me made after return to germany
1145        }
1146
1147        if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x11")
1148            && nvram_match("boardtype", "0x048e") && melco_id == 32064) {
1149                cprintf("router is Buffalo WHR-HP-G125\n");
1150                setRouter("Buffalo WHR-HP-G125");
1151                return ROUTER_BUFFALO_WHRG54S;
1152        }
1153
1154        if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x13")
1155            && nvram_match("boardtype", "0x467")) {
1156                if (nvram_match("boardflags", "0x1658")
1157                    || nvram_match("boardflags", "0x2658")
1158                    || nvram_match("boardflags", "0x3658")) {
1159                        cprintf("router is Buffalo WLI-TX4-G54HP\n");
1160                        setRouter("Buffalo WLI-TX4-G54HP");
1161                        return ROUTER_BUFFALO_WLI_TX4_G54HP;
1162                }
1163                if (!nvram_match("buffalo_hp", "1")
1164                    && nvram_match("boardflags", "0x2758")) {
1165                        cprintf("router is Buffalo WHR-G54S\n");
1166                        setRouter("Buffalo WHR-G54S");
1167                        return ROUTER_BUFFALO_WHRG54S;
1168                }
1169                if (nvram_match("buffalo_hp", "1")
1170                    || nvram_match("boardflags", "0x1758")) {
1171#ifndef HAVE_BUFFALO
1172                        cprintf("router is Buffalo WHR-HP-G54\n");
1173                        setRouter("Buffalo WHR-HP-G54");
1174#else
1175                        cprintf("router is Buffalo WHR-HP-G54DD\n");
1176#ifdef BUFFALO_JP
1177                        setRouter("Buffalo AS-A100");
1178#else
1179                        setRouter("Buffalo WHR-HP-G54DD");
1180#endif
1181#endif
1182                        return ROUTER_BUFFALO_WHRG54S;
1183                }
1184        }
1185
1186        if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x10")
1187            && nvram_match("boardtype", "0x470")) {
1188                cprintf("router is Buffalo WHR-AM54G54\n");
1189                setRouter("Buffalo WHR-AM54G54");
1190                return ROUTER_BUFFALO_WHRAM54G54;
1191        }
1192
1193        if (boardnum == 42 && nvram_match("boardtype", "0x042f")) {
1194
1195                if (nvram_match("product_name", "WZR-RS-G54")
1196                    || melco_id == 30083) {
1197                        cprintf("router is Buffalo WZR-RS-G54\n");
1198                        setRouter("Buffalo WZR-RS-G54");
1199                        return ROUTER_BUFFALO_WZRRSG54;
1200                }
1201                if (nvram_match("product_name", "WZR-HP-G54")
1202                    || melco_id == 30026) {
1203                        cprintf("router is Buffalo WZR-HP-G54\n");
1204                        setRouter("Buffalo WZR-HP-G54");
1205                        return ROUTER_BUFFALO_WZRRSG54;
1206                }
1207                if (nvram_match("product_name", "WZR-G54") || melco_id == 30061) {
1208                        cprintf("router is Buffalo WZR-G54\n");
1209                        setRouter("Buffalo WZR-G54");
1210                        return ROUTER_BUFFALO_WZRRSG54;
1211                }
1212                if (nvram_match("melco_id", "290441dd")) {
1213                        cprintf("router is Buffalo WHR2-A54G54\n");
1214                        setRouter("Buffalo WHR2-A54G54");
1215                        return ROUTER_BUFFALO_WZRRSG54;
1216                }
1217                if (nvram_match("product_name", "WHR3-AG54")
1218                    || nvram_match("product_name", "WHR3-B11")
1219                    || melco_id == 29130) {
1220                        cprintf("router is Buffalo WHR3-AG54\n");
1221                        setRouter("Buffalo WHR3-AG54");
1222                        return ROUTER_BUFFALO_WZRRSG54;
1223                }
1224                if (nvram_match("product_name", "WVR-G54-NF")
1225                    || melco_id == 28100) {
1226                        cprintf("router is Buffalo WVR-G54-NF\n");
1227                        setRouter("Buffalo WVR-G54-NF");
1228                        return ROUTER_BUFFALO_WZRRSG54;
1229                }
1230                if (nvram_match("product_name", "WZR-G108") || melco_id == 31095
1231                    || melco_id == 30153) {
1232                        cprintf("router is Buffalo WZR-G108\n");
1233                        setRouter("Buffalo WZR-G108");
1234                        return ROUTER_BRCM4702_GENERIC;
1235                }
1236                if (melco_id > 0)       // e.g. 29115
1237                {
1238                        cprintf("router is Buffalo WZR series\n");
1239                        setRouter("Buffalo WZR series");
1240                        return ROUTER_BUFFALO_WZRRSG54;
1241                }
1242        }
1243#ifndef HAVE_BUFFALO
1244        if (boardnum == 42 && nvram_match("boardtype", "0x042f")
1245            && nvram_match("boardrev", "0x10"))
1246                // nvram_match ("boardflags","0x0018"))
1247        {
1248                cprintf("router is Linksys WRTSL54GS\n");
1249                setRouter("Linksys WRTSL54GS");
1250                return ROUTER_WRTSL54GS;
1251        }
1252
1253        if (boardnum == 42 && nvram_match("boardtype", "0x0101")
1254            && nvram_match("boardrev", "0x10")
1255            && nvram_match("boot_ver", "v3.6")) {
1256                cprintf("router is Linksys WRT54G3G\n");
1257                setRouter("Linksys WRT54G3G");
1258                return ROUTER_WRT54G3G;
1259        }
1260
1261        if (nvram_match("boardtype", "0x042f")
1262            && nvram_match("boardrev", "0x10")) {
1263                char *hwver = nvram_safe_get("hardware_version");
1264
1265                if (boardnum == 45 || startswith(hwver, "WL500gp")
1266                    || startswith(hwver, "WL500gH")) {
1267                        cprintf("router is Asus WL-500g Premium\n");
1268                        setRouter("Asus WL-500g Premium");
1269                        return ROUTER_ASUS_WL500G_PRE;
1270                }
1271        }
1272
1273        char *et0 = nvram_safe_get("et0macaddr");
1274
1275        if (boardnum == 100 && nvram_match("boardtype", "bcm94710r4")) {
1276                if (startswith(et0, "00:11:50")) {
1277                        cprintf("router is Belkin F5D7130 / F5D7330\n");
1278                        setRouter("Belkin F5D7130 / F5D7330");
1279                        return ROUTER_RT210W;
1280                }
1281                if (startswith(et0, "00:30:BD") || startswith(et0, "00:30:bd")) {
1282                        cprintf("router is Belkin F5D7230 v1000\n");
1283                        setRouter("Belkin F5D7230-4 v1000");
1284                        return ROUTER_RT210W;
1285                }
1286                if (startswith(et0, "00:01:E3") ||
1287                    startswith(et0, "00:01:e3") || startswith(et0, "00:90:96"))
1288                {
1289                        cprintf("router is Siemens\n");
1290                        setRouter("Siemens SE505 v1");
1291                        return ROUTER_RT210W;
1292                } else {
1293                        cprintf("router is Askey generic\n");
1294                        setRouter("RT210W generic");
1295                        return ROUTER_RT210W;
1296                }
1297        }
1298
1299        if (nvram_match("boardtype", "bcm94710r4")
1300            && nvram_match("boardnum", "")) {
1301                cprintf("router is Askey board RT2100W\n");
1302                setRouter("Askey board RT2100W-D65)");
1303                return ROUTER_BRCM4702_GENERIC;
1304        }
1305
1306        if (boardnum == 0 && nvram_match("boardtype", "0x0100")
1307            && nvram_match("boardrev", "0x10")) {
1308                cprintf("router is Askey board RT2205(6)D-D56\n");
1309                if (startswith(et0, "00:11:50") ||
1310                    startswith(et0, "00:30:BD") || startswith(et0, "00:30:bd"))
1311                {
1312                        setRouter("Askey board RT2205(6)D-D56");
1313                } else {
1314                        setRouter("Belkin board F5D8230");
1315                }
1316                return ROUTER_ASKEY_RT220XD;
1317        }
1318
1319        if (nvram_match("boardtype", "0x0101")) {
1320                if (startswith(et0, "00:11:50") ||
1321                    startswith(et0, "00:30:BD") || startswith(et0, "00:30:bd"))
1322                {
1323                        if (nvram_match("Belkin_ver", "2000")) {
1324                                cprintf("router is Belkin F5D7230-4 v2000\n");
1325                                setRouter("Belkin F5D7230-4 v2000");
1326                                return ROUTER_BELKIN_F5D7230_V2000;
1327                        } else {
1328                                cprintf("router is Belkin F5D7230-4 v1444\n");
1329                                setRouter("Belkin F5D7230-4 v1444");
1330                                return ROUTER_RT480W;
1331                        }
1332                }
1333                if (startswith(et0, "00:01:E3") ||
1334                    startswith(et0, "00:01:e3") || startswith(et0, "00:90:96"))
1335                {
1336                        cprintf("router is Siemens / Askey\n");
1337                        setRouter("Siemens SE505 v2");
1338                        return ROUTER_RT480W;
1339                }
1340        }
1341        if (boardnum == 1 && nvram_match("boardtype", "0x456")
1342            && nvram_match("test_led_gpio", "2")) {
1343                cprintf("router is Belkin F5D7230-4 v3000\n");
1344                setRouter("Belkin F5D7230-4 v3000");
1345                return ROUTER_BELKIN_F5D7230_V3000;
1346        }
1347
1348        if (nvram_match("boardtype", "0x456")
1349            && nvram_match("hw_model", "F5D7231-4")) {
1350                cprintf("router is Belkin F5D7231-4 v1212UK\n");
1351                setRouter("Belkin F5D7231-4 v1212UK");
1352                return ROUTER_BELKIN_F5D7231;
1353        }
1354
1355        if (boardnum == 8 && nvram_match("boardtype", "0x0467"))        // fccid:
1356                // K7SF5D7231B
1357        {
1358                cprintf("router is Belkin F5D7231-4 v2000\n");
1359                setRouter("Belkin F5D7231-4 v2000");
1360                return ROUTER_BELKIN_F5D7231_V2000;
1361        }
1362
1363        if (nvram_match("boardtype", "0x467")) {
1364                if (startswith(et0, "00:11:50") ||
1365                    startswith(et0, "00:30:BD") || startswith(et0, "00:30:bd"))
1366                {
1367                        cprintf("router is Belkin F5D7231-4 v2000\n");
1368                        setRouter("Belkin F5D7231-4 v2000");
1369                        return ROUTER_BELKIN_F5D7231;
1370                }
1371        }
1372#endif
1373        if (boardnum == 2 && nvram_match("boardtype", "bcm94710dev") && melco_id == 29016)      // Buffalo
1374                // WLI2-TX1-G54)
1375        {
1376                cprintf("router is Buffalo WLI2-TX1-G54\n");
1377                setRouter("Buffalo WLI2-TX1-G54");
1378                return ROUTER_BUFFALO_WLI2_TX1_G54;
1379        }
1380#ifndef HAVE_BUFFALO
1381
1382        char *gemtek = nvram_safe_get("GemtekPmonVer");
1383        unsigned long gemteknum = strtoul(gemtek, NULL, 0);
1384
1385        if (boardnum == 2 && (gemteknum == 10 || gemteknum == 11) &&
1386            (startswith(et0, "00:0C:E5") ||
1387             startswith(et0, "00:0c:e5") ||
1388             startswith(et0, "00:11:22") ||
1389             startswith(et0, "00:0C:10") ||
1390             startswith(et0, "00:0c:10") ||
1391             startswith(et0, "00:0C:11") || startswith(et0, "00:0c:11"))) {
1392                cprintf("router Motorola WE800G v1\n");
1393                setRouter("Motorola WE800G v1");
1394                return ROUTER_MOTOROLA_WE800G;
1395        }
1396
1397        if (boardnum == 2
1398            && (startswith(gemtek, "RC") || gemteknum == 1 || gemteknum == 10))
1399        {
1400                cprintf("router is Linksys wap54g v1.x\n");
1401                setRouter("Linksys WAP54G v1.x");
1402                return ROUTER_WAP54G_V1;
1403        }
1404
1405        if (boardnum == 2 && gemteknum == 1) {
1406                cprintf("router is Sitecom wl-105b\n");
1407                setRouter("Sitecom WL-105(b)");
1408                return ROUTER_SITECOM_WL105B;
1409        }
1410
1411        if (boardnum == 2 && gemteknum == 7
1412            && nvram_match("boardtype", "bcm94710dev")) {
1413                cprintf("router is Sitecom wl-111\n");
1414                setRouter("Sitecom WL-111");
1415                return ROUTER_SITECOM_WL111;
1416        }
1417
1418        if (gemteknum == 9)     // Must be Motorola wr850g v1 or we800g v1 or
1419                // Linksys wrt55ag v1
1420        {
1421                if (startswith(et0, "00:0C:E5") ||
1422                    startswith(et0, "00:0c:e5") ||
1423                    startswith(et0, "00:0C:10") ||
1424                    startswith(et0, "00:0c:10") ||
1425                    startswith(et0, "00:0C:11") ||
1426                    startswith(et0, "00:0c:11") ||
1427                    startswith(et0, "00:11:22") ||
1428                    startswith(et0, "00:0C:90") || startswith(et0, "00:0c:90"))
1429                {
1430                        if (!strlen(nvram_safe_get("phyid_num"))) {
1431                                insmod("switch-core");  // get phy type
1432                                insmod("switch-robo");
1433                                rmmod("switch-robo");
1434                                rmmod("switch-core");
1435                                nvram_set("boardnum", "2");
1436                                nvram_set("boardtype", "bcm94710dev");
1437                        }
1438                        if (nvram_match("phyid_num", "0x00000000")) {
1439                                cprintf("router Motorola WE800G v1\n");
1440                                setRouter("Motorola WE800G v1");
1441                                return ROUTER_MOTOROLA_WE800G;
1442                        } else  // phyid_num == 0xffffffff
1443                        {
1444                                cprintf("router Motorola WR850G v1\n");
1445                                setRouter("Motorola WR850G v1");
1446                                return ROUTER_MOTOROLA_V1;
1447                        }
1448                } else {
1449                        cprintf("router is linksys WRT55AG\n");
1450                        setRouter("Linksys WRT55AG v1");
1451                        return ROUTER_LINKSYS_WRT55AG;
1452                }
1453        }
1454#endif
1455        if (boardnum == 0 && nvram_match("boardtype", "0x478")
1456            && nvram_match("cardbus", "0") && nvram_match("boardrev", "0x10")
1457            && nvram_match("boardflags", "0x110") && melco_id == 32027) {
1458                setRouter("Buffalo WZR-G144NH");
1459                return ROUTER_BUFFALO_WZRG144NH;
1460        }
1461
1462        if (boardnum == 20060330 && nvram_match("boardtype", "0x0472")) {
1463                setRouter("Buffalo WZR-G300N");
1464                return ROUTER_BUFFALO_WZRG300N;
1465        }
1466#ifndef HAVE_BUFFALO
1467
1468        if (boardnum == 8 && nvram_match("boardtype", "0x0472")
1469            && nvram_match("cardbus", "1")) {
1470                cprintf("router is Netgear WNR834B\n");
1471                setRouter("Netgear WNR834B");
1472                return ROUTER_NETGEAR_WNR834B;
1473        }
1474
1475        if (boardnum == 1 && nvram_match("boardtype", "0x0472")
1476            && nvram_match("boardrev", "0x23")) {
1477                if (nvram_match("cardbus", "1")) {
1478                        cprintf("router is Netgear WNR834B v2\n");
1479                        setRouter("Netgear WNR834B v2");
1480                        return ROUTER_NETGEAR_WNR834BV2;
1481                } else {
1482                        cprintf("router is Netgear WNDR-3300\n");
1483                        setRouter("Netgear WNDR3300");
1484                        return ROUTER_NETGEAR_WNDR3300;
1485                }
1486        }
1487
1488        if (boardnum == 42)     // Get Linksys N models
1489        {
1490                if (nvram_match("boot_hw_model", "WRT300N")
1491                    && nvram_match("boot_hw_ver", "1.1")) {
1492                        setRouter("Linksys WRT300N v1.1");
1493                        return ROUTER_WRT300NV11;
1494                } else if (nvram_match("boot_hw_model", "WRT150N")
1495                           && nvram_match("boot_hw_ver", "1")) {
1496                        setRouter("Linksys WRT150N v1");
1497                        return ROUTER_WRT150N;
1498                } else if (nvram_match("boot_hw_model", "WRT150N")
1499                           && nvram_match("boot_hw_ver", "1.1")) {
1500                        setRouter("Linksys WRT150N v1.1");
1501                        // return ROUTER_WRT150NV11;
1502                        return ROUTER_WRT150N;
1503                } else if (nvram_match("boot_hw_model", "WRT150N")
1504                           && nvram_match("boot_hw_ver", "1.2")) {
1505                        setRouter("Linksys WRT150N v1.2");
1506                        // return ROUTER_WRT150NV12;
1507                        return ROUTER_WRT150N;
1508                } else if (nvram_match("boot_hw_model", "WRT160N")
1509                           && nvram_match("boot_hw_ver", "1.0")) {
1510                        setRouter("Linksys WRT160N");
1511                        return ROUTER_WRT160N;
1512                } else if (nvram_match("boot_hw_model", "WRT160N")
1513                           && nvram_match("boot_hw_ver", "3.0")) {
1514                        setRouter("Linksys WRT160Nv3");
1515                        return ROUTER_WRT160NV3;
1516                } else if (nvram_match("boot_hw_model", "WRT310N")
1517                           && nvram_match("boot_hw_ver", "1.0")) {
1518                        setRouter("Linksys WRT310N");
1519                        return ROUTER_WRT310N;
1520                } else if (nvram_match("boot_hw_model", "WRT310N")
1521                           && nvram_match("boot_hw_ver", "2.0")) {
1522                        setRouter("Linksys WRT310Nv2");
1523                        return ROUTER_WRT310NV2;
1524                }
1525        }
1526
1527        if (boardnum == 42 && nvram_match("boardtype", "0x0472")
1528            && nvram_match("cardbus", "1")) {
1529                setRouter("Linksys WRT300N v1");
1530                return ROUTER_WRT300N;
1531        }
1532
1533        if (boardnum == 42 &&
1534            nvram_match("boardtype", "0x478") && nvram_match("cardbus", "1")) {
1535                cprintf("router is Linksys WRT350N\n");
1536                setRouter("Linksys WRT350N");
1537                return ROUTER_WRT350N;
1538        }
1539
1540        if (nvram_match("boardnum", "20070615") &&
1541            nvram_match("boardtype", "0x478") && nvram_match("cardbus", "0")
1542            && nvram_match("switch_type", "BCM5395")) {
1543                cprintf("router is Linksys WRT600N v1.1\n");
1544                setRouter("Linksys WRT600N v1.1");
1545                return ROUTER_WRT600N;
1546        }
1547
1548        if (nvram_match("boardnum", "20070615") &&
1549            nvram_match("boardtype", "0x478") && nvram_match("cardbus", "0")) {
1550                cprintf("router is Linksys WRT600N\n");
1551                setRouter("Linksys WRT600N");
1552                return ROUTER_WRT600N;
1553        }
1554
1555        if (nvram_match("boardtype", "0x478")
1556            && nvram_match("boot_hw_model", "WRT610N")) {
1557                cprintf("router is Linksys WRT610N\n");
1558                setRouter("Linksys WRT610N");
1559                return ROUTER_WRT610N;
1560        }
1561
1562        if (nvram_match("boardtype", "0x04cf")
1563            && nvram_match("boot_hw_model", "WRT610N")) {
1564                cprintf("router is Linksys WRT610Nv2\n");
1565                setRouter("Linksys WRT610Nv2");
1566                return ROUTER_WRT610NV2;
1567        }
1568
1569        if (boardnum == 42 && nvram_match("boardtype", "bcm94710dev")) {
1570                cprintf("router is Linksys WRT54G v1.x\n");
1571                setRouter("Linksys WRT54G v1.x");
1572                return ROUTER_WRT54G1X;
1573        }
1574
1575        if ((boardnum == 1 || boardnum == 0)
1576            && nvram_match("boardtype", "0x0446")) {
1577                cprintf("router is U.S. Robotics USR5430\n");
1578                setRouter("U.S.Robotics USR5430");
1579                return ROUTER_USR_5430;
1580        }
1581
1582        if (boardnum == 1 && nvram_match("boardtype", "0x456")
1583            && nvram_match("test_led_gpio", "0")) {
1584                cprintf("router is Netgear WG602 v3\n");
1585                setRouter("Netgear WG602 v3");
1586                return ROUTER_NETGEAR_WG602_V3;
1587        }
1588
1589        if (boardnum == 10496 && nvram_match("boardtype", "0x456")) {
1590                cprintf("router is U.S. Robotics USR5461\n");
1591                setRouter("U.S.Robotics USR5461");
1592                return ROUTER_USR_5461;
1593        }
1594
1595        if (boardnum == 10500 && nvram_match("boardtype", "0x456")) {
1596                cprintf("router is U.S. Robotics USR5432\n");
1597                setRouter("U.S.Robotics USR5432");
1598                return ROUTER_USR_5461; // should work in the same way
1599        }
1600
1601        if (boardnum == 10506 && nvram_match("boardtype", "0x456")) {
1602                cprintf("router is U.S. Robotics USR5451\n");
1603                setRouter("U.S.Robotics USR5451");
1604                return ROUTER_USR_5461; // should work in the same way
1605        }
1606
1607        if (boardnum == 10512 && nvram_match("boardtype", "0x456")) {
1608                cprintf("router is U.S. Robotics USR5441\n");
1609                setRouter("U.S.Robotics USR5441");
1610                return ROUTER_USR_5461; // should work in the same way
1611        }
1612
1613        if ((boardnum == 35324 || boardnum == 38256)
1614            && nvram_match("boardtype", "0x048e")) {
1615                cprintf("router is U.S. Robotics USR5465\n");
1616                setRouter("U.S.Robotics USR5465");
1617                return ROUTER_USR_5465;
1618        }
1619
1620        if (boardnum == 35334 && nvram_match("boardtype", "0x048e")) {
1621                cprintf("router is U.S. Robotics USR5455\n");
1622                setRouter("U.S.Robotics USR5455");
1623                return ROUTER_USR_5465; // should work in the same way
1624        }
1625
1626        if (boardnum == 1024 && nvram_match("boardtype", "0x0446")) {
1627                char *cfe = nvram_safe_get("cfe_version");
1628
1629                if (strstr(cfe, "WRE54G")) {
1630                        cprintf("router is Linksys WRE54Gv1\n");
1631                        setRouter("Linksys WRE54G v1");
1632                        return ROUTER_WAP54G_V2;
1633                } else if (strstr(cfe, "iewsonic")) {
1634                        cprintf("router is Viewsonic WAPBR-100\n");
1635                        setRouter("Viewsonic WAPBR-100");
1636                        return ROUTER_VIEWSONIC_WAPBR_100;
1637                } else {
1638                        cprintf("router is Linksys WAP54G v2\n");
1639                        setRouter("Linksys WAP54G v2");
1640                        return ROUTER_WAP54G_V2;
1641                }
1642        }
1643
1644        if (nvram_invmatch("CFEver", "")) {
1645                char *cfe = nvram_safe_get("CFEver");
1646
1647                if (!strncmp(cfe, "MotoWR", 6)) {
1648                        cprintf("router is motorola\n");
1649                        setRouter("Motorola WR850G v2/v3");
1650                        return ROUTER_MOTOROLA;
1651                }
1652        }
1653
1654        if (boardnum == 44 && (nvram_match("boardtype", "0x0101")
1655                               || nvram_match("boardtype", "0x0101\r"))) {
1656                char *cfe = nvram_safe_get("CFEver");
1657
1658                if (!strncmp(cfe, "GW_WR110G", 9)) {
1659                        cprintf("router is Sparklan WX-6615GT\n");
1660                        setRouter("Sparklan WX-6615GT");
1661                        return ROUTER_DELL_TRUEMOBILE_2300_V2;
1662                } else {
1663                        cprintf("router is Dell TrueMobile 2300 v2\n");
1664                        setRouter("Dell TrueMobile 2300 v2");
1665                        return ROUTER_DELL_TRUEMOBILE_2300_V2;
1666                }
1667        }
1668#endif
1669        if (nvram_match("boardtype", "bcm94710ap")) {
1670                cprintf("router is Buffalo old 4710\n");
1671                setRouter("Buffalo WBR-B11");
1672                return ROUTER_BUFFALO_WBR54G;
1673        }
1674#ifndef HAVE_BUFFALO
1675        if (boardnum == 0 && nvram_match("boardtype", "0x048e") &&      // cfe sets boardnum="", strtoul -> 0
1676            nvram_match("boardrev", "0x35")) {
1677                cprintf("router is D-Link DIR-320\n");
1678                setRouter("D-Link DIR-320");
1679                // apply some fixes
1680                if (nvram_get("vlan2ports") != NULL) {
1681                        nvram_unset("vlan2ports");
1682                        nvram_unset("vlan2hwname");
1683                }
1684                return ROUTER_DLINK_DIR320;
1685        }
1686        if (nvram_match("model_name", "DIR-330") &&
1687            nvram_match("boardrev", "0x10")) {
1688                cprintf("router is D-Link DIR-330\n");
1689                setRouter("D-Link DIR-330");
1690                nvram_set("wan_ifnames", "eth0");       // quirk
1691                nvram_set("wan_ifname", "eth0");
1692                if (nvram_match("et0macaddr", "00:90:4c:4e:00:0c")) {
1693                        FILE *in = fopen("/dev/mtdblock/1", "rb");
1694
1695                        fseek(in, 0x7a0022, SEEK_SET);
1696                        char mac[32];
1697
1698                        fread(mac, 32, 1, in);
1699                        fclose(in);
1700                        mac[17] = 0;
1701                        if (sv_valid_hwaddr(mac)) {
1702                                nvram_set("et0macaddr", mac);
1703                                fprintf(stderr, "restore D-Link MAC\n");
1704                                nvram_commit();
1705                                sys_reboot();
1706                        }
1707                }
1708                /*
1709                 * if (nvram_get("vlan2ports")!=NULL) { nvram_unset("vlan2ports");
1710                 * nvram_unset("vlan2hwname"); }
1711                 */
1712                return ROUTER_DLINK_DIR330;
1713        }
1714        if (boardnum == 42 && nvram_match("boardtype", "0x048e")
1715            && nvram_match("boardrev", "0x10")) {
1716                if (nvram_match("boardflags", "0x20750")) {
1717                        cprintf("router is wrt54g2v1/v1.3/gs2v1\n");
1718                        setRouter("Linksys WRT54G2 / GS2");
1719                } else {
1720                        cprintf("router is wrt54gv8/gsv7\n");
1721                        setRouter("Linksys WRT54Gv8 / GSv7");
1722                }
1723                return ROUTER_WRT54G_V8;
1724        }
1725
1726        if (boardnum == 8 && nvram_match("boardtype", "0x048e")
1727            && nvram_match("boardrev", "0x11")) {
1728                cprintf("router is ALLNET01\n");
1729                setRouter("ALLNET EUROWRT 54");
1730                return ROUTER_ALLNET01;
1731        }
1732
1733        if (boardnum == 01 && nvram_match("boardtype", "0x048e")
1734            && nvram_match("boardrev", "0x11")
1735            && (nvram_match("boardflags", "0x650")
1736                || nvram_match("boardflags", "0x0458"))) {
1737                cprintf("router is Netgear WG602 v4\n");
1738                setRouter("Netgear WG602 v4");
1739                return ROUTER_NETGEAR_WG602_V4;
1740        }
1741
1742        if (boardnum == 1 && nvram_match("boardtype", "0x048e")
1743            && nvram_match("boardrev", "0x35")
1744            && nvram_match("parefldovoltage", "0x28")) {
1745                cprintf("router is netcore nw618\n");
1746                setRouter("NetCore NW618");
1747                return ROUTER_WRT54G;
1748        }
1749
1750        if (boardnum == 42 && nvram_match("boardtype", "0x048E")
1751            && nvram_match("boardrev", "0x10")) {
1752                cprintf("router is Linksys WRH54G\n");
1753                setRouter("Linksys WRH54G");
1754                return ROUTER_LINKSYS_WRH54G;
1755        }
1756
1757        if (nvram_match("boardnum", "00") && nvram_match("boardtype", "0x048E")
1758            && nvram_match("boardrev", "0x10")) {
1759                cprintf("router is Linksys WRT54G v8.1\n");
1760                setRouter("Linksys WRT54G v8.1");
1761                return ROUTER_WRT54G_V81;
1762        }
1763
1764        if (boardnum == 45 && nvram_match("boardtype", "0x456")) {
1765                cprintf("router is Asus WL-520G\n");
1766                setRouter("Asus WL-520G");
1767                return ROUTER_ASUS_WL520G;
1768        }
1769
1770        if (nvram_match("boardtype", "0x48E")
1771            && nvram_match("boardrev", "0x10")) {
1772                char *hwver = nvram_safe_get("hardware_version");
1773
1774                if (boardnum == 45 && startswith(hwver, "WL500GPV2")) {
1775                        cprintf("router is Asus WL-500G Premium V2\n");
1776                        setRouter("Asus WL-500G Premium V2");
1777                        return ROUTER_ASUS_WL500G_PRE_V2;
1778                } else if (boardnum == 45 && startswith(hwver, "WL330GE")) {
1779                        cprintf("router is Asus WL-330GE\n");
1780                        setRouter("Asus WL-330GE");
1781                        return ROUTER_ASUS_330GE;
1782                } else if (boardnum == 45 || startswith(hwver, "WL500GU")
1783                           || startswith(hwver, "WL500GC")) {
1784                        cprintf("router is Asus WL-520GU/GC\n");
1785                        setRouter("Asus WL-520GU/GC");
1786                        return ROUTER_ASUS_WL520GUGC;
1787                }
1788        }
1789
1790        if ((boardnum == 83258 || boardnum == 1 || boardnum == 0123)    //or 01 or 001 or 0x01
1791            && (nvram_match("boardtype", "0x048e") || nvram_match("boardtype", "0x48E")) && (nvram_match("boardrev", "0x11") || nvram_match("boardrev", "0x10")) && (nvram_match("boardflags", "0x750") || nvram_match("boardflags", "0x0750")) && nvram_match("sdram_init", "0x000A")) //16 MB ram
1792        {
1793                cprintf("router is Netgear WGR614v8/L/WW\n");
1794                setRouter("Netgear WGR614v8/L/WW");
1795                return ROUTER_NETGEAR_WGR614L;
1796        }
1797
1798        if (boardnum == 3805 && nvram_match("boardtype", "0x48E")
1799            && nvram_match("boardrev", "0x10")) {
1800                cprintf("router is Netgear WGR614v9\n");
1801                setRouter("Netgear WGR614v9");
1802                return ROUTER_NETGEAR_WGR614V9;
1803        }
1804
1805        if (boardnum == 56 && nvram_match("boardtype", "0x456")
1806            && nvram_match("boardrev", "0x10")) {
1807                cprintf("router is wtr54gs\n");
1808                setRouter("Linksys WTR54GS");
1809                return ROUTER_LINKSYS_WTR54GS;
1810        }
1811
1812        if (nvram_match("boardnum", "WAP54GV3_8M_0614")
1813            && (nvram_match("boardtype", "0x0467")
1814                || nvram_match("boardtype", "0x467"))
1815            && nvram_match("WAPver", "3")) {
1816                cprintf("router is WAP54G v3.x\n");
1817                setRouter("Linksys WAP54G v3.x");
1818                return ROUTER_WAP54G_V3;
1819        }
1820
1821        if ((boardnum == 1 || boardnum == 3500)
1822            && nvram_match("boardtype", "0x04CF")
1823            && (nvram_match("boardrev", "0x1213")
1824                || nvram_match("boardrev", "02"))) {
1825                cprintf("router is wnr3500v2/U/L\n");
1826                setRouter("Netgear WNR3500v2/U/L");
1827                return ROUTER_NETGEAR_WNR3500L;
1828        }
1829
1830        if ((boardnum == 42 || boardnum == 66)
1831            && nvram_match("boardtype", "0x04EF")
1832            && (nvram_match("boardrev", "0x1304")
1833                || nvram_match("boardrev", "0x1305"))) {
1834                cprintf("router is wrt320n\n");
1835                setRouter("Linksys WRT320N");
1836                return ROUTER_WRT320N;
1837        }
1838
1839        setRouter("Linksys WRT54G/GL/GS");
1840        cprintf("router is wrt54g\n");
1841        return ROUTER_WRT54G;
1842#else
1843        eval("event", "3", "1", "15");
1844        return 0;
1845#endif
1846#endif
1847#endif
1848}
1849
1850static int router_type = -1;
1851int getRouterBrand()
1852{
1853        if (router_type == -1)
1854                router_type = internal_getRouterBrand();
1855        return router_type;
1856}
1857
1858int get_ppp_pid(char *file)
1859{
1860        char buf[80];
1861        int pid = -1;
1862
1863        if (file_to_buf(file, buf, sizeof(buf))) {
1864                char tmp[80], tmp1[80];
1865
1866                snprintf(tmp, sizeof(tmp), "/var/run/%s.pid", buf);
1867                file_to_buf(tmp, tmp1, sizeof(tmp1));
1868                pid = atoi(tmp1);
1869        }
1870        return pid;
1871}
1872
1873int check_wan_link(int num)
1874{
1875        int wan_link = 0;
1876
1877        if ((nvram_match("wan_proto", "pptp")
1878             || nvram_match("wan_proto", "l2tp")
1879             || nvram_match("wan_proto", "pppoe")
1880             || nvram_match("wan_proto", "3g")
1881             || nvram_match("wan_proto", "heartbeat"))
1882            && !nvram_match("3gdata", "hso")) {
1883                FILE *fp;
1884                char filename[80];
1885                char *name;
1886
1887                if (num == 0)
1888                        strcpy(filename, "/tmp/ppp/link");
1889                if ((fp = fopen(filename, "r"))) {
1890                        int pid = -1;
1891
1892                        fclose(fp);
1893                        if (nvram_match("wan_proto", "heartbeat")) {
1894                                char buf[20];
1895
1896                                file_to_buf("/tmp/ppp/link", buf, sizeof(buf));
1897                                pid = atoi(buf);
1898                        } else
1899                                pid = get_ppp_pid(filename);
1900
1901                        name = find_name_by_proc(pid);
1902                        if (!strncmp(name, "pppoecd", 7) ||     // for PPPoE
1903                            !strncmp(name, "pppd", 4) ||        // for PPTP
1904                            !strncmp(name, "bpalogin", 8))      // for HeartBeat
1905                                wan_link = 1;   // connect
1906                        else {
1907                                printf("The %s had been died, remove %s\n",
1908                                       nvram_safe_get("wan_proto"), filename);
1909                                wan_link = 0;   // For some reason, the pppoed had been died,
1910                                // by link file still exist.
1911                                unlink(filename);
1912                        }
1913                }
1914        } else {
1915                if (nvram_invmatch("wan_ipaddr", "0.0.0.0"))
1916                        wan_link = 1;
1917        }
1918
1919        return wan_link;
1920}
1921
1922/*
1923 * Find process name by pid from /proc directory
1924 */
1925char *find_name_by_proc(int pid)
1926{
1927        FILE *fp;
1928        char line[254];
1929        char filename[80];
1930        static char name[80];
1931
1932        snprintf(filename, sizeof(filename), "/proc/%d/status", pid);
1933
1934        if ((fp = fopen(filename, "r"))) {
1935                fgets(line, sizeof(line), fp);
1936                /*
1937                 * Buffer should contain a string like "Name: binary_name"
1938                 */
1939                sscanf(line, "%*s %s", name);
1940                fclose(fp);
1941                return name;
1942        }
1943
1944        return "";
1945}
1946
1947int diag_led_4702(int type, int act)
1948{
1949
1950#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA) || defined(HAVE_MERAKI) || defined(HAVE_LS2) || defined(HAVE_WHRAG108) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_TW6600) || defined(HAVE_PB42) || defined(HAVE_LS5) || defined(HAVE_FONERA) || defined(HAVE_LSX) || defined(HAVE_DANUBE) || defined(HAVE_STORM) || defined(HAVE_ADM5120) || defined(HAVE_RT2880)
1951        return 0;
1952#else
1953        if (act == START_LED) {
1954                switch (type) {
1955                case DMZ:
1956                        system2("echo 1 > /proc/sys/diag");
1957                        break;
1958                }
1959        } else {
1960                switch (type) {
1961                case DMZ:
1962                        system2("echo 0 > /proc/sys/diag");
1963                        break;
1964                }
1965        }
1966        return 0;
1967#endif
1968}
1969
1970int C_led_4702(int i)
1971{
1972#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA) || defined(HAVE_MERAKI) || defined(HAVE_LS2) || defined(HAVE_WHRAG108) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_TW6600) || defined(HAVE_PB42) || defined(HAVE_LS5) || defined(HAVE_LSX) || defined(HAVE_DANUBE) || defined(HAVE_STORM) || defined(HAVE_ADM5120) || defined(HAVE_RT2880)
1973        return 0;
1974#else
1975        FILE *fp;
1976        char string[10];
1977        int flg;
1978
1979        memset(string, 0, 10);
1980        /*
1981         * get diag before set
1982         */
1983        if ((fp = fopen("/proc/sys/diag", "r"))) {
1984                fgets(string, sizeof(string), fp);
1985                fclose(fp);
1986        } else
1987                perror("/proc/sys/diag");
1988
1989        if (i)
1990                flg = atoi(string) | 0x10;
1991        else
1992                flg = atoi(string) & 0xef;
1993
1994        memset(string, 0, 10);
1995        sprintf(string, "%d", flg);
1996        if ((fp = fopen("/proc/sys/diag", "w"))) {
1997                fputs(string, fp);
1998                fclose(fp);
1999        } else
2000                perror("/proc/sys/diag");
2001
2002        return 0;
2003#endif
2004}
2005
2006unsigned int read_gpio(char *device)
2007{
2008        FILE *fp;
2009        unsigned int val;
2010
2011        if ((fp = fopen(device, "r"))) {
2012                fread(&val, 4, 1, fp);
2013                fclose(fp);
2014                // fprintf(stderr, "----- gpio %s = [%X]\n",device,val);
2015                return val;
2016        } else {
2017                perror(device);
2018                return 0;
2019        }
2020}
2021
2022unsigned int write_gpio(char *device, unsigned int val)
2023{
2024        FILE *fp;
2025
2026        if ((fp = fopen(device, "w"))) {
2027                fwrite(&val, 4, 1, fp);
2028                fclose(fp);
2029                // fprintf(stderr, "----- set gpio %s = [%X]\n",device,val);
2030                return 1;
2031        } else {
2032                perror(device);
2033                return 0;
2034        }
2035}
2036
2037static char hw_error = 0;
2038int diag_led_4704(int type, int act)
2039{
2040#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA) || defined(HAVE_MERAKI)|| defined(HAVE_LS2) || defined(HAVE_WHRAG108) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_TW6600) || defined(HAVE_PB42) || defined(HAVE_LS5) || defined(HAVE_LSX) || defined(HAVE_DANUBE) || defined(HAVE_STORM) || defined(HAVE_ADM5120) || defined(HAVE_RT2880)
2041        return 0;
2042#else
2043        unsigned int control, in, outen, out;
2044
2045#ifdef BCM94712AGR
2046        /*
2047         * The router will crash, if we load the code into broadcom demo board.
2048         */
2049        return 1;
2050#endif
2051        // int brand;
2052        control = read_gpio("/dev/gpio/control");
2053        in = read_gpio("/dev/gpio/in");
2054        out = read_gpio("/dev/gpio/out");
2055        outen = read_gpio("/dev/gpio/outen");
2056
2057        write_gpio("/dev/gpio/outen", (outen & 0x7c) | 0x83);
2058        switch (type) {
2059        case DIAG:              // GPIO 1
2060                if (hw_error) {
2061                        write_gpio("/dev/gpio/out", (out & 0x7c) | 0x00);
2062                        return 1;
2063                }
2064
2065                if (act == STOP_LED) {  // stop blinking
2066                        write_gpio("/dev/gpio/out", (out & 0x7c) | 0x83);
2067                        // cprintf("tallest:=====( DIAG STOP_LED !!)=====\n");
2068                } else if (act == START_LED) {  // start blinking
2069                        write_gpio("/dev/gpio/out", (out & 0x7c) | 0x81);
2070                        // cprintf("tallest:=====( DIAG START_LED !!)=====\n");
2071                } else if (act == MALFUNCTION_LED) {    // start blinking
2072                        write_gpio("/dev/gpio/out", (out & 0x7c) | 0x00);
2073                        hw_error = 1;
2074                        // cprintf("tallest:=====( DIAG MALFUNCTION_LED !!)=====\n");
2075                }
2076                break;
2077
2078        }
2079        return 1;
2080#endif
2081}
2082
2083int diag_led_4712(int type, int act)
2084{
2085        unsigned int control, in, outen, out, ctr_mask, out_mask;
2086
2087#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA)|| defined(HAVE_MERAKI) || defined(HAVE_LS2) || defined(HAVE_WHRAG108) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_TW6600) || defined(HAVE_PB42) || defined(HAVE_LS5) || defined(HAVE_LSX) || defined(HAVE_DANUBE) || defined(HAVE_STORM) || defined(HAVE_ADM5120) || defined(HAVE_RT2880)
2088        return 0;
2089#else
2090
2091#ifdef BCM94712AGR
2092        /*
2093         * The router will crash, if we load the code into broadcom demo board.
2094         */
2095        return 1;
2096#endif
2097        control = read_gpio("/dev/gpio/control");
2098        in = read_gpio("/dev/gpio/in");
2099        out = read_gpio("/dev/gpio/out");
2100        outen = read_gpio("/dev/gpio/outen");
2101
2102        ctr_mask = ~(1 << type);
2103        out_mask = (1 << type);
2104
2105        write_gpio("/dev/gpio/control", control & ctr_mask);
2106        write_gpio("/dev/gpio/outen", outen | out_mask);
2107
2108        if (act == STOP_LED) {  // stop blinking
2109                // cprintf("%s: Stop GPIO %d\n", __FUNCTION__, type);
2110                write_gpio("/dev/gpio/out", out | out_mask);
2111        } else if (act == START_LED) {  // start blinking
2112                // cprintf("%s: Start GPIO %d\n", __FUNCTION__, type);
2113                write_gpio("/dev/gpio/out", out & ctr_mask);
2114        }
2115
2116        return 1;
2117#endif
2118}
2119
2120int C_led_4712(int i)
2121{
2122        if (i == 1)
2123                return diag_led(DIAG, START_LED);
2124        else
2125                return diag_led(DIAG, STOP_LED);
2126}
2127
2128int C_led(int i)
2129{
2130        int brand = getRouterBrand();
2131
2132        if (brand == ROUTER_WRT54G1X || brand == ROUTER_LINKSYS_WRT55AG)
2133                return C_led_4702(i);
2134        else if (brand == ROUTER_WRT54G)
2135                return C_led_4712(i);
2136        else
2137                return 0;
2138}
2139
2140int diag_led(int type, int act)
2141{
2142        int brand = getRouterBrand();
2143
2144        if (brand == ROUTER_WRT54G || brand == ROUTER_WRT54G3G
2145            || brand == ROUTER_WRT300NV11)
2146                return diag_led_4712(type, act);
2147        else if (brand == ROUTER_WRT54G1X || brand == ROUTER_LINKSYS_WRT55AG)
2148                return diag_led_4702(type, act);
2149        else if ((brand == ROUTER_WRTSL54GS
2150                  || brand == ROUTER_WRT310N || brand == ROUTER_WRT350N
2151                  || brand == ROUTER_BUFFALO_WZRG144NH) && type == DIAG)
2152                return diag_led_4704(type, act);
2153        else {
2154                if (type == DMZ) {
2155                        if (act == START_LED)
2156                                return led_control(LED_DMZ, LED_ON);
2157                        if (act == STOP_LED)
2158                                return led_control(LED_DMZ, LED_OFF);
2159                        return 1;
2160                }
2161        }
2162        return 0;
2163}
2164
2165#ifdef HAVE_MADWIFI
2166static char *stalist[] = {
2167        "ath0", "ath1", "ath2", "ath3", "ath4", "ath5", "ath6", "ath8", "ath9"
2168};
2169
2170char *getWifi(char *ifname)
2171{
2172        if (!strcmp(ifname, "ath0"))
2173                return "wifi0";
2174        if (!strcmp(ifname, "ath1"))
2175                return "wifi1";
2176        if (!strcmp(ifname, "ath2"))
2177                return "wifi2";
2178        if (!strcmp(ifname, "ath3"))
2179                return "wifi3";
2180        return NULL;
2181}
2182
2183char *getWDSSTA(void)
2184{
2185
2186        int c = getifcount("wifi");
2187        int i;
2188
2189        for (i = 0; i < c; i++) {
2190                char mode[32];
2191                char netmode[32];
2192
2193                sprintf(mode, "ath%d_mode", i);
2194                sprintf(netmode, "ath%d_net_mode", i);
2195                if (nvram_match(mode, "wdssta")
2196                    && !nvram_match(netmode, "disabled")) {
2197                        return stalist[i];
2198                }
2199
2200        }
2201        return NULL;
2202}
2203
2204char *getSTA(void)
2205{
2206
2207#ifdef HAVE_WAVESAT
2208        if (nvram_match("ofdm_mode", "sta"))
2209                return "ofdm";
2210#endif
2211        int c = getifcount("wifi");
2212        int i;
2213
2214        for (i = 0; i < c; i++) {
2215                char mode[32];
2216                char netmode[32];
2217
2218                sprintf(mode, "ath%d_mode", i);
2219                sprintf(netmode, "ath%d_net_mode", i);
2220                if (nvram_match(mode, "sta")
2221                    && !nvram_match(netmode, "disabled")) {
2222                        return stalist[i];
2223                }
2224
2225        }
2226        return NULL;
2227}
2228
2229char *getWET(void)
2230{
2231#ifdef HAVE_WAVESAT
2232        if (nvram_match("ofdm_mode", "bridge"))
2233                return "ofdm";
2234#endif
2235        int c = getifcount("wifi");
2236        int i;
2237
2238        for (i = 0; i < c; i++) {
2239                char mode[32];
2240                char netmode[32];
2241
2242                sprintf(mode, "ath%d_mode", i);
2243                sprintf(netmode, "ath%d_net_mode", i);
2244                if (nvram_match(mode, "wet")
2245                    && !nvram_match(netmode, "disabled")) {
2246                        return stalist[i];
2247                }
2248
2249        }
2250        return NULL;
2251}
2252
2253#elif HAVE_RT2880
2254
2255char *getSTA()
2256{
2257        int c = get_wl_instances();
2258        int i;
2259
2260        for (i = 0; i < c; i++) {
2261                if (nvram_nmatch("sta", "wl%d_mode", i)) {
2262                        if (!nvram_nmatch("disabled", "wl%d_net_mode", i))
2263                                return "ra0";
2264                }
2265
2266                if (nvram_nmatch("apsta", "wl%d_mode", i)) {
2267                        if (!nvram_nmatch("disabled", "wl%d_net_mode", i))
2268                                return "apcli0";
2269                }
2270
2271        }
2272        return NULL;
2273}
2274
2275char *getWET()
2276{
2277        int c = get_wl_instances();
2278        int i;
2279
2280        for (i = 0; i < c; i++) {
2281                if (!nvram_nmatch("disabled", "wl%d_net_mode", i)
2282                    && nvram_nmatch("wet", "wl%d_mode", i))
2283                        return "ra0";
2284
2285                if (!nvram_nmatch("disabled", "wl%d_net_mode", i)
2286                    && nvram_nmatch("apstawet", "wl%d_mode", i))
2287                        return "apcli0";
2288
2289        }
2290        return NULL;
2291}
2292
2293#else
2294char *getSTA()
2295{
2296        int c = get_wl_instances();
2297        int i;
2298
2299        for (i = 0; i < c; i++) {
2300                if (nvram_nmatch("sta", "wl%d_mode", i)
2301                    || nvram_nmatch("apsta", "wl%d_mode", i)) {
2302                        if (!nvram_nmatch("disabled", "wl%d_net_mode", i))
2303                                return get_wl_instance_name(i);
2304                        // else
2305                        // return nvram_nget ("wl%d_ifname", i);
2306                }
2307
2308        }
2309        return NULL;
2310}
2311
2312char *getWET()
2313{
2314        int c = get_wl_instances();
2315        int i;
2316
2317        for (i = 0; i < c; i++) {
2318                if (nvram_nmatch("wet", "wl%d_mode", i)
2319                    || nvram_nmatch("apstawet", "wl%d_mode", i)) {
2320                        if (!nvram_nmatch("disabled", "wl%d_net_mode", i))
2321                                return get_wl_instance_name(i);
2322                        // else
2323                        // return nvram_nget ("wl%d_ifname", i);
2324
2325                }
2326
2327        }
2328        return NULL;
2329}
2330
2331#endif
2332// note - broadcast addr returned in ipaddr
2333void get_broadcast(char *ipaddr, char *netmask)
2334{
2335        int ip2[4], mask2[4];
2336        unsigned char ip[4], mask[4];
2337
2338        if (!ipaddr || !netmask)
2339                return;
2340
2341        sscanf(ipaddr, "%d.%d.%d.%d", &ip2[0], &ip2[1], &ip2[2], &ip2[3]);
2342        sscanf(netmask, "%d.%d.%d.%d", &mask2[0], &mask2[1], &mask2[2],
2343               &mask2[3]);
2344        int i = 0;
2345
2346        for (i = 0; i < 4; i++) {
2347                ip[i] = ip2[i];
2348                mask[i] = mask2[i];
2349                // ip[i] = (ip[i] & mask[i]) | !mask[i];
2350                ip[i] = (ip[i] & mask[i]) | (0xff & ~mask[i]);
2351        }
2352
2353        sprintf(ipaddr, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
2354#ifdef WDS_DEBUG
2355        fprintf(fp, "get_broadcast return %s\n", value);
2356#endif
2357
2358}
2359
2360char *get_wan_face(void)
2361{
2362        static char localwanface[IFNAMSIZ];
2363
2364        /*
2365         * if (nvram_match ("pptpd_client_enable", "1")) { strncpy (localwanface,
2366         * "ppp0", IFNAMSIZ); return localwanface; }
2367         */
2368        if (nvram_match("wan_proto", "pptp")
2369            || nvram_match("wan_proto", "l2tp")
2370            || nvram_match("wan_proto", "3g")
2371            || nvram_match("wan_proto", "pppoe")) {
2372                if (nvram_match("pppd_pppifname", ""))
2373                        strncpy(localwanface, "ppp0", IFNAMSIZ);
2374                else
2375                        strncpy(localwanface, nvram_safe_get("pppd_pppifname"),
2376                                IFNAMSIZ);
2377        }
2378#ifndef HAVE_MADWIFI
2379        else if (getSTA()) {
2380                strcpy(localwanface, getSTA());
2381        }
2382#else
2383        else if (getSTA()) {
2384                if (nvram_match("wifi_bonding", "1"))
2385                        strcpy(localwanface, "bond0");
2386                else
2387                        strcpy(localwanface, getSTA());
2388        }
2389#endif
2390        else
2391                strncpy(localwanface, nvram_safe_get("wan_ifname"), IFNAMSIZ);
2392
2393        return localwanface;
2394}
2395
2396static int _pidof(const char *name, pid_t ** pids)
2397{
2398        const char *p;
2399        char *e;
2400        DIR *dir;
2401        struct dirent *de;
2402        pid_t i;
2403        int count;
2404        char buf[256];
2405
2406        count = 0;
2407        *pids = NULL;
2408        if ((p = strchr(name, '/')) != NULL)
2409                name = p + 1;
2410        if ((dir = opendir("/proc")) != NULL) {
2411                while ((de = readdir(dir)) != NULL) {
2412                        i = strtol(de->d_name, &e, 10);
2413                        if (*e != 0)
2414                                continue;
2415                        if (strcmp(name, psname(i, buf, sizeof(buf))) == 0) {
2416                                if ((*pids =
2417                                     realloc(*pids,
2418                                             sizeof(pid_t) * (count + 1))) ==
2419                                    NULL) {
2420                                        return -1;
2421                                }
2422                                (*pids)[count++] = i;
2423                        }
2424                }
2425        }
2426        closedir(dir);
2427        return count;
2428}
2429
2430int pidof(const char *name)
2431{
2432        pid_t *pids;
2433        pid_t p;
2434
2435        if (_pidof(name, &pids) > 0) {
2436                p = *pids;
2437                free(pids);
2438                return p;
2439        }
2440        return -1;
2441}
2442
2443int killall(const char *name, int sig)
2444{
2445        pid_t *pids;
2446        int i;
2447        int r;
2448
2449        if ((i = _pidof(name, &pids)) > 0) {
2450                r = 0;
2451                do {
2452                        r |= kill(pids[--i], sig);
2453                }
2454                while (i > 0);
2455                free(pids);
2456                return r;
2457        }
2458        return -2;
2459}
2460
2461void set_ip_forward(char c)
2462{
2463        FILE *fp;
2464
2465        if ((fp = fopen("/proc/sys/net/ipv4/ip_forward", "r+"))) {
2466                fputc(c, fp);
2467                fclose(fp);
2468        } else {
2469                perror("/proc/sys/net/ipv4/ip_forward");
2470        }
2471}
2472
2473int ifexists(const char *ifname)
2474{
2475        return getifcount(ifname) > 0 ? 1 : 0;
2476}
2477
2478int getifcount(const char *ifprefix)
2479{
2480        /*
2481         * char devcall[128];
2482         *
2483         * sprintf (devcall, "cat /proc/net/dev|grep \"%s\"|wc -l", ifprefix);
2484         * FILE *in = popen (devcall, "rb"); if (in == NULL) return 0; int count;
2485         * fscanf (in, "%d", &count); pclose (in); return count;
2486         */
2487        char *iflist = malloc(256);
2488
2489        memset(iflist, 0, 256);
2490        int c = getIfList(iflist, ifprefix);
2491
2492        free(iflist);
2493        return c;
2494}
2495
2496static void skipline(FILE * in)
2497{
2498        while (1) {
2499                int c = getc(in);
2500
2501                if (c == EOF)
2502                        return;
2503                if (c == 0x0)
2504                        return;
2505                if (c == 0xa)
2506                        return;
2507        }
2508}
2509
2510/*
2511 * strips trailing char(s) c from string
2512 */
2513void strtrim_right(char *p, int c)
2514{
2515        char *end;
2516        int len;
2517
2518        len = strlen(p);
2519        while (*p && len) {
2520                end = p + len - 1;
2521                if (c == *end)
2522                        *end = 0;
2523                else
2524                        break;
2525                len = strlen(p);
2526        }
2527        return;
2528}
2529
2530// returns a physical interfacelist filtered by ifprefix. if ifprefix is
2531// NULL, all valid interfaces will be returned
2532int getIfList(char *buffer, const char *ifprefix)
2533{
2534        FILE *in = fopen("/proc/net/dev", "rb");
2535        char ifname[32];
2536
2537        // skip the first 2 lines
2538        skipline(in);
2539        skipline(in);
2540        int ifcount = 0;
2541        int count = 0;
2542
2543        while (1) {
2544                int c = getc(in);
2545
2546                if (c == EOF) {
2547                        if (count)
2548                                buffer[strlen(buffer) - 1] = 0; // fixup last space
2549                        fclose(in);
2550                        return count;
2551                }
2552                if (c == 0) {
2553                        if (count)
2554                                buffer[strlen(buffer) - 1] = 0; // fixup last space
2555                        fclose(in);
2556                        return count;
2557                }
2558                if (c == 0x20)
2559                        continue;
2560                if (c == ':' || ifcount == 30) {
2561                        ifname[ifcount++] = 0;
2562                        int skip = 0;
2563
2564                        if (ifprefix) {
2565                                if (strncmp(ifname, ifprefix, strlen(ifprefix))) {
2566                                        skip = 1;
2567                                }
2568                        } else {
2569                                if (!strncmp(ifname, "wifi", 4))
2570                                        skip = 1;
2571                                if (!strncmp(ifname, "ifb", 3))
2572                                        skip = 1;
2573                                if (!strncmp(ifname, "imq", 3))
2574                                        skip = 1;
2575                                if (!strncmp(ifname, "etherip", 7))
2576                                        skip = 1;
2577                                if (!strncmp(ifname, "lo", 2))
2578                                        skip = 1;
2579                                if (!strncmp(ifname, "teql", 4))
2580                                        skip = 1;
2581                                if (!strncmp(ifname, "gre", 3))
2582                                        skip = 1;
2583                                if (!strncmp(ifname, "ppp", 3))
2584                                        skip = 1;
2585                                if (!strncmp(ifname, "tun", 3))
2586                                        skip = 1;
2587                                if (!strncmp(ifname, "tap", 3))
2588                                        skip = 1;
2589                        }
2590                        if (!skip) {
2591                                strcat(buffer, ifname);
2592                                strcat(buffer, " ");
2593                                count++;
2594                        }
2595                        skip = 0;
2596                        ifcount = 0;
2597                        memset(ifname, 0, 32);
2598                        skipline(in);
2599                        continue;
2600                }
2601                if (ifcount < 30)
2602                        ifname[ifcount++] = c;
2603        }
2604}
2605
2606/*
2607 * Example: legal_hwaddr("00:11:22:33:44:aB"); return true;
2608 * legal_hwaddr("00:11:22:33:44:5"); return false;
2609 * legal_hwaddr("00:11:22:33:44:HH"); return false;
2610 */
2611int sv_valid_hwaddr(char *value)
2612{
2613        unsigned int hwaddr[6];
2614        int tag = TRUE;
2615        int i, count;
2616
2617        /*
2618         * Check for bad, multicast, broadcast, or null address
2619         */
2620        for (i = 0, count = 0; *(value + i); i++) {
2621                if (*(value + i) == ':') {
2622                        if ((i + 1) % 3 != 0) {
2623                                tag = FALSE;
2624                                break;
2625                        }
2626                        count++;
2627                } else if (ishexit(*(value + i)))       /* one of 0 1 2 3 4 5 6 7 8 9
2628                                                         * a b c d e f A B C D E F */
2629                        continue;
2630                else {
2631                        tag = FALSE;
2632                        break;
2633                }
2634        }
2635
2636        if (!tag || i != 17 || count != 5)      /* must have 17's characters and 5's
2637                                                 * ':' */
2638                tag = FALSE;
2639        else if (sscanf(value, "%x:%x:%x:%x:%x:%x",
2640                        &hwaddr[0], &hwaddr[1], &hwaddr[2],
2641                        &hwaddr[3], &hwaddr[4], &hwaddr[5]) != 6) {
2642                tag = FALSE;
2643        } else
2644                tag = TRUE;
2645#ifdef WDS_DEBUG
2646        if (tag == FALSE)
2647                fprintf(fp, "failed valid_hwaddr\n");
2648#endif
2649
2650        return tag;
2651}
2652
2653int led_control(int type, int act)
2654/*
2655 * type: LED_POWER, LED_DIAG, LED_DMZ, LED_CONNECTED, LED_BRIDGE, LED_VPN,
2656 * LED_SES, LED_SES2, LED_WLAN act: LED_ON, LED_OFF, LED_FLASH
2657 */
2658{
2659#if (defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_MAGICBOX) || defined(HAVE_MERAKI) || defined(HAVE_LS2) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_LS5) )  && (!defined(HAVE_DIR300) && !defined(HAVE_WRT54G2) && !defined(HAVE_RTG32) && !defined(HAVE_DIR400) && !defined(HAVE_BWRG1000))
2660        return 0;
2661#else
2662        int use_gpio = 0x0ff;
2663        int gpio_value;
2664        int enable;
2665        int disable;
2666
2667        int power_gpio = 0x0ff;
2668        int diag_gpio = 0x0ff;
2669        int dmz_gpio = 0x0ff;
2670        int connected_gpio = 0x0ff;
2671        int bridge_gpio = 0x0ff;
2672        int vpn_gpio = 0x0ff;
2673        int ses_gpio = 0x0ff;   // use for SES1 (Linksys), AOSS (Buffalo)
2674        int ses2_gpio = 0x0ff;
2675        int wlan_gpio = 0x0ff;  // use this only if wlan led is not controlled by hardware!
2676        int usb_gpio = 0x0ff;
2677        int sec0_gpio = 0x0ff;  // security leds, wrt600n
2678        int sec1_gpio = 0x0ff;
2679        int v1func = 0;
2680
2681        switch (getRouterBrand())       // gpio definitions here: 0xYZ,
2682                // Y=0:normal, Y=1:inverted, Z:gpio
2683                // number (f=disabled)
2684        {
2685#ifndef HAVE_BUFFALO
2686        case ROUTER_BOARD_PB42:
2687#ifdef HAVE_WP543
2688                diag_gpio = 0x107;
2689                connected_gpio = 0x106;
2690#endif
2691#ifdef HAVE_DIR825
2692                diag_gpio = 0x104;
2693                connected_gpio = 0x10b;
2694#endif
2695                break;
2696        case ROUTER_ALLNET01:
2697                connected_gpio = 0x100;
2698                break;
2699        case ROUTER_BOARD_WP54G:
2700                diag_gpio = 0x102;
2701                connected_gpio = 0x107;
2702                break;
2703        case ROUTER_BOARD_NP28G:
2704                diag_gpio = 0x102;
2705                connected_gpio = 0x106;
2706                break;
2707        case ROUTER_BOARD_GATEWORX_GW2369:
2708                connected_gpio = 0x102;
2709                break;
2710        case ROUTER_BOARD_GATEWORX:
2711#ifdef HAVE_WG302V1
2712                diag_gpio = 0x104;
2713                wlan_gpio = 0x105;
2714#elif HAVE_WG302
2715                diag_gpio = 0x102;
2716                wlan_gpio = 0x104;
2717#else
2718                if (nvram_match("DD_BOARD", "Cambria GW2350")
2719                    || nvram_match("DD_BOARD2", "Cambria GW2350"))
2720                        connected_gpio = 0x105;
2721                else if (nvram_match("DD_BOARD", "Cambria GW2358-4")
2722                         || nvram_match("DD_BOARD2", "Cambria GW2358-4"))
2723                        connected_gpio = 0x118;
2724                else
2725                        connected_gpio = 0x003;
2726#endif
2727                break;
2728        case ROUTER_BOARD_GATEWORX_SWAP:
2729                connected_gpio = 0x004;
2730                break;
2731        case ROUTER_BOARD_STORM:
2732                connected_gpio = 0x005;
2733                diag_gpio = 0x003;
2734                break;
2735        case ROUTER_LINKSYS_WRH54G:
2736                diag_gpio = 0x101;      // power led blink / off to indicate factory
2737                // defaults
2738                break;
2739        case ROUTER_WRT54G:
2740        case ROUTER_WRT54G_V8:
2741                power_gpio = 0x001;
2742                dmz_gpio = 0x107;
2743                connected_gpio = 0x103; // ses orange
2744                ses_gpio = 0x102;       // ses white
2745                ses2_gpio = 0x103;      // ses orange
2746                break;
2747        case ROUTER_WRT54G_V81:
2748                power_gpio = 0x101;
2749                dmz_gpio = 0x102;
2750                connected_gpio = 0x104; // ses orange
2751                ses_gpio = 0x103;       // ses white
2752                ses2_gpio = 0x104;      // ses orange
2753                break;
2754        case ROUTER_WRT54G1X:
2755                connected_gpio = 0x103;
2756                v1func = 1;
2757                break;
2758        case ROUTER_WRT350N:
2759                connected_gpio = 0x103;
2760                power_gpio = 0x001;
2761                ses2_gpio = 0x103;      // ses orange
2762                sec0_gpio = 0x109;
2763                usb_gpio = 0x10b;
2764                break;
2765        case ROUTER_WRT600N:
2766                power_gpio = 0x102;
2767                diag_gpio = 0x002;
2768                usb_gpio = 0x103;
2769                sec0_gpio = 0x109;
2770                sec1_gpio = 0x10b;
2771                break;
2772        case ROUTER_LINKSYS_WRT55AG:
2773                connected_gpio = 0x103;
2774                break;
2775        case ROUTER_DLINK_DIR330:
2776                diag_gpio = 0x106;
2777                connected_gpio = 0x100;
2778                usb_gpio = 0x104;
2779                break;
2780        case ROUTER_BOARD_DIR600B:
2781                diag_gpio = 0x10d;
2782                connected_gpio = 0x108;
2783                break;
2784#endif
2785        case ROUTER_BOARD_WHRG300N:
2786                diag_gpio = 0x107;
2787                connected_gpio = 0x109;
2788                ses_gpio = 0x10e;
2789                break;
2790        case ROUTER_BOARD_WHRHPGN:
2791                diag_gpio = 0x101;
2792                connected_gpio = 0x106;
2793                ses_gpio = 0x100;
2794                break;
2795        case ROUTER_BUFFALO_WBR54G:
2796                diag_gpio = 0x107;
2797                break;
2798        case ROUTER_BUFFALO_WBR2G54S:
2799                diag_gpio = 0x001;
2800                ses_gpio = 0x006;
2801                break;
2802        case ROUTER_BUFFALO_WLA2G54C:
2803                diag_gpio = 0x104;
2804                ses_gpio = 0x103;
2805                break;
2806        case ROUTER_BUFFALO_WLAH_G54:
2807                diag_gpio = 0x107;
2808                ses_gpio = 0x106;
2809                break;
2810        case ROUTER_BUFFALO_WAPM_HP_AM54G54:
2811                diag_gpio = 0x107;
2812                ses_gpio = 0x101;
2813                break;
2814        case ROUTER_BOARD_WHRAG108:
2815                diag_gpio = 0x107;
2816                bridge_gpio = 0x104;
2817                ses_gpio = 0x100;
2818                break;
2819        case ROUTER_BUFFALO_WHRG54S:
2820        case ROUTER_BUFFALO_WLI_TX4_G54HP:
2821                diag_gpio = 0x107;
2822                if (nvram_match("DD_BOARD", "Buffalo WHR-G125")) {
2823                        connected_gpio = 0x101;
2824                        sec0_gpio = 0x106;
2825                } else {
2826                        bridge_gpio = 0x101;
2827                        ses_gpio = 0x106;
2828                }
2829                break;
2830        case ROUTER_BUFFALO_WZRRSG54:
2831                diag_gpio = 0x107;
2832                vpn_gpio = 0x101;
2833                ses_gpio = 0x106;
2834                break;
2835        case ROUTER_BUFFALO_WZRG300N:
2836                diag_gpio = 0x107;
2837                bridge_gpio = 0x101;
2838                break;
2839        case ROUTER_BUFFALO_WZRG144NH:
2840                diag_gpio = 0x103;
2841                bridge_gpio = 0x101;
2842                ses_gpio = 0x102;
2843                break;
2844#ifndef HAVE_BUFFALO
2845#ifdef HAVE_DIR300
2846        case ROUTER_BOARD_FONERA:
2847                diag_gpio = 0x003;
2848                bridge_gpio = 0x004;
2849                ses_gpio = 0x001;
2850                break;
2851#endif
2852#ifdef HAVE_WRT54G2
2853        case ROUTER_BOARD_FONERA:
2854                bridge_gpio = 0x004;
2855                ses_gpio = 0x104;
2856                diag_gpio = 0x103;
2857                break;
2858#endif
2859#ifdef HAVE_RTG32
2860        case ROUTER_BOARD_FONERA:
2861                break;
2862#endif
2863#ifdef HAVE_BWRG1000
2864        case ROUTER_BOARD_LS2:
2865                diag_gpio = 0x007;
2866                break;
2867#endif
2868#ifdef HAVE_DIR400
2869        case ROUTER_BOARD_FONERA2200:
2870                diag_gpio = 0x003;
2871                bridge_gpio = 0x004;
2872                ses_gpio = 0x001;
2873                break;
2874#endif
2875#ifdef HAVE_WRK54G
2876        case ROUTER_BOARD_FONERA:
2877                diag_gpio = 0x107;
2878                dmz_gpio = 0x005;
2879                break;
2880#endif
2881        case ROUTER_BOARD_TW6600:
2882                diag_gpio = 0x107;
2883                bridge_gpio = 0x104;
2884                ses_gpio = 0x100;
2885                break;
2886        case ROUTER_MOTOROLA:
2887                power_gpio = 0x001;
2888                diag_gpio = 0x101;      // power led blink / off to indicate factory
2889                // defaults
2890                break;
2891        case ROUTER_RT210W:
2892                power_gpio = 0x105;
2893                diag_gpio = 0x005;      // power led blink / off to indicate factory
2894                // defaults
2895                connected_gpio = 0x100;
2896                wlan_gpio = 0x103;
2897                break;
2898        case ROUTER_RT480W:
2899        case ROUTER_BELKIN_F5D7230_V2000:
2900        case ROUTER_BELKIN_F5D7231:
2901                power_gpio = 0x105;
2902                diag_gpio = 0x005;      // power led blink / off to indicate factory
2903                // defaults
2904                connected_gpio = 0x100;
2905                break;
2906        case ROUTER_MICROSOFT_MN700:
2907                power_gpio = 0x006;
2908                diag_gpio = 0x106;      // power led blink / off to indicate factory
2909                // defaults
2910                break;
2911        case ROUTER_ASUS_WL500GD:
2912        case ROUTER_ASUS_WL520GUGC:
2913                diag_gpio = 0x000;      // power led blink / off to indicate factory
2914                // defaults
2915                break;
2916        case ROUTER_ASUS_WL500G_PRE:
2917                power_gpio = 0x101;
2918                diag_gpio = 0x001;      // power led blink / off to indicate factory
2919                // defaults
2920                break;
2921        case ROUTER_ASUS_WL550GE:
2922                power_gpio = 0x102;
2923                diag_gpio = 0x002;      // power led blink / off to indicate factory
2924                // defaults
2925                break;
2926        case ROUTER_WRT54G3G:
2927        case ROUTER_WRTSL54GS:
2928                power_gpio = 0x001;
2929                dmz_gpio = 0x100;
2930                connected_gpio = 0x107; // ses orange
2931                ses_gpio = 0x105;       // ses white
2932                ses2_gpio = 0x107;      // ses orange
2933                break;
2934        case ROUTER_MOTOROLA_WE800G:
2935        case ROUTER_MOTOROLA_V1:
2936                diag_gpio = 0x103;
2937                wlan_gpio = 0x101;
2938                bridge_gpio = 0x105;
2939                break;
2940        case ROUTER_DELL_TRUEMOBILE_2300:
2941        case ROUTER_DELL_TRUEMOBILE_2300_V2:
2942                power_gpio = 0x107;
2943                diag_gpio = 0x007;      // power led blink / off to indicate factory
2944                // defaults
2945                wlan_gpio = 0x106;
2946                break;
2947        case ROUTER_NETGEAR_WNR834B:
2948                power_gpio = 0x104;
2949                diag_gpio = 0x105;
2950                wlan_gpio = 0x106;
2951                break;
2952        case ROUTER_SITECOM_WL105B:
2953                power_gpio = 0x003;
2954                diag_gpio = 0x103;      // power led blink / off to indicate factory
2955                // defaults
2956                wlan_gpio = 0x104;
2957                break;
2958        case ROUTER_WRT300N:
2959                power_gpio = 0x001;
2960                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
2961                break;
2962        case ROUTER_WRT150N:
2963                power_gpio = 0x001;
2964                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
2965                sec0_gpio = 0x105;
2966                break;
2967        case ROUTER_WRT300NV11:
2968                ses_gpio = 0x105;
2969                // diag_gpio = 0x11; //power led blink / off to indicate fac.def.
2970                break;
2971        case ROUTER_WRT310N:
2972                connected_gpio = 0x103;  //sesorange
2973                power_gpio = 0x001;
2974                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
2975                ses_gpio = 0x109;       // ses blue
2976                break;
2977        case ROUTER_WRT310NV2:
2978                connected_gpio = 0x102; // ses orange
2979                power_gpio = 0x001;
2980                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
2981                ses_gpio = 0x104;       // ses blue
2982                break;
2983        case ROUTER_WRT160N:
2984                power_gpio = 0x001;
2985                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
2986                connected_gpio = 0x103; // ses orange
2987                ses_gpio = 0x105;       // ses blue
2988                break;
2989        case ROUTER_WRT160NV3:
2990                power_gpio = 0x001;
2991                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
2992                connected_gpio = 0x102; // ses orange
2993                ses_gpio = 0x104;       // ses blue
2994                break;
2995        case ROUTER_ASUS_WL500G:
2996                power_gpio = 0x100;
2997                diag_gpio = 0x000;      // power led blink /off to indicate factory
2998                // defaults
2999                break;
3000        case ROUTER_ASUS_WL500W:
3001                power_gpio = 0x105;
3002                diag_gpio = 0x005;      // power led blink /off to indicate factory
3003                // defaults
3004                break;
3005        case ROUTER_LINKSYS_WTR54GS:
3006                diag_gpio = 0x001;
3007                break;
3008        case ROUTER_WAP54G_V1:
3009                diag_gpio = 0x103;
3010                wlan_gpio = 0x104;      // LINK led
3011                break;
3012        case ROUTER_WAP54G_V3:
3013                ses_gpio = 0x10c;
3014                connected_gpio = 0x006;
3015                break;
3016        case ROUTER_NETGEAR_WNR834BV2:
3017                power_gpio = 0x002;
3018                diag_gpio = 0x003;      // power led amber
3019                connected_gpio = 0x007; // WAN led green
3020                break;
3021        case ROUTER_NETGEAR_WNDR3300:
3022                power_gpio = 0x005;
3023                diag_gpio = 0x105;      // power led blink /off to indicate factory defaults
3024                connected_gpio = 0x007; // WAN led green
3025                break;
3026        case ROUTER_ASKEY_RT220XD:
3027                wlan_gpio = 0x100;
3028                dmz_gpio = 0x101;       // not soldered
3029                break;
3030        case ROUTER_WRT610N:
3031                power_gpio = 0x001;
3032                connected_gpio = 0x103; // ses amber
3033                ses_gpio = 0x109;       // ses blue
3034                usb_gpio = 0x100;
3035                break;
3036        case ROUTER_WRT610NV2:
3037                power_gpio = 0x005;
3038                connected_gpio = 0x100; // ses amber
3039                ses_gpio = 0x103;       // ses blue
3040                usb_gpio = 0x007;
3041                break;
3042        case ROUTER_USR_5461:
3043                usb_gpio = 0x001;
3044                break;
3045        case ROUTER_USR_5465:
3046                //usb_gpio = 0x002; //or 0x001 ??
3047                break;
3048        case ROUTER_NETGEAR_WGR614L:
3049        case ROUTER_NETGEAR_WGR614V9:
3050                // power_gpio = 0x107;       // don't use - resets router
3051                diag_gpio = 0x006;
3052                connected_gpio = 0x104;
3053                break;
3054        case ROUTER_NETGEAR_WG602_V4:
3055                power_gpio = 0x101;     // trick: make lan led green for 100Mbps
3056                break;
3057        case ROUTER_BELKIN_F5D7231_V2000:
3058                connected_gpio = 0x104;
3059                diag_gpio = 0x001;      // power led blink /off to indicate factory defaults
3060                break;
3061        case ROUTER_NETGEAR_WNR3500L:
3062                power_gpio = 0x003;     //power led green
3063                diag_gpio = 0x007;      // power led amber
3064                ses_gpio = 0x001;       // WPS led green
3065                connected_gpio = 0x002; //wan led green
3066                break;
3067        case ROUTER_WRT320N:
3068                power_gpio = 0x002;     //power/diag (disabled=blink)
3069                ses_gpio = 0x103;       // ses blue
3070                connected_gpio = 0x104; //ses orange
3071                break;
3072        case ROUTER_ASUS_RTN12:
3073                power_gpio = 0x102;
3074                diag_gpio = 0x002;      // power blink
3075                break;
3076        case ROUTER_ASUS_RTN10:
3077        case ROUTER_ASUS_RTN16:
3078                power_gpio = 0x101;
3079                diag_gpio = 0x001;      // power blink
3080                break;
3081#endif
3082        }
3083        if (type == LED_DIAG && v1func == 1) {
3084                if (act == LED_ON)
3085                        C_led(1);
3086                else
3087                        C_led(0);
3088        }
3089
3090        switch (type) {
3091        case LED_POWER:
3092                use_gpio = power_gpio;
3093                break;
3094        case LED_DIAG:
3095                use_gpio = diag_gpio;
3096                break;
3097        case LED_DMZ:
3098                use_gpio = dmz_gpio;
3099                break;
3100        case LED_CONNECTED:
3101                use_gpio = connected_gpio;
3102                break;
3103        case LED_BRIDGE:
3104                use_gpio = bridge_gpio;
3105                break;
3106        case LED_VPN:
3107                use_gpio = vpn_gpio;
3108                break;
3109        case LED_SES:
3110                use_gpio = ses_gpio;
3111                break;
3112        case LED_SES2:
3113                use_gpio = ses2_gpio;
3114                break;
3115        case LED_WLAN:
3116                use_gpio = wlan_gpio;
3117                break;
3118        case LED_USB:
3119                use_gpio = usb_gpio;
3120                break;
3121        case LED_SEC0:
3122                use_gpio = sec0_gpio;
3123                break;
3124        case LED_SEC1:
3125                use_gpio = sec1_gpio;
3126                break;
3127        }
3128        if ((use_gpio & 0x0ff) != 0x0ff) {
3129                gpio_value = use_gpio & 0x0ff;
3130                enable = (use_gpio & 0x100) == 0 ? 1 : 0;
3131                disable = (use_gpio & 0x100) == 0 ? 0 : 1;
3132                switch (act) {
3133                case LED_ON:
3134                        set_gpio(gpio_value, enable);
3135                        break;
3136                case LED_OFF:
3137                        set_gpio(gpio_value, disable);
3138                        break;
3139                case LED_FLASH: // will lit the led for 1 sec.
3140                        set_gpio(gpio_value, enable);
3141                        sleep(1);
3142                        set_gpio(gpio_value, disable);
3143                        break;
3144                }
3145        }
3146        return 1;
3147
3148#endif
3149}
3150
3151int file_to_buf(char *path, char *buf, int len)
3152{
3153        FILE *fp;
3154
3155        memset(buf, 0, len);
3156
3157        if ((fp = fopen(path, "r"))) {
3158                fgets(buf, len, fp);
3159                fclose(fp);
3160                return 1;
3161        }
3162
3163        return 0;
3164}
3165
3166int ishexit(char c)
3167{
3168
3169        if (strchr("01234567890abcdefABCDEF", c) != (char *)0)
3170                return 1;
3171
3172        return 0;
3173}
3174
3175int getMTD(char *name)
3176{
3177        char buf[128];
3178        int device;
3179
3180        sprintf(buf, "cat /proc/mtd|grep \"%s\"", name);
3181        FILE *fp = popen(buf, "rb");
3182
3183        fscanf(fp, "%s", &buf[0]);
3184        device = buf[3] - '0';
3185        pclose(fp);
3186        return device;
3187}
3188
3189int insmod(char *module)
3190{
3191        return eval("insmod", module);
3192}
3193
3194void rmmod(char *module)
3195{
3196        eval("rmmod", module);
3197}
3198
3199#include "revision.h"
3200
3201char *getSoftwareRevision(void)
3202{
3203        return "" SVN_REVISION "";
3204}
3205
3206#ifdef HAVE_OLED
3207void initlcd()
3208{
3209
3210}
3211
3212void lcdmessage(char *message)
3213{
3214        eval("oled-print", "DD-WRT v24 sp2", "build:" SVN_REVISION,
3215             "3G/UMTS Router", message);
3216}
3217
3218void lcdmessaged(char *dual, char *message)
3219{
3220
3221}
3222
3223#endif
3224
3225#if 0
3226
3227static int fd;
3228
3229void SetEnvironment()
3230{
3231        system("stty ispeed 2400 < /dev/tts/1");
3232        system("stty raw < /dev/tts/1");
3233}
3234
3235int Cmd = 254;                  /* EZIO Command */
3236int cls = 1;                    /* Clear screen */
3237void Cls()
3238{
3239        write(fd, &Cmd, 1);
3240        write(fd, &cls, 1);
3241}
3242
3243int init = 0x28;
3244void Init()
3245{
3246        write(fd, &Cmd, 1);
3247        write(fd, &init, 1);
3248}
3249
3250int stopsend = 0x37;
3251void StopSend()
3252{
3253        write(fd, &Cmd, 1);
3254        write(fd, &init, 1);
3255}
3256
3257int home = 2;                   /* Home cursor */
3258void Home()
3259{
3260        write(fd, &Cmd, 1);
3261        write(fd, &home, 1);
3262}
3263
3264int readkey = 6;                /* Read key */
3265void ReadKey()
3266{
3267        write(fd, &Cmd, 1);
3268        write(fd, &readkey, 1);
3269}
3270
3271int blank = 8;                  /* Blank display */
3272void Blank()
3273{
3274        write(fd, &Cmd, 1);
3275        write(fd, &blank, 1);
3276}
3277
3278int hide = 12;                  /* Hide cursor & display blanked characters */
3279void Hide()
3280{
3281        write(fd, &Cmd, 1);
3282        write(fd, &hide, 1);
3283}
3284
3285int turn = 13;                  /* Turn On (blinking block cursor) */
3286void TurnOn()
3287{
3288        write(fd, &Cmd, 1);
3289        write(fd, &turn, 1);
3290}
3291
3292int show = 14;                  /* Show underline cursor */
3293void Show()
3294{
3295        write(fd, &Cmd, 1);
3296        write(fd, &show, 1);
3297}
3298
3299int movel = 16;                 /* Move cursor 1 character left */
3300void MoveL()
3301{
3302        write(fd, &Cmd, 1);
3303        write(fd, &movel, 1);
3304}
3305
3306int mover = 20;                 /* Move cursor 1 character right */
3307void MoveR()
3308{
3309        write(fd, &Cmd, 1);
3310        write(fd, &mover, 1);
3311}
3312
3313int scl = 24;                   /* Scroll cursor 1 character left */
3314void ScrollL()
3315{
3316        write(fd, &Cmd, 1);
3317        write(fd, &scl, 1);
3318}
3319
3320int scr = 28;                   /* Scroll cursor 1 character right */
3321void ScrollR()
3322{
3323        write(fd, &Cmd, 1);
3324        write(fd, &scr, 1);
3325}
3326
3327int setdis = 64;                /* Command */
3328void SetDis()
3329{
3330        write(fd, &Cmd, 1);
3331        write(fd, &setdis, 1);
3332
3333}
3334
3335int a, b;
3336void ShowMessage(char *str1, char *str2)
3337{
3338        char nul[] = "                                       ";
3339
3340        a = strlen(str1);
3341        b = 40 - a;
3342        write(fd, str1, a);
3343        write(fd, nul, b);
3344        write(fd, str2, strlen(str2));
3345}
3346
3347void initlcd()
3348{
3349
3350        fd = open("/dev/tts/1", O_RDWR);
3351
3352                                  /** Open Serial port (COM2) */
3353        if (fd > 0) {
3354                close(fd);
3355                SetEnvironment();       /* Set RAW mode */
3356                fd = open("/dev/tts/1", O_RDWR);
3357                Init();         /* Initialize EZIO twice */
3358                Init();
3359
3360                Cls();          /* Clear screen */
3361        }
3362        close(fd);
3363}
3364
3365void lcdmessage(char *message)
3366{
3367
3368        fd = open("/dev/tts/1", O_RDWR);
3369                                   /** Open Serial port (COM2) */
3370
3371        if (fd > 0) {
3372                Init();         /* Initialize EZIO twice */
3373                Init();
3374                SetDis();
3375                Cls();
3376                Home();
3377                ShowMessage("State", message);
3378                close(fd);
3379        }
3380}
3381
3382void lcdmessaged(char *dual, char *message)
3383{
3384
3385        fd = open("/dev/tts/1", O_RDWR);
3386
3387                                  /** Open Serial port (COM2) */
3388
3389        if (fd > 0) {
3390                Init();         /* Initialize EZIO twice */
3391                Init();
3392                SetDis();
3393                Cls();          /* Clear screen */
3394                Home();
3395                ShowMessage(dual, message);
3396                close(fd);
3397        }
3398}
3399
3400#endif
3401static int i64c(int i)
3402{
3403        i &= 0x3f;
3404        if (i == 0)
3405                return '.';
3406        if (i == 1)
3407                return '/';
3408        if (i < 12)
3409                return ('0' - 2 + i);
3410        if (i < 38)
3411                return ('A' - 12 + i);
3412        return ('a' - 38 + i);
3413}
3414
3415int crypt_make_salt(char *p, int cnt, int x)
3416{
3417        x += getpid() + time(NULL);
3418        do {
3419                /*
3420                 * x = (x*1664525 + 1013904223) % 2^32 generator is lame (low-order
3421                 * bit is not "random", etc...), but for our purposes it is good
3422                 * enough
3423                 */
3424                x = x * 1664525 + 1013904223;
3425                /*
3426                 * BTW, Park and Miller's "minimal standard generator" is x = x*16807
3427                 * % ((2^31)-1) It has no problem with visibly alternating lowest bit
3428                 * but is also weak in cryptographic sense + needs div, which needs
3429                 * more code (and slower) on many CPUs
3430                 */
3431                *p++ = i64c(x >> 16);
3432                *p++ = i64c(x >> 22);
3433        }
3434        while (--cnt);
3435        *p = '\0';
3436        return x;
3437}
3438
3439#define MD5_OUT_BUFSIZE 36
3440
3441char *zencrypt(char *passwd)
3442{
3443        char salt[sizeof("$N$XXXXXXXX")];       /* "$N$XXXXXXXX" or "XX" */
3444        static char passout[MD5_OUT_BUFSIZE];
3445
3446        strcpy(salt, "$1$");
3447        crypt_make_salt(salt + 3, 4, 0);
3448        return md5_crypt(passout, (unsigned char *)passwd,
3449                         (unsigned char *)salt);
3450}
Note: See TracBrowser for help on using the repository browser.