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

Last change on this file since 17734 was 17734, checked in by BrainSlayer, 21 months ago

for playing with it

File size: 110.2 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#ifdef HAVE_ATH9K
44#include <glob.h>
45#endif
46
47#include <utils.h>
48#include <wlutils.h>
49#include <bcmnvram.h>
50#include <shutils.h>
51#include <cy_conf.h>
52#include <code_pattern.h>
53#include <bcmdevs.h>
54#include <net/route.h>
55#include <cy_conf.h>
56#include <bcmdevs.h>
57#include <linux/if_ether.h>
58// #include <linux/mii.h>
59#include <linux/sockios.h>
60#include <cymac.h>
61#include <broadcom.h>
62#define SIOCGMIIREG     0x8948  /* Read MII PHY register.  */
63#define SIOCSMIIREG     0x8949  /* Write MII PHY register.  */
64
65struct mii_ioctl_data {
66        unsigned short phy_id;
67        unsigned short reg_num;
68        unsigned short val_in;
69        unsigned short val_out;
70};
71
72#define TRX_MAGIC_F7D3301                       0x20100322      /* Belkin Share Max; router's birthday ? */
73#define TRX_MAGIC_F7D3302                       0x20090928      /* Belkin Share; router's birthday ? */
74#define TRX_MAGIC_F7D4302                       0x20091006      /* Belkin Play; router's birthday ? */
75
76#ifdef HAVE_FONERA
77static void inline getBoardMAC(char *mac)
78{
79        // 102
80        int i;
81        char op[32];
82        unsigned char data[256];
83        FILE *in;
84
85        sprintf(op, "/dev/mtdblock/%d", getMTD("board_config"));
86        in = fopen(op, "rb");
87        if (in == NULL)
88                return;
89        fread(data, 256, 1, in);
90        fclose(in);
91        sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", data[102] & 0xff,
92                data[103] & 0xff, data[104] & 0xff, data[105] & 0xff,
93                data[106] & 0xff, data[107] & 0xff);
94}
95#endif
96
97int count_processes(char *pidName)
98{
99        FILE *fp;
100        char line[254];
101        char safename[64];
102
103        sprintf(safename, " %s ", pidName);
104        char zombie[64];
105
106        sprintf(zombie, "Z   [%s]", pidName);   // do not count zombies
107        int i = 0;
108
109        cprintf("Search for %s\n", pidName);
110        if ((fp = popen("ps", "r"))) {
111                while (fgets(line, sizeof(line), fp) != NULL) {
112                        int len = strlen(line);
113                        if (len > 254)
114                                len = 254;
115                        line[len - 1] = ' ';
116                        line[len] = 0;
117                        if (strstr(line, safename) && !strstr(line, zombie)) {
118                                i++;
119                        }
120                }
121                pclose(fp);
122        }
123        cprintf("Search done... %d\n", i);
124
125        return i;
126}
127
128/*
129 * This function returns the number of days for the given month in the given
130 * year
131 */
132unsigned int daysformonth(unsigned int month, unsigned int year)
133{
134        return (30 + (((month & 9) == 8) || ((month & 9) == 1)) -
135                (month == 2) - (!(((year % 4) == 0)
136                                  && (((year % 100) != 0)
137                                      || ((year % 400) == 0)))
138                                && (month == 2)));
139}
140
141#ifdef HAVE_AQOS
142
143static char *get_wshaper_dev(void)
144{
145        if (nvram_match("wshaper_dev", "WAN"))
146                return get_wan_face();
147        else
148                return "br0";
149}
150
151void add_userip(char *ip, int idx, char *upstream, char *downstream)
152{
153        int base = 120 + idx;
154        char up[32];
155        char down[32];
156        char ups[32];
157        char downs[32];
158
159        if (nvram_match("qos_type", "1")) {
160                sprintf(up, "1:%d", base);
161                sprintf(down, "1:%d", base + 1);
162                sprintf(ups, "%skbit", upstream);
163                sprintf(downs, "%skbit", downstream);
164                sysprintf
165                    ("tc class add dev %s parent 1:1 classid 1:%d htb rate %skbit ceil %skbit",
166                     "imq0", base, upstream, upstream);
167                sysprintf
168                    ("tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
169                     "imq0", base);
170                sysprintf
171                    ("tc filter add dev %s protocol ip parent 1:0 prio 1 u32 match ip src %s flowid 1:%d",
172                     "imq0", ip, base);
173
174                sysprintf
175                    ("tc class add dev imq0 parent 1:1 classid 1:%d htb rate %skbit ceil %skbit",
176                     base + 1, downstream, downstream);
177                sysprintf
178                    ("tc qdisc add dev imq0 parent 1:%d sfq quantum 1514b perturb 15",
179                     base + 1, base + 1);
180                sysprintf
181                    ("tc filter add dev imq0 protocol ip parent 1:0 prio 1 u32 match ip dst %s flowid 1:%d",
182                     ip, base + 1);
183
184        } else {
185                sprintf(up, "1:%d", base);
186                sprintf(down, "1:%d", base + 1);
187                sprintf(ups, "%skbit", upstream);
188                sprintf(downs, "%skbit", downstream);
189                sysprintf
190                    ("tc class add dev %s parent 1:2 classid 1:%d htb rate %skbit ceil %skbit",
191                     "imq0", base, upstream, upstream);
192                sysprintf
193                    ("tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
194                     "imq0", base);
195                sysprintf
196                    ("tc filter add dev %s protocol ip parent 1:0 prio 1 u32 match ip src %s flowid 1:%d",
197                     "imq0", ip, base);
198
199                sysprintf
200                    ("tc class add dev imq0 parent 1:2 classid 1:%d htb rate %skbit ceil %skbit",
201                     base + 1, downstream, downstream);
202                sysprintf
203                    ("tc qdisc add dev imq0 parent 1:%d sfq quantum 1514b perturb 15",
204                     base + 1, base + 1);
205                sysprintf
206                    ("tc filter add dev imq0 protocol ip parent 1:0 prio 1 u32 match ip dst %s flowid 1:%d",
207                     ip, base + 1);
208        }
209}
210
211void add_usermac(char *mac, int idx, char *upstream, char *downstream)
212{
213        unsigned char octet[6];
214
215        ether_atoe(mac, octet);
216        int base = 120 + idx;
217        char up[32];
218        char down[32];
219        char ups[32];
220        char downs[32];
221        char oct2[32];
222        char oct4[32];
223        char doct2[32];
224        char doct4[32];
225
226        sprintf(up, "1:%d", base);
227        sprintf(down, "1:%d", base + 1);
228        sprintf(ups, "%skbit", upstream);
229        sprintf(downs, "%skbit", downstream);
230
231        sprintf(oct2, "%02X%02X", octet[4], octet[5]);
232        sprintf(oct4, "%02X%02X%02X%02X", octet[0], octet[1], octet[2],
233                octet[3]);
234
235        sprintf(doct4, "%02X%02X%02X%02X", octet[2], octet[3], octet[4],
236                octet[5]);
237        sprintf(doct2, "%02X%02X", octet[0], octet[1]);
238
239        if (nvram_match("qos_type", "1")) {
240                // up
241                sysprintf("tc class add dev %s parent 1:1 classid 1:%d htb rate %skbit ceil %skbit", "imq0", base, upstream, upstream); //
242                sysprintf
243                    ("tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
244                     "imq0", base);
245                sysprintf
246                    ("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",
247                     "imq0", oct2, oct4, base);
248
249                // down
250                if (strcmp(get_wshaper_dev(), "br0")) {
251                        /*
252                         * use separate root class, since no other class is created for br0
253                         * if qos is wan based
254                         */
255                        sysprintf
256                            ("tc class add dev br0 parent 1: classid 1:%d htb rate %skbit ceil %skbit",
257                             base + 1, downstream, downstream);
258                        sysprintf
259                            ("tc qdisc add dev br0 parent 1:%d sfq quantum 1514b perturb 15",
260                             base + 1, base + 1);
261                        sysprintf
262                            ("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",
263                             doct4, doct2, base + 1);
264                } else {
265                        /*
266                         * use root class of br0 interface which was created by the wshaper
267                         */
268                        // br0 -> imq0 changed, in lan-briding, we need to use IMQ
269                        sysprintf
270                            ("tc class add dev imq0 parent 1:1 classid 1:%d htb rate %skbit ceil %skbit",
271                             base + 1, downstream, downstream);
272                        sysprintf
273                            ("tc qdisc add dev imq0 parent 1:%d sfq quantum 1514b perturb 15",
274                             base + 1, base + 1);
275                        sysprintf
276                            ("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",
277                             doct4, doct2, base + 1);
278                }
279
280        } else {
281                // up
282                sysprintf("tc class add dev %s parent 1:2 classid 1:%d htb rate %skbit ceil %skbit", "imq0", base, upstream, upstream); //
283                sysprintf
284                    ("tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
285                     "imq0", base);
286                sysprintf
287                    ("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",
288                     "imq0", oct2, oct4, base);
289
290                // down
291                if (strcmp(get_wshaper_dev(), "br0")) {
292                        /*
293                         * use separate root class, since no other class is created for br0
294                         * if qos is wan based
295                         */
296                        sysprintf
297                            ("tc class add dev br0 parent 1: classid 1:%d htb rate %skbit ceil %skbit",
298                             base + 1, downstream, downstream);
299                        sysprintf
300                            ("tc qdisc add dev br0 parent 1:%d sfq quantum 1514b perturb 15",
301                             base + 1, base + 1);
302                        sysprintf
303                            ("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",
304                             doct4, doct2, base + 1);
305                } else {
306                        /*
307                         * use root class of br0 interface which was created by the wshaper
308                         */
309                        // br0 -> imq0 changed, in lan-briding, we need to use IMQ
310                        sysprintf
311                            ("tc class add dev imq0 parent 1:2 classid 1:%d htb rate %skbit ceil %skbit",
312                             base + 1, downstream, downstream);
313                        sysprintf
314                            ("tc qdisc add dev imq0 parent 1:%d sfq quantum 1514b perturb 15",
315                             base + 1, base + 1);
316                        sysprintf
317                            ("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",
318                             doct4, doct2, base + 1);
319                }
320        }
321        /*
322         * mac downstream matching can only be made directly on the connected
323         * interface
324         */
325        char iflist[256];
326
327        getIfList(iflist, NULL);
328        static char word[256];
329        char *next, *wordlist;
330
331        foreach(word, iflist, next) {
332                if (nvram_nmatch("0", "%s_bridged", word)) {
333                        sysprintf
334                            ("tc class add dev %s parent 1: classid 1:%d htb rate %skbit ceil %skbit",
335                             word, base + 1, downstream, downstream);
336                        sysprintf
337                            ("tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
338                             word, base + 1, base + 1);
339                        sysprintf
340                            ("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",
341                             word, doct4, doct2, base + 1);
342                }
343        }
344
345}
346
347#endif
348int buf_to_file(char *path, char *buf)
349{
350        FILE *fp;
351
352        if ((fp = fopen(path, "w"))) {
353                fprintf(fp, "%s", buf);
354                fclose(fp);
355                return 1;
356        }
357
358        return 0;
359}
360
361int check_action(void)
362{
363        char buf[80] = "";
364
365        if (file_to_buf(ACTION_FILE, buf, sizeof(buf))) {
366                if (!strcmp(buf, "ACT_TFTP_UPGRADE")) {
367                        fprintf(stderr, "Upgrading from tftp now ...\n");
368                        return ACT_TFTP_UPGRADE;
369                }
370#ifdef HAVE_HTTPS
371                else if (!strcmp(buf, "ACT_WEBS_UPGRADE")) {
372                        fprintf(stderr, "Upgrading from web (https) now ...\n");
373                        return ACT_WEBS_UPGRADE;
374                }
375#endif
376                else if (!strcmp(buf, "ACT_WEB_UPGRADE")) {
377                        fprintf(stderr, "Upgrading from web (http) now ...\n");
378                        return ACT_WEB_UPGRADE;
379                } else if (!strcmp(buf, "ACT_SW_RESTORE")) {
380                        fprintf(stderr,
381                                "Receiving restore command from web ...\n");
382                        return ACT_SW_RESTORE;
383                } else if (!strcmp(buf, "ACT_HW_RESTORE")) {
384                        fprintf(stderr,
385                                "Receiving restore command from resetbutton ...\n");
386                        return ACT_HW_RESTORE;
387                } else if (!strcmp(buf, "ACT_NVRAM_COMMIT")) {
388                        fprintf(stderr, "Committing nvram now ...\n");
389                        return ACT_NVRAM_COMMIT;
390                } else if (!strcmp(buf, "ACT_ERASE_NVRAM")) {
391                        fprintf(stderr, "Erasing nvram now ...\n");
392                        return ACT_ERASE_NVRAM;
393                }
394        }
395        // fprintf(stderr, "Waiting for upgrading....\n");
396        return ACT_IDLE;
397}
398
399int check_vlan_support(void)
400{
401#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_MAGICBOX)  || defined(HAVE_RB600) || 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) || defined(HAVE_OPENRISC)
402        return 0;
403#else
404
405        int brand = getRouterBrand();
406
407        switch (brand) {
408#ifndef HAVE_BUFFALO
409        case ROUTER_ASUS_WL500GD:
410                return 1;
411                break;
412#endif
413        case ROUTER_BUFFALO_WLAG54C:
414        case ROUTER_BUFFALO_WLA2G54C:
415#ifndef HAVE_BUFFALO
416        case ROUTER_LINKSYS_WRT55AG:
417        case ROUTER_MOTOROLA_V1:
418        case ROUTER_MOTOROLA_WE800G:
419        case ROUTER_WAP54G_V1:
420        case ROUTER_SITECOM_WL105B:
421        case ROUTER_SITECOM_WL111:
422        case ROUTER_BUFFALO_WLI2_TX1_G54:
423        case ROUTER_BUFFALO_WLI_TX4_G54HP:
424        case ROUTER_BRCM4702_GENERIC:
425        case ROUTER_ASUS_WL500G:
426        case ROUTER_BELKIN_F5D7230_V2000:
427        case ROUTER_ASKEY_RT220XD:
428#endif
429                return 0;
430                break;
431        }
432
433        unsigned long boardflags =
434            strtoul(nvram_safe_get("boardflags"), NULL, 0);
435
436        if (boardflags & BFL_ENETVLAN)
437                return 1;
438
439        if (nvram_match("boardtype", "bcm94710dev")
440            || nvram_match("boardtype", "0x0101") || (boardflags & 0x0100))
441                return 1;
442        else
443                return 0;
444#endif
445}
446
447void setRouter(char *name)
448{
449#ifdef HAVE_POWERNOC_WORT54G
450        nvram_set(NVROUTER, "WORT54G");
451#elif HAVE_POWERNOC_WOAP54G
452        nvram_set(NVROUTER, "WOAP54G");
453#elif HAVE_ERC
454        nvram_set(NVROUTER, "ServiceGate v1.0");
455#elif HAVE_OMNI
456        nvram_set(NVROUTER, "Omni Wifi Router");
457#elif HAVE_ALFA_BRANDING
458        nvram_set(NVROUTER, "WLAN base-station");
459        if (name)
460                nvram_set("DD_BOARD2", name);
461#elif HAVE_MAKSAT
462        if (name)
463                nvram_set("DD_BOARD2", name);
464#ifdef HAVE_MAKSAT_BLANK
465        nvram_set(NVROUTER, "default");
466#else
467        nvram_set(NVROUTER, "MAKSAT");
468#endif
469#elif HAVE_TMK
470        if (name)
471                nvram_set("DD_BOARD2", name);
472        nvram_set(NVROUTER, "KMT-WAS");
473#elif HAVE_BKM
474        if (name)
475                nvram_set("DD_BOARD2", name);
476        nvram_set(NVROUTER, "BKM-HSDL");
477#elif HAVE_TRIMAX
478        if (name)
479                nvram_set("DD_BOARD2", name);
480        nvram_set(NVROUTER, "Trimax Wireless");
481#elif HAVE_WIKINGS
482        if (name)
483                nvram_set("DD_BOARD2", name);
484#ifdef HAVE_SUB3
485        nvram_set(NVROUTER, "ExcelMin");
486#elif HAVE_SUB6
487        nvram_set(NVROUTER, "ExcelMed");
488#else
489        nvram_set(NVROUTER, "Excellent");
490#endif
491#elif HAVE_ESPOD
492        if (name)
493                nvram_set("DD_BOARD2", name);
494#ifdef HAVE_SUB3
495        nvram_set(NVROUTER, "ESPOD ES-3680");
496#elif HAVE_SUB6
497        nvram_set(NVROUTER, "ESPOD ES-3680");
498#else
499        nvram_set(NVROUTER, "ESPOD ES-3680");
500#endif
501#elif HAVE_CARLSONWIRELESS
502        nvram_set(NVROUTER, "LH-135/270 ST");
503#else
504        if (name)
505                nvram_set(NVROUTER, name);
506#endif
507        cprintf("router is %s\n", getRouter());
508}
509
510char *getRouter()
511{
512        char *n = nvram_get(NVROUTER);
513
514        return n != NULL ? n : "Unknown Model";
515}
516
517int internal_getRouterBrand()
518{
519#if defined(HAVE_ALLNETWRT) && !defined(HAVE_ECB9750)
520        unsigned long boardnum = strtoul(nvram_safe_get("boardnum"), NULL, 0);
521
522        if (boardnum == 8 && nvram_match("boardtype", "0x048e")
523            && nvram_match("boardrev", "0x11")) {
524                setRouter("ALLNET EUROWRT 54");
525                return ROUTER_ALLNET01;
526        }
527        eval("event", "3", "1", "15");
528        return 0;
529#elif defined(HAVE_ALLNETWRT) && defined(HAVE_EOC5610)
530        setRouter("Allnet Outdoor A/B/G CPE");
531        return ROUTER_BOARD_LS2;
532#else
533#ifdef HAVE_NP28G
534        setRouter("Compex NP28G");
535        return ROUTER_BOARD_NP28G;
536#elif HAVE_WP54G
537        setRouter("Compex WP54G");
538        return ROUTER_BOARD_WP54G;
539#elif HAVE_ADM5120
540        if (!nvram_match("DD_BOARD", "OSBRiDGE 5LXi"))
541                setRouter("Tonze AP-120");
542        return ROUTER_BOARD_ADM5120;
543#elif HAVE_RB500
544        setRouter("Mikrotik RB500");
545        return ROUTER_BOARD_500;
546#elif HAVE_GEMTEK
547        setRouter("SuperGerry");
548        return ROUTER_SUPERGERRY;
549#elif HAVE_LAGUNA
550        char *filename = "/sys/devices/platform/cns3xxx-i2c.0/i2c-adapter/i2c-0/0-0050/eeprom"; /* bank2=0x100                                                                                           */
551        FILE *file = fopen(filename, "rb");
552        if (file) {
553                fseek(file, 0x130, SEEK_SET);
554                char gwid[9];
555                fread(&gwid[0], 9, 1, file);
556                fclose(file);
557                if (!strncmp(gwid, "GW2388", 6)) {
558                        setRouter("Gateworks Laguna GW2388");
559                        return ROUTER_BOARD_GW2388;
560                } else if (!strncmp(gwid, "GW2380", 6)) {
561                        setRouter("Gateworks Laguna GW2380");
562                        return ROUTER_BOARD_GW2380;
563                } else {
564                        setRouter("Gateworks Laguna GWXXXX");
565                        return ROUTER_BOARD_GW2388;
566                }
567        } else {
568                setRouter("Gateworks Laguna");
569                return ROUTER_BOARD_GW2388;
570
571        }
572#elif HAVE_MI424WR
573        setRouter("Actiontec MI424WR");
574        return ROUTER_BOARD_GATEWORX_GW2345;
575#elif HAVE_USR8200
576        setRouter("US Robotics USR8200");
577        return ROUTER_BOARD_GATEWORX;
578#elif HAVE_TONZE
579        setRouter("Tonze AP-425");
580        return ROUTER_BOARD_GATEWORX;
581#elif HAVE_NOP8670
582        setRouter("Senao NOP-8670");
583        return ROUTER_BOARD_GATEWORX;
584#elif HAVE_WRT300NV2
585        setRouter("Linksys WRT300N v2");
586        return ROUTER_BOARD_GATEWORX;
587#elif HAVE_WG302V1
588        setRouter("Netgear WG302 v1");
589        return ROUTER_BOARD_GATEWORX;
590#elif HAVE_WG302
591        setRouter("Netgear WG302 v2");
592        return ROUTER_BOARD_GATEWORX;
593#elif HAVE_PRONGHORN
594        setRouter("ADI Engineering Pronghorn Metro");
595        return ROUTER_BOARD_GATEWORX;
596#elif HAVE_GATEWORX
597        char *filename = "/sys/devices/platform/IXP4XX-I2C.0/i2c-adapter:i2c-0/0-0051/eeprom";  /* bank2=0x100
598                                                                                                 */
599        FILE *file = fopen(filename, "r");
600        if (!file) {
601                filename = "/sys/devices/platform/IXP4XX-I2C.0/i2c-0/0-0051/eeprom";    //for 2.6.34.6
602                file = fopen(filename, "r");
603        }
604        if (file)               // new detection scheme
605        {
606
607                char *gwid;
608                char temp[64];
609                int ret = fread(temp, 40, 1, file);
610                if (ret < 1) {
611                        fclose(file);
612                        goto old_way;
613                }
614                gwid = &temp[32];
615                gwid[8] = 0;
616                fclose(file);
617                if (!strncmp(gwid, "GW2347", 6)) {
618                        setRouter("Gateworks Avila GW2347");
619                        return ROUTER_BOARD_GATEWORX_SWAP;
620                }
621                if (!strncmp(gwid, "GW2357", 6)) {
622                        setRouter("Gateworks Avila GW2357");
623                        return ROUTER_BOARD_GATEWORX_SWAP;
624                }
625                if (!strncmp(gwid, "GW2353", 6)) {
626                        setRouter("Gateworks Avila GW2353");
627                        return ROUTER_BOARD_GATEWORX;
628                }
629                if (!strncmp(gwid, "GW2348-2", 8)) {
630                        setRouter("Gateworks Avila GW2348-2");
631                        return ROUTER_BOARD_GATEWORX;
632                }
633                if (!strncmp(gwid, "GW2348-4", 8)) {
634                        setRouter("Gateworks Avila GW2348-4");
635                        return ROUTER_BOARD_GATEWORX;
636                }
637                if (!strncmp(gwid, "GW2348", 6)) {
638                        setRouter("Gateworks Avila GW2348-4/2");
639                        return ROUTER_BOARD_GATEWORX;
640                }
641                if (!strncmp(gwid, "GW2358", 6)) {
642                        setRouter("Gateworks Cambria GW2358-4");
643                        return ROUTER_BOARD_GATEWORX;
644                }
645                if (!strncmp(gwid, "GW2350", 6)) {
646                        setRouter("Gateworks Cambria GW2350");
647                        return ROUTER_BOARD_GATEWORX;
648                }
649                if (!strncmp(gwid, "GW2369", 6)) {
650                        setRouter("Gateworks Avila GW2369");
651                        return ROUTER_BOARD_GATEWORX_GW2369;
652                }
653                if (!strncmp(gwid, "GW2355", 6)) {
654                        setRouter("Gateworks Avila GW2355");
655                        return ROUTER_BOARD_GATEWORX_GW2345;
656                }
657                if (!strncmp(gwid, "GW2345", 6)) {
658                        setRouter("Gateworks Avila GW2345");
659                        return ROUTER_BOARD_GATEWORX_GW2345;
660                }
661        }
662      old_way:;
663        struct mii_ioctl_data *data;
664        struct ifreq iwr;
665        int s = socket(AF_INET, SOCK_DGRAM, 0);
666
667        if (s < 0) {
668                fprintf(stderr, "socket(SOCK_DRAGM)\n");
669                setRouter("Gateworks Avila");
670                return ROUTER_BOARD_GATEWORX;
671        }
672        (void)strncpy(iwr.ifr_name, "ixp0", sizeof("ixp0"));
673        data = (struct mii_ioctl_data *)&iwr.ifr_data;
674        data->phy_id = 1;
675#define IX_ETH_ACC_MII_PHY_ID1_REG  0x2 /* PHY identifier 1 Register */
676#define IX_ETH_ACC_MII_PHY_ID2_REG  0x3 /* PHY identifier 2 Register */
677        data->reg_num = IX_ETH_ACC_MII_PHY_ID1_REG;
678        ioctl(s, SIOCGMIIREG, &iwr);
679        data->phy_id = 1;
680        data->reg_num = IX_ETH_ACC_MII_PHY_ID1_REG;
681        ioctl(s, SIOCGMIIREG, &iwr);
682        int reg1 = data->val_out;
683
684        data->phy_id = 1;
685        data->reg_num = IX_ETH_ACC_MII_PHY_ID2_REG;
686        ioctl(s, SIOCGMIIREG, &iwr);
687        int reg2 = data->val_out;
688
689        close(s);
690        fprintf(stderr, "phy id %X:%X\n", reg1, reg2);
691        if (reg1 == 0x2000 && reg2 == 0x5c90) {
692                setRouter("Avila GW2347");
693                return ROUTER_BOARD_GATEWORX_SWAP;
694        } else if (reg1 == 0x13 && reg2 == 0x7a11) {
695#if HAVE_ALFA_BRANDING
696                setRouter("WLAN base-station");
697#else
698                setRouter("Gateworks Avila GW2348-4/2");
699#endif
700                return ROUTER_BOARD_GATEWORX;
701        } else if (reg1 == 0x143 && reg2 == 0xbc31)     // broadcom phy
702        {
703                setRouter("ADI Engineering Pronghorn Metro");
704                return ROUTER_BOARD_GATEWORX;
705        } else if (reg1 == 0x22 && reg2 == 0x1450)      // kendin switch
706        {
707                setRouter("Gateworks Avila GW2345");
708                return ROUTER_BOARD_GATEWORX_GW2345;
709        } else if (reg1 == 0x0 && reg2 == 0x8201)       // realtek
710        {
711                setRouter("Compex WP188");
712                return ROUTER_BOARD_GATEWORX;
713        } else {
714                setRouter("Unknown");
715                return ROUTER_BOARD_GATEWORX;
716        }
717#elif HAVE_RT2880
718
719#ifdef HAVE_ECB9750
720#ifdef HAVE_ALLNETWRT
721        setRouter("Allnet 802.11n Router");
722#else
723        setRouter("Senao ECB-9750");
724#endif
725        return ROUTER_BOARD_ECB9750;
726#elif HAVE_ALLNET11N
727        setRouter("Allnet 802.11n Router");
728        return ROUTER_BOARD_WHRG300N;
729#elif HAVE_AR670W
730        setRouter("Airlink 101 AR670W");
731        return ROUTER_BOARD_AR670W;
732#elif HAVE_AR690W
733        setRouter("Airlink 101 AR690W");
734        return ROUTER_BOARD_AR690W;
735#elif HAVE_RT15N
736        setRouter("Asus RT-N15");
737        return ROUTER_BOARD_RT15N;
738#elif HAVE_BR6574N
739        setRouter("Edimax BR-6574N");
740        return ROUTER_BOARD_BR6574N;
741#elif HAVE_ESR6650
742        setRouter("Senao ESR-6650");
743        return ROUTER_BOARD_ESR6650;
744#elif HAVE_EAP9550
745        setRouter("Senao EAP-9550");
746        return ROUTER_BOARD_EAP9550;
747#elif HAVE_ESR9752
748        setRouter("Senao ESR-9752");
749        return ROUTER_BOARD_ESR9752;
750#elif HAVE_ACXNR22
751        setRouter("Aceex NR22");
752        return ROUTER_BOARD_ACXNR22;
753#elif HAVE_W502U
754        setRouter("Alfa AIP-W502U");
755        return ROUTER_BOARD_W502U;
756#elif HAVE_DIR615
757        setRouter("Dlink-DIR615 rev d");
758        return ROUTER_BOARD_DIR615D;
759#elif HAVE_RT3352
760        setRouter("Ralink RT3352 Device");
761        return ROUTER_BOARD_RT3352;
762#elif HAVE_NEPTUNE
763        setRouter("Neptune-Mini");
764        return ROUTER_BOARD_NEPTUNE;
765#elif HAVE_TECHNAXX
766        setRouter("TECHNAXX Router-150 Wifi-N");
767        return ROUTER_BOARD_TECHNAXX;
768#elif HAVE_RT10N
769        setRouter("Asus RT-N10+");
770        return ROUTER_ASUS_RTN10PLUS;
771#elif HAVE_DIR600
772#ifdef HAVE_DIR300
773        setRouter("Dlink-DIR300 rev b");
774#else
775        setRouter("Dlink-DIR600 rev b");
776#endif
777        return ROUTER_BOARD_DIR600B;
778#elif HAVE_RT13NB1
779        setRouter("Asus RT-N13U B1");
780        return ROUTER_BOARD_WHRG300N;
781#elif HAVE_ASUSRTN13U
782        setRouter("Asus RT-N13U");
783        return ROUTER_BOARD_WHRG300N;
784#elif HAVE_F5D8235
785        setRouter("Belkin F5D8235-4 v2");
786        return ROUTER_BOARD_F5D8235;
787#elif HAVE_WHRG300N
788        setRouter("Buffalo WHR-G300N");
789        return ROUTER_BOARD_WHRG300N;
790#elif HAVE_WR5422
791        setRouter("Repotec RP-WR5422");
792        return ROUTER_BOARD_WR5422;
793#else
794        setRouter("Generic RT2880");
795        return ROUTER_BOARD_RT2880;
796#endif
797#elif HAVE_X86
798#ifdef HAVE_CORENET
799        setRouter("CORENET X86i");
800        return ROUTER_BOARD_X86;
801#else
802        setRouter("Generic X86");
803        return ROUTER_BOARD_X86;
804#endif
805#elif HAVE_XSCALE
806        setRouter("NewMedia Dual A/B/G");
807        return ROUTER_BOARD_XSCALE;
808#elif HAVE_MAGICBOX
809        setRouter("OpenRB PowerPC Board");
810        return ROUTER_BOARD_MAGICBOX;
811#elif HAVE_RB1000
812        setRouter("Mikrotik RB1000");
813        return ROUTER_BOARD_RB600;
814#elif HAVE_RB800
815        setRouter("Mikrotik RB800");
816        return ROUTER_BOARD_RB600;
817#elif HAVE_RB600
818        setRouter("Mikrotik RB600");
819        return ROUTER_BOARD_RB600;
820#elif HAVE_GWMF54G2
821        setRouter("Planex GW-MF54G2");
822        char mac[32];
823        getBoardMAC(mac);
824        if (!strncmp(mac, "00:19:3B", 8) || !strncmp(mac, "00:02:6F", 8)
825            || !strncmp(mac, "00:15:6D", 8)) {
826                fprintf(stderr, "unsupported board\n");
827                sys_reboot();
828        }
829        return ROUTER_BOARD_FONERA;
830#elif HAVE_WRT54GV7
831        setRouter("Linksys WRT54G v7");
832        return ROUTER_BOARD_FONERA;
833#elif HAVE_WRK54G
834        setRouter("Linksys WRK54G v3");
835        return ROUTER_BOARD_FONERA;
836#elif HAVE_WGT624
837        setRouter("Netgear WGT624 v4");
838        return ROUTER_BOARD_FONERA;
839#elif HAVE_WPE53G
840        setRouter("Compex WPE53G");
841        return ROUTER_BOARD_FONERA;
842#elif HAVE_NP25G
843        setRouter("Compex NP25G");
844        return ROUTER_BOARD_FONERA;
845#elif HAVE_MR3202A
846        setRouter("MR3202A");
847        return ROUTER_BOARD_FONERA;
848#elif HAVE_DLM101
849        setRouter("Doodle Labs DLM-101");
850        return ROUTER_BOARD_FONERA;
851#elif HAVE_AR430W
852        setRouter("Airlink-101 AR430W");
853        return ROUTER_BOARD_FONERA;
854#elif HAVE_DIR400
855        setRouter("D-Link DIR-400");
856        return ROUTER_BOARD_FONERA2200;
857#elif HAVE_WRT54G2
858        setRouter("Linksys WRT54G2 v1.1");
859        return ROUTER_BOARD_FONERA;
860#elif HAVE_RTG32
861        setRouter("Asus RT-G32");
862        return ROUTER_BOARD_FONERA;
863#elif HAVE_DIR300
864        setRouter("D-Link DIR-300");
865        return ROUTER_BOARD_FONERA;
866#elif HAVE_CNC
867        setRouter("WiFi4You Outdoor AP");
868        return ROUTER_BOARD_FONERA;
869#elif defined(HAVE_CORENET) && defined(HAVE_NS2)
870        setRouter("CORENET XNS2");
871        return ROUTER_BOARD_LS2;
872#elif defined(HAVE_CORENET) && defined(HAVE_LC2)
873        setRouter("CORENET XLO2");
874        return ROUTER_BOARD_LS2;
875#elif defined(HAVE_CORENET) && defined(HAVE_EOC2610)
876        setRouter("CORENET XC61");
877        return ROUTER_BOARD_FONERA;
878#elif defined(HAVE_CORENET) && defined(HAVE_EOC1650)
879        setRouter("CORENET XC65");
880        return ROUTER_BOARD_FONERA;
881#elif defined(HAVE_CORENET) && defined(HAVE_BS2)
882        setRouter("CORENET XBU2");
883        return ROUTER_BOARD_LS2;
884#elif defined(HAVE_CORENET) && defined(HAVE_BS2HP)
885        setRouter("CORENET MBU2i");
886        return ROUTER_BOARD_LS2;
887#elif HAVE_WBD500
888        setRouter("Wiligear WBD-500");
889        return ROUTER_BOARD_FONERA;
890#elif HAVE_EOC1650
891        setRouter("Senao EOC-1650");
892        return ROUTER_BOARD_FONERA;
893#elif HAVE_EOC2611
894        setRouter("Senao EOC-2611");
895        return ROUTER_BOARD_FONERA;
896#elif HAVE_EOC2610
897#ifdef HAVE_TRIMAX
898        setRouter("TMAX-1200");
899#else
900        setRouter("Senao EOC-2610");
901#endif
902        return ROUTER_BOARD_FONERA;
903#elif HAVE_ECB3500
904        setRouter("Senao ECB-3500");
905        return ROUTER_BOARD_FONERA;
906#elif HAVE_EAP3660
907        setRouter("Senao EAP-3660");
908        return ROUTER_BOARD_FONERA;
909#elif HAVE_MR3201A
910        setRouter("Accton MR3201A");
911        return ROUTER_BOARD_FONERA;
912#elif HAVE_FONERA
913        struct mii_ioctl_data *data;
914        struct ifreq iwr;
915        char mac[32];
916        getBoardMAC(mac);
917        if (!strncmp(mac, "00:19:3B", 8) || !strncmp(mac, "00:02:6F", 8)
918            || !strncmp(mac, "00:15:6D", 8) || !strncmp(mac, "00:C0:CA", 8)) {
919                fprintf(stderr, "unsupported board\n");
920                sys_reboot();
921        }
922        int s = socket(AF_INET, SOCK_DGRAM, 0);
923
924        if (s < 0) {
925                fprintf(stderr, "socket(SOCK_DRAGM)\n");
926                setRouter("Fonera 2100/2200");
927                return ROUTER_BOARD_FONERA;
928        }
929        (void)strncpy(iwr.ifr_name, "eth0", sizeof("eth0"));
930        data = (struct mii_ioctl_data *)&iwr.ifr_data;
931        data->phy_id = 0x10;
932        data->reg_num = 0x2;
933        ioctl(s, SIOCGMIIREG, &iwr);
934        data->phy_id = 0x10;
935        data->reg_num = 0x2;
936        ioctl(s, SIOCGMIIREG, &iwr);
937        if (data->val_out == 0x0141) {
938                data->phy_id = 0x10;
939                data->reg_num = 0x3;
940                ioctl(s, SIOCGMIIREG, &iwr);
941                close(s);
942                if ((data->val_out & 0xfc00) != 0x0c00) // marvell phy
943                {
944                        setRouter("Fonera 2100/2200");
945                        return ROUTER_BOARD_FONERA;
946                } else {
947                        setRouter("Fonera 2201");
948                        return ROUTER_BOARD_FONERA2200;
949                }
950        } else {
951                setRouter("Fonera 2100/2200");
952                return ROUTER_BOARD_FONERA;
953        }
954#elif HAVE_MERAKI
955        setRouter("Meraki Mini");
956        return ROUTER_BOARD_MERAKI;
957#elif HAVE_BWRG1000
958        setRouter("Bountiful BWRG-1000");
959        return ROUTER_BOARD_LS2;
960#elif HAVE_WLAEAG300N
961#ifdef HAVE_BUFFALO
962        setRouter("WLAE-AG300N");
963#else
964        setRouter("Buffalo WLAE-AG300N");
965#endif
966        nvram_default_get("ath0_rxantenna", "3");
967        nvram_default_get("ath0_txantenna", "3");
968        return ROUTER_BOARD_WHRHPGN;
969#elif HAVE_WHRHPG300N
970#ifdef HAVE_BUFFALO
971        setRouter("WHR-HP-G300N");
972#else
973        setRouter("Buffalo WHR-HP-G300N");
974#endif
975        nvram_default_get("ath0_rxantenna", "3");
976        nvram_default_get("ath0_txantenna", "3");
977        return ROUTER_BOARD_WHRHPGN;
978#elif HAVE_WHRG300NV2
979#ifdef HAVE_BUFFALO
980        setRouter("WHR-G300N");
981#else
982        setRouter("Buffalo WHR-G300N");
983#endif
984        nvram_default_get("ath0_rxantenna", "3");
985        nvram_default_get("ath0_txantenna", "3");
986        return ROUTER_BOARD_WHRHPGN;
987#elif HAVE_WHRHPGN
988#ifdef HAVE_BUFFALO
989        setRouter("WHR-HP-GN");
990#else
991        setRouter("Buffalo WHR-HP-GN");
992#endif
993        nvram_default_get("ath0_rxantenna", "1");
994        nvram_default_get("ath0_txantenna", "1");
995        return ROUTER_BOARD_WHRHPGN;
996#elif HAVE_UBNTM
997        typedef struct UBNTDEV {
998                char *devicename;       // device name
999                unsigned short devid;   // pci subdevice id
1000                char *rxchain;  // rx chainmask
1001                char *txchain;  // tx chainmask
1002                int dddev;      // dd-wrt device id
1003                int offset;     // frequency offset
1004        };
1005
1006        /* these values are guessed and need to be validated */
1007#define M900 (- (2427 - 907))
1008#define M365 (- (5540 - 3650))
1009#define M35 (- (5540 - 3540))
1010        struct UBNTDEV dev[] = {
1011                {"Ubiquiti NanoStation M2", 0xe002, "3", "3", ROUTER_BOARD_NS2M, 0},    //
1012                {"Ubiquiti NanoStation M2", 0xe012, "3", "3", ROUTER_BOARD_NS2M, 0},    //
1013                {"Ubiquiti NanoStation M5", 0xe005, "3", "3", ROUTER_BOARD_NS5M, 0},    //
1014                {"Ubiquiti NanoStation M3", 0xe035, "3", "3", ROUTER_BOARD_NS5M, M35},  //
1015                {"Ubiquiti NanoStation M365", 0xe003, "3", "3", ROUTER_BOARD_NS5M, M365},       //
1016//              {"Ubiquiti NanoStation M900", 0xe009, "3", "3", ROUTER_BOARD_NS5M, M900},       //
1017                {"Ubiquiti Rocket M2", 0xe102, "3", "3", ROUTER_BOARD_R2M, 0},  //
1018                {"Ubiquiti Rocket M2", 0xe112, "3", "3", ROUTER_BOARD_R2M, 0},  //
1019                {"Ubiquiti Rocket M2", 0xe1b2, "3", "3", ROUTER_BOARD_R2M, 0},  //
1020                {"Ubiquiti Rocket M2", 0xe1c2, "3", "3", ROUTER_BOARD_R2M, 0},  //
1021                {"Ubiquiti Rocket M5", 0xe105, "3", "3", ROUTER_BOARD_R5M, 0},  //
1022                {"Ubiquiti Rocket M5", 0xe1b5, "3", "3", ROUTER_BOARD_R5M, 0},  //
1023                {"Ubiquiti Rocket M5", 0xe1c5, "3", "3", ROUTER_BOARD_R5M, 0},  //
1024                {"Ubiquiti Rocket M3", 0xe1c3, "3", "3", ROUTER_BOARD_R5M, M35},        //
1025                {"Ubiquiti Rocket M365", 0xe1b3, "3", "3", ROUTER_BOARD_R5M, M365},     //
1026                {"Ubiquiti Rocket M365", 0xe1d3, "3", "3", ROUTER_BOARD_R5M, M365},     //
1027                {"Ubiquiti Rocket M900", 0xe1b9, "3", "3", ROUTER_BOARD_R2M, M900},     //
1028                {"Ubiquiti Bullet M2", 0xe202, "1", "1", ROUTER_BOARD_BS5M, 0}, //
1029                {"Ubiquiti Bullet M5", 0xe205, "1", "1", ROUTER_BOARD_BS5M, 0}, //
1030                {"Ubiquiti Airgrid M2", 0xe212, "1", "1", ROUTER_BOARD_BS2M, 0},        //
1031                {"Ubiquiti Airgrid M2", 0xe242, "1", "1", ROUTER_BOARD_BS2M, 0},        //
1032                {"Ubiquiti Airgrid M5", 0xe215, "1", "1", ROUTER_BOARD_BS5M, 0},        //
1033                {"Ubiquiti Airgrid M5", 0xe245, "1", "1", ROUTER_BOARD_BS5M, 0},        //
1034                {"Ubiquiti AirRouter", 0xe4a2, "3", "3", ROUTER_BOARD_NS2M, 0}, //
1035                {"Ubiquiti Pico M2", 0xe302, "1", "1", ROUTER_BOARD_BS2M, 0},   //
1036                {"Ubiquiti Pico M5", 0xe305, "1", "1", ROUTER_BOARD_BS5M, 0},   //
1037                {"Ubiquiti Airwire", 0xe405, "3", "3", ROUTER_BOARD_BS5M, 0},   //
1038                {"Ubiquiti Airwire", 0xe4a5, "3", "3", ROUTER_BOARD_BS5M, 0},   //
1039                {"Ubiquiti Loco M5", 0xe0a5, "3", "3", ROUTER_BOARD_NS5M, 0},   //
1040                {"Ubiquiti Loco M2", 0xe0a2, "3", "3", ROUTER_BOARD_NS5M, 0},   //
1041                {"Ubiquiti Loco M900", 0xe009, "3", "3", ROUTER_BOARD_NS5M, M900},      //
1042                {"Ubiquiti LiteStation M25", 0xe115, "3", "3", ROUTER_BOARD_NS5M, 0},   //
1043                {"Ubiquiti PowerAP N", 0xe402, "3", "3", ROUTER_BOARD_NS2M, 0}, //
1044                {"Ubiquiti Simple AP", 0xe4a2, "3", "3", ROUTER_BOARD_R2M, 0},  //
1045                {"Ubiquiti PowerBridge M3", 0xe2a3, "3", "3", ROUTER_BOARD_R5M, M35},   //
1046                {"Ubiquiti PowerBridge M5", 0xe1a5, "3", "3", ROUTER_BOARD_R5M, 0},     //
1047                {"Ubiquiti PowerBridge M365", 0xe1a3, "3", "3", ROUTER_BOARD_R5M, M365},        //
1048                {"Ubiquiti NanoBridge M3", 0xe243, "3", "3", ROUTER_BOARD_BS5M, M35},   //
1049                {"Ubiquiti NanoBridge M365", 0xe233, "3", "3", ROUTER_BOARD_BS5M, M365},        //
1050                {"Ubiquiti NanoBridge M900", 0xe239, "3", "3", ROUTER_BOARD_BS5M, M900},        //
1051                {"Ubiquiti NanoBridge M5", 0xe235, "3", "3", ROUTER_BOARD_BS5M, 0},     //
1052                {"Ubiquiti NanoBridge M5", 0xe2b5, "3", "3", ROUTER_BOARD_BS5M, 0},     //
1053                {"Ubiquiti NanoBridge M2", 0xe232, "3", "3", ROUTER_BOARD_BS2M, 0},     //
1054                {"Ubiquiti 3G Station", 0xe6a2, "3", "3", ROUTER_BOARD_BS2M, 0},        //
1055                {"Ubiquiti 3G Station Professional", 0xe6b2, "3", "3", ROUTER_BOARD_BS2M, 0},   //
1056                {"Ubiquiti 3G Station Outdoor", 0xe6c2, "3", "3", ROUTER_BOARD_BS2M, 0},        //
1057                {"Ubiquiti WispStation M5", 0xe2a5, "3", "3", ROUTER_BOARD_BS5M, 0},    //
1058                {"Ubiquiti UniFi AP", 0xe502, "3", "3", ROUTER_BOARD_UNIFI, 0}, //
1059                {NULL, 0, NULL, NULL, 0},       //
1060        };
1061
1062#undef M35
1063#undef M365
1064#undef M900
1065
1066#if 0
1067        FILE *fp =
1068            fopen("/sys/bus/pci/devices/0000:00:00.0/subsystem_device", "rb");
1069        if (fp == NULL)
1070                return ROUTER_BOARD_PB42;
1071        int device;
1072        fscanf(fp, "0x%04X", &device);
1073        fclose(fp);
1074#else
1075        FILE *fp = fopen("/dev/mtdblock5", "rb");       //open board config
1076        int device = 0;
1077        if (fp) {
1078                fseek(fp, 0x1006, SEEK_SET);
1079                unsigned short cal[128];
1080                fread(&cal[0], 1, 256, fp);
1081                fclose(fp);
1082                int calcnt = 0;
1083                while (((cal[calcnt] & 0xffff) != 0xffff)) {
1084                        unsigned short reg = cal[calcnt++] & 0xffff;
1085                        if (reg == 0x602c || reg == 0x502c) {
1086                                calcnt++;
1087                                device = cal[calcnt++] & 0xffff;
1088                                break;
1089                        } else {
1090                                calcnt += 2;
1091                        }
1092                }
1093        }
1094#endif
1095        int devcnt = 0;
1096        while (dev[devcnt].devicename != NULL) {
1097                if (dev[devcnt].devid == device) {
1098                        nvram_default_get("ath0_rxantenna",
1099                                          dev[devcnt].rxchain);
1100                        nvram_default_get("ath0_txantenna",
1101                                          dev[devcnt].txchain);
1102                        if (dev[devcnt].offset) {
1103                                char foff[32];
1104                                sprintf(foff, "%d", dev[devcnt].offset);
1105                                nvram_set("ath0_offset", foff);
1106                        }
1107                        setRouter(dev[devcnt].devicename);
1108                        return dev[devcnt].dddev;
1109                }
1110                devcnt++;
1111        }
1112        setRouter("Ubiquiti Unknown Model");
1113        return ROUTER_BOARD_PB42;
1114#elif HAVE_NS2
1115        setRouter("Ubiquiti NanoStation 2");
1116        return ROUTER_BOARD_LS2;
1117#elif HAVE_EOC5510
1118        setRouter("Senao EOC-5510");
1119        return ROUTER_BOARD_LS2;
1120#elif HAVE_EOC5611
1121        setRouter("Senao EOC-5611");
1122        return ROUTER_BOARD_LS2;
1123#elif HAVE_EOC5610
1124        setRouter("Senao EOC-5610");
1125        return ROUTER_BOARD_LS2;
1126#elif HAVE_NS5
1127        setRouter("Ubiquiti NanoStation 5");
1128        return ROUTER_BOARD_LS2;
1129#elif HAVE_SOLO51
1130        setRouter("Alfa SoLo48-N");
1131        return ROUTER_BOARD_LS2;
1132#elif HAVE_NS3
1133        setRouter("Ubiquiti NanoStation 3");
1134        return ROUTER_BOARD_LS2;
1135#elif HAVE_BS5
1136        setRouter("Ubiquiti Bullet 5");
1137        return ROUTER_BOARD_LS2;
1138#elif HAVE_BS2
1139        setRouter("Ubiquiti Bullet 2");
1140        return ROUTER_BOARD_LS2;
1141#elif HAVE_PICO2
1142        setRouter("Ubiquiti PicoStation 2");
1143        return ROUTER_BOARD_LS2;
1144#elif HAVE_PICO2HP
1145        setRouter("Ubiquiti PicoStation 2 HP");
1146        return ROUTER_BOARD_LS2;
1147#elif HAVE_PICO5
1148        setRouter("Ubiquiti PicoStation 5");
1149        return ROUTER_BOARD_LS2;
1150#elif HAVE_MS2
1151        setRouter("Ubiquiti MiniStation");
1152        return ROUTER_BOARD_LS2;
1153#elif HAVE_BS2HP
1154        setRouter("Ubiquiti Bullet 2 HP");
1155        return ROUTER_BOARD_LS2;
1156#elif HAVE_LC2
1157        setRouter("Ubiquiti NanoStation 2 Loco");
1158        return ROUTER_BOARD_LS2;
1159#elif HAVE_LC5
1160        setRouter("Ubiquiti NanoStation 5 Loco");
1161        return ROUTER_BOARD_LS2;
1162#elif HAVE_PS2
1163        setRouter("Ubiquiti PowerStation 2");
1164        return ROUTER_BOARD_LS2;
1165#elif HAVE_PS5
1166        setRouter("Ubiquiti PowerStation 5");
1167        return ROUTER_BOARD_LS2;
1168#elif HAVE_LS2
1169        setRouter("Ubiquiti LiteStation 2");
1170        return ROUTER_BOARD_LS2;
1171#elif HAVE_LS5
1172        setRouter("Ubiquiti LiteStation 5");
1173        return ROUTER_BOARD_LS2;
1174#elif HAVE_WHRAG108
1175        setRouter("Buffalo WHR-HP-AG108");
1176        return ROUTER_BOARD_WHRAG108;
1177#elif HAVE_PB42
1178        setRouter("Atheros PB42");
1179        return ROUTER_BOARD_PB42;
1180#elif HAVE_RSPRO
1181        setRouter("Ubiquiti RouterStation Pro");
1182        return ROUTER_BOARD_PB42;
1183#elif HAVE_RS
1184#ifdef HAVE_DDLINK
1185        setRouter("ddlink1x1");
1186#else
1187        setRouter("Ubiquiti RouterStation");
1188#endif
1189        return ROUTER_BOARD_PB42;
1190#elif HAVE_E2100
1191        setRouter("Linksys E2100L");
1192        return ROUTER_BOARD_PB42;
1193#elif HAVE_WRT160NL
1194        setRouter("Linksys WRT160NL");
1195        return ROUTER_BOARD_PB42;
1196#elif HAVE_TG2521
1197        setRouter("ZCom TG-2521");
1198        return ROUTER_BOARD_PB42;
1199#elif HAVE_WZRG300NH2
1200        nvram_default_get("ath0_rxantenna", "3");
1201        nvram_default_get("ath0_txantenna", "3");
1202#ifdef HAVE_BUFFALO
1203        setRouter("WZR-HP-G300NH2");
1204#else
1205        setRouter("Buffalo WZR-HP-G300NH2");
1206#endif
1207        return ROUTER_BOARD_PB42;
1208#elif HAVE_WZRG450
1209        nvram_default_get("ath0_rxantenna", "7");
1210        nvram_default_get("ath0_txantenna", "7");
1211#ifdef HAVE_BUFFALO
1212        setRouter("WZR-HP-G450H");
1213#else
1214        setRouter("Buffalo WZR-HP-G450H");
1215#endif
1216        return ROUTER_BOARD_PB42;
1217#elif HAVE_WZRG300NH
1218#ifdef HAVE_BUFFALO
1219        setRouter("WZR-HP-G300NH");
1220#else
1221        setRouter("Buffalo WZR-HP-G300NH");
1222#endif
1223        nvram_default_get("ath0_rxantenna", "7");
1224        nvram_default_get("ath0_txantenna", "7");
1225        return ROUTER_BOARD_PB42;
1226#elif HAVE_WZRHPAG300NH
1227#ifdef HAVE_BUFFALO
1228        setRouter("WZR-HP-AG300H");
1229#else
1230        setRouter("Buffalo WZR-HP-AG300H");
1231#endif
1232        return ROUTER_BOARD_PB42;
1233#elif HAVE_WNDR3700V2
1234        nvram_default_get("ath0_rxantenna", "3");
1235        nvram_default_get("ath0_txantenna", "3");
1236        nvram_default_get("ath1_rxantenna", "3");
1237        nvram_default_get("ath1_txantenna", "3");
1238        setRouter("Netgear WNDR3700 v2");
1239        return ROUTER_BOARD_PB42;
1240#elif HAVE_WNDR3700
1241        nvram_default_get("ath0_rxantenna", "3");
1242        nvram_default_get("ath0_txantenna", "3");
1243        nvram_default_get("ath1_rxantenna", "3");
1244        nvram_default_get("ath1_txantenna", "3");
1245        setRouter("Netgear WNDR3700");
1246        return ROUTER_BOARD_PB42;
1247#elif HAVE_DIR825
1248        nvram_default_get("ath0_rxantenna", "3");
1249        nvram_default_get("ath0_txantenna", "3");
1250        nvram_default_get("ath1_rxantenna", "3");
1251        nvram_default_get("ath1_txantenna", "3");
1252        setRouter("Dlink DIR-825");
1253        return ROUTER_BOARD_PB42;
1254#elif HAVE_WRT400
1255        nvram_default_get("ath0_rxantenna", "3");
1256        nvram_default_get("ath0_txantenna", "3");
1257        nvram_default_get("ath1_rxantenna", "3");
1258        nvram_default_get("ath1_txantenna", "3");
1259        setRouter("Linksys WRT400N");
1260        return ROUTER_BOARD_PB42;
1261#elif HAVE_DIR615C1
1262        setRouter("D-Link DIR-615-C1");
1263        return ROUTER_BOARD_PB42;
1264#elif HAVE_DIR601A1
1265        nvram_default_get("ath0_rxantenna", "1");
1266        nvram_default_get("ath0_txantenna", "1");
1267        setRouter("D-Link DIR-601-A1");
1268        return ROUTER_BOARD_PB42;
1269#elif HAVE_DIR615E1
1270        nvram_default_get("ath0_rxantenna", "3");
1271        nvram_default_get("ath0_txantenna", "3");
1272        setRouter("D-Link DIR-615-E1");
1273        return ROUTER_BOARD_PB42;
1274#elif HAVE_DIR615E
1275        nvram_default_get("ath0_rxantenna", "3");
1276        nvram_default_get("ath0_txantenna", "3");
1277        setRouter("D-Link DIR-615-E3/E4");
1278        return ROUTER_BOARD_PB42;
1279#elif HAVE_TEW652BRP
1280        setRouter("Trendnet TEW-652BRP");
1281        return ROUTER_BOARD_PB42;
1282#elif HAVE_TEW632BRP
1283        setRouter("Trendnet TEW-632BRP");
1284        return ROUTER_BOARD_PB42;
1285#elif HAVE_WR841v3
1286        setRouter("TP-Link TL-WR841ND v3");
1287        return ROUTER_BOARD_PB42;
1288#elif HAVE_WR941
1289        setRouter("TP-Link TL-WR941ND v2/v3");
1290        return ROUTER_BOARD_PB42;
1291#elif HAVE_WR841v5
1292        nvram_default_get("ath0_rxantenna", "3");
1293        nvram_default_get("ath0_txantenna", "3");
1294        setRouter("TP-Link TL-WR841ND v5");
1295        return ROUTER_BOARD_PB42;
1296#elif HAVE_WR841v7
1297        nvram_default_get("ath0_rxantenna", "3");
1298        nvram_default_get("ath0_txantenna", "3");
1299        setRouter("TP-Link TL-WR841ND v7");
1300        return ROUTER_BOARD_PB42;
1301#elif HAVE_WR740v1
1302        nvram_default_get("ath0_rxantenna", "1");
1303        nvram_default_get("ath0_txantenna", "1");
1304        setRouter("TP-Link TL-WR740N");
1305        return ROUTER_BOARD_PB42;
1306#elif HAVE_WA901v1
1307        nvram_default_get("ath0_rxantenna", "3");
1308        nvram_default_get("ath0_txantenna", "3");
1309        setRouter("TP-Link TL-WA901ND v1");
1310        return ROUTER_BOARD_PB42;
1311#elif HAVE_WR941v4
1312        setRouter("TP-Link TL-WR941ND v4");
1313        return ROUTER_BOARD_PB42;
1314#elif HAVE_WR743
1315        nvram_default_get("ath0_rxantenna", "1");
1316        nvram_default_get("ath0_txantenna", "1");
1317        setRouter("TP-Link TL-WR743ND v1");
1318        return ROUTER_BOARD_PB42;
1319#elif HAVE_WR741
1320        nvram_default_get("ath0_rxantenna", "1");
1321        nvram_default_get("ath0_txantenna", "1");
1322        setRouter("TP-Link TL-WR741ND v1");
1323        return ROUTER_BOARD_PB42;
1324#elif HAVE_WR1043
1325        nvram_default_get("ath0_rxantenna", "7");
1326        nvram_default_get("ath0_txantenna", "7");
1327        setRouter("TP-Link TL-WR1043ND");
1328        return ROUTER_BOARD_PB42;
1329#elif HAVE_AP83
1330        setRouter("Atheros AP83");
1331        return ROUTER_BOARD_PB42;
1332#elif HAVE_WP543
1333        setRouter("Compex WP543");
1334        return ROUTER_BOARD_PB42;
1335#elif HAVE_JA76PF
1336        setRouter("JJPLUS JA76PF");
1337        return ROUTER_BOARD_PB42;
1338#elif HAVE_JWAP003
1339        setRouter("JJPLUS JWAP003");
1340        return ROUTER_BOARD_PB42;
1341#elif HAVE_ALFAAP94
1342        setRouter("Alfa AP94 Board");
1343        return ROUTER_BOARD_PB42;
1344#elif HAVE_LSX
1345        setRouter("Ubiquiti LiteStation-SR71");
1346        return ROUTER_BOARD_PB42;
1347#elif HAVE_WMBR_G300NH
1348        setRouter("Buffalo WBMR-HP-G300H");
1349        nvram_default_get("ath0_rxantenna", "3");
1350        nvram_default_get("ath0_txantenna", "3");
1351        return ROUTER_BOARD_DANUBE;
1352#elif HAVE_VF802
1353        setRouter("Vodafone Easybox 802");
1354        return ROUTER_BOARD_DANUBE;
1355#elif HAVE_VF803
1356        setRouter("Vodafone Easybox 803");
1357        return ROUTER_BOARD_DANUBE;
1358#elif HAVE_DANUBE
1359        setRouter("Infineon Danube");
1360        return ROUTER_BOARD_DANUBE;
1361#elif HAVE_WBD222
1362        setRouter("Wiligear WBD-222");
1363        return ROUTER_BOARD_STORM;
1364#elif HAVE_STORM
1365        setRouter("Wiligear WBD-111");
1366        return ROUTER_BOARD_STORM;
1367#elif HAVE_OPENRISC
1368        setRouter("Alekto OpenRisc");
1369        return ROUTER_BOARD_OPENRISC;
1370#elif HAVE_TW6600
1371        setRouter("AW-6660");
1372        return ROUTER_BOARD_TW6600;
1373#elif HAVE_ALPHA
1374        setRouter("Alfa Networks AP48");
1375        return ROUTER_BOARD_CA8;
1376#elif HAVE_USR5453
1377        setRouter("US Robotics USR5453");
1378        return ROUTER_BOARD_CA8;
1379#elif HAVE_RDAT81
1380        setRouter("Wistron RDAT-81");
1381        return ROUTER_BOARD_RDAT81;
1382#elif HAVE_RCAA01
1383        setRouter("Airlive WLA-9000AP");
1384        return ROUTER_BOARD_RCAA01;
1385#elif HAVE_CA8PRO
1386        setRouter("Wistron CA8-4 PRO");
1387        return ROUTER_BOARD_CA8PRO;
1388#elif HAVE_CA8
1389#ifdef HAVE_WHA5500CPE
1390        setRouter("Airlive WHA-5500CPE");
1391#elif HAVE_AIRMAX5
1392        setRouter("Airlive AirMax 5");
1393#else
1394        setRouter("Airlive WLA-5000AP");
1395#endif
1396        return ROUTER_BOARD_CA8;
1397#else
1398
1399        unsigned long boardnum = strtoul(nvram_safe_get("boardnum"), NULL, 0);
1400        unsigned long melco_id = strtoul(nvram_safe_get("melco_id"), NULL, 0);
1401
1402        if (boardnum == 42 && nvram_match("boardtype", "bcm94710ap")) {
1403                setRouter("Buffalo WBR-G54 / WLA-G54");
1404                return ROUTER_BUFFALO_WBR54G;
1405        }
1406#ifndef HAVE_BUFFALO
1407        if (nvram_match("boardnum", "mn700") &&
1408            nvram_match("boardtype", "bcm94710ap")) {
1409                setRouter("Microsoft MN-700");
1410                return ROUTER_MICROSOFT_MN700;
1411        }
1412
1413        if (nvram_match("boardnum", "asusX") &&
1414            nvram_match("boardtype", "bcm94710dev")) {
1415                setRouter("Asus WL-300g / WL-500g");
1416                return ROUTER_ASUS_WL500G;
1417        }
1418
1419        if (boardnum == 44 && nvram_match("boardtype", "bcm94710ap")) {
1420                setRouter("Dell TrueMobile 2300");
1421                return ROUTER_DELL_TRUEMOBILE_2300;
1422        }
1423#endif
1424
1425        if (boardnum == 100 && nvram_match("boardtype", "bcm94710dev")) {
1426                setRouter("Buffalo WLA-G54C");
1427                return ROUTER_BUFFALO_WLAG54C;
1428        }
1429#ifndef HAVE_BUFFALO
1430        if (boardnum == 45 && nvram_match("boardtype", "bcm95365r")) {
1431                setRouter("Asus WL-500g Deluxe");
1432                return ROUTER_ASUS_WL500GD;
1433        }
1434
1435        if (boardnum == 45 && nvram_match("boardtype", "0x0472")
1436            && nvram_match("boardrev", "0x23") && nvram_match("parkid", "1")) {
1437                setRouter("Asus WL-500W");
1438                return ROUTER_ASUS_WL500W;
1439        }
1440
1441        if (boardnum == 45 && nvram_match("boardtype", "0x467")) {
1442                char *hwver0 = nvram_safe_get("hardware_version");
1443
1444                if (startswith(hwver0, "WL320G")) {
1445                        setRouter("Asus WL-320gE/gP");
1446                        return ROUTER_ASUS_WL550GE;
1447                } else {
1448                        setRouter("Asus WL-550gE");
1449                        return ROUTER_ASUS_WL550GE;
1450                }
1451        }
1452#ifdef HAVE_BCMMODERN
1453        if (boardnum == 45 && nvram_match("boardtype", "0x04EC")
1454            && nvram_match("boardrev", "0x1402")) {
1455                setRouter("Asus RT-N10");
1456                return ROUTER_ASUS_RTN10;
1457        }
1458
1459        if (boardnum == 45 && nvram_match("boardtype", "0x0550")
1460            && nvram_match("boardrev", "0x1102")) {
1461                setRouter("Asus RT-N10U");
1462                return ROUTER_ASUS_RTN10U;
1463        }
1464
1465        if (boardnum == 45 && nvram_match("boardtype", "0x0550")
1466            && nvram_match("boardrev", "0x1442")) {
1467                setRouter("Asus RT-N53");
1468                return ROUTER_ASUS_RTN53;
1469        }
1470
1471        if (boardnum == 0 && nvram_match("boardtype", "0xF5B2")
1472            && nvram_match("boardrev", "0x1100")) {
1473                setRouter("Asus RT-N66U");
1474                return ROUTER_ASUS_RTN66;
1475        }
1476
1477        if (nvram_match("boardnum", "1") && nvram_match("boardtype", "0x054d")
1478            && nvram_match("boardrev", "0x1109")) {
1479                setRouter("NetCore NW715P");
1480                return ROUTER_NETCORE_NW715P;
1481        }
1482
1483        if (boardnum == 45 && nvram_match("boardtype", "0x04CD")
1484            && nvram_match("boardrev", "0x1201")) {
1485                setRouter("Asus RT-N12");
1486                return ROUTER_ASUS_RTN12;
1487        }
1488
1489        if (boardnum == 45 && nvram_match("boardtype", "0x054D")
1490            && nvram_match("boardrev", "0x1101")) {
1491                setRouter("Asus RT-N12B");
1492                return ROUTER_ASUS_RTN12B;
1493        }
1494
1495        if (boardnum == 45 && nvram_match("boardtype", "0x04cf")
1496            && nvram_match("boardrev", "0x1218")) {
1497                setRouter("Asus RT-N16");
1498                return ROUTER_ASUS_RTN16;
1499        }
1500
1501        if (nvram_match("boardtype", "0xa4cf")
1502            && nvram_match("boardrev", "0x1100")) {
1503                setRouter("Belkin F5D8235-4 v3");
1504                return ROUTER_BELKIN_F5D8235V3;
1505        }
1506
1507        if (nvram_match("boardtype", "0xd4cf")
1508            && nvram_match("boardrev", "0x1204")) {
1509                setRouter("Belkin F7D4301 / F7D8301 v1");
1510                return ROUTER_BELKIN_F7D4301;
1511        }
1512
1513        if (nvram_match("boardtype", "0xa4cf")
1514            && nvram_match("boardrev", "0x1102")) {
1515                FILE *mtd1 = fopen("/dev/mtdblock/1", "rb");
1516                unsigned long trxhd;
1517                if (mtd1) {
1518                        fread(&trxhd, 4, 1, mtd1);
1519                        fclose(mtd1);
1520                        if (trxhd == TRX_MAGIC_F7D3301) {
1521                                setRouter("Belkin F7D3301 / F7D7301 v1");
1522                                return ROUTER_BELKIN_F7D3301;
1523                        }
1524                        if (trxhd == TRX_MAGIC_F7D3302) {
1525                                setRouter("Belkin F7D3302 / F7D7302 v1");
1526                                return ROUTER_BELKIN_F7D3302;
1527                        }
1528                }
1529                setRouter("Belkin F7D4302 / F7D8302 v1");
1530                return ROUTER_BELKIN_F7D4302;
1531        }
1532#endif
1533
1534#endif
1535        if (nvram_match("boardnum", "00") && nvram_match("boardtype", "0x0101")
1536            && nvram_match("boardrev", "0x10")) {
1537                setRouter("Buffalo WBR2-G54 / WBR2-G54S");
1538                return ROUTER_BUFFALO_WBR2G54S;
1539        }
1540
1541        if (boardnum == 2 && nvram_match("boardtype", "0x0101")
1542            && nvram_match("boardrev", "0x10")) {
1543                setRouter("Buffalo WLA2-G54C / WLI3-TX1-G54");
1544                return ROUTER_BUFFALO_WLA2G54C;
1545        }
1546        if (boardnum == 0 && melco_id == 29090
1547            && nvram_match("boardrev", "0x10")) {
1548                setRouter("Buffalo WLAH-G54");
1549                return ROUTER_BUFFALO_WLAH_G54;
1550
1551        }
1552        if (boardnum == 0 && melco_id == 31070
1553            && nvram_match("boardflags", "0x2288")
1554            && nvram_match("boardrev", "0x10")) {
1555                setRouter("Buffalo WAPM-HP-AM54G54");
1556                return ROUTER_BUFFALO_WAPM_HP_AM54G54;
1557        }
1558        if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x11")
1559            && nvram_match("boardtype", "0x048e") && melco_id == 32093) {
1560                setRouter("Buffalo WHR-G125");
1561                return ROUTER_BUFFALO_WHRG54S;
1562        }
1563
1564        if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x10")
1565            && nvram_match("boardtype", "0x048e") && melco_id == 32139) {
1566                setRouter("Buffalo WCA-G");
1567                return ROUTER_BUFFALO_WCAG;     //vlan1 is lan, vlan0 is unused, implementation not done. will me made after return to germany
1568        }
1569
1570        if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x11")
1571            && nvram_match("boardtype", "0x048e") && melco_id == 32064) {
1572                setRouter("Buffalo WHR-HP-G125");
1573                return ROUTER_BUFFALO_WHRG54S;
1574        }
1575
1576        if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x13")
1577            && nvram_match("boardtype", "0x467")) {
1578                if (nvram_match("boardflags", "0x1658")
1579                    || nvram_match("boardflags", "0x2658")
1580                    || nvram_match("boardflags", "0x3658")) {
1581                        setRouter("Buffalo WLI-TX4-G54HP");
1582                        return ROUTER_BUFFALO_WLI_TX4_G54HP;
1583                }
1584                if (!nvram_match("buffalo_hp", "1")
1585                    && nvram_match("boardflags", "0x2758")) {
1586                        setRouter("Buffalo WHR-G54S");
1587                        return ROUTER_BUFFALO_WHRG54S;
1588                }
1589                if (nvram_match("buffalo_hp", "1")
1590                    || nvram_match("boardflags", "0x1758")) {
1591#ifndef HAVE_BUFFALO
1592                        setRouter("Buffalo WHR-HP-G54");
1593#else
1594#ifdef BUFFALO_JP
1595                        setRouter("Buffalo AS-A100");
1596#else
1597                        setRouter("Buffalo WHR-HP-G54DD");
1598#endif
1599#endif
1600                        return ROUTER_BUFFALO_WHRG54S;
1601                }
1602        }
1603
1604        if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x10")
1605            && nvram_match("boardtype", "0x470")) {
1606                setRouter("Buffalo WHR-AM54G54");
1607                return ROUTER_BUFFALO_WHRAM54G54;
1608        }
1609
1610        if (boardnum == 42 && nvram_match("boardtype", "0x042f")) {
1611
1612                if (nvram_match("product_name", "WZR-RS-G54")
1613                    || melco_id == 30083) {
1614                        setRouter("Buffalo WZR-RS-G54");
1615                        return ROUTER_BUFFALO_WZRRSG54;
1616                }
1617                if (nvram_match("product_name", "WZR-HP-G54")
1618                    || melco_id == 30026) {
1619                        setRouter("Buffalo WZR-HP-G54");
1620                        return ROUTER_BUFFALO_WZRRSG54;
1621                }
1622                if (nvram_match("product_name", "WZR-G54") || melco_id == 30061) {
1623                        setRouter("Buffalo WZR-G54");
1624                        return ROUTER_BUFFALO_WZRRSG54;
1625                }
1626                if (nvram_match("melco_id", "290441dd")) {
1627                        setRouter("Buffalo WHR2-A54G54");
1628                        return ROUTER_BUFFALO_WZRRSG54;
1629                }
1630                if (nvram_match("product_name", "WHR3-AG54")
1631                    || nvram_match("product_name", "WHR3-B11")
1632                    || melco_id == 29130) {
1633                        setRouter("Buffalo WHR3-AG54");
1634                        return ROUTER_BUFFALO_WZRRSG54;
1635                }
1636                if (nvram_match("product_name", "WVR-G54-NF")
1637                    || melco_id == 28100) {
1638                        setRouter("Buffalo WVR-G54-NF");
1639                        return ROUTER_BUFFALO_WZRRSG54;
1640                }
1641                if (nvram_match("product_name", "WZR-G108") || melco_id == 31095
1642                    || melco_id == 30153) {
1643                        setRouter("Buffalo WZR-G108");
1644                        return ROUTER_BRCM4702_GENERIC;
1645                }
1646                if (melco_id > 0)       // e.g. 29115
1647                {
1648                        setRouter("Buffalo WZR series");
1649                        return ROUTER_BUFFALO_WZRRSG54;
1650                }
1651        }
1652#ifndef HAVE_BUFFALO
1653        if (boardnum == 42 && nvram_match("boardtype", "0x042f")
1654            && nvram_match("boardrev", "0x10"))
1655                // nvram_match ("boardflags","0x0018"))
1656        {
1657                setRouter("Linksys WRTSL54GS");
1658                return ROUTER_WRTSL54GS;
1659        }
1660
1661        if (boardnum == 42 && nvram_match("boardtype", "0x0101")
1662            && nvram_match("boardrev", "0x10")
1663            && nvram_match("boot_ver", "v3.6")) {
1664                setRouter("Linksys WRT54G3G");
1665                return ROUTER_WRT54G3G;
1666        }
1667
1668        if (nvram_match("boardtype", "0x042f")
1669            && nvram_match("boardrev", "0x10")) {
1670                char *hwver = nvram_safe_get("hardware_version");
1671
1672                if (boardnum == 45 || startswith(hwver, "WL500gp")
1673                    || startswith(hwver, "WL500gH")) {
1674                        setRouter("Asus WL-500g Premium");
1675                        return ROUTER_ASUS_WL500G_PRE;
1676                }
1677                if (boardnum == 44 || startswith(hwver, "WL700g")) {
1678                        setRouter("Asus WL-700gE");
1679                        return ROUTER_ASUS_WL700GE;
1680                }
1681        }
1682
1683        char *et0 = nvram_safe_get("et0macaddr");
1684
1685        if (boardnum == 100 && nvram_match("boardtype", "bcm94710r4")) {
1686                if (startswith(et0, "00:11:50")) {
1687                        setRouter("Belkin F5D7130 / F5D7330");
1688                        return ROUTER_RT210W;
1689                }
1690                if (startswith(et0, "00:30:BD") || startswith(et0, "00:30:bd")) {
1691                        setRouter("Belkin F5D7230-4 v1000");
1692                        return ROUTER_RT210W;
1693                }
1694                if (startswith(et0, "00:01:E3") ||
1695                    startswith(et0, "00:01:e3") || startswith(et0, "00:90:96"))
1696                {
1697                        setRouter("Siemens SE505 v1");
1698                        return ROUTER_RT210W;
1699                } else {
1700                        setRouter("Askey RT210W generic");
1701                        return ROUTER_RT210W;
1702                }
1703        }
1704
1705        if (nvram_match("boardtype", "bcm94710r4")
1706            && nvram_match("boardnum", "")) {
1707                setRouter("Askey board RT2100W-D65)");
1708                return ROUTER_BRCM4702_GENERIC;
1709        }
1710
1711        if (boardnum == 0 && nvram_match("boardtype", "0x0100")
1712            && nvram_match("boardrev", "0x10")) {
1713                if (startswith(et0, "00:11:50") ||
1714                    startswith(et0, "00:30:BD") || startswith(et0, "00:30:bd"))
1715                {
1716                        setRouter("Askey board RT2205(6)D-D56");
1717                } else {
1718                        setRouter("Belkin board F5D8230");
1719                }
1720                return ROUTER_ASKEY_RT220XD;
1721        }
1722
1723        if (nvram_match("boardtype", "0x0101")) {
1724                if (startswith(et0, "00:11:50") ||
1725                    startswith(et0, "00:30:BD") || startswith(et0, "00:30:bd"))
1726                {
1727                        if (nvram_match("Belkin_ver", "2000")) {
1728                                setRouter("Belkin F5D7230-4 v2000");
1729                                return ROUTER_BELKIN_F5D7230_V2000;
1730                        } else {
1731                                setRouter("Belkin F5D7230-4 v1444");
1732                                return ROUTER_RT480W;
1733                        }
1734                }
1735                if (startswith(et0, "00:01:E3") ||
1736                    startswith(et0, "00:01:e3") || startswith(et0, "00:90:96"))
1737                {
1738                        setRouter("Siemens SE505 v2");
1739                        return ROUTER_RT480W;
1740                }
1741        }
1742        if (boardnum == 1 && nvram_match("boardtype", "0x456")
1743            && nvram_match("test_led_gpio", "2")) {
1744                setRouter("Belkin F5D7230-4 v3000");
1745                return ROUTER_BELKIN_F5D7230_V3000;
1746        }
1747
1748        if (nvram_match("boardtype", "0x456")
1749            && nvram_match("hw_model", "F5D7231-4")) {
1750                setRouter("Belkin F5D7231-4 v1212UK");
1751                return ROUTER_BELKIN_F5D7231;
1752        }
1753
1754        if (boardnum == 8 && nvram_match("boardtype", "0x0467"))        // fccid:
1755                // K7SF5D7231B
1756        {
1757                setRouter("Belkin F5D7231-4 v2000");
1758                return ROUTER_BELKIN_F5D7231_V2000;
1759        }
1760
1761        if (nvram_match("boardtype", "0x467")) {
1762                if (startswith(et0, "00:11:50") ||
1763                    startswith(et0, "00:30:BD") || startswith(et0, "00:30:bd"))
1764                {
1765                        setRouter("Belkin F5D7231-4 v2000");
1766                        return ROUTER_BELKIN_F5D7231;
1767                }
1768        }
1769#endif
1770        if (boardnum == 2 && nvram_match("boardtype", "bcm94710dev") && melco_id == 29016)      // Buffalo
1771                // WLI2-TX1-G54)
1772        {
1773                setRouter("Buffalo WLI2-TX1-G54");
1774                return ROUTER_BUFFALO_WLI2_TX1_G54;
1775        }
1776#ifndef HAVE_BUFFALO
1777
1778        char *gemtek = nvram_safe_get("GemtekPmonVer");
1779        unsigned long gemteknum = strtoul(gemtek, NULL, 0);
1780
1781        if (boardnum == 2 && (gemteknum == 10 || gemteknum == 11) &&
1782            (startswith(et0, "00:0C:E5") ||
1783             startswith(et0, "00:0c:e5") ||
1784             startswith(et0, "00:11:22") ||
1785             startswith(et0, "00:0C:10") ||
1786             startswith(et0, "00:0c:10") ||
1787             startswith(et0, "00:0C:11") || startswith(et0, "00:0c:11"))) {
1788                setRouter("Motorola WE800G v1");
1789                return ROUTER_MOTOROLA_WE800G;
1790        }
1791
1792        if (boardnum == 2
1793            && (startswith(gemtek, "RC") || gemteknum == 1 || gemteknum == 10))
1794        {
1795                setRouter("Linksys WAP54G v1.x");
1796                return ROUTER_WAP54G_V1;
1797        }
1798
1799        if (boardnum == 2 && gemteknum == 1) {
1800                setRouter("Sitecom WL-105(b)");
1801                return ROUTER_SITECOM_WL105B;
1802        }
1803
1804        if (boardnum == 2 && gemteknum == 7
1805            && nvram_match("boardtype", "bcm94710dev")) {
1806                setRouter("Sitecom WL-111");
1807                return ROUTER_SITECOM_WL111;
1808        }
1809
1810        if (gemteknum == 9)     // Must be Motorola wr850g v1 or we800g v1 or
1811                // Linksys wrt55ag v1
1812        {
1813                if (startswith(et0, "00:0C:E5") ||
1814                    startswith(et0, "00:0c:e5") ||
1815                    startswith(et0, "00:0C:10") ||
1816                    startswith(et0, "00:0c:10") ||
1817                    startswith(et0, "00:0C:11") ||
1818                    startswith(et0, "00:0c:11") ||
1819                    startswith(et0, "00:11:22") ||
1820                    startswith(et0, "00:0C:90") || startswith(et0, "00:0c:90"))
1821                {
1822                        if (!strlen(nvram_safe_get("phyid_num"))) {
1823                                insmod("switch-core");  // get phy type
1824                                insmod("switch-robo");
1825                                rmmod("switch-robo");
1826                                rmmod("switch-core");
1827                                nvram_set("boardnum", "2");
1828                                nvram_set("boardtype", "bcm94710dev");
1829                        }
1830                        if (nvram_match("phyid_num", "0x00000000")) {
1831                                setRouter("Motorola WE800G v1");
1832                                return ROUTER_MOTOROLA_WE800G;
1833                        } else  // phyid_num == 0xffffffff
1834                        {
1835                                setRouter("Motorola WR850G v1");
1836                                return ROUTER_MOTOROLA_V1;
1837                        }
1838                } else {
1839                        setRouter("Linksys WRT55AG v1");
1840                        return ROUTER_LINKSYS_WRT55AG;
1841                }
1842        }
1843#endif
1844        if (boardnum == 0 && nvram_match("boardtype", "0x478")
1845            && nvram_match("cardbus", "0") && nvram_match("boardrev", "0x10")
1846            && nvram_match("boardflags", "0x110") && melco_id == 32027) {
1847                setRouter("Buffalo WZR-G144NH");
1848                return ROUTER_BUFFALO_WZRG144NH;
1849        }
1850
1851        if (boardnum == 20060330 && nvram_match("boardtype", "0x0472")) {
1852                setRouter("Buffalo WZR-G300N");
1853                return ROUTER_BUFFALO_WZRG300N;
1854        }
1855#ifndef HAVE_BUFFALO
1856
1857        if (boardnum == 8 && nvram_match("boardtype", "0x0472")
1858            && nvram_match("cardbus", "1")) {
1859                setRouter("Netgear WNR834B");
1860                return ROUTER_NETGEAR_WNR834B;
1861        }
1862
1863        if (boardnum == 1 && nvram_match("boardtype", "0x0472")
1864            && nvram_match("boardrev", "0x23")) {
1865                if (nvram_match("cardbus", "1")) {
1866                        setRouter("Netgear WNR834B v2");
1867                        return ROUTER_NETGEAR_WNR834BV2;
1868                } else {
1869                        setRouter("Netgear WNDR3300");
1870                        return ROUTER_NETGEAR_WNDR3300;
1871                }
1872        }
1873
1874        if (boardnum == 42)     // Get Linksys N models
1875        {
1876                if (nvram_match("boot_hw_model", "WRT300N")
1877                    && nvram_match("boot_hw_ver", "1.1")) {
1878                        setRouter("Linksys WRT300N v1.1");
1879                        return ROUTER_WRT300NV11;
1880                } else if (nvram_match("boot_hw_model", "WRT150N")
1881                           && nvram_match("boot_hw_ver", "1")) {
1882                        setRouter("Linksys WRT150N v1");
1883                        return ROUTER_WRT150N;
1884                } else if (nvram_match("boot_hw_model", "WRT150N")
1885                           && nvram_match("boot_hw_ver", "1.1")) {
1886                        setRouter("Linksys WRT150N v1.1");
1887                        return ROUTER_WRT150N;
1888                } else if (nvram_match("boot_hw_model", "WRT150N")
1889                           && nvram_match("boot_hw_ver", "1.2")) {
1890                        setRouter("Linksys WRT150N v1.2");
1891                        return ROUTER_WRT150N;
1892                } else if (nvram_match("boot_hw_model", "WRT160N")
1893                           && nvram_match("boot_hw_ver", "1.0")) {
1894                        setRouter("Linksys WRT160N");
1895                        return ROUTER_WRT160N;
1896                } else if (nvram_match("boot_hw_model", "WRT160N")
1897                           && nvram_match("boot_hw_ver", "3.0")) {
1898                        setRouter("Linksys WRT160N v3");
1899                        return ROUTER_WRT160NV3;
1900                } else if (nvram_match("boot_hw_model", "M10")
1901                           && nvram_match("boot_hw_ver", "1.0")) {
1902                        setRouter("Cisco Valet M10 v1");        // renamed wrt160nv3
1903                        return ROUTER_WRT160NV3;
1904                } else if (nvram_match("boot_hw_model", "E100")
1905                           && nvram_match("boot_hw_ver", "1.0")) {
1906                        setRouter("Linksys E1000 v1");  // renamed wrt160nv3
1907                        return ROUTER_WRT160NV3;
1908                } else if (nvram_match("boot_hw_model", "E1000")
1909                           && nvram_match("boot_hw_ver", "2.0")) {
1910                        setRouter("Linksys E1000 v2");
1911                        return ROUTER_LINKSYS_E1000V2;
1912                } else if (nvram_match("boot_hw_model", "E1000")
1913                           && nvram_match("boot_hw_ver", "2.1")) {
1914                        setRouter("Linksys E1000 v2.1");
1915                        return ROUTER_LINKSYS_E1000V2;
1916                } else if (nvram_match("boot_hw_model", "WRT310N")
1917                           && nvram_match("boot_hw_ver", "1.0")) {
1918                        setRouter("Linksys WRT310N");
1919                        return ROUTER_WRT310N;
1920                } else if (nvram_match("boot_hw_model", "WRT310N")
1921                           && nvram_match("boot_hw_ver", "2.0")) {
1922                        setRouter("Linksys WRT310N v2");
1923                        return ROUTER_WRT310NV2;
1924                } else if (nvram_match("boot_hw_model", "M20")
1925                           && nvram_match("boot_hw_ver", "1.0")) {
1926                        setRouter("Cisco Valet Plus M20");      // ranamed wrt310nv2
1927                        return ROUTER_WRT310NV2;
1928                } else if (nvram_match("boot_hw_model", "E3200")
1929                           && nvram_match("boot_hw_ver", "1.0")) {
1930                        setRouter("Linksys E3200");
1931                        return ROUTER_LINKSYS_E3200;
1932                } else if (nvram_match("boot_hw_model", "E4200")
1933                           && nvram_match("boot_hw_ver", "1.0")) {
1934                        setRouter("Linksys E4200");
1935                        return ROUTER_LINKSYS_E4200;
1936                }
1937        }
1938
1939        if (boardnum == 42 && nvram_match("boardtype", "0x0472")
1940            && nvram_match("cardbus", "1")) {
1941                setRouter("Linksys WRT300N v1");
1942                return ROUTER_WRT300N;
1943        }
1944
1945        if (boardnum == 42 &&
1946            nvram_match("boardtype", "0x478") && nvram_match("cardbus", "1")) {
1947                setRouter("Linksys WRT350N");
1948                return ROUTER_WRT350N;
1949        }
1950
1951        if (nvram_match("boardnum", "20070615") &&
1952            nvram_match("boardtype", "0x478") && nvram_match("cardbus", "0")) {
1953                if (nvram_match("switch_type", "BCM5395")) {
1954                        setRouter("Linksys WRT600N v1.1");
1955                        return ROUTER_WRT600N;
1956                } else {
1957                        setRouter("Linksys WRT600N");
1958                        return ROUTER_WRT600N;
1959                }
1960        }
1961
1962        if (nvram_match("boardtype", "0x478")
1963            && nvram_match("boot_hw_model", "WRT610N")) {
1964                setRouter("Linksys WRT610N");
1965                return ROUTER_WRT610N;
1966        }
1967#ifdef HAVE_BCMMODERN
1968        if (nvram_match("boardtype", "0x04cf")
1969            && nvram_match("boot_hw_model", "WRT610N")) {
1970                setRouter("Linksys WRT610N v2");
1971                return ROUTER_WRT610NV2;
1972        }
1973
1974        if (nvram_match("boardtype", "0x04cf")
1975            && nvram_match("boot_hw_model", "E300")) {
1976                setRouter("Linksys E3000");     // renamed wrt610nv2
1977                return ROUTER_WRT610NV2;
1978        }
1979#endif
1980
1981        if (boardnum == 42 && nvram_match("boardtype", "bcm94710dev")) {
1982                setRouter("Linksys WRT54G v1.x");
1983                return ROUTER_WRT54G1X;
1984        }
1985
1986        if ((boardnum == 1 || boardnum == 0)
1987            && nvram_match("boardtype", "0x0446")) {
1988                setRouter("U.S.Robotics USR5430");
1989                return ROUTER_USR_5430;
1990        }
1991
1992        if (boardnum == 1 && nvram_match("boardtype", "0x456")
1993            && nvram_match("test_led_gpio", "0")) {
1994                setRouter("Netgear WG602 v3");
1995                return ROUTER_NETGEAR_WG602_V3;
1996        }
1997
1998        if (boardnum == 10496 && nvram_match("boardtype", "0x456")) {
1999                setRouter("U.S.Robotics USR5461");
2000                return ROUTER_USR_5461;
2001        }
2002
2003        if (boardnum == 10500 && nvram_match("boardtype", "0x456")) {
2004                setRouter("U.S.Robotics USR5432");
2005                return ROUTER_USR_5461; // should work in the same way
2006        }
2007
2008        if (boardnum == 10506 && nvram_match("boardtype", "0x456")) {
2009                setRouter("U.S.Robotics USR5451");
2010                return ROUTER_USR_5461; // should work in the same way
2011        }
2012
2013        if (boardnum == 10512 && nvram_match("boardtype", "0x456")) {
2014                setRouter("U.S.Robotics USR5441");
2015                return ROUTER_USR_5461; // should work in the same way
2016        }
2017
2018        if ((boardnum == 35324 || boardnum == 38256)
2019            && nvram_match("boardtype", "0x048e")) {
2020                setRouter("U.S.Robotics USR5465");
2021                return ROUTER_USR_5465;
2022        }
2023
2024        if (boardnum == 35334 && nvram_match("boardtype", "0x048e")) {
2025                setRouter("U.S.Robotics USR5455");
2026                return ROUTER_USR_5465; // should work in the same way
2027        }
2028
2029        if (boardnum == 1024 && nvram_match("boardtype", "0x0446")) {
2030                char *cfe = nvram_safe_get("cfe_version");
2031
2032                if (strstr(cfe, "WRE54G")) {
2033                        setRouter("Linksys WRE54G v1");
2034                        return ROUTER_WAP54G_V2;
2035                } else if (strstr(cfe, "iewsonic")) {
2036                        setRouter("Viewsonic WAPBR-100");
2037                        return ROUTER_VIEWSONIC_WAPBR_100;
2038                } else {
2039                        setRouter("Linksys WAP54G v2");
2040                        return ROUTER_WAP54G_V2;
2041                }
2042        }
2043
2044        if (nvram_invmatch("CFEver", "")) {
2045                char *cfe = nvram_safe_get("CFEver");
2046
2047                if (!strncmp(cfe, "MotoWR", 6)) {
2048                        setRouter("Motorola WR850G v2/v3");
2049                        return ROUTER_MOTOROLA;
2050                }
2051        }
2052
2053        if (boardnum == 44 && (nvram_match("boardtype", "0x0101")
2054                               || nvram_match("boardtype", "0x0101\r"))) {
2055                char *cfe = nvram_safe_get("CFEver");
2056
2057                if (!strncmp(cfe, "GW_WR110G", 9)) {
2058                        setRouter("Sparklan WX-6615GT");
2059                        return ROUTER_DELL_TRUEMOBILE_2300_V2;
2060                } else {
2061                        setRouter("Dell TrueMobile 2300 v2");
2062                        return ROUTER_DELL_TRUEMOBILE_2300_V2;
2063                }
2064        }
2065#endif
2066        if (nvram_match("boardtype", "bcm94710ap")) {
2067                setRouter("Buffalo WBR-B11");
2068                return ROUTER_BUFFALO_WBR54G;
2069        }
2070#ifndef HAVE_BUFFALO
2071        if (boardnum == 0 && nvram_match("boardtype", "0x048e") &&      // cfe sets boardnum="", strtoul -> 0
2072            nvram_match("boardrev", "0x35")) {
2073                setRouter("D-Link DIR-320");
2074                // apply some fixes
2075                if (nvram_get("vlan2ports") != NULL) {
2076                        nvram_unset("vlan2ports");
2077                        nvram_unset("vlan2hwname");
2078                }
2079                return ROUTER_DLINK_DIR320;
2080        }
2081        if (nvram_match("model_name", "DIR-330") &&
2082            nvram_match("boardrev", "0x10")) {
2083                setRouter("D-Link DIR-330");
2084                nvram_set("wan_ifnames", "eth0");       // quirk
2085                nvram_set("wan_ifname", "eth0");
2086                if (nvram_match("et0macaddr", "00:90:4c:4e:00:0c")) {
2087                        FILE *in = fopen("/dev/mtdblock/1", "rb");
2088
2089                        fseek(in, 0x7a0022, SEEK_SET);
2090                        char mac[32];
2091
2092                        fread(mac, 32, 1, in);
2093                        fclose(in);
2094                        mac[17] = 0;
2095                        if (sv_valid_hwaddr(mac)) {
2096                                nvram_set("et0macaddr", mac);
2097                                fprintf(stderr, "restore D-Link MAC\n");
2098                                nvram_commit();
2099                                sys_reboot();
2100                        }
2101                }
2102                /*
2103                 * if (nvram_get("vlan2ports")!=NULL) { nvram_unset("vlan2ports");
2104                 * nvram_unset("vlan2hwname"); }
2105                 */
2106                return ROUTER_DLINK_DIR330;
2107        }
2108        if (boardnum == 42 && nvram_match("boardtype", "0x048e")
2109            && nvram_match("boardrev", "0x10")) {
2110                if (nvram_match("boardflags", "0x20750")) {
2111                        setRouter("Linksys WRT54G2 / GS2");     // router is wrt54g2v1/v1.3/gs2v1
2112                } else {
2113                        setRouter("Linksys WRT54Gv8 / GSv7");
2114                }
2115                return ROUTER_WRT54G_V8;
2116        }
2117
2118        if (boardnum == 8 && nvram_match("boardtype", "0x048e")
2119            && nvram_match("boardrev", "0x11")) {
2120                setRouter("ALLNET EUROWRT 54"); //ALLNET01
2121                return ROUTER_ALLNET01;
2122        }
2123
2124        if (boardnum == 01 && nvram_match("boardtype", "0x048e")
2125            && nvram_match("boardrev", "0x11")
2126            && (nvram_match("boardflags", "0x650")
2127                || nvram_match("boardflags", "0x0458"))) {
2128                setRouter("Netgear WG602 v4");
2129                return ROUTER_NETGEAR_WG602_V4;
2130        }
2131
2132        if (boardnum == 1 && nvram_match("boardtype", "0x048e")
2133            && nvram_match("boardrev", "0x35")
2134            && nvram_match("parefldovoltage", "0x28")) {
2135                setRouter("NetCore NW618 / Rosewill RNX-GX4");
2136                return ROUTER_NETCORE_NW618;
2137        }
2138
2139        if (boardnum == 42 && nvram_match("boardtype", "0x048E")
2140            && nvram_match("boardrev", "0x10")) {
2141                setRouter("Linksys WRH54G");
2142                return ROUTER_LINKSYS_WRH54G;
2143        }
2144
2145        if (nvram_match("boardnum", "00") && nvram_match("boardtype", "0x048E")
2146            && nvram_match("boardrev", "0x10")) {
2147                setRouter("Linksys WRT54G v8.1");
2148                return ROUTER_WRT54G_V81;
2149        }
2150
2151        if (boardnum == 45 && nvram_match("boardtype", "0x456")) {
2152                setRouter("Asus WL-520G");
2153                return ROUTER_ASUS_WL520G;
2154        }
2155
2156        if (nvram_match("boardtype", "0x48E")
2157            && nvram_match("boardrev", "0x10")) {
2158                char *hwver = nvram_safe_get("hardware_version");
2159
2160                if (boardnum == 45 && startswith(hwver, "WL500GPV2")) {
2161                        setRouter("Asus WL-500G Premium v2");
2162                        return ROUTER_ASUS_WL500G_PRE_V2;
2163                } else if (boardnum == 45 && startswith(hwver, "WL330GE")) {
2164                        setRouter("Asus WL-330GE");
2165                        return ROUTER_ASUS_330GE;
2166                } else if (boardnum == 45 || startswith(hwver, "WL500GU")
2167                           || startswith(hwver, "WL500GC")) {
2168                        setRouter("Asus WL-520GU/GC");
2169                        return ROUTER_ASUS_WL520GUGC;
2170                }
2171        }
2172
2173        if ((boardnum == 83258 || boardnum == 1 || boardnum == 0123)    //or 01 or 001 or 0x01
2174            && (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
2175        {
2176                setRouter("Netgear WGR614v8/L/WW");
2177                return ROUTER_NETGEAR_WGR614L;
2178        }
2179
2180        if (boardnum == 3805 && nvram_match("boardtype", "0x48E")
2181            && nvram_match("boardrev", "0x10")) {
2182                setRouter("Netgear WGR614v9");
2183                return ROUTER_NETGEAR_WGR614V9;
2184        }
2185
2186        if (boardnum == 56 && nvram_match("boardtype", "0x456")
2187            && nvram_match("boardrev", "0x10")) {
2188                setRouter("Linksys WTR54GS");
2189                return ROUTER_LINKSYS_WTR54GS;
2190        }
2191
2192        if (nvram_match("boardnum", "WAP54GV3_8M_0614")
2193            && (nvram_match("boardtype", "0x0467")
2194                || nvram_match("boardtype", "0x467"))
2195            && nvram_match("WAPver", "3")) {
2196                setRouter("Linksys WAP54G v3.x");
2197                return ROUTER_WAP54G_V3;
2198        }
2199#ifdef HAVE_BCMMODERN
2200        if (boardnum == 1 && nvram_match("boardtype", "0xE4CD")
2201            && nvram_match("boardrev", "0x1700")) {
2202                setRouter("Netgear WNR2000 v2");
2203                return ROUTER_NETGEAR_WNR2000V2;
2204        }
2205
2206        if ((boardnum == 1 || boardnum == 3500)
2207            && nvram_match("boardtype", "0x04CF")
2208            && (nvram_match("boardrev", "0x1213")
2209                || nvram_match("boardrev", "02"))) {
2210                setRouter("Netgear WNR3500v2/U/L");
2211                return ROUTER_NETGEAR_WNR3500L;
2212        }
2213
2214        if (nvram_match("boardnum", "01") && nvram_match("boardtype", "0xb4cf")
2215            && nvram_match("boardrev", "0x1100")) {
2216                setRouter("Netgear WNDR3400");
2217                return ROUTER_NETGEAR_WNDR3400;
2218        }
2219
2220        if (nvram_match("boardnum", "01") && nvram_match("boardtype", "0xF52C")
2221            && nvram_match("boardrev", "0x1101")) {
2222                setRouter("Netgear WNDR4000");
2223                return ROUTER_NETGEAR_WNDR4000;
2224        }
2225
2226        if ((boardnum == 42 || boardnum == 66)
2227            && nvram_match("boardtype", "0x04EF")
2228            && (nvram_match("boardrev", "0x1304")
2229                || nvram_match("boardrev", "0x1305"))) {
2230                setRouter("Linksys WRT320N");
2231                return ROUTER_WRT320N;
2232        }
2233
2234        if (boardnum == 42 && nvram_match("boardtype", "0x04EF")
2235            && nvram_match("boardrev", "0x1307")) {
2236                setRouter("Linksys E2000");     // renamed (and fixed reset button) wrt320n
2237                return ROUTER_WRT320N;
2238        }
2239#endif
2240
2241        if (boardnum == 94703 && nvram_match("boardtype", "0x04c0")
2242            && nvram_match("boardrev", "0x1100")) {
2243                setRouter("Dynex DX-NRUTER");
2244                return ROUTER_DYNEX_DX_NRUTER;
2245        }
2246
2247        setRouter("Linksys WRT54G/GL/GS");
2248        return ROUTER_WRT54G;
2249#else
2250        eval("event", "3", "1", "15");
2251        return 0;
2252#endif
2253#endif
2254#endif
2255}
2256
2257static int router_type = -1;
2258int getRouterBrand()
2259{
2260        if (router_type == -1)
2261                router_type = internal_getRouterBrand();
2262        return router_type;
2263}
2264
2265int get_ppp_pid(char *file)
2266{
2267        char buf[80];
2268        int pid = -1;
2269
2270        if (file_to_buf(file, buf, sizeof(buf))) {
2271                char tmp[80], tmp1[80];
2272
2273                snprintf(tmp, sizeof(tmp), "/var/run/%s.pid", buf);
2274                file_to_buf(tmp, tmp1, sizeof(tmp1));
2275                pid = atoi(tmp1);
2276        }
2277        return pid;
2278}
2279
2280int check_wan_link(int num)
2281{
2282        int wan_link = 0;
2283
2284        if ((nvram_match("wan_proto", "pptp")
2285#ifdef HAVE_L2TP
2286             || nvram_match("wan_proto", "l2tp")
2287#endif
2288#ifdef HAVE_PPPOE
2289             || nvram_match("wan_proto", "pppoe")
2290#endif
2291#ifdef HAVE_PPPOA
2292             || nvram_match("wan_proto", "pppoa")
2293#endif
2294#ifdef HAVE_3G
2295             || nvram_match("wan_proto", "3g")
2296#endif
2297             || nvram_match("wan_proto", "heartbeat"))
2298            && !nvram_match("3gdata", "hso")) {
2299                FILE *fp;
2300                char filename[80];
2301                char *name;
2302
2303                if (num == 0)
2304                        strcpy(filename, "/tmp/ppp/link");
2305                if ((fp = fopen(filename, "r"))) {
2306                        int pid = -1;
2307
2308                        fclose(fp);
2309                        if (nvram_match("wan_proto", "heartbeat")) {
2310                                char buf[20];
2311
2312                                file_to_buf("/tmp/ppp/link", buf, sizeof(buf));
2313                                pid = atoi(buf);
2314                        } else
2315                                pid = get_ppp_pid(filename);
2316
2317                        name = find_name_by_proc(pid);
2318                        if (!strncmp(name, "pppoecd", 7) ||     // for PPPoE
2319                            !strncmp(name, "pppd", 4) ||        // for PPTP
2320                            !strncmp(name, "bpalogin", 8))      // for HeartBeat
2321                                wan_link = 1;   // connect
2322                        else {
2323                                printf("The %s had been died, remove %s\n",
2324                                       nvram_safe_get("wan_proto"), filename);
2325                                wan_link = 0;   // For some reason, the pppoed had been died,
2326                                // by link file still exist.
2327                                unlink(filename);
2328                        }
2329                }
2330        } else {
2331                if (nvram_invmatch("wan_ipaddr", "0.0.0.0"))
2332                        wan_link = 1;
2333        }
2334
2335        return wan_link;
2336}
2337
2338#if defined(HAVE_BUFFALO) || defined(HAVE_BUFFALO_BL_DEFAULTS)
2339void *getUEnv(char *name)
2340{
2341#ifdef HAVE_WZRG300NH
2342#define UOFFSET 0x40000
2343#elif HAVE_WZRHPAG300NH
2344#define UOFFSET 0x40000
2345#elif HAVE_WZRG450
2346#define UOFFSET 0x40000
2347#elif HAVE_WMBR_G300NH
2348#define UOFFSET 0x0
2349#else
2350#define UOFFSET 0x3E000
2351#endif
2352        static char res[64];
2353        memset(res, 0, sizeof(res));
2354        //fprintf(stderr,"[u-boot env]%s\n",name);
2355#ifdef HAVE_WMBR_G300NH
2356        FILE *fp = fopen("/dev/mtdblock/1", "rb");
2357#else
2358        FILE *fp = fopen("/dev/mtdblock/0", "rb");
2359#endif
2360        fseek(fp, UOFFSET, SEEK_SET);
2361        char *mem = safe_malloc(0x2000);
2362        fread(mem, 0x2000, 1, fp);
2363        fclose(fp);
2364        int s = (0x2000 - 1) - strlen(name);
2365        int i;
2366        int l = strlen(name);
2367        for (i = 0; i < s; i++) {
2368                if (!strncmp(mem + i, name, l)) {
2369                        strncpy(res, mem + i + l + 1, sizeof(res) - 1);
2370                        free(mem);
2371                        return res;
2372                }
2373        }
2374        free(mem);
2375        return NULL;
2376}
2377#endif
2378
2379char *get_wan_ipaddr(void)
2380{
2381        char *wan_ipaddr;
2382        char *wan_proto = nvram_safe_get("wan_proto");
2383        int wan_link = check_wan_link(0);
2384
2385        if (!strcmp(wan_proto, "pptp")) {
2386                wan_ipaddr =
2387                    wan_link ? nvram_safe_get("pptp_get_ip") :
2388                    nvram_safe_get("wan_ipaddr");
2389        } else if (!strcmp(wan_proto, "pppoe")
2390#ifdef HAVE_PPPOATM
2391                   || !strcmp(wan_proto, "pppoa")
2392#endif
2393#ifdef HAVE_3G
2394                   || !strcmp(wan_proto, "3g")
2395#endif
2396            ) {
2397                wan_ipaddr =
2398                    wan_link ? nvram_safe_get("wan_ipaddr") : "0.0.0.0";
2399#ifdef HAVE_L2TP
2400        } else if (!strcmp(wan_proto, "l2tp")) {
2401                wan_ipaddr =
2402                    wan_link ? nvram_safe_get("l2tp_get_ip") :
2403                    nvram_safe_get("wan_ipaddr");
2404#endif
2405        } else {
2406                wan_ipaddr = nvram_safe_get("wan_ipaddr");
2407        }
2408        return wan_ipaddr;
2409}
2410
2411/*
2412 * Find process name by pid from /proc directory
2413 */
2414char *find_name_by_proc(int pid)
2415{
2416        FILE *fp;
2417        char line[254];
2418        char filename[80];
2419        static char name[80];
2420
2421        snprintf(filename, sizeof(filename), "/proc/%d/status", pid);
2422
2423        if ((fp = fopen(filename, "r"))) {
2424                fgets(line, sizeof(line), fp);
2425                /*
2426                 * Buffer should contain a string like "Name: binary_name"
2427                 */
2428                sscanf(line, "%*s %s", name);
2429                fclose(fp);
2430                return name;
2431        }
2432
2433        return "";
2434}
2435
2436int diag_led_4702(int type, int act)
2437{
2438
2439#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_LAGUNA) || defined(HAVE_MAGICBOX) || defined(HAVE_RB600) || 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) || defined(HAVE_OPENRISC)
2440        return 0;
2441#else
2442        if (act == START_LED) {
2443                switch (type) {
2444                case DMZ:
2445                        system2("echo 1 > /proc/sys/diag");
2446                        break;
2447                }
2448        } else {
2449                switch (type) {
2450                case DMZ:
2451                        system2("echo 0 > /proc/sys/diag");
2452                        break;
2453                }
2454        }
2455        return 0;
2456#endif
2457}
2458
2459int C_led_4702(int i)
2460{
2461#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE)  || defined(HAVE_LAGUNA) || defined(HAVE_MAGICBOX) || defined(HAVE_RB600) || 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) || defined(HAVE_OPENRISC)
2462        return 0;
2463#else
2464        FILE *fp;
2465        char string[10];
2466        int flg;
2467
2468        memset(string, 0, 10);
2469        /*
2470         * get diag before set
2471         */
2472        if ((fp = fopen("/proc/sys/diag", "r"))) {
2473                fgets(string, sizeof(string), fp);
2474                fclose(fp);
2475        } else
2476                perror("/proc/sys/diag");
2477
2478        if (i)
2479                flg = atoi(string) | 0x10;
2480        else
2481                flg = atoi(string) & 0xef;
2482
2483        memset(string, 0, 10);
2484        sprintf(string, "%d", flg);
2485        if ((fp = fopen("/proc/sys/diag", "w"))) {
2486                fputs(string, fp);
2487                fclose(fp);
2488        } else
2489                perror("/proc/sys/diag");
2490
2491        return 0;
2492#endif
2493}
2494
2495unsigned int read_gpio(char *device)
2496{
2497        FILE *fp;
2498        unsigned int val;
2499
2500        if ((fp = fopen(device, "r"))) {
2501                fread(&val, 4, 1, fp);
2502                fclose(fp);
2503                // fprintf(stderr, "----- gpio %s = [%X]\n",device,val);
2504                return val;
2505        } else {
2506                perror(device);
2507                return 0;
2508        }
2509}
2510
2511unsigned int write_gpio(char *device, unsigned int val)
2512{
2513        FILE *fp;
2514
2515        if ((fp = fopen(device, "w"))) {
2516                fwrite(&val, 4, 1, fp);
2517                fclose(fp);
2518                // fprintf(stderr, "----- set gpio %s = [%X]\n",device,val);
2519                return 1;
2520        } else {
2521                perror(device);
2522                return 0;
2523        }
2524}
2525
2526static char hw_error = 0;
2527int diag_led_4704(int type, int act)
2528{
2529#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_LAGUNA) || defined(HAVE_MAGICBOX) || defined(HAVE_RB600) || 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) || defined(HAVE_OPENRISC)
2530        return 0;
2531#else
2532        unsigned int control, in, outen, out;
2533
2534#ifdef BCM94712AGR
2535        /*
2536         * The router will crash, if we load the code into broadcom demo board.
2537         */
2538        return 1;
2539#endif
2540        // int brand;
2541        control = read_gpio("/dev/gpio/control");
2542        in = read_gpio("/dev/gpio/in");
2543        out = read_gpio("/dev/gpio/out");
2544        outen = read_gpio("/dev/gpio/outen");
2545
2546        write_gpio("/dev/gpio/outen", (outen & 0x7c) | 0x83);
2547        switch (type) {
2548        case DIAG:              // GPIO 1
2549                if (hw_error) {
2550                        write_gpio("/dev/gpio/out", (out & 0x7c) | 0x00);
2551                        return 1;
2552                }
2553
2554                if (act == STOP_LED) {  // stop blinking
2555                        write_gpio("/dev/gpio/out", (out & 0x7c) | 0x83);
2556                        // cprintf("tallest:=====( DIAG STOP_LED !!)=====\n");
2557                } else if (act == START_LED) {  // start blinking
2558                        write_gpio("/dev/gpio/out", (out & 0x7c) | 0x81);
2559                        // cprintf("tallest:=====( DIAG START_LED !!)=====\n");
2560                } else if (act == MALFUNCTION_LED) {    // start blinking
2561                        write_gpio("/dev/gpio/out", (out & 0x7c) | 0x00);
2562                        hw_error = 1;
2563                        // cprintf("tallest:=====( DIAG MALFUNCTION_LED !!)=====\n");
2564                }
2565                break;
2566
2567        }
2568        return 1;
2569#endif
2570}
2571
2572int diag_led_4712(int type, int act)
2573{
2574        unsigned int control, in, outen, out, ctr_mask, out_mask;
2575
2576#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_LAGUNA) || defined(HAVE_MAGICBOX) || defined(HAVE_RB600) || 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) || defined(HAVE_OPENRISC)
2577        return 0;
2578#else
2579
2580#ifdef BCM94712AGR
2581        /*
2582         * The router will crash, if we load the code into broadcom demo board.
2583         */
2584        return 1;
2585#endif
2586        control = read_gpio("/dev/gpio/control");
2587        in = read_gpio("/dev/gpio/in");
2588        out = read_gpio("/dev/gpio/out");
2589        outen = read_gpio("/dev/gpio/outen");
2590
2591        ctr_mask = ~(1 << type);
2592        out_mask = (1 << type);
2593
2594        write_gpio("/dev/gpio/control", control & ctr_mask);
2595        write_gpio("/dev/gpio/outen", outen | out_mask);
2596
2597        if (act == STOP_LED) {  // stop blinking
2598                // cprintf("%s: Stop GPIO %d\n", __FUNCTION__, type);
2599                write_gpio("/dev/gpio/out", out | out_mask);
2600        } else if (act == START_LED) {  // start blinking
2601                // cprintf("%s: Start GPIO %d\n", __FUNCTION__, type);
2602                write_gpio("/dev/gpio/out", out & ctr_mask);
2603        }
2604
2605        return 1;
2606#endif
2607}
2608
2609int C_led_4712(int i)
2610{
2611        if (i == 1)
2612                return diag_led(DIAG, START_LED);
2613        else
2614                return diag_led(DIAG, STOP_LED);
2615}
2616
2617int C_led(int i)
2618{
2619        int brand = getRouterBrand();
2620
2621        if (brand == ROUTER_WRT54G1X || brand == ROUTER_LINKSYS_WRT55AG)
2622                return C_led_4702(i);
2623        else if (brand == ROUTER_WRT54G)
2624                return C_led_4712(i);
2625        else
2626                return 0;
2627}
2628
2629int diag_led(int type, int act)
2630{
2631        int brand = getRouterBrand();
2632
2633        if (brand == ROUTER_WRT54G || brand == ROUTER_WRT54G3G
2634            || brand == ROUTER_WRT300NV11)
2635                return diag_led_4712(type, act);
2636        else if (brand == ROUTER_WRT54G1X || brand == ROUTER_LINKSYS_WRT55AG)
2637                return diag_led_4702(type, act);
2638        else if ((brand == ROUTER_WRTSL54GS
2639                  || brand == ROUTER_WRT310N || brand == ROUTER_WRT350N
2640                  || brand == ROUTER_BUFFALO_WZRG144NH) && type == DIAG)
2641                return diag_led_4704(type, act);
2642        else {
2643                if (type == DMZ) {
2644                        if (act == START_LED)
2645                                return led_control(LED_DMZ, LED_ON);
2646                        if (act == STOP_LED)
2647                                return led_control(LED_DMZ, LED_OFF);
2648                        return 1;
2649                }
2650        }
2651        return 0;
2652}
2653
2654#ifdef HAVE_MADWIFI
2655static char *stalist[] = {
2656        "ath0", "ath1", "ath2", "ath3", "ath4", "ath5", "ath6", "ath8", "ath9"
2657};
2658
2659char *getWifi(char *ifname)
2660{
2661        if (!strncmp(ifname, "ath0", 4))
2662                return "wifi0";
2663        if (!strncmp(ifname, "ath1", 4))
2664                return "wifi1";
2665        if (!strncmp(ifname, "ath2", 4))
2666                return "wifi2";
2667        if (!strncmp(ifname, "ath3", 4))
2668                return "wifi3";
2669        return NULL;
2670}
2671
2672char *getWDSSTA(void)
2673{
2674
2675        int c = getdevicecount();
2676        int i;
2677
2678        for (i = 0; i < c; i++) {
2679                char mode[32];
2680                char netmode[32];
2681
2682                sprintf(mode, "ath%d_mode", i);
2683                sprintf(netmode, "ath%d_net_mode", i);
2684                if (nvram_match(mode, "wdssta")
2685                    && !nvram_match(netmode, "disabled")) {
2686                        return stalist[i];
2687                }
2688
2689        }
2690        return NULL;
2691}
2692
2693char *getSTA(void)
2694{
2695
2696#ifdef HAVE_WAVESAT
2697        if (nvram_match("ofdm_mode", "sta"))
2698                return "ofdm";
2699#endif
2700        int c = getdevicecount();
2701        int i;
2702
2703        for (i = 0; i < c; i++) {
2704                if (nvram_nmatch("sta", "ath%d_mode", i)
2705                    && !nvram_nmatch("disabled", "ath%d_net_mode", i)) {
2706                        return stalist[i];
2707                }
2708
2709        }
2710        return NULL;
2711}
2712
2713char *getWET(void)
2714{
2715#ifdef HAVE_WAVESAT
2716        if (nvram_match("ofdm_mode", "bridge"))
2717                return "ofdm";
2718#endif
2719        int c = getdevicecount();
2720        int i;
2721
2722        for (i = 0; i < c; i++) {
2723                if (nvram_nmatch("wet", "ath%d_mode", i)
2724                    && !nvram_nmatch("disabled", "ath%d_net_mode", i)) {
2725                        return stalist[i];
2726                }
2727
2728        }
2729        return NULL;
2730}
2731
2732#elif defined(HAVE_RT2880) || defined(HAVE_RT61)
2733
2734char *getSTA()
2735{
2736        int c = get_wl_instances();
2737        int i;
2738
2739        for (i = 0; i < c; i++) {
2740                if (nvram_nmatch("sta", "wl%d_mode", i)) {
2741                        if (!nvram_nmatch("disabled", "wl%d_net_mode", i))
2742                                return "ra0";
2743                }
2744
2745                if (nvram_nmatch("apsta", "wl%d_mode", i)) {
2746                        if (!nvram_nmatch("disabled", "wl%d_net_mode", i))
2747                                return "apcli0";
2748                }
2749
2750        }
2751        return NULL;
2752}
2753
2754char *getWET()
2755{
2756        int c = get_wl_instances();
2757        int i;
2758
2759        for (i = 0; i < c; i++) {
2760                if (!nvram_nmatch("disabled", "wl%d_net_mode", i)
2761                    && nvram_nmatch("wet", "wl%d_mode", i))
2762                        return "ra0";
2763
2764                if (!nvram_nmatch("disabled", "wl%d_net_mode", i)
2765                    && nvram_nmatch("apstawet", "wl%d_mode", i))
2766                        return "apcli0";
2767
2768        }
2769        return NULL;
2770}
2771
2772#else
2773char *getSTA()
2774{
2775        int c = get_wl_instances();
2776        int i;
2777
2778        for (i = 0; i < c; i++) {
2779                if (nvram_nmatch("sta", "wl%d_mode", i)
2780                    || nvram_nmatch("apsta", "wl%d_mode", i)) {
2781                        if (!nvram_nmatch("disabled", "wl%d_net_mode", i))
2782                                return get_wl_instance_name(i);
2783                        // else
2784                        // return nvram_nget ("wl%d_ifname", i);
2785                }
2786
2787        }
2788        return NULL;
2789}
2790
2791char *getWET()
2792{
2793        int c = get_wl_instances();
2794        int i;
2795
2796        for (i = 0; i < c; i++) {
2797                if (nvram_nmatch("wet", "wl%d_mode", i)
2798                    || nvram_nmatch("apstawet", "wl%d_mode", i)) {
2799                        if (!nvram_nmatch("disabled", "wl%d_net_mode", i))
2800                                return get_wl_instance_name(i);
2801                        // else
2802                        // return nvram_nget ("wl%d_ifname", i);
2803
2804                }
2805
2806        }
2807        return NULL;
2808}
2809
2810#endif
2811// note - broadcast addr returned in ipaddr
2812void get_broadcast(char *ipaddr, char *netmask)
2813{
2814        int ip2[4], mask2[4];
2815        unsigned char ip[4], mask[4];
2816
2817        if (!ipaddr || !netmask)
2818                return;
2819
2820        sscanf(ipaddr, "%d.%d.%d.%d", &ip2[0], &ip2[1], &ip2[2], &ip2[3]);
2821        sscanf(netmask, "%d.%d.%d.%d", &mask2[0], &mask2[1], &mask2[2],
2822               &mask2[3]);
2823        int i = 0;
2824
2825        for (i = 0; i < 4; i++) {
2826                ip[i] = ip2[i];
2827                mask[i] = mask2[i];
2828                // ip[i] = (ip[i] & mask[i]) | !mask[i];
2829                ip[i] = (ip[i] & mask[i]) | (0xff & ~mask[i]);
2830        }
2831
2832        sprintf(ipaddr, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
2833#ifdef WDS_DEBUG
2834        fprintf(fp, "get_broadcast return %s\n", value);
2835#endif
2836
2837}
2838
2839char *get_wan_face(void)
2840{
2841        static char localwanface[IFNAMSIZ];
2842        if (nvram_match("wan_proto", "disabled"))
2843                return "br0";
2844
2845        /*
2846         * if (nvram_match ("pptpd_client_enable", "1")) { strncpy (localwanface,
2847         * "ppp0", IFNAMSIZ); return localwanface; }
2848         */
2849        if (nvram_match("wan_proto", "pptp")
2850#ifdef HAVE_L2TP
2851            || nvram_match("wan_proto", "l2tp")
2852#endif
2853#ifdef HAVE_3G
2854            || nvram_match("wan_proto", "3g")
2855#endif
2856#ifdef HAVE_PPPOATM
2857            || nvram_match("wan_proto", "pppoa")
2858#endif
2859            || nvram_match("wan_proto", "pppoe")) {
2860                if (nvram_match("pppd_pppifname", ""))
2861                        strncpy(localwanface, "ppp0", IFNAMSIZ);
2862                else
2863                        strncpy(localwanface, nvram_safe_get("pppd_pppifname"),
2864                                IFNAMSIZ);
2865        }
2866#ifndef HAVE_MADWIFI
2867        else if (getSTA()) {
2868                strcpy(localwanface, getSTA());
2869        }
2870#else
2871        else if (getSTA()) {
2872                if (nvram_match("wifi_bonding", "1"))
2873                        strcpy(localwanface, "bond0");
2874                else
2875                        strcpy(localwanface, getSTA());
2876        }
2877#endif
2878        else
2879                strncpy(localwanface, nvram_safe_get("wan_ifname"), IFNAMSIZ);
2880
2881        return localwanface;
2882}
2883
2884static int _pidof(const char *name, pid_t ** pids)
2885{
2886        const char *p;
2887        char *e;
2888        DIR *dir;
2889        struct dirent *de;
2890        pid_t i;
2891        int count;
2892        char buf[256];
2893
2894        count = 0;
2895        *pids = NULL;
2896        if ((p = strchr(name, '/')) != NULL)
2897                name = p + 1;
2898        if ((dir = opendir("/proc")) != NULL) {
2899                while ((de = readdir(dir)) != NULL) {
2900                        i = strtol(de->d_name, &e, 10);
2901                        if (*e != 0)
2902                                continue;
2903                        if (strcmp(name, psname(i, buf, sizeof(buf))) == 0) {
2904                                if ((*pids =
2905                                     realloc(*pids,
2906                                             sizeof(pid_t) * (count + 1))) ==
2907                                    NULL) {
2908                                        return -1;
2909                                }
2910                                (*pids)[count++] = i;
2911                        }
2912                }
2913        }
2914        closedir(dir);
2915        return count;
2916}
2917
2918int pidof(const char *name)
2919{
2920        pid_t *pids;
2921        pid_t p;
2922
2923        if (_pidof(name, &pids) > 0) {
2924                p = *pids;
2925                free(pids);
2926                return p;
2927        }
2928        return -1;
2929}
2930
2931int killall(const char *name, int sig)
2932{
2933        pid_t *pids;
2934        int i;
2935        int r;
2936
2937        if ((i = _pidof(name, &pids)) > 0) {
2938                r = 0;
2939                do {
2940                        r |= kill(pids[--i], sig);
2941                }
2942                while (i > 0);
2943                free(pids);
2944                return r;
2945        }
2946        return -2;
2947}
2948
2949void set_ip_forward(char c)
2950{
2951        FILE *fp;
2952
2953        if ((fp = fopen("/proc/sys/net/ipv4/ip_forward", "r+"))) {
2954                fputc(c, fp);
2955                fclose(fp);
2956        } else {
2957                perror("/proc/sys/net/ipv4/ip_forward");
2958        }
2959}
2960
2961int ifexists(const char *ifname)
2962{
2963        return getifcount(ifname) > 0 ? 1 : 0;
2964}
2965
2966int getdevicecount(void)
2967{
2968        int count = 0;
2969#ifdef HAVE_ATH9K
2970        count += getath9kdevicecount();
2971#endif
2972        count += getifcount("wifi");
2973
2974        return count;
2975}
2976
2977int getifcount(const char *ifprefix)
2978{
2979        /*
2980         * char devcall[128];
2981         *
2982         * sprintf (devcall, "cat /proc/net/dev|grep \"%s\"|wc -l", ifprefix);
2983         * FILE *in = popen (devcall, "rb"); if (in == NULL) return 0; int count;
2984         * fscanf (in, "%d", &count); pclose (in); return count;
2985         */
2986        char *iflist = safe_malloc(256);
2987
2988        memset(iflist, 0, 256);
2989        int c = getIfList(iflist, ifprefix);
2990
2991        free(iflist);
2992        return c;
2993}
2994
2995static void skipline(FILE * in)
2996{
2997        while (1) {
2998                int c = getc(in);
2999
3000                if (c == EOF)
3001                        return;
3002                if (c == 0x0)
3003                        return;
3004                if (c == 0xa)
3005                        return;
3006        }
3007}
3008
3009/*
3010 * strips trailing char(s) c from string
3011 */
3012void strtrim_right(char *p, int c)
3013{
3014        char *end;
3015        int len;
3016
3017        len = strlen(p);
3018        while (*p && len) {
3019                end = p + len - 1;
3020                if (c == *end)
3021                        *end = 0;
3022                else
3023                        break;
3024                len = strlen(p);
3025        }
3026        return;
3027}
3028
3029// returns a physical interfacelist filtered by ifprefix. if ifprefix is
3030// NULL, all valid interfaces will be returned
3031int getIfList(char *buffer, const char *ifprefix)
3032{
3033        FILE *in = fopen("/proc/net/dev", "rb");
3034        char ifname[32];
3035
3036        // skip the first 2 lines
3037        skipline(in);
3038        skipline(in);
3039        int ifcount = 0;
3040        int count = 0;
3041
3042        while (1) {
3043                int c = getc(in);
3044
3045                if (c == 0 || c == EOF) {
3046                        if (count)
3047                                buffer[strlen(buffer) - 1] = 0; // fixup last space
3048                        fclose(in);
3049                        return count;
3050                }
3051                if (c == 0x20)
3052                        continue;
3053                if (c == ':' || ifcount == 30) {
3054                        ifname[ifcount++] = 0;
3055                        int skip = 0;
3056
3057                        if (ifprefix) {
3058                                if (strncmp(ifname, ifprefix, strlen(ifprefix))) {
3059                                        skip = 1;
3060                                }
3061                        } else {
3062                                if (!strncmp(ifname, "wifi", 4))
3063                                        skip = 1;
3064                                if (!strncmp(ifname, "ifb", 3))
3065                                        skip = 1;
3066                                if (!strncmp(ifname, "imq", 3))
3067                                        skip = 1;
3068                                if (!strncmp(ifname, "etherip", 7))
3069                                        skip = 1;
3070                                if (!strncmp(ifname, "lo", 2))
3071                                        skip = 1;
3072                                if (!strncmp(ifname, "teql", 4))
3073                                        skip = 1;
3074                                if (!strncmp(ifname, "gre", 3))
3075                                        skip = 1;
3076                                if (!strncmp(ifname, "ppp", 3))
3077                                        skip = 1;
3078                                if (!strncmp(ifname, "tun", 3))
3079                                        skip = 1;
3080                                if (!strncmp(ifname, "tap", 3))
3081                                        skip = 1;
3082                        }
3083                        if (!skip) {
3084                                strcat(buffer, ifname);
3085                                strcat(buffer, " ");
3086                                count++;
3087                        }
3088                        skip = 0;
3089                        ifcount = 0;
3090                        memset(ifname, 0, 32);
3091                        skipline(in);
3092                        continue;
3093                }
3094                if (ifcount < 30)
3095                        ifname[ifcount++] = c;
3096        }
3097}
3098
3099/*
3100 * Example: legal_hwaddr("00:11:22:33:44:aB"); return true;
3101 * legal_hwaddr("00:11:22:33:44:5"); return false;
3102 * legal_hwaddr("00:11:22:33:44:HH"); return false;
3103 */
3104int sv_valid_hwaddr(char *value)
3105{
3106        unsigned int hwaddr[6];
3107        int tag = TRUE;
3108        int i, count;
3109
3110        /*
3111         * Check for bad, multicast, broadcast, or null address
3112         */
3113        for (i = 0, count = 0; *(value + i); i++) {
3114                if (*(value + i) == ':') {
3115                        if ((i + 1) % 3 != 0) {
3116                                tag = FALSE;
3117                                break;
3118                        }
3119                        count++;
3120                } else if (ishexit(*(value + i)))       /* one of 0 1 2 3 4 5 6 7 8 9
3121                                                         * a b c d e f A B C D E F */
3122                        continue;
3123                else {
3124                        tag = FALSE;
3125                        break;
3126                }
3127        }
3128
3129        if (!tag || i != 17 || count != 5)      /* must have 17's characters and 5's
3130                                                 * ':' */
3131                tag = FALSE;
3132        else if (sscanf(value, "%x:%x:%x:%x:%x:%x",
3133                        &hwaddr[0], &hwaddr[1], &hwaddr[2],
3134                        &hwaddr[3], &hwaddr[4], &hwaddr[5]) != 6) {
3135                tag = FALSE;
3136        } else
3137                tag = TRUE;
3138#ifdef WDS_DEBUG
3139        if (tag == FALSE)
3140                fprintf(fp, "failed valid_hwaddr\n");
3141#endif
3142
3143        return tag;
3144}
3145
3146char *cpustring(void)
3147{
3148        static char buf[256];
3149#ifdef HAVE_RB600
3150        strcpy(buf, "FreeScale MPC8343");
3151        return buf;
3152#else
3153        FILE *fcpu = fopen("/proc/cpuinfo", "r");
3154
3155        if (fcpu == NULL) {
3156                return NULL;
3157        }
3158        int i;
3159
3160#ifdef HAVE_MAGICBOX
3161        int cnt = 0;
3162#endif
3163#ifdef HAVE_X86
3164        int cnt = 0;
3165#endif
3166        for (i = 0; i < 256; i++) {
3167                int c = getc(fcpu);
3168
3169                if (c == EOF) {
3170                        fclose(fcpu);
3171                        return NULL;
3172                }
3173                if (c == ':')
3174#ifdef HAVE_MAGICBOX
3175                        cnt++;
3176                if (cnt == 2)
3177                        break;
3178#elif HAVE_X86
3179                        cnt++;
3180                if (cnt == 5)
3181                        break;
3182#else
3183                        break;
3184#endif
3185        }
3186        getc(fcpu);
3187        for (i = 0; i < 256; i++) {
3188                int c = getc(fcpu);
3189
3190                if (c == EOF) {
3191                        fclose(fcpu);
3192                        return NULL;
3193                }
3194                if (c == 0xa || c == 0xd)
3195                        break;
3196                buf[i] = c;
3197        }
3198        buf[i] = 0;
3199        fclose(fcpu);
3200        return buf;
3201#endif
3202}
3203
3204#if defined(HAVE_MADWIFI_MIMO) || defined(HAVE_ATH9K)
3205
3206int isap8x(void)
3207{
3208#define CPUSTR "Atheros AR91"
3209        char *str = cpustring();
3210        if (str && !strncmp(str, CPUSTR, 12))
3211                return 1;
3212        else
3213                return 0;
3214#undef CPUSTR
3215
3216}
3217
3218#endif
3219
3220int led_control(int type, int act)
3221/*
3222 * type: LED_POWER, LED_DIAG, LED_DMZ, LED_CONNECTED, LED_BRIDGE, LED_VPN,
3223 * LED_SES, LED_SES2, LED_WLAN0, LED_WLAN1, LED_SEC0, LED_SEC1, USB_POWER
3224 * act: LED_ON, LED_OFF, LED_FLASH
3225 */
3226{
3227#if (defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_MAGICBOX)  || defined(HAVE_RB600) || 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))
3228        return 0;
3229#else
3230        int use_gpio = 0x0ff;
3231        int gpio_value;
3232        int enable;
3233        int disable;
3234
3235        int power_gpio = 0x0ff;
3236        int diag_gpio = 0x0ff;
3237        int dmz_gpio = 0x0ff;
3238        int connected_gpio = 0x0ff;
3239        int disconnected_gpio = 0x0ff;
3240        int bridge_gpio = 0x0ff;
3241        int vpn_gpio = 0x0ff;
3242        int ses_gpio = 0x0ff;   // use for SES1 (Linksys), AOSS (Buffalo)
3243        int ses2_gpio = 0x0ff;
3244        int wlan0_gpio = 0x0ff; // use this only if wlan led is not controlled by hardware!
3245        int wlan1_gpio = 0x0ff; // use this only if wlan led is not controlled by hardware!
3246        int usb_gpio = 0x0ff;
3247        int sec0_gpio = 0x0ff;  // security leds, wrt600n
3248        int sec1_gpio = 0x0ff;
3249        int usb_power = 0x0ff;
3250        int v1func = 0;
3251        int connblue = nvram_match("connblue", "1") ? 1 : 0;
3252
3253        switch (getRouterBrand())       // gpio definitions here: 0xYZ,
3254                // Y=0:normal, Y=1:inverted, Z:gpio
3255                // number (f=disabled)
3256        {
3257#ifndef HAVE_BUFFALO
3258        case ROUTER_BOARD_UNIFI:
3259                diag_gpio = 0x001;
3260                break;
3261        case ROUTER_BOARD_DANUBE:
3262#ifdef HAVE_WMBR_G300NH
3263                diag_gpio = 0x105;
3264                ses_gpio = 0x10e;
3265                connected_gpio = 111;
3266                disconnected_gpio = 112;
3267                power_gpio = 101;
3268#endif
3269                break;
3270        case ROUTER_BOARD_PB42:
3271#ifdef HAVE_WR941
3272                diag_gpio = 0x102;
3273                ses_gpio = 0x005;
3274//              usb_gpio = 0x101;
3275#endif
3276#ifdef HAVE_WR741
3277                diag_gpio = 0x101;
3278                ses_gpio = 0x000;
3279//              usb_gpio = 0x101;
3280#endif
3281#ifdef HAVE_WR1043
3282                diag_gpio = 0x102;
3283                ses_gpio = 0x005;
3284//              usb_gpio = 0x101;
3285#endif
3286#ifdef HAVE_WRT160NL
3287                power_gpio = 0x10e;
3288                connected_gpio = 0x109;
3289                ses_gpio = 0x108;
3290#endif
3291#ifdef HAVE_TG2521
3292                ses_gpio = 0x103;
3293                diag_gpio = 0x103;
3294                usb_power = 0x105;
3295#endif
3296#ifdef HAVE_TEW632BRP
3297                diag_gpio = 0x101;
3298                ses_gpio = 0x103;
3299#endif
3300#ifdef HAVE_WP543
3301                diag_gpio = 0x107;
3302                connected_gpio = 0x106;
3303#endif
3304#ifdef HAVE_DIR825
3305                power_gpio = 0x102;
3306                diag_gpio = 0x101;
3307                connected_gpio = 0x10b;
3308                disconnected_gpio = 0x106;
3309                ses_gpio = 0x104;
3310#endif
3311#ifdef HAVE_WNDR3700
3312                power_gpio = 0x102;
3313                diag_gpio = 0x101;
3314                connected_gpio = 0x106;
3315                ses_gpio = 0x104;
3316#endif
3317#ifdef HAVE_WZRG300NH
3318                diag_gpio = 0x101;
3319                connected_gpio = 0x112;
3320                ses_gpio = 0x111;
3321                sec0_gpio = 0x111;
3322#endif
3323#ifdef HAVE_WZRG450
3324                diag_gpio = 0x10e;
3325                ses_gpio = 0x10d;
3326                sec0_gpio = 0x10d;
3327                usb_power = 0x010;
3328                connected_gpio = 0x12e; // card 1, gpio 14
3329#endif
3330#ifdef HAVE_WZRG300NH2
3331                diag_gpio = 0x110;
3332                ses_gpio = 0x126;       // card 1, gpio 6
3333                sec0_gpio = 0x126;
3334                usb_power = 0x00d;
3335                connected_gpio = 0x127; // card 1, gpio 7
3336#endif
3337#ifdef HAVE_WZRHPAG300NH
3338                diag_gpio = 0x101;
3339                connected_gpio = 0x133; // card 2 gpio 3
3340                sec0_gpio = 0x125;
3341                sec1_gpio = 0x131;
3342                ses_gpio = 0x125;       // card 1 gpio 5
3343                ses2_gpio = 0x131;      // card 2 gpio 5
3344                usb_power = 0x002;
3345#endif
3346#ifdef HAVE_DIR615E
3347                power_gpio = 0x006;
3348                diag_gpio = 0x001;
3349                connected_gpio = 0x111;
3350                disconnected_gpio = 0x007;
3351                ses_gpio = 0x100;
3352#endif
3353#ifdef HAVE_WRT400
3354                power_gpio = 0x001;
3355                diag_gpio = 0x105;
3356                ses_gpio = 0x104;
3357                connected_gpio = 0x007;
3358#endif
3359#ifdef HAVE_ALFAAP94
3360                power_gpio = 0x005;
3361#endif
3362                break;
3363        case ROUTER_ALLNET01:
3364                connected_gpio = 0x100;
3365                break;
3366        case ROUTER_BOARD_WP54G:
3367                diag_gpio = 0x102;
3368                connected_gpio = 0x107;
3369                break;
3370        case ROUTER_BOARD_NP28G:
3371                diag_gpio = 0x102;
3372                connected_gpio = 0x106;
3373                break;
3374        case ROUTER_BOARD_GATEWORX_GW2369:
3375                connected_gpio = 0x102;
3376                break;
3377        case ROUTER_BOARD_GW2388:
3378        case ROUTER_BOARD_GW2380:
3379                connected_gpio = 0x110; // 16 is mapped to front led
3380                break;
3381        case ROUTER_BOARD_GATEWORX:
3382#ifdef HAVE_WG302V1
3383                diag_gpio = 0x104;
3384                wlan0_gpio = 0x105;
3385#elif HAVE_WG302
3386                diag_gpio = 0x102;
3387                wlan0_gpio = 0x104;
3388#else
3389                if (nvram_match("DD_BOARD", "Gateworks Cambria GW2350")
3390                    || nvram_match("DD_BOARD2", "Gateworks Cambria GW2350"))
3391                        connected_gpio = 0x105;
3392                else if (nvram_match("DD_BOARD", "Gateworks Cambria GW2358-4")
3393                         || nvram_match("DD_BOARD2",
3394                                        "Gateworks Cambria GW2358-4"))
3395                        connected_gpio = 0x118;
3396                else
3397                        connected_gpio = 0x003;
3398#endif
3399                break;
3400        case ROUTER_BOARD_GATEWORX_SWAP:
3401                connected_gpio = 0x004;
3402                break;
3403        case ROUTER_BOARD_STORM:
3404                connected_gpio = 0x005;
3405                diag_gpio = 0x003;
3406                break;
3407        case ROUTER_LINKSYS_WRH54G:
3408                diag_gpio = 0x101;      // power led blink / off to indicate factory
3409                // defaults
3410                break;
3411        case ROUTER_WRT54G:
3412        case ROUTER_WRT54G_V8:
3413                power_gpio = 0x001;
3414                dmz_gpio = 0x107;
3415                connected_gpio = 0x103; // ses orange
3416                ses_gpio = 0x102;       // ses white
3417                ses2_gpio = 0x103;      // ses orange
3418                break;
3419        case ROUTER_WRT54G_V81:
3420                power_gpio = 0x101;
3421                dmz_gpio = 0x102;
3422                connected_gpio = 0x104; // ses orange
3423                ses_gpio = 0x103;       // ses white
3424                ses2_gpio = 0x104;      // ses orange
3425                break;
3426        case ROUTER_WRT54G1X:
3427                connected_gpio = 0x103;
3428                v1func = 1;
3429                break;
3430        case ROUTER_WRT350N:
3431                connected_gpio = 0x103;
3432                power_gpio = 0x001;
3433                ses2_gpio = 0x103;      // ses orange
3434                sec0_gpio = 0x109;
3435                usb_gpio = 0x10b;
3436                break;
3437        case ROUTER_WRT600N:
3438                power_gpio = 0x102;
3439                diag_gpio = 0x002;
3440                usb_gpio = 0x103;
3441                sec0_gpio = 0x109;
3442                sec1_gpio = 0x10b;
3443                break;
3444        case ROUTER_LINKSYS_WRT55AG:
3445                connected_gpio = 0x103;
3446                break;
3447        case ROUTER_DLINK_DIR330:
3448                diag_gpio = 0x106;
3449                connected_gpio = 0x100;
3450                usb_gpio = 0x104;
3451                break;
3452        case ROUTER_ASUS_RTN10PLUS:
3453//              diag_gpio = 0x10d;
3454//              connected_gpio = 0x108;
3455//              power_gpio = 0x109;
3456                break;
3457        case ROUTER_BOARD_DIR600B:
3458                diag_gpio = 0x10d;
3459                connected_gpio = 0x108;
3460                power_gpio = 0x109;
3461                break;
3462        case ROUTER_BOARD_DIR615D:
3463                diag_gpio = 0x108;
3464                connected_gpio = 0x10c;
3465                disconnected_gpio = 0x10e;
3466                ses_gpio = 0x10b;
3467                power_gpio = 0x109;
3468                break;
3469        case ROUTER_BOARD_W502U:
3470                connected_gpio = 0x10d;
3471                break;
3472        case ROUTER_BOARD_OPENRISC:
3473#ifndef HAVE_ERC
3474// ERC: diag button is used different / wlan button is handled by a script
3475                diag_gpio = 0x003;
3476                ses_gpio = 0x005;
3477#endif
3478                break;
3479        case ROUTER_BOARD_WR5422:
3480                ses_gpio = 0x10d;
3481                break;
3482        case ROUTER_BOARD_F5D8235:
3483                usb_gpio = 0x117;
3484                diag_gpio = 0x109;
3485                disconnected_gpio = 0x106;
3486                connected_gpio = 0x105;
3487                ses_gpio = 0x10c;
3488                break;
3489#else
3490        case ROUTER_BOARD_PB42:
3491#ifdef HAVE_WZRG300NH
3492                diag_gpio = 0x101;
3493                connected_gpio = 0x112;
3494                ses_gpio = 0x111;
3495                sec0_gpio = 0x111;
3496#endif
3497#ifdef HAVE_WZRHPAG300NH
3498                diag_gpio = 0x101;
3499                connected_gpio = 0x133;
3500                ses_gpio = 0x125;
3501                ses2_gpio = 0x131;
3502                sec0_gpio = 0x125;
3503                sec1_gpio = 0x131;
3504                usb_power = 0x002;
3505#endif
3506#ifdef HAVE_WZRG450
3507                diag_gpio = 0x10e;
3508                ses_gpio = 0x10d;
3509                sec0_gpio = 0x10d;
3510                usb_power = 0x010;
3511                connected_gpio = 0x12e; // card 1, gpio 14
3512#endif
3513#ifdef HAVE_WZRG300NH2
3514                diag_gpio = 0x110;
3515                ses_gpio = 0x126;
3516                sec0_gpio = 0x126;
3517                usb_power = 0x00d;
3518                connected_gpio = 0x127;
3519#endif
3520                break;
3521#endif
3522        case ROUTER_BOARD_WHRG300N:
3523                diag_gpio = 0x107;
3524                connected_gpio = 0x109;
3525                ses_gpio = 0x10e;
3526                break;
3527        case ROUTER_BOARD_WHRHPGN:
3528                diag_gpio = 0x101;
3529                connected_gpio = 0x106;
3530                ses_gpio = 0x100;
3531                sec0_gpio = 0x100;
3532                break;
3533        case ROUTER_BUFFALO_WBR54G:
3534                diag_gpio = 0x107;
3535                break;
3536        case ROUTER_BUFFALO_WBR2G54S:
3537                diag_gpio = 0x001;
3538                ses_gpio = 0x006;
3539                break;
3540        case ROUTER_BUFFALO_WLA2G54C:
3541                diag_gpio = 0x104;
3542                ses_gpio = 0x103;
3543                break;
3544        case ROUTER_BUFFALO_WLAH_G54:
3545                diag_gpio = 0x107;
3546                ses_gpio = 0x106;
3547                break;
3548        case ROUTER_BUFFALO_WAPM_HP_AM54G54:
3549                diag_gpio = 0x107;
3550                ses_gpio = 0x101;
3551                break;
3552        case ROUTER_BOARD_WHRAG108:
3553                diag_gpio = 0x107;
3554                bridge_gpio = 0x104;
3555                ses_gpio = 0x100;
3556                break;
3557        case ROUTER_BUFFALO_WHRG54S:
3558        case ROUTER_BUFFALO_WLI_TX4_G54HP:
3559                diag_gpio = 0x107;
3560                if (nvram_match("DD_BOARD", "Buffalo WHR-G125")) {
3561                        connected_gpio = 0x101;
3562                        sec0_gpio = 0x106;
3563                } else {
3564                        bridge_gpio = 0x101;
3565                        ses_gpio = 0x106;
3566                }
3567                break;
3568        case ROUTER_BUFFALO_WZRRSG54:
3569                diag_gpio = 0x107;
3570                vpn_gpio = 0x101;
3571                ses_gpio = 0x106;
3572                break;
3573        case ROUTER_BUFFALO_WZRG300N:
3574                diag_gpio = 0x107;
3575                bridge_gpio = 0x101;
3576                break;
3577        case ROUTER_BUFFALO_WZRG144NH:
3578                diag_gpio = 0x103;
3579                bridge_gpio = 0x101;
3580                ses_gpio = 0x102;
3581                break;
3582#ifndef HAVE_BUFFALO
3583#ifdef HAVE_DIR300
3584        case ROUTER_BOARD_FONERA:
3585                diag_gpio = 0x003;
3586                bridge_gpio = 0x004;
3587                ses_gpio = 0x001;
3588                break;
3589#endif
3590#ifdef HAVE_WRT54G2
3591        case ROUTER_BOARD_FONERA:
3592                bridge_gpio = 0x004;
3593                ses_gpio = 0x104;
3594                diag_gpio = 0x103;
3595                break;
3596#endif
3597#ifdef HAVE_RTG32
3598        case ROUTER_BOARD_FONERA:
3599                break;
3600#endif
3601#ifdef HAVE_BWRG1000
3602        case ROUTER_BOARD_LS2:
3603                diag_gpio = 0x007;
3604                break;
3605#endif
3606#ifdef HAVE_DIR400
3607        case ROUTER_BOARD_FONERA2200:
3608                diag_gpio = 0x003;
3609                bridge_gpio = 0x004;
3610                ses_gpio = 0x001;
3611                break;
3612#endif
3613#ifdef HAVE_WRK54G
3614        case ROUTER_BOARD_FONERA:
3615                diag_gpio = 0x107;
3616                dmz_gpio = 0x005;
3617                break;
3618#endif
3619        case ROUTER_BOARD_TW6600:
3620                diag_gpio = 0x107;
3621                bridge_gpio = 0x104;
3622                ses_gpio = 0x100;
3623                break;
3624        case ROUTER_MOTOROLA:
3625                power_gpio = 0x001;
3626                diag_gpio = 0x101;      // power led blink / off to indicate factory
3627                // defaults
3628                break;
3629        case ROUTER_RT210W:
3630                power_gpio = 0x105;
3631                diag_gpio = 0x005;      // power led blink / off to indicate factory
3632                // defaults
3633                connected_gpio = 0x100;
3634                wlan0_gpio = 0x103;
3635                break;
3636        case ROUTER_RT480W:
3637        case ROUTER_BELKIN_F5D7230_V2000:
3638        case ROUTER_BELKIN_F5D7231:
3639                power_gpio = 0x105;
3640                diag_gpio = 0x005;      // power led blink / off to indicate factory
3641                // defaults
3642                connected_gpio = 0x100;
3643                break;
3644        case ROUTER_MICROSOFT_MN700:
3645                power_gpio = 0x006;
3646                diag_gpio = 0x106;      // power led blink / off to indicate factory
3647                // defaults
3648                break;
3649        case ROUTER_ASUS_WL500GD:
3650        case ROUTER_ASUS_WL520GUGC:
3651                diag_gpio = 0x000;      // power led blink / off to indicate factory
3652                // defaults
3653                break;
3654        case ROUTER_ASUS_WL500G_PRE:
3655        case ROUTER_ASUS_WL700GE:
3656                power_gpio = 0x101;
3657                diag_gpio = 0x001;      // power led blink / off to indicate factory
3658                // defaults
3659                break;
3660        case ROUTER_ASUS_WL550GE:
3661                power_gpio = 0x102;
3662                diag_gpio = 0x002;      // power led blink / off to indicate factory
3663                // defaults
3664                break;
3665        case ROUTER_WRT54G3G:
3666        case ROUTER_WRTSL54GS:
3667                power_gpio = 0x001;
3668                dmz_gpio = 0x100;
3669                connected_gpio = 0x107; // ses orange
3670                ses_gpio = 0x105;       // ses white
3671                ses2_gpio = 0x107;      // ses orange
3672                break;
3673        case ROUTER_MOTOROLA_WE800G:
3674        case ROUTER_MOTOROLA_V1:
3675                diag_gpio = 0x103;
3676                wlan0_gpio = 0x101;
3677                bridge_gpio = 0x105;
3678                break;
3679        case ROUTER_DELL_TRUEMOBILE_2300:
3680        case ROUTER_DELL_TRUEMOBILE_2300_V2:
3681                power_gpio = 0x107;
3682                diag_gpio = 0x007;      // power led blink / off to indicate factory
3683                // defaults
3684                wlan0_gpio = 0x106;
3685                break;
3686        case ROUTER_NETGEAR_WNR834B:
3687                power_gpio = 0x104;
3688                diag_gpio = 0x105;
3689                wlan0_gpio = 0x106;
3690                break;
3691        case ROUTER_SITECOM_WL105B:
3692                power_gpio = 0x003;
3693                diag_gpio = 0x103;      // power led blink / off to indicate factory
3694                // defaults
3695                wlan0_gpio = 0x104;
3696                break;
3697        case ROUTER_WRT300N:
3698                power_gpio = 0x001;
3699                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
3700                break;
3701        case ROUTER_WRT150N:
3702                power_gpio = 0x001;
3703                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
3704                sec0_gpio = 0x105;
3705                break;
3706        case ROUTER_WRT300NV11:
3707                ses_gpio = 0x105;
3708                // diag_gpio = 0x11; //power led blink / off to indicate fac.def.
3709                break;
3710        case ROUTER_WRT310N:
3711                connected_gpio = 0x103; //ses orange
3712                power_gpio = 0x001;
3713                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
3714                ses_gpio = 0x109;       // ses blue
3715                break;
3716        case ROUTER_WRT310NV2:
3717                connected_gpio = 0x102; // ses orange
3718                power_gpio = 0x001;
3719                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
3720                ses_gpio = 0x104;       // ses blue
3721                break;
3722        case ROUTER_WRT160N:
3723                power_gpio = 0x001;
3724                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
3725                connected_gpio = 0x103; // ses orange
3726                ses_gpio = 0x105;       // ses blue
3727                break;
3728        case ROUTER_WRT160NV3:
3729                power_gpio = 0x001;
3730                diag_gpio = 0x101;      // power led blink / off to indicate fac.def.
3731                connected_gpio = 0x102; // ses orange
3732                ses_gpio = 0x104;       // ses blue
3733                break;
3734        case ROUTER_LINKSYS_E1000V2:
3735                power_gpio = 0x106;
3736                diag_gpio = 0x006;      // power led blink / off to indicate fac.def.
3737                connected_gpio = 0x007; // ses orange
3738                ses_gpio = 0x008;       // ses blue
3739                break;
3740        case ROUTER_LINKSYS_E3200:
3741                power_gpio = 0x103;
3742                diag_gpio = 0x003;      // power led blink / off to indicate fac.def.
3743                break;
3744        case ROUTER_LINKSYS_E4200:
3745                power_gpio = 0x105;     // white LED1
3746                diag_gpio = 0x005;      // power led blink / off to indicate fac.def.
3747                connected_gpio = 0x103; // white LED2
3748                break;
3749        case ROUTER_ASUS_WL500G:
3750                power_gpio = 0x100;
3751                diag_gpio = 0x000;      // power led blink /off to indicate factory
3752                // defaults
3753                break;
3754        case ROUTER_ASUS_WL500W:
3755                power_gpio = 0x105;
3756                diag_gpio = 0x005;      // power led blink /off to indicate factory
3757                // defaults
3758                break;
3759        case ROUTER_LINKSYS_WTR54GS:
3760                diag_gpio = 0x001;
3761                break;
3762        case ROUTER_WAP54G_V1:
3763                diag_gpio = 0x103;
3764                wlan0_gpio = 0x104;     // LINK led
3765                break;
3766        case ROUTER_WAP54G_V3:
3767                ses_gpio = 0x10c;
3768                connected_gpio = 0x006;
3769                break;
3770        case ROUTER_NETGEAR_WNR834BV2:
3771                power_gpio = 0x002;
3772                diag_gpio = 0x003;      // power led amber
3773                connected_gpio = 0x007; // WAN led green
3774                break;
3775        case ROUTER_NETGEAR_WNDR3300:
3776                power_gpio = 0x005;
3777                diag_gpio = 0x105;      // power led blink /off to indicate factory defaults
3778                connected_gpio = 0x007; // WAN led green
3779                break;
3780        case ROUTER_ASKEY_RT220XD:
3781                wlan0_gpio = 0x100;
3782                dmz_gpio = 0x101;       // not soldered
3783                break;
3784        case ROUTER_WRT610N:
3785                power_gpio = 0x001;
3786                connected_gpio = 0x103; // ses amber
3787                ses_gpio = 0x109;       // ses blue
3788                usb_gpio = 0x100;
3789                break;
3790        case ROUTER_WRT610NV2:
3791                power_gpio = 0x005;
3792                connected_gpio = 0x100; // ses amber
3793                ses_gpio = 0x103;       // ses blue
3794                usb_gpio = 0x007;
3795                break;
3796        case ROUTER_USR_5461:
3797                usb_gpio = 0x001;
3798                break;
3799        case ROUTER_USR_5465:
3800                //usb_gpio = 0x002; //or 0x001 ??
3801                break;
3802        case ROUTER_NETGEAR_WGR614L:
3803        case ROUTER_NETGEAR_WGR614V9:
3804                // power_gpio = 0x107;       // don't use - resets router
3805                diag_gpio = 0x006;
3806                connected_gpio = 0x104;
3807                break;
3808        case ROUTER_NETGEAR_WG602_V4:
3809                power_gpio = 0x101;     // trick: make lan led green for 100Mbps
3810                break;
3811        case ROUTER_BELKIN_F5D7231_V2000:
3812                connected_gpio = 0x104;
3813                diag_gpio = 0x001;      // power led blink /off to indicate factory defaults
3814                break;
3815        case ROUTER_NETGEAR_WNR3500L:
3816                power_gpio = 0x003;     //power led green
3817                diag_gpio = 0x007;      // power led amber
3818                ses_gpio = 0x001;       // WPS led green
3819                connected_gpio = 0x002; //wan led green
3820                break;
3821        case ROUTER_NETGEAR_WNDR3400:
3822                power_gpio = 0x003;     //power led green
3823                diag_gpio = 0x007;      // power led amber
3824                connected_gpio = 0x001; //wan led green
3825                usb_gpio = 0x102;       //usb led green
3826                wlan1_gpio = 0x000;     // radio 1 led blue
3827                break;
3828        case ROUTER_NETGEAR_WNDR4000:
3829                power_gpio = 0x000;     //power led green
3830                diag_gpio = 0x001;      // power led amber
3831                connected_gpio = 0x002; //wan led green
3832                wlan0_gpio = 0x003;     //radio 0 led green
3833                wlan1_gpio = 0x004;     // radio 1 led blue
3834                usb_gpio = 0x005;       //usb led green
3835                ses_gpio = 0x106;       // WPS led green - inverse
3836                ses2_gpio = 0x107;      // WLAN led green - inverse
3837                break;
3838        case ROUTER_NETGEAR_WNR2000V2:
3839                //power_gpio = ??;
3840                diag_gpio = 0x002;
3841                ses_gpio = 0x007;       //WPS led
3842                connected_gpio = 0x006;
3843                break;
3844        case ROUTER_WRT320N:
3845                power_gpio = 0x002;     //power/diag (disabled=blink)
3846                ses_gpio = 0x103;       // ses blue
3847                connected_gpio = 0x104; //ses orange
3848                break;
3849        case ROUTER_ASUS_RTN12:
3850                power_gpio = 0x102;
3851                diag_gpio = 0x002;      // power blink
3852                break;
3853        case ROUTER_BOARD_NEPTUNE:
3854//              usb_gpio = 0x108;
3855                // 0x10c //unknown gpio label, use as diag
3856                diag_gpio = 0x10c;
3857                break;
3858        case ROUTER_ASUS_RTN10U:
3859                ses_gpio = 0x007;
3860                usb_gpio = 0x008;
3861                break;
3862        case ROUTER_ASUS_RTN10:
3863        case ROUTER_ASUS_RTN16:
3864        case ROUTER_NETCORE_NW618:
3865                power_gpio = 0x101;
3866                diag_gpio = 0x001;      // power blink
3867                break;
3868        case ROUTER_BELKIN_F7D3301:
3869        case ROUTER_BELKIN_F7D3302:
3870        case ROUTER_BELKIN_F7D4301:
3871        case ROUTER_BELKIN_F7D4302:
3872                power_gpio = 0x10a;     // green
3873                diag_gpio = 0x10b;      // red
3874                ses_gpio = 0x10d;       // wps orange
3875                break;
3876        case ROUTER_DYNEX_DX_NRUTER:
3877                power_gpio = 0x001;
3878                diag_gpio = 0x101;      // power blink
3879                connected_gpio = 0x100;
3880                sec0_gpio = 0x103;
3881                break;
3882#endif
3883        }
3884        if (type == LED_DIAG && v1func == 1) {
3885                if (act == LED_ON)
3886                        C_led(1);
3887                else
3888                        C_led(0);
3889        }
3890
3891        switch (type) {
3892        case LED_POWER:
3893                use_gpio = power_gpio;
3894                break;
3895        case USB_POWER:
3896                use_gpio = usb_power;
3897                break;
3898        case LED_DIAG:
3899                use_gpio = diag_gpio;
3900                break;
3901        case LED_DMZ:
3902                use_gpio = dmz_gpio;
3903                break;
3904        case LED_CONNECTED:
3905                if (act == LED_ON)
3906                        led_control(LED_DISCONNECTED, LED_OFF);
3907                else
3908                        led_control(LED_DISCONNECTED, LED_ON);
3909                use_gpio = connblue ? ses_gpio : connected_gpio;
3910                break;
3911        case LED_DISCONNECTED:
3912                use_gpio = disconnected_gpio;
3913                break;
3914        case LED_BRIDGE:
3915                use_gpio = bridge_gpio;
3916                break;
3917        case LED_VPN:
3918                use_gpio = vpn_gpio;
3919                break;
3920        case LED_SES:
3921                use_gpio = connblue ? connected_gpio : ses_gpio;
3922                break;
3923        case LED_SES2:
3924                use_gpio = ses2_gpio;
3925                break;
3926        case LED_WLAN0:
3927                use_gpio = wlan0_gpio;
3928                break;
3929        case LED_WLAN1:
3930                use_gpio = wlan1_gpio;
3931                break;
3932        case LED_USB:
3933                use_gpio = usb_gpio;
3934                break;
3935        case LED_SEC0:
3936                use_gpio = sec0_gpio;
3937                break;
3938        case LED_SEC1:
3939                use_gpio = sec1_gpio;
3940                break;
3941        }
3942        if ((use_gpio & 0x0ff) != 0x0ff) {
3943                gpio_value = use_gpio & 0x0ff;
3944                enable = (use_gpio & 0x100) == 0 ? 1 : 0;
3945                disable = (use_gpio & 0x100) == 0 ? 0 : 1;
3946                switch (act) {
3947                case LED_ON:
3948                        set_gpio(gpio_value, enable);
3949                        break;
3950                case LED_OFF:
3951                        set_gpio(gpio_value, disable);
3952                        break;
3953                case LED_FLASH: // will lit the led for 1 sec.
3954                        set_gpio(gpio_value, enable);
3955                        sleep(1);
3956                        set_gpio(gpio_value, disable);
3957                        break;
3958                }
3959        }
3960        return 1;
3961
3962#endif
3963}
3964
3965int file_to_buf(char *path, char *buf, int len)
3966{
3967        FILE *fp;
3968
3969        memset(buf, 0, len);
3970
3971        if ((fp = fopen(path, "r"))) {
3972                fgets(buf, len, fp);
3973                fclose(fp);
3974                return 1;
3975        }
3976
3977        return 0;
3978}
3979
3980int ishexit(char c)
3981{
3982
3983        if (strchr("01234567890abcdefABCDEF", c) != (char *)0)
3984                return 1;
3985
3986        return 0;
3987}
3988
3989int getMTD(char *name)
3990{
3991        char buf[128];
3992        int device;
3993
3994        sprintf(buf, "cat /proc/mtd|grep \"%s\"", name);
3995        FILE *fp = popen(buf, "rb");
3996
3997        fscanf(fp, "%s", &buf[0]);
3998        device = buf[3] - '0';
3999        pclose(fp);
4000        return device;
4001}
4002
4003int insmod(char *module)
4004{
4005        return eval("insmod", module);
4006}
4007
4008void rmmod(char *module)
4009{
4010        eval("rmmod", module);
4011}
4012
4013#include "revision.h"
4014
4015char *getSoftwareRevision(void)
4016{
4017        return "" SVN_REVISION "";
4018}
4019
4020#ifdef HAVE_OLED
4021void initlcd()
4022{
4023
4024}
4025
4026void lcdmessage(char *message)
4027{
4028        eval("oled-print", "DD-WRT v24 sp2", "build:" SVN_REVISION,
4029             "3G/UMTS Router", message);
4030}
4031
4032void lcdmessaged(char *dual, char *message)
4033{
4034
4035}
4036
4037#endif
4038
4039#if 0
4040
4041static int fd;
4042
4043void SetEnvironment()
4044{
4045        system("stty ispeed 2400 < /dev/tts/1");
4046        system("stty raw < /dev/tts/1");
4047}
4048
4049int Cmd = 254;                  /* EZIO Command */
4050int cls = 1;                    /* Clear screen */
4051void Cls()
4052{
4053        write(fd, &Cmd, 1);
4054        write(fd, &cls, 1);
4055}
4056
4057int init = 0x28;
4058void Init()
4059{
4060        write(fd, &Cmd, 1);
4061        write(fd, &init, 1);
4062}
4063
4064int stopsend = 0x37;
4065void StopSend()
4066{
4067        write(fd, &Cmd, 1);
4068        write(fd, &init, 1);
4069}
4070
4071int home = 2;                   /* Home cursor */
4072void Home()
4073{
4074        write(fd, &Cmd, 1);
4075        write(fd, &home, 1);
4076}
4077
4078int readkey = 6;                /* Read key */
4079void ReadKey()
4080{
4081        write(fd, &Cmd, 1);
4082        write(fd, &readkey, 1);
4083}
4084
4085int blank = 8;                  /* Blank display */
4086void Blank()
4087{
4088        write(fd, &Cmd, 1);
4089        write(fd, &blank, 1);
4090}
4091
4092int hide = 12;                  /* Hide cursor & display blanked characters */
4093void Hide()
4094{
4095        write(fd, &Cmd, 1);
4096        write(fd, &hide, 1);
4097}
4098
4099int turn = 13;                  /* Turn On (blinking block cursor) */
4100void TurnOn()
4101{
4102        write(fd, &Cmd, 1);
4103        write(fd, &turn, 1);
4104}
4105
4106int show = 14;                  /* Show underline cursor */
4107void Show()
4108{
4109        write(fd, &Cmd, 1);
4110        write(fd, &show, 1);
4111}
4112
4113int movel = 16;                 /* Move cursor 1 character left */
4114void MoveL()
4115{
4116        write(fd, &Cmd, 1);
4117        write(fd, &movel, 1);
4118}
4119
4120int mover = 20;                 /* Move cursor 1 character right */
4121void MoveR()
4122{
4123        write(fd, &Cmd, 1);
4124        write(fd, &mover, 1);
4125}
4126
4127int scl = 24;                   /* Scroll cursor 1 character left */
4128void ScrollL()
4129{
4130        write(fd, &Cmd, 1);
4131        write(fd, &scl, 1);
4132}
4133
4134int scr = 28;                   /* Scroll cursor 1 character right */
4135void ScrollR()
4136{
4137        write(fd, &Cmd, 1);
4138        write(fd, &scr, 1);
4139}
4140
4141int setdis = 64;                /* Command */
4142void SetDis()
4143{
4144        write(fd, &Cmd, 1);
4145        write(fd, &setdis, 1);
4146
4147}
4148
4149int a, b;
4150void ShowMessage(char *str1, char *str2)
4151{
4152        char nul[] = "                                       ";
4153
4154        a = strlen(str1);
4155        b = 40 - a;
4156        write(fd, str1, a);
4157        write(fd, nul, b);
4158        write(fd, str2, strlen(str2));
4159}
4160
4161void initlcd()
4162{
4163
4164        fd = open("/dev/tts/1", O_RDWR);
4165
4166                                  /** Open Serial port (COM2) */
4167        if (fd > 0) {
4168                close(fd);
4169                SetEnvironment();       /* Set RAW mode */
4170                fd = open("/dev/tts/1", O_RDWR);
4171                Init();         /* Initialize EZIO twice */
4172                Init();
4173
4174                Cls();          /* Clear screen */
4175        }
4176        close(fd);
4177}
4178
4179void lcdmessage(char *message)
4180{
4181
4182        fd = open("/dev/tts/1", O_RDWR);
4183                                   /** Open Serial port (COM2) */
4184
4185        if (fd > 0) {
4186                Init();         /* Initialize EZIO twice */
4187                Init();
4188                SetDis();
4189                Cls();
4190                Home();
4191                ShowMessage("State", message);
4192                close(fd);
4193        }
4194}
4195
4196void lcdmessaged(char *dual, char *message)
4197{
4198
4199        fd = open("/dev/tts/1", O_RDWR);
4200
4201                                  /** Open Serial port (COM2) */
4202
4203        if (fd > 0) {
4204                Init();         /* Initialize EZIO twice */
4205                Init();
4206                SetDis();
4207                Cls();          /* Clear screen */
4208                Home();
4209                ShowMessage(dual, message);
4210                close(fd);
4211        }
4212}
4213
4214#endif
4215static int i64c(int i)
4216{
4217        i &= 0x3f;
4218        if (i == 0)
4219                return '.';
4220        if (i == 1)
4221                return '/';
4222        if (i < 12)
4223                return ('0' - 2 + i);
4224        if (i < 38)
4225                return ('A' - 12 + i);
4226        return ('a' - 38 + i);
4227}
4228
4229int crypt_make_salt(char *p, int cnt, int x)
4230{
4231        x += getpid() + time(NULL);
4232        do {
4233                /*
4234                 * x = (x*1664525 + 1013904223) % 2^32 generator is lame (low-order
4235                 * bit is not "random", etc...), but for our purposes it is good
4236                 * enough
4237                 */
4238                x = x * 1664525 + 1013904223;
4239                /*
4240                 * BTW, Park and Miller's "minimal standard generator" is x = x*16807
4241                 * % ((2^31)-1) It has no problem with visibly alternating lowest bit
4242                 * but is also weak in cryptographic sense + needs div, which needs
4243                 * more code (and slower) on many CPUs
4244                 */
4245                *p++ = i64c(x >> 16);
4246                *p++ = i64c(x >> 22);
4247        }
4248        while (--cnt);
4249        *p = '\0';
4250        return x;
4251}
4252
4253#include <crypt.h>
4254#define MD5_OUT_BUFSIZE 36
4255
4256char *zencrypt(char *passwd)
4257{
4258        char salt[sizeof("$N$XXXXXXXX")];       /* "$N$XXXXXXXX" or "XX" */
4259        static char passout[MD5_OUT_BUFSIZE];
4260
4261        strcpy(salt, "$1$");
4262        crypt_make_salt(salt + 3, 4, 0);
4263        strcpy(passout, crypt((unsigned char *)passwd, (unsigned char *)salt));
4264        return passout;
4265}
4266
4267int has_gateway(void)
4268{
4269        if (nvram_match("wk_mode", "gateway"))
4270                return 1;
4271        if (nvram_match("wk_mode", "olsr") && nvram_match("olsrd_gateway", "1"))
4272                return 1;
4273        return 0;
4274}
4275
4276#ifdef HAVE_ATH9K
4277int getath9kdevicecount(void)
4278{
4279        glob_t globbuf;
4280        int globresult;
4281        int count = 0;
4282#ifndef HAVE_MADWIFI_MIMO
4283        if (1) {
4284#else
4285        if (nvram_match("mimo_driver", "ath9k")) {
4286#endif
4287                globresult =
4288                    glob("/sys/class/ieee80211/phy*", GLOB_NOSORT, NULL,
4289                         &globbuf);
4290                if (globresult == 0)
4291                        count = (int)globbuf.gl_pathc;
4292                globfree(&globbuf);
4293        }
4294        return (count);
4295}
4296
4297int get_ath9k_phy_idx(int idx)
4298{
4299        // fprintf(stderr,"channel number %d of %d\n", i,achans.ic_nchans);
4300        return idx - getifcount("wifi");
4301}
4302
4303int is_ath9k(char *prefix)
4304{
4305        glob_t globbuf;
4306        int count = 0;
4307        char globstring[1024];
4308        int globresult;
4309        int devnum;
4310        // get legacy interface count
4311#ifdef HAVE_MADWIFI_MIMO
4312        if (!nvram_match("mimo_driver", "ath9k"))
4313                return (0);
4314#endif
4315        if (!sscanf(prefix, "ath%d", &devnum))
4316                return (0);
4317        // correct index if there are legacy cards arround
4318        devnum = get_ath9k_phy_idx(devnum);
4319        sprintf(globstring, "/sys/class/ieee80211/phy%d", devnum);
4320        globresult = glob(globstring, GLOB_NOSORT, NULL, &globbuf);
4321        if (globresult == 0)
4322                count = (int)globbuf.gl_pathc;
4323        globfree(&globbuf);
4324        return (count);
4325}
4326#endif
4327
4328double HTTxRate20_800(unsigned int index)
4329{
4330        static const double vHTTxRate20_800[24] =
4331            { 6.5, 13.0, 19.5, 26.0, 39.0, 52.0, 58.5, 65.0, 13.0, 26.0, 39.0,
4332                52.0, 78.0, 104.0, 117.0, 130.0,
4333                19.5, 39.0, 58.5, 78.0, 117.0, 156.0, 175.5, 195.0
4334        };
4335        if (index > sizeof(HTTxRate20_800) / sizeof(double) - 1) {
4336                fprintf(stderr, "utils.c HTTxRate20_800() index overflow\n");
4337                return 0.0;
4338        }
4339        return vHTTxRate20_800[index];
4340}
4341
4342double HTTxRate20_400(unsigned int index)
4343{
4344        static const double vHTTxRate20_400[24] =
4345            { 7.2, 14.4, 21.7, 28.9, 43.3, 57.8, 65.0, 72.2, 14.444, 28.889,
4346                43.333, 57.778, 86.667, 115.556, 130.000, 144.444,
4347                21.7, 43.3, 65.0, 86.7, 130.0, 173.3, 195.0, 216.7
4348        };
4349        if (index > sizeof(vHTTxRate20_400) / sizeof(double) - 1) {
4350                fprintf(stderr, "utils.c HTTxRate20_400() index overflow\n");
4351                return 0.0;
4352        }
4353        return vHTTxRate20_400[index];
4354}
4355
4356double HTTxRate40_800(unsigned int index)
4357{
4358        static const double vHTTxRate40_800[25] =
4359            { 13.5, 27.0, 40.5, 54.0, 81.0, 108.0, 121.5, 135.0, 27.0, 54.0,
4360                81.0, 108.0, 162.0, 216.0, 243.0, 270.0,
4361                40.5, 81.0, 121.5, 162.0, 243.0, 324.0, 364.5, 405.0, 6.0
4362        };
4363        if (index > sizeof(vHTTxRate40_800) / sizeof(double) - 1) {
4364                fprintf(stderr, "utils.c HTTxRate40_800() index overflow\n");
4365                return 0.0;
4366        }
4367        return vHTTxRate40_800[index];
4368}
4369
4370double HTTxRate40_400(unsigned int index)
4371{
4372        static const double vHTTxRate40_400[25] =
4373            { 15.0, 30.0, 45.0, 60.0, 90.0, 120.0, 135.0, 150.0, 30.0, 60.0,
4374                90.0, 120.0, 180.0, 240.0, 270.0, 300.0,
4375                45.0, 90.0, 135.0, 180.0, 270.0, 360.0, 405.0, 450.0, 6.7
4376        };
4377        if (index > sizeof(vHTTxRate40_400) / sizeof(double) - 1) {
4378                fprintf(stderr, "utils.c HTTxRate40_400() index overflow\n");
4379                return 0.0;
4380        }
4381        return vHTTxRate40_400[index];
4382}
Note: See TracBrowser for help on using the repository browser.