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

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

gpio support for storm board (wbd-111)

File size: 69.5 KB
Line 
1// #define CDEBUG
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6#include <errno.h>
7#include <net/if.h>
8#include <dirent.h>
9#include <unistd.h>
10#include <ctype.h>
11#include <syslog.h>
12#include <sys/socket.h>
13#include <sys/stat.h>
14#include <fcntl.h>
15#include <netinet/in.h>
16#include <stdarg.h>
17#include <sys/ioctl.h>
18#include <sys/sysinfo.h>
19#include <arpa/inet.h>
20#include <netdb.h>
21#include <resolv.h>
22#include <signal.h>
23
24#include <utils.h>
25#include <wlutils.h>
26#include <bcmnvram.h>
27#include <shutils.h>
28#include <cy_conf.h>
29#include <code_pattern.h>
30#include <bcmdevs.h>
31#include <net/route.h>
32#include <cy_conf.h>
33#include <bcmdevs.h>
34#include <linux/if_ether.h>
35// #include <linux/mii.h>
36#include <linux/sockios.h>
37#include <cymac.h>
38#include <broadcom.h>
39#define SIOCGMIIREG     0x8948  /* Read MII PHY register.  */
40#define SIOCSMIIREG     0x8949  /* Write MII PHY register.  */
41
42struct mii_ioctl_data
43{
44    unsigned short phy_id;
45    unsigned short reg_num;
46    unsigned short val_in;
47    unsigned short val_out;
48};
49
50int count_processes( char *pidName )
51{
52    FILE *fp;
53    char line[254];
54    char safename[64];
55
56    sprintf( safename, " %s ", pidName );
57    char zombie[64];
58
59    sprintf( zombie, "Z   [%s]", pidName );     // do not count zombies
60    int i = 0;
61
62    cprintf( "Search for %s\n", pidName );
63    if( ( fp = popen( "ps", "r" ) ) )
64    {
65        while( fgets( line, sizeof( line ), fp ) != NULL )
66        {
67            if( strstr( line, safename ) && !strstr( line, zombie ) )
68            {
69                i++;
70            }
71        }
72        pclose( fp );
73    }
74    cprintf( "Search done... %d\n", i );
75
76    return i;
77}
78
79/*
80 * This function returns the number of days for the given month in the given
81 * year
82 */
83unsigned int daysformonth( unsigned int month, unsigned int year )
84{
85    return ( 30 + ( ( ( month & 9 ) == 8 ) || ( ( month & 9 ) == 1 ) ) -
86             ( month ==
87               2 ) - ( !( ( ( year % 4 ) == 0 )
88                          && ( ( ( year % 100 ) != 0 )
89                               || ( ( year % 400 ) == 0 ) ) )
90                       && ( month == 2 ) ) );
91}
92
93#ifdef HAVE_AQOS
94
95static char *get_wshaper_dev( void )
96{
97    if( nvram_match( "wshaper_dev", "WAN" ) )
98        return get_wan_face(  );
99    else
100        return "br0";
101}
102
103void add_userip( char *ip, int idx, char *upstream, char *downstream )
104{
105    int base = 120 + idx;
106    char up[32];
107    char down[32];
108    char ups[32];
109    char downs[32];
110
111    if( nvram_match( "qos_type", "1" ) )
112    {
113        sprintf( up, "1:%d", base );
114        sprintf( down, "1:%d", base + 1 );
115        sprintf( ups, "%skbit", upstream );
116        sprintf( downs, "%skbit", downstream );
117        sysprintf
118            ( "tc class add dev %s parent 1:1 classid 1:%d htb rate %skbit ceil %skbit",
119              "imq0", base, upstream, upstream );
120        sysprintf
121            ( "tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
122              "imq0", base );
123        sysprintf
124            ( "tc filter add dev %s protocol ip parent 1:0 prio 1 u32 match ip src %s flowid 1:%d",
125              "imq0", ip, base );
126
127        sysprintf
128            ( "tc class add dev imq0 parent 1:1 classid 1:%d htb rate %skbit ceil %skbit",
129              base + 1, downstream, downstream );
130        sysprintf
131            ( "tc qdisc add dev imq0 parent 1:%d sfq quantum 1514b perturb 15",
132              base + 1, base + 1 );
133        sysprintf
134            ( "tc filter add dev imq0 protocol ip parent 1:0 prio 1 u32 match ip dst %s flowid 1:%d",
135              ip, base + 1 );
136
137    }
138    else
139    {
140        sprintf( up, "1:%d", base );
141        sprintf( down, "1:%d", base + 1 );
142        sprintf( ups, "%skbit", upstream );
143        sprintf( downs, "%skbit", downstream );
144        sysprintf
145            ( "tc class add dev %s parent 1:2 classid 1:%d htb rate %skbit ceil %skbit",
146              "imq0", base, upstream, upstream );
147        sysprintf
148            ( "tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
149              "imq0", base );
150        sysprintf
151            ( "tc filter add dev %s protocol ip parent 1:0 prio 1 u32 match ip src %s flowid 1:%d",
152              "imq0", ip, base );
153
154        sysprintf
155            ( "tc class add dev imq0 parent 1:2 classid 1:%d htb rate %skbit ceil %skbit",
156              base + 1, downstream, downstream );
157        sysprintf
158            ( "tc qdisc add dev imq0 parent 1:%d sfq quantum 1514b perturb 15",
159              base + 1, base + 1 );
160        sysprintf
161            ( "tc filter add dev imq0 protocol ip parent 1:0 prio 1 u32 match ip dst %s flowid 1:%d",
162              ip, base + 1 );
163    }
164}
165
166void add_usermac( char *mac, int idx, char *upstream, char *downstream )
167{
168    unsigned char octet[6];
169   
170    ether_atoe( mac, octet );
171    int base = 120 + idx;
172    char up[32];
173    char down[32];
174    char ups[32];
175    char downs[32];
176    char oct2[32];
177    char oct4[32];
178    char doct2[32];
179    char doct4[32];
180
181    sprintf( up, "1:%d", base );
182    sprintf( down, "1:%d", base + 1 );
183    sprintf( ups, "%skbit", upstream );
184    sprintf( downs, "%skbit", downstream );
185
186    sprintf( oct2, "%02X%02X", octet[4], octet[5] );
187    sprintf( oct4, "%02X%02X%02X%02X", octet[0], octet[1], octet[2],
188             octet[3] );
189
190    sprintf( doct4, "%02X%02X%02X%02X", octet[2], octet[3], octet[4],
191             octet[5] );
192    sprintf( doct2, "%02X%02X", octet[0], octet[1] );
193
194    if( nvram_match( "qos_type", "1" ) )
195    {
196        // up
197        sysprintf( "tc class add dev %s parent 1:1 classid 1:%d htb rate %skbit ceil %skbit", "imq0", base, upstream, upstream );       //
198        sysprintf
199            ( "tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
200              "imq0", base );
201        sysprintf
202            ( "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",
203              "imq0", oct2, oct4, base );
204
205        // down
206        if( strcmp( get_wshaper_dev(  ), "br0" ) )
207        {
208            /*
209             * use separate root class, since no other class is created for br0
210             * if qos is wan based
211             */
212            sysprintf
213                ( "tc class add dev br0 parent 1: classid 1:%d htb rate %skbit ceil %skbit",
214                  base + 1, downstream, downstream );
215            sysprintf
216                ( "tc qdisc add dev br0 parent 1:%d sfq quantum 1514b perturb 15",
217                  base + 1, base + 1 );
218            sysprintf
219                ( "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",
220                  doct4, doct2, base + 1 );
221        }
222        else
223        {
224            /*
225             * use root class of br0 interface which was created by the wshaper
226             */
227            sysprintf
228                ( "tc class add dev br0 parent 1:1 classid 1:%d htb rate %skbit ceil %skbit",
229                  base + 1, downstream, downstream );
230            sysprintf
231                ( "tc qdisc add dev br0 parent 1:%d sfq quantum 1514b perturb 15",
232                  base + 1, base + 1 );
233            sysprintf
234                ( "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",
235                  doct4, doct2, base + 1 );
236        }
237
238    }
239    else
240    {
241        // up
242        sysprintf( "tc class add dev %s parent 1:2 classid 1:%d htb rate %skbit ceil %skbit", "imq0", base, upstream, upstream );       //
243        sysprintf
244            ( "tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
245              "imq0", base );
246        sysprintf
247            ( "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",
248              "imq0", oct2, oct4, base );
249
250        // down
251        if( strcmp( get_wshaper_dev(  ), "br0" ) )
252        {
253            /*
254             * use separate root class, since no other class is created for br0
255             * if qos is wan based
256             */
257            sysprintf
258                ( "tc class add dev br0 parent 1: classid 1:%d htb rate %skbit ceil %skbit",
259                  base + 1, downstream, downstream );
260            sysprintf
261                ( "tc qdisc add dev br0 parent 1:%d sfq quantum 1514b perturb 15",
262                  base + 1, base + 1 );
263            sysprintf
264                ( "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",
265                  doct4, doct2, base + 1 );
266        }
267        else
268        {
269            /*
270             * use root class of br0 interface which was created by the wshaper
271             */
272            sysprintf
273                ( "tc class add dev br0 parent 1:2 classid 1:%d htb rate %skbit ceil %skbit",
274                  base + 1, downstream, downstream );
275            sysprintf
276                ( "tc qdisc add dev br0 parent 1:%d sfq quantum 1514b perturb 15",
277                  base + 1, base + 1 );
278            sysprintf
279                ( "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",
280                  doct4, doct2, base + 1 );
281        }
282    }
283    /*
284     * mac downstream matching can only be made directly on the connected
285     * interface
286     */
287    char iflist[256];
288
289    getIfList( iflist, NULL );
290    static char word[256];
291    char *next, *wordlist;
292
293    foreach( word, iflist, next )
294    {
295        if( nvram_nmatch( "0", "%s_bridged", word ) )
296        {
297            sysprintf
298                ( "tc class add dev %s parent 1: classid 1:%d htb rate %skbit ceil %skbit",
299                  word, base + 1, downstream, downstream );
300            sysprintf
301                ( "tc qdisc add dev %s parent 1:%d sfq quantum 1514b perturb 15",
302                  word, base + 1, base + 1 );
303            sysprintf
304                ( "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",
305                  word, doct4, doct2, base + 1 );
306        }
307    }
308
309}
310
311#endif
312int buf_to_file( char *path, char *buf )
313{
314    FILE *fp;
315
316    if( ( fp = fopen( path, "w" ) ) )
317    {
318        fprintf( fp, "%s", buf );
319        fclose( fp );
320        return 1;
321    }
322
323    return 0;
324}
325
326int check_action( void )
327{
328    char buf[80] = "";
329
330    if( file_to_buf( ACTION_FILE, buf, sizeof( buf ) ) )
331    {
332        if( !strcmp( buf, "ACT_TFTP_UPGRADE" ) )
333        {
334            fprintf( stderr, "Upgrading from tftp now ...\n" );
335            return ACT_TFTP_UPGRADE;
336        }
337#ifdef HAVE_HTTPS
338        else if( !strcmp( buf, "ACT_WEBS_UPGRADE" ) )
339        {
340            fprintf( stderr, "Upgrading from web (https) now ...\n" );
341            return ACT_WEBS_UPGRADE;
342        }
343#endif
344        else if( !strcmp( buf, "ACT_WEB_UPGRADE" ) )
345        {
346            fprintf( stderr, "Upgrading from web (http) now ...\n" );
347            return ACT_WEB_UPGRADE;
348        }
349        else if( !strcmp( buf, "ACT_SW_RESTORE" ) )
350        {
351            fprintf( stderr, "Receiving restore command from web ...\n" );
352            return ACT_SW_RESTORE;
353        }
354        else if( !strcmp( buf, "ACT_HW_RESTORE" ) )
355        {
356            fprintf( stderr,
357                     "Receiving restore command from resetbutton ...\n" );
358            return ACT_HW_RESTORE;
359        }
360        else if( !strcmp( buf, "ACT_NVRAM_COMMIT" ) )
361        {
362            fprintf( stderr, "Committing nvram now ...\n" );
363            return ACT_NVRAM_COMMIT;
364        }
365        else if( !strcmp( buf, "ACT_ERASE_NVRAM" ) )
366        {
367            fprintf( stderr, "Erasing nvram now ...\n" );
368            return ACT_ERASE_NVRAM;
369        }
370    }
371    // fprintf(stderr, "Waiting for upgrading....\n");
372    return ACT_IDLE;
373}
374
375int check_vlan_support( void )
376{
377#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA) || defined(HAVE_MERAKI) || defined(HAVE_LS2) || defined(HAVE_WHRAG108) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_TW6600) || defined(HAVE_PB42) || defined(HAVE_LS5) || defined(HAVE_LSX) || defined(HAVE_DANUBE) || defined(HAVE_STORM) || defined(HAVE_ADM5120)
378    return 0;
379#else
380
381    int brand = getRouterBrand(  );
382
383    switch ( brand )
384    {
385#ifndef HAVE_BUFFALO
386        case ROUTER_ASUS_WL500GD:
387            return 1;
388            break;
389#endif
390        case ROUTER_BUFFALO_WLAG54C:
391        case ROUTER_BUFFALO_WLA2G54C:
392#ifndef HAVE_BUFFALO
393        case ROUTER_LINKSYS_WRT55AG:
394        case ROUTER_MOTOROLA_V1:
395        case ROUTER_MOTOROLA_WE800G:
396        case ROUTER_WAP54G_V1:
397        case ROUTER_SITECOM_WL105B:
398        case ROUTER_SITECOM_WL111:
399        case ROUTER_BUFFALO_WLI2_TX1_G54:
400        case ROUTER_BUFFALO_WLI_TX4_G54HP:
401        case ROUTER_BRCM4702_GENERIC:
402        case ROUTER_ASUS_WL500G:
403        case ROUTER_BELKIN_F5D7230_V2000:
404#endif
405            return 0;
406            break;
407    }
408
409    uint boardflags = strtoul( nvram_safe_get( "boardflags" ), NULL, 0 );
410
411    if( boardflags & BFL_ENETVLAN )
412        return 1;
413
414    if( nvram_match( "boardtype", "bcm94710dev" )
415        || nvram_match( "boardtype", "0x0101" ) || ( boardflags & 0x0100 ) )
416        return 1;
417    else
418        return 0;
419#endif
420}
421
422void setRouter( char *name )
423{
424#ifdef HAVE_POWERNOC_WORT54G
425    nvram_set( NVROUTER, "WORT54G" );
426#elif HAVE_POWERNOC_WOAP54G
427    nvram_set( NVROUTER, "WOAP54G" );
428#elif HAVE_OMNI
429    nvram_set( NVROUTER, "Omni Wifi Router" );
430#elif HAVE_MAKSAT
431    if( name )
432        nvram_set( "DD_BOARD2", name );
433    nvram_set( NVROUTER, "MAKSAT" );
434#else
435    if( name )
436        nvram_set( NVROUTER, name );
437#endif
438}
439
440char *getRouter(  )
441{
442    char *n = nvram_get( NVROUTER );
443
444    return n != NULL ? n : "Unknown Model";
445}
446
447int internal_getRouterBrand(  )
448{
449
450#ifdef HAVE_ADM5120
451    setRouter( "Tonze AP-120" );
452    return ROUTER_BOARD_ADM5120;
453#elif HAVE_RB500
454    setRouter( "Mikrotik RB500" );
455    return ROUTER_BOARD_500;
456#elif HAVE_GEMTEK
457    setRouter( "SuperGerry" );
458    return ROUTER_SUPERGERRY;
459#elif HAVE_TONZE
460    setRouter( "Tonze AP-425" );
461    return ROUTER_BOARD_GATEWORX;
462#elif HAVE_NOP8670
463    setRouter( "Senao NOP-8670" );
464    return ROUTER_BOARD_GATEWORX;
465#elif HAVE_WRT300NV2
466    setRouter( "Linksys WRT300N v2" );
467    return ROUTER_BOARD_GATEWORX;
468#elif HAVE_GATEWORX
469    char *filename = "/sys/devices/platform/IXP4XX-I2C.0/i2c-adapter:i2c-0/0-0051/eeprom";      /* bank2=0x100
470                                                                                                 */
471    FILE *file = fopen( filename, "r" );
472
473    if( file )                  // new detection scheme
474    {
475        fseek( file, 32, SEEK_SET );
476        char gwid[7];
477
478        gwid[6] = 0;
479        int ret = fread( gwid, 6, 1, file );
480
481        if( ret < 1 )
482        {
483            fclose( file );
484            goto old_way;
485        }
486        fclose( file );
487        if( !strcmp( gwid, "GW2347" ) )
488        {
489            setRouter( "Avila GW2347" );
490            return ROUTER_BOARD_GATEWORX_SWAP;
491        }
492        if( !strcmp( gwid, "GW2357" ) )
493        {
494            setRouter( "Avila GW2357" );
495            return ROUTER_BOARD_GATEWORX_SWAP;
496        }
497        if( !strcmp( gwid, "GW2353" ) )
498        {
499            setRouter( "Avila GW2343" );
500            return ROUTER_BOARD_GATEWORX;
501        }
502        if( !strcmp( gwid, "GW2348" ) )
503        {
504            setRouter( "Avila GW2348-4/2" );
505            return ROUTER_BOARD_GATEWORX;
506        }
507        if( !strcmp( gwid, "GW2358" ) )
508        {
509            setRouter( "Cambria GW2358-4" );
510            return ROUTER_BOARD_GATEWORX;
511        }
512        if( !strcmp( gwid, "GW2355" ) )
513        {
514            setRouter( "Avila GW2355" );
515            return ROUTER_BOARD_GATEWORX_GW2345;
516        }
517        if( !strcmp( gwid, "GW2345" ) )
518        {
519            setRouter( "Avila GW2345" );
520            return ROUTER_BOARD_GATEWORX_GW2345;
521        }
522    }
523  old_way:;
524    struct mii_ioctl_data *data;
525    struct ifreq iwr;
526    int s = socket( AF_INET, SOCK_DGRAM, 0 );
527
528    if( s < 0 )
529    {
530        fprintf( stderr, "socket(SOCK_DRAGM)\n" );
531        setRouter( "Avila Gateworks" );
532        return ROUTER_BOARD_GATEWORX;
533    }
534    ( void )strncpy( iwr.ifr_name, "ixp0", sizeof( "ixp0" ) );
535    data = ( struct mii_ioctl_data * )&iwr.ifr_data;
536    data->phy_id = 1;
537#define IX_ETH_ACC_MII_PHY_ID1_REG  0x2 /* PHY identifier 1 Register */
538#define IX_ETH_ACC_MII_PHY_ID2_REG  0x3 /* PHY identifier 2 Register */
539    data->reg_num = IX_ETH_ACC_MII_PHY_ID1_REG;
540    ioctl( s, SIOCGMIIREG, &iwr );
541    data->phy_id = 1;
542    data->reg_num = IX_ETH_ACC_MII_PHY_ID1_REG;
543    ioctl( s, SIOCGMIIREG, &iwr );
544    int reg1 = data->val_out;
545
546    data->phy_id = 1;
547    data->reg_num = IX_ETH_ACC_MII_PHY_ID2_REG;
548    ioctl( s, SIOCGMIIREG, &iwr );
549    int reg2 = data->val_out;
550
551    close( s );
552    fprintf( stderr, "phy id %X:%X\n", reg1, reg2 );
553    if( reg1 == 0x2000 && reg2 == 0x5c90 )
554    {
555        setRouter( "Avila GW2347" );
556        return ROUTER_BOARD_GATEWORX_SWAP;
557    }
558    else if( reg1 == 0x13 && reg2 == 0x7a11 )
559    {
560        setRouter( "Avila GW2348-4/2" );
561        return ROUTER_BOARD_GATEWORX;
562    }
563    else if( reg1 == 0x143 && reg2 == 0xbc31 )  // broadcom phy
564    {
565        setRouter( "ADI Engineering Pronghorn Metro" );
566        return ROUTER_BOARD_GATEWORX;
567    }
568    else if( reg1 == 0x22 && reg2 == 0x1450 )   // kendin switch
569    {
570        setRouter( "Avila GW2345" );
571        return ROUTER_BOARD_GATEWORX_GW2345;
572    }
573    else if( reg1 == 0x0 && reg2 == 0x8201 )    // realtek
574    {
575        setRouter( "Compex WP188" );
576        return ROUTER_BOARD_GATEWORX;
577    }
578    else
579    {
580        setRouter( "Unknown" );
581        return ROUTER_BOARD_GATEWORX;
582    }
583#elif HAVE_X86
584    setRouter( "Generic X86" );
585    return ROUTER_BOARD_X86;
586#elif HAVE_XSCALE
587    setRouter( "NewMedia Dual A/B/G" );
588    return ROUTER_BOARD_XSCALE;
589#elif HAVE_MAGICBOX
590    setRouter( "MagicBox" );
591    return ROUTER_BOARD_MAGICBOX;
592#elif HAVE_WRT54GV7
593    setRouter( "Linksys WRT54G v7" );
594    return ROUTER_BOARD_FONERA;
595#elif HAVE_WRK54G
596    setRouter( "Linksys WRK54G v3" );
597    return ROUTER_BOARD_FONERA;
598#elif HAVE_MR3202A
599    setRouter( "MR3202A" );
600    return ROUTER_BOARD_FONERA;
601#elif HAVE_AR430W
602    setRouter( "Airlink-101 AR430W" );
603    return ROUTER_BOARD_FONERA;
604#elif HAVE_DIR400
605    setRouter( "D-Link DIR-400" );
606    return ROUTER_BOARD_FONERA2200;
607#elif HAVE_DIR300
608    setRouter( "D-Link DIR-300" );
609    return ROUTER_BOARD_FONERA;
610#elif HAVE_WBD500
611    setRouter( "Wiligear WBD-500" );
612    return ROUTER_BOARD_FONERA;
613#elif HAVE_FONERA
614    struct mii_ioctl_data *data;
615    struct ifreq iwr;
616    int s = socket( AF_INET, SOCK_DGRAM, 0 );
617
618    if( s < 0 )
619    {
620        fprintf( stderr, "socket(SOCK_DRAGM)\n" );
621        setRouter( "Fonera 2100/2200" );
622        return ROUTER_BOARD_FONERA;
623    }
624    ( void )strncpy( iwr.ifr_name, "eth0", sizeof( "eth0" ) );
625    data = ( struct mii_ioctl_data * )&iwr.ifr_data;
626    data->phy_id = 0x10;
627    data->reg_num = 0x2;
628    ioctl( s, SIOCGMIIREG, &iwr );
629    data->phy_id = 0x10;
630    data->reg_num = 0x2;
631    ioctl( s, SIOCGMIIREG, &iwr );
632    if( data->val_out == 0x0141 )
633    {
634        data->phy_id = 0x10;
635        data->reg_num = 0x3;
636        ioctl( s, SIOCGMIIREG, &iwr );
637        close( s );
638        if( ( data->val_out & 0xfc00 ) != 0x0c00 )      // marvell phy
639        {
640            setRouter( "Fonera 2100/2200" );
641            return ROUTER_BOARD_FONERA;
642        }
643        else
644        {
645            setRouter( "Fonera 2201" );
646            return ROUTER_BOARD_FONERA2200;
647        }
648    }
649    else
650    {
651        setRouter( "Fonera 2100/2200" );
652        return ROUTER_BOARD_FONERA;
653    }
654#elif HAVE_MERAKI
655    setRouter( "Meraki Mini" );
656    return ROUTER_BOARD_MERAKI;
657#elif HAVE_NS2
658    setRouter( "Ubiquiti Nanostation 2" );
659    return ROUTER_BOARD_LS2;
660#elif HAVE_NS5
661    setRouter( "Ubiquiti Nanostation 5" );
662    return ROUTER_BOARD_LS2;
663#elif HAVE_PS2
664    setRouter( "Ubiquiti Powerstation 2" );
665    return ROUTER_BOARD_LS2;
666#elif HAVE_PS5
667    setRouter( "Ubiquiti Powerstation 5" );
668    return ROUTER_BOARD_LS2;
669#elif HAVE_LS2
670    setRouter( "Ubiquiti Litestation 2" );
671    return ROUTER_BOARD_LS2;
672#elif HAVE_LS5
673    setRouter( "Ubiquiti Litestation 5" );
674    return ROUTER_BOARD_LS2;
675#elif HAVE_WHRAG108
676    setRouter( "Buffalo WHR-HP-AG108" );
677    return ROUTER_BOARD_WHRAG108;
678#elif HAVE_PB42
679    setRouter( "Atheros PB42" );
680    return ROUTER_BOARD_PB42;
681#elif HAVE_LSX
682    setRouter( "Ubiquiti LSX" );
683    return ROUTER_BOARD_PB42;
684#elif HAVE_DANUBE
685    setRouter( "Infineon Danube" );
686    return ROUTER_BOARD_DANUBE;
687#elif HAVE_STORM
688    setRouter( "Wiligear WBD-111" );
689    return ROUTER_BOARD_STORM;
690#elif HAVE_TW6600
691    setRouter( "AW-6660" );
692    return ROUTER_BOARD_TW6600;
693#elif HAVE_ALPHA
694    setRouter( "Alfa Networks AP48" );
695    return ROUTER_BOARD_CA8;
696#elif HAVE_USR5453
697    setRouter( "US Robotics USR5453" );
698    return ROUTER_BOARD_CA8;
699#elif HAVE_CA8PRO
700    setRouter( "Wistron CA8-4 PRO" );
701    return ROUTER_BOARD_CA8PRO;
702#elif HAVE_CA8
703    setRouter( "Wistron CA8-4" );
704    return ROUTER_BOARD_CA8;
705#else
706
707    uint boardnum = strtoul( nvram_safe_get( "boardnum" ), NULL, 0 );
708
709    if( boardnum == 42 && nvram_match( "boardtype", "bcm94710ap" ) )
710    {
711        cprintf( "router is buffalo\n" );
712        setRouter( "Buffalo WBR-G54 / WLA-G54" );
713        return ROUTER_BUFFALO_WBR54G;
714    }
715#ifndef HAVE_BUFFALO
716    if( nvram_match( "boardnum", "mn700" ) &&
717        nvram_match( "boardtype", "bcm94710ap" ) )
718    {
719        cprintf( "router is Microsoft MN-700\n" );
720        setRouter( "Microsoft MN-700" );
721        return ROUTER_MICROSOFT_MN700;
722    }
723
724    if( nvram_match( "boardnum", "asusX" ) &&
725        nvram_match( "boardtype", "bcm94710dev" ) )
726    {
727        cprintf( "router is Asus WL300g / WL500g\n" );
728        setRouter( "Asus WL-300g / WL-500g" );
729        return ROUTER_ASUS_WL500G;
730    }
731
732    if( boardnum == 44 && nvram_match( "boardtype", "bcm94710ap" ) )
733    {
734        cprintf( "router is Dell TrueMobile 2300\n" );
735        setRouter( "Dell TrueMobile 2300" );
736        return ROUTER_DELL_TRUEMOBILE_2300;
737    }
738#endif
739
740    if( boardnum == 100 && nvram_match( "boardtype", "bcm94710dev" ) )
741    {
742        cprintf( "router is buffalo\n" );
743        setRouter( "Buffalo WLA-G54C" );
744        return ROUTER_BUFFALO_WLAG54C;
745    }
746
747#ifndef HAVE_BUFFALO
748    if( boardnum == 45 && nvram_match( "boardtype", "bcm95365r" ) )
749    {
750        cprintf( "router is Asus WL-500GD\n" );
751        setRouter( "Asus WL-500g Deluxe" );
752        return ROUTER_ASUS_WL500GD;
753    }
754
755    if( boardnum == 45 && nvram_match( "boardtype", "0x0472" )
756        && nvram_match( "boardrev", "0x23" ) && nvram_match( "parkid", "1" ) )
757    {
758        cprintf( "router is Asus WL-500W\n" );
759        setRouter( "Asus WL-500W" );
760        return ROUTER_ASUS_WL500W;
761    }
762
763    if( boardnum == 45 && nvram_match( "boardtype", "0x467" ) )
764    {
765        cprintf( "router is Asus WL-550gE\n" );
766        setRouter( "Asus WL-550gE" );
767        return ROUTER_ASUS_WL550GE;
768    }
769#endif
770    if( nvram_match( "boardnum", "00" ) &&
771        nvram_match( "boardtype", "0x0101" )
772        && nvram_match( "boardrev", "0x10" ) )
773    {
774        cprintf( "router is Buffalo wbr2\n" );
775        setRouter( "Buffalo WBR2-G54 / WBR2-G54S" );
776        return ROUTER_BUFFALO_WBR2G54S;
777    }
778
779    if( boardnum == 2 &&
780        nvram_match( "boardtype", "0x0101" )
781        && nvram_match( "boardrev", "0x10" ) )
782    {
783        cprintf( "router is buffalo wla2-g54c\n" );
784        setRouter( "Buffalo WLA2-G54C / WLI3-TX1-G54" );
785        return ROUTER_BUFFALO_WLA2G54C;
786    }
787    if( boardnum == 0 && nvram_match( "melco_id", "29090" )
788        && nvram_match( "boardflags", "0x0010" )
789        && nvram_match( "boardrev", "0x10" ) )
790    {
791        cprintf( "router is Buffalo WLAH-G54\n" );
792        setRouter( "Buffalo WLAH-G54" );
793        return ROUTER_BUFFALO_WLAH_G54;
794
795    }
796    if( boardnum == 0 && nvram_match( "melco_id", "31070" )
797        && nvram_match( "boardflags", "0x2288" )
798        && nvram_match( "boardrev", "0x10" ) )
799    {
800        cprintf( "router is Buffalo WAPM-HP-AM54G54\n" );
801        setRouter( "Buffalo WAPM-HP-AM54G54" );
802        return ROUTER_BUFFALO_WAPM_HP_AM54G54;
803    }
804    if( nvram_match( "boardnum", "00" ) && nvram_match( "boardrev", "0x11" )
805        && nvram_match( "boardtype", "0x048e" )
806        && nvram_match( "melco_id", "32093" ) )
807    {
808        cprintf( "router is Buffalo WHR-G125\n" );
809        setRouter( "Buffalo WHR-G125" );
810        return ROUTER_BUFFALO_WHRG54S;
811    }
812
813    if( nvram_match( "boardnum", "00" ) &&
814        nvram_match( "boardrev", "0x13" )
815        && nvram_match( "boardtype", "0x467" ) )
816    {
817        if( nvram_match( "boardflags", "0x1658" )
818            || nvram_match( "boardflags", "0x2658" )
819            || nvram_match( "boardflags", "0x3658" ) )
820        {
821            cprintf( "router is Buffalo WLI-TX4-G54HP\n" );
822            setRouter( "Buffalo WLI-TX4-G54HP" );
823            return ROUTER_BUFFALO_WLI_TX4_G54HP;
824        }
825        if( !nvram_match( "buffalo_hp", "1" )
826            && nvram_match( "boardflags", "0x2758" ) )
827        {
828            cprintf( "router is Buffalo WHR-G54S\n" );
829            setRouter( "Buffalo WHR-G54S" );
830            return ROUTER_BUFFALO_WHRG54S;
831        }
832        if( nvram_match( "buffalo_hp", "1" )
833            || nvram_match( "boardflags", "0x1758" ) )
834        {
835#ifndef HAVE_BUFFALO
836            cprintf( "router is Buffalo WHR-HP-G54\n" );
837            setRouter( "Buffalo WHR-HP-G54" );
838#else
839            cprintf( "router is Buffalo WHR-HP-G54DD\n" );
840#ifdef BUFFALO_JP
841            setRouter( "Buffalo AS-A100" );
842#else
843            setRouter( "Buffalo WHR-HP-G54DD" );
844#endif
845#endif
846            return ROUTER_BUFFALO_WHRG54S;
847        }
848    }
849
850    if( nvram_match( "boardnum", "00" ) &&
851        nvram_match( "boardrev", "0x10" )
852        && nvram_match( "boardtype", "0x470" ) )
853    {
854        cprintf( "router is Buffalo WHR-AM54G54\n" );
855        setRouter( "Buffalo WHR-AM54G54" );
856        return ROUTER_BUFFALO_WHRAM54G54;
857    }
858
859    if( boardnum == 42 && nvram_match( "boardtype", "0x042f" ) )
860    {
861        uint melco_id = strtoul( nvram_safe_get( "melco_id" ), NULL, 0 );
862
863        if( nvram_match( "product_name", "WZR-RS-G54" ) || melco_id == 30083 )
864        {
865            cprintf( "router is Buffalo WZR-RS-G54\n" );
866            setRouter( "Buffalo WZR-RS-G54" );
867            return ROUTER_BUFFALO_WZRRSG54;
868        }
869        if( nvram_match( "product_name", "WZR-HP-G54" ) || melco_id == 30026 )
870        {
871            cprintf( "router is Buffalo WZR-HP-G54\n" );
872            setRouter( "Buffalo WZR-HP-G54" );
873            return ROUTER_BUFFALO_WZRRSG54;
874        }
875        if( nvram_match( "product_name", "WZR-G54" ) || melco_id == 30061 )
876        {
877            cprintf( "router is Buffalo WZR-G54\n" );
878            setRouter( "Buffalo WZR-G54" );
879            return ROUTER_BUFFALO_WZRRSG54;
880        }
881        if( nvram_match( "melco_id", "290441dd" ) )
882        {
883            cprintf( "router is Buffalo WHR2-A54G54\n" );
884            setRouter( "Buffalo WHR2-A54G54" );
885            return ROUTER_BUFFALO_WZRRSG54;
886        }
887        if( nvram_match( "product_name", "WHR3-AG54" )
888            || nvram_match( "product_name", "WHR3-B11" )
889            || melco_id == 29130 )
890        {
891            cprintf( "router is Buffalo WHR3-AG54\n" );
892            setRouter( "Buffalo WHR3-AG54" );
893            return ROUTER_BUFFALO_WZRRSG54;
894        }
895        if( nvram_match( "product_name", "WVR-G54-NF" ) || melco_id == 28100 )
896        {
897            cprintf( "router is Buffalo WVR-G54-NF\n" );
898            setRouter( "Buffalo WVR-G54-NF" );
899            return ROUTER_BUFFALO_WZRRSG54;
900        }
901        if( melco_id > 0 )      // e.g. 29115
902        {
903            cprintf( "router is Buffalo WZR series\n" );
904            setRouter( "Buffalo WZR series" );
905            return ROUTER_BUFFALO_WZRRSG54;
906        }
907    }
908
909#ifndef HAVE_BUFFALO
910    if( boardnum == 42 &&
911        nvram_match( "boardtype", "0x042f" )
912        && nvram_match( "boardrev", "0x10" ) )
913        // nvram_match ("boardflags","0x0018"))
914    {
915        cprintf( "router is Linksys WRTSL54GS\n" );
916        setRouter( "Linksys WRTSL54GS" );
917        return ROUTER_WRTSL54GS;
918    }
919
920    if( boardnum == 42 && nvram_match( "boardtype", "0x0101" )
921        && nvram_match( "boardrev", "0x10" )
922        && nvram_match( "boot_ver", "v3.6" ) )
923    {
924        cprintf( "router is Linksys WRT54G3G\n" );
925        setRouter( "Linksys WRT54G3G" );
926        return ROUTER_WRT54G3G;
927    }
928
929    if( boardnum == 45 &&
930        nvram_match( "boardtype", "0x042f" )
931        && nvram_match( "boardrev", "0x10" ) )
932    {
933        cprintf( "router is Asus WL-500g Premium\n" );
934        setRouter( "Asus WL-500g Premium" );
935        return ROUTER_ASUS_WL500G_PRE;
936    }
937
938    char *et0 = nvram_safe_get( "et0macaddr" );
939
940    if( boardnum == 100 && nvram_match( "boardtype", "bcm94710r4" ) )
941    {
942        if( startswith( et0, "00:11:50" ) )
943        {
944            cprintf( "router is Belkin F5D7130 / F5D7330\n" );
945            setRouter( "Belkin F5D7130 / F5D7330" );
946            return ROUTER_RT210W;
947        }
948        if( startswith( et0, "00:30:BD" ) || startswith( et0, "00:30:bd" ) )
949        {
950            cprintf( "router is Belkin F5D7230 v1000\n" );
951            setRouter( "Belkin F5D7230-4 v1000" );
952            return ROUTER_RT210W;
953        }
954        if( startswith( et0, "00:01:E3" ) ||
955            startswith( et0, "00:01:e3" ) || startswith( et0, "00:90:96" ) )
956        {
957            cprintf( "router is Siemens\n" );
958            setRouter( "Siemens SE505 v1" );
959            return ROUTER_RT210W;
960        }
961        else
962        {
963            cprintf( "router is Askey generic\n" );
964            setRouter( "RT210W generic" );
965            return ROUTER_RT210W;
966        }
967    }
968
969    if( nvram_match( "boardtype", "bcm94710r4" )
970        && nvram_match( "boardnum", "" ) )
971    {
972        cprintf( "router is Askey board RT2100W\n" );
973        setRouter( "Askey board RT2100W-D65)" );
974        return ROUTER_BRCM4702_GENERIC;
975    }
976
977    if( boardnum == 0 && nvram_match( "boardtype", "0x0100" )
978        && nvram_match( "boardrev", "0x10" ) )
979    {
980        cprintf( "router is Askey board RT2205(6)D-D56\n" );
981        if( startswith( et0, "00:11:50" ) ||
982            startswith( et0, "00:30:BD" ) || startswith( et0, "00:30:bd" ) )
983        {
984            setRouter( "Askey board RT2205(6)D-D56" );
985        }
986        else
987        {
988            setRouter( "Belkin board F5D8230" );
989        }
990        return ROUTER_ASKEY_RT220XD;
991    }
992
993    if( nvram_match( "boardtype", "0x0101" ) )
994    {
995        if( startswith( et0, "00:11:50" ) ||
996            startswith( et0, "00:30:BD" ) || startswith( et0, "00:30:bd" ) )
997        {
998            if( nvram_match( "Belkin_ver", "2000" ) )
999            {
1000                cprintf( "router is Belkin F5D7230-4 v2000\n" );
1001                setRouter( "Belkin F5D7230-4 v2000" );
1002                return ROUTER_BELKIN_F5D7230_V2000;
1003            }
1004            else
1005            {
1006                cprintf( "router is Belkin F5D7230-4 v1444\n" );
1007                setRouter( "Belkin F5D7230-4 v1444" );
1008                return ROUTER_RT480W;
1009            }
1010        }
1011        if( startswith( et0, "00:01:E3" ) ||
1012            startswith( et0, "00:01:e3" ) || startswith( et0, "00:90:96" ) )
1013        {
1014            cprintf( "router is Siemens / Askey\n" );
1015            setRouter( "Siemens SE505 v2" );
1016            return ROUTER_RT480W;
1017        }
1018    }
1019    if( boardnum == 1 && nvram_match( "boardtype", "0x456" )
1020        && nvram_match( "test_led_gpio", "2" ) )
1021    {
1022        cprintf( "router is Belkin F5D7230-4 v3000\n" );
1023        setRouter( "Belkin F5D7230-4 v3000" );
1024        return ROUTER_BELKIN_F5D7230_V3000;
1025    }
1026
1027    if( nvram_match( "boardtype", "0x456" )
1028        && nvram_match( "hw_model", "F5D7231-4" ) )
1029    {
1030        cprintf( "router is Belkin F5D7231-4 v1212UK\n" );
1031        setRouter( "Belkin F5D7231-4 v1212UK" );
1032        return ROUTER_BELKIN_F5D7231;
1033    }
1034
1035    if( boardnum == 8 && nvram_match( "boardtype", "0x0467" ) ) // fccid:
1036        // K7SF5D7231B
1037    {
1038        cprintf( "router is Belkin F5D7231-4 v2000\n" );
1039        setRouter( "Belkin F5D7231-4 v2000" );
1040        return ROUTER_BELKIN_F5D7231;
1041    }
1042
1043    if( nvram_match( "boardtype", "0x467" ) )
1044    {
1045        if( startswith( et0, "00:11:50" ) ||
1046            startswith( et0, "00:30:BD" ) || startswith( et0, "00:30:bd" ) )
1047        {
1048            cprintf( "router is Belkin F5D7231-4 v2000\n" );
1049            setRouter( "Belkin F5D7231-4 v2000" );
1050            return ROUTER_BELKIN_F5D7231;
1051        }
1052    }
1053#endif
1054    if( boardnum == 2 && nvram_match( "boardtype", "bcm94710dev" ) && nvram_match( "melco_id", "29016" ) )      // Buffalo
1055        // WLI2-TX1-G54)
1056    {
1057        cprintf( "router is Buffalo WLI2-TX1-G54\n" );
1058        setRouter( "Buffalo WLI2-TX1-G54" );
1059        return ROUTER_BUFFALO_WLI2_TX1_G54;
1060    }
1061#ifndef HAVE_BUFFALO
1062
1063    char *gemtek = nvram_safe_get( "GemtekPmonVer" );
1064    uint gemteknum = strtoul( gemtek, NULL, 0 );
1065
1066    if( boardnum == 2 && gemteknum == 10 &&
1067        ( startswith( et0, "00:0C:E5" ) ||
1068          startswith( et0, "00:0c:e5" ) ||
1069          startswith( et0, "00:0C:10" ) ||
1070          startswith( et0, "00:0c:10" ) ||
1071          startswith( et0, "00:0C:11" ) || startswith( et0, "00:0c:11" ) ) )
1072    {
1073        cprintf( "router Motorola WE800G v1\n" );
1074        setRouter( "Motorola WE800G v1" );
1075        return ROUTER_MOTOROLA_WE800G;
1076    }
1077
1078    if( boardnum == 2
1079        && ( startswith( gemtek, "RC" ) || gemteknum == 1
1080             || gemteknum == 10 ) )
1081    {
1082        cprintf( "router is Linksys wap54g v1.x\n" );
1083        setRouter( "Linksys WAP54G v1.x" );
1084        return ROUTER_WAP54G_V1;
1085    }
1086
1087    if( boardnum == 2 && gemteknum == 1 )
1088    {
1089        cprintf( "router is Sitecom wl-105b\n" );
1090        setRouter( "Sitecom WL-105(b)" );
1091        return ROUTER_SITECOM_WL105B;
1092    }
1093
1094    if( boardnum == 2 && gemteknum == 7
1095        && nvram_match( "boardtype", "bcm94710dev" ) )
1096    {
1097        cprintf( "router is Sitecom wl-111\n" );
1098        setRouter( "Sitecom WL-111" );
1099        return ROUTER_SITECOM_WL111;
1100    }
1101
1102    if( gemteknum == 9 )        // Must be Motorola wr850g v1 or we800g v1 or
1103        // Linksys wrt55ag v1
1104    {
1105        if( startswith( et0, "00:0C:E5" ) ||
1106            startswith( et0, "00:0c:e5" ) ||
1107            startswith( et0, "00:0C:10" ) ||
1108            startswith( et0, "00:0c:10" ) ||
1109            startswith( et0, "00:0C:11" ) ||
1110            startswith( et0, "00:0c:11" ) ||
1111            startswith( et0, "00:11:22" ) ||
1112            startswith( et0, "00:0C:90" ) || startswith( et0, "00:0c:90" ) )
1113        {
1114            if( !strlen( nvram_safe_get( "phyid_num" ) ) )
1115            {
1116                insmod( "switch-core" );        // get phy type
1117                insmod( "switch-robo" );
1118                rmmod( "switch-robo" );
1119                rmmod( "switch-core" );
1120                nvram_set( "boardnum", "2" );
1121                nvram_set( "boardtype", "bcm94710dev" );
1122            }
1123            if( nvram_match( "phyid_num", "0x00000000" ) )
1124            {
1125                cprintf( "router Motorola WE800G v1\n" );
1126                setRouter( "Motorola WE800G v1" );
1127                return ROUTER_MOTOROLA_WE800G;
1128            }
1129            else                // phyid_num == 0xffffffff
1130            {
1131                cprintf( "router Motorola WR850G v1\n" );
1132                setRouter( "Motorola WR850G v1" );
1133                return ROUTER_MOTOROLA_V1;
1134            }
1135        }
1136        else
1137        {
1138            cprintf( "router is linksys WRT55AG\n" );
1139            setRouter( "Linksys WRT55AG v1" );
1140            return ROUTER_LINKSYS_WRT55AG;
1141        }
1142    }
1143#endif
1144    if( boardnum == 0 && nvram_match( "boardtype", "0x478" )
1145        && nvram_match( "cardbus", "0" ) && nvram_match( "boardrev", "0x10" )
1146        && nvram_match( "boardflags", "0x110" )
1147        && nvram_match( "melco_id", "32027" ) )
1148    {
1149        setRouter( "Buffalo WZR-G144NH" );
1150        return ROUTER_BUFFALO_WZRG144NH;
1151    }
1152
1153    if( boardnum == 20060330 && nvram_match( "boardtype", "0x0472" ) )
1154    {
1155        setRouter( "Buffalo WZR-G300N" );
1156        return ROUTER_BUFFALO_WZRG300N;
1157    }
1158#ifndef HAVE_BUFFALO
1159
1160    if( boardnum == 8 &&
1161        nvram_match( "boardtype", "0x0472" )
1162        && nvram_match( "cardbus", "1" ) )
1163    {
1164        cprintf( "router is Netgear WNR834B\n" );
1165        setRouter( "Netgear WNR834B" );
1166        return ROUTER_NETGEAR_WNR834B;
1167    }
1168
1169    if( boardnum == 1 &&
1170        nvram_match( "boardtype", "0x0472" )
1171        && nvram_match( "cardbus", "1" ) )
1172    {
1173        cprintf( "router is Netgear WNR834B v2\n" );
1174        setRouter( "Netgear WNR834B v2" );
1175        return ROUTER_NETGEAR_WNR834BV2;
1176    }
1177
1178    if( boardnum == 1 &&
1179        nvram_match( "boardtype", "0x0472" )
1180        && nvram_match( "boardrev", "0x23" ) )
1181    {
1182        cprintf( "router is Netgear WNDR-3300\n" );
1183        setRouter( "Netgear WNDR3300" );
1184        return ROUTER_NETGEAR_WNDR3300;
1185    }
1186
1187    if( boardnum == 42 )        // Get Linksys N models
1188    {
1189        if( nvram_match( "boot_hw_model", "WRT300N" )
1190            && nvram_match( "boot_hw_ver", "1.1" ) )
1191        {
1192            setRouter( "Linksys WRT300N v1.1" );
1193            return ROUTER_WRT300NV11;
1194        }
1195        else if( nvram_match( "boot_hw_model", "WRT150N" )
1196                 && nvram_match( "boot_hw_ver", "1" ) )
1197        {
1198            setRouter( "Linksys WRT150N v1" );
1199            return ROUTER_WRT150N;
1200        }
1201        else if( nvram_match( "boot_hw_model", "WRT150N" )
1202                 && nvram_match( "boot_hw_ver", "1.1" ) )
1203        {
1204            setRouter( "Linksys WRT150N v1.1" );
1205            // return ROUTER_WRT150NV11;
1206            return ROUTER_WRT150N;
1207        }
1208        else if( nvram_match( "boot_hw_model", "WRT150N" )
1209                 && nvram_match( "boot_hw_ver", "1.2" ) )
1210        {
1211            setRouter( "Linksys WRT150N v1.2" );
1212            // return ROUTER_WRT150NV12;
1213            return ROUTER_WRT150N;
1214        }
1215        else if( nvram_match( "boot_hw_model", "WRT160N" )
1216                 && nvram_match( "boot_hw_ver", "1.0" ) )
1217        {
1218            setRouter( "Linksys WRT160N" );
1219            return ROUTER_WRT160N;
1220        }
1221        else if( nvram_match( "boot_hw_model", "WRT310N" )
1222                 && nvram_match( "boot_hw_ver", "1.0" ) )
1223        {
1224            setRouter( "Linksys WRT310N" );
1225            return ROUTER_WRT310N;
1226        }
1227    }
1228
1229    if( boardnum == 42 &&
1230        nvram_match( "boardtype", "0x0472" )
1231        && nvram_match( "cardbus", "1" ) )
1232    {
1233        setRouter( "Linksys WRT300N v1" );
1234        return ROUTER_WRT300N;
1235    }
1236
1237    if( boardnum == 42 &&
1238        nvram_match( "boardtype", "0x478" ) && nvram_match( "cardbus", "1" ) )
1239    {
1240        cprintf( "router is Linksys WRT350N\n" );
1241        setRouter( "Linksys WRT350N" );
1242        return ROUTER_WRT350N;
1243    }
1244
1245    if( nvram_match( "boardnum", "20070615" ) &&
1246        nvram_match( "boardtype", "0x478" ) && nvram_match( "cardbus", "0" )
1247        && nvram_match( "switch_type", "BCM5395" ) )
1248    {
1249        cprintf( "router is Linksys WRT600N v1.1\n" );
1250        setRouter( "Linksys WRT600N v1.1" );
1251        return ROUTER_WRT600N;
1252    }
1253
1254    if( nvram_match( "boardnum", "20070615" ) &&
1255        nvram_match( "boardtype", "0x478" ) && nvram_match( "cardbus", "0" ) )
1256    {
1257        cprintf( "router is Linksys WRT600N\n" );
1258        setRouter( "Linksys WRT600N" );
1259        return ROUTER_WRT600N;
1260    }
1261
1262    if( nvram_match( "boardtype", "0x478" )
1263        && nvram_match( "boot_hw_model", "WRT610N" ) )
1264    {
1265        cprintf( "router is Linksys WRT610N\n" );
1266        setRouter( "Linksys WRT610N" );
1267        return ROUTER_WRT610N;
1268    }
1269
1270    if( boardnum == 42 && nvram_match( "boardtype", "bcm94710dev" ) )
1271    {
1272        cprintf( "router is Linksys WRT54G v1.x\n" );
1273        setRouter( "Linksys WRT54G v1.x" );
1274        return ROUTER_WRT54G1X;
1275    }
1276
1277    if( ( boardnum == 1 || boardnum == 0 )
1278        && nvram_match( "boardtype", "0x0446" ) )
1279    {
1280        cprintf( "router is U.S. Robotics USR5430\n" );
1281        setRouter( "U.S.Robotics USR5430" );
1282        return ROUTER_USR_5430;
1283    }
1284
1285    if( boardnum == 1 && nvram_match( "boardtype", "0x456" )
1286        && nvram_match( "test_led_gpio", "0" ) )
1287    {
1288        cprintf( "router is Netgear WG602 v3\n" );
1289        setRouter( "Netgear WG602 v3" );
1290        return ROUTER_NETGEAR_WG602_V3;
1291    }
1292
1293    if( boardnum == 10496 && nvram_match( "boardtype", "0x456" ) )
1294    {
1295        cprintf( "router is U.S. Robotics USR5461\n" );
1296        setRouter( "U.S.Robotics USR5461" );
1297        return ROUTER_USR_5461;
1298    }
1299
1300    if( boardnum == 10500 && nvram_match( "boardtype", "0x456" ) )
1301    {
1302        cprintf( "router is U.S. Robotics USR5432\n" );
1303        setRouter( "U.S.Robotics USR5432" );
1304        return ROUTER_USR_5461; // should work in the same way
1305    }
1306
1307    if( boardnum == 10506 && nvram_match( "boardtype", "0x456" ) )
1308    {
1309        cprintf( "router is U.S. Robotics USR5451\n" );
1310        setRouter( "U.S.Robotics USR5451" );
1311        return ROUTER_USR_5461; // should work in the same way
1312    }
1313
1314    if( boardnum == 1024 && nvram_match( "boardtype", "0x0446" ) )
1315    {
1316        char *cfe = nvram_safe_get( "cfe_version" );
1317
1318        if( strstr( cfe, "iewsonic" ) )
1319        {
1320            cprintf( "router is Viewsonic WAPBR-100\n" );
1321            setRouter( "Viewsonic WAPBR-100" );
1322            return ROUTER_VIEWSONIC_WAPBR_100;
1323        }
1324        else
1325        {
1326            cprintf( "router is Linksys WAP54G v2\n" );
1327            setRouter( "Linksys WAP54G v2" );
1328            return ROUTER_WAP54G_V2;
1329        }
1330    }
1331
1332    if( nvram_invmatch( "CFEver", "" ) )
1333    {
1334        char *cfe = nvram_safe_get( "CFEver" );
1335
1336        if( !strncmp( cfe, "MotoWR", 6 ) )
1337        {
1338            cprintf( "router is motorola\n" );
1339            setRouter( "Motorola WR850G v2/v3" );
1340            return ROUTER_MOTOROLA;
1341        }
1342    }
1343
1344    if( boardnum == 44 &&
1345        ( nvram_match( "boardtype", "0x0101" )
1346          || nvram_match( "boardtype", "0x0101\r" ) ) )
1347    {
1348        char *cfe = nvram_safe_get( "CFEver" );
1349
1350        if( !strncmp( cfe, "GW_WR110G", 9 ) )
1351        {
1352            cprintf( "router is Sparklan WX-6615GT\n" );
1353            setRouter( "Sparklan WX-6615GT" );
1354            return ROUTER_DELL_TRUEMOBILE_2300_V2;
1355        }
1356        else
1357        {
1358            cprintf( "router is Dell TrueMobile 2300 v2\n" );
1359            setRouter( "Dell TrueMobile 2300 v2" );
1360            return ROUTER_DELL_TRUEMOBILE_2300_V2;
1361        }
1362    }
1363#endif
1364    if( nvram_match( "boardtype", "bcm94710ap" ) )
1365    {
1366        cprintf( "router is Buffalo old 4710\n" );
1367        setRouter( "Buffalo WBR-B11" );
1368        return ROUTER_BUFFALO_WBR54G;
1369    }
1370#ifndef HAVE_BUFFALO
1371    if( nvram_match( "boardtype", "0x048e" ) &&
1372        nvram_match( "boardrev", "0x35" ) &&
1373        nvram_match( "sdram_init", "0x000b" ) )
1374    {
1375        cprintf( "router is D-Link DIR-320\n" );
1376        setRouter( "D-Link DIR-320" );
1377        // apply some fixes
1378        if( nvram_get( "vlan2ports" ) != NULL )
1379        {
1380            nvram_unset( "vlan2ports" );
1381            nvram_unset( "vlan2hwname" );
1382        }
1383        return ROUTER_DLINK_DIR320;
1384    }
1385    if( nvram_match( "model_name", "DIR-330" ) &&
1386        nvram_match( "boardrev", "0x10" ) )
1387    {
1388        cprintf( "router is D-Link DIR-330\n" );
1389        setRouter( "D-Link DIR-330" );
1390        nvram_set( "wan_ifnames", "eth0" );     // quirk
1391        nvram_set( "wan_ifname", "eth0" );
1392        if( nvram_match( "et0macaddr", "00:90:4c:4e:00:0c" ) )
1393        {
1394            FILE *in = fopen( "/dev/mtdblock/1", "rb" );
1395
1396            fseek( in, 0x7a0022, SEEK_SET );
1397            char mac[32];
1398
1399            fread( mac, 32, 1, in );
1400            fclose( in );
1401            mac[17] = 0;
1402            if( sv_valid_hwaddr( mac ) )
1403            {
1404                nvram_set( "et0macaddr", mac );
1405                fprintf( stderr, "restore D-Link MAC\n" );
1406                nvram_commit(  );
1407                sys_reboot(  );
1408            }
1409        }
1410        /*
1411         * if (nvram_get("vlan2ports")!=NULL) { nvram_unset("vlan2ports");
1412         * nvram_unset("vlan2hwname"); }
1413         */
1414        return ROUTER_DLINK_DIR330;
1415    }
1416    if( boardnum == 42 &&
1417        nvram_match( "boardtype", "0x048e" )
1418        && nvram_match( "boardrev", "0x10" ) )
1419    {
1420        cprintf( "router is wrt54g v8\n" );
1421        setRouter( "Linksys WRT54Gv8 / GSv7" );
1422        return ROUTER_WRT54G_V8;
1423    }
1424
1425    if( boardnum == 8 &&
1426        nvram_match( "boardtype", "0x048e" )
1427        && nvram_match( "boardrev", "0x11" ) )
1428    {
1429        cprintf( "router is ALLNET01\n" );
1430        setRouter( "ALLNET01" );
1431        return ROUTER_ALLNET01;
1432    }
1433
1434    if( boardnum == 1 &&
1435        nvram_match( "boardtype", "0x048e" )
1436        && nvram_match( "boardrev", "0x11" ) )
1437    {
1438        cprintf( "router is Netgear WG602 v4\n" );
1439        setRouter( "Netgear WG602 v4" );
1440        return ROUTER_NETGEAR_WG602_V4;
1441    }
1442
1443    if( boardnum == 1 &&
1444        nvram_match( "boardtype", "0x048e" )
1445        && nvram_match( "boardrev", "0x35" )
1446        && nvram_match( "parefldovoltage", "0x28" ) )
1447    {
1448        cprintf( "router is netcore nw618\n" );
1449        setRouter( "NetCore NW618" );
1450        return ROUTER_WRT54G;
1451    }
1452
1453    if( boardnum == 42 &&
1454        nvram_match( "boardtype", "0x048E" )
1455        && nvram_match( "boardrev", "0x10" ) )
1456    {
1457        cprintf( "router is Linksys WRH54G\n" );
1458        setRouter( "Linksys WRH54G" );
1459        return ROUTER_LINKSYS_WRH54G;
1460    }
1461
1462    if( nvram_match( "boardnum", "00" ) &&
1463        nvram_match( "boardtype", "0x048E" )
1464        && nvram_match( "boardrev", "0x10" ) )
1465    {
1466        cprintf( "router is Linksys WRT54G v8.1\n" );
1467        setRouter( "Linksys WRT54G v8.1" );
1468        return ROUTER_WRT54G_V81;
1469    }
1470
1471    if( boardnum == 45 && nvram_match( "boardtype", "0x456" ) )
1472    {
1473        cprintf( "router is Asus WL-520G\n" );
1474        setRouter( "Asus WL-520G" );
1475        return ROUTER_ASUS_WL520G;
1476    }
1477
1478    if( boardnum == 45 &&
1479        nvram_match( "boardtype", "0x48E" )
1480        && nvram_match( "boardrev", "0x10" ) )
1481    {
1482        char *hwver = nvram_safe_get( "hardware_version" );
1483
1484        if( startswith( hwver, "WL500GPV2" ) )
1485        {
1486            cprintf( "router is Asus WL-500G Premium V2\n" );
1487            setRouter( "Asus WL-500G Premium V2" );
1488            return ROUTER_ASUS_WL500G_PRE_V2;
1489        }
1490        else
1491        {
1492            cprintf( "router is Asus WL-520GU/GC\n" );
1493            setRouter( "Asus WL-520GU/GC" );
1494            return ROUTER_ASUS_WL520GUGC;
1495        }
1496    }
1497
1498    if( ( boardnum == 83258 || nvram_match( "boardnum", "0x01" ) ) &&
1499        nvram_match( "boardtype", "0x48E" )
1500        && nvram_match( "boardrev", "0x10" ) )
1501    {
1502        cprintf( "router is Netgear WGR614v8/v9/L\n" );
1503        setRouter( "Netgear WGR614v8/v9/L" );
1504        return ROUTER_NETGEAR_WGR614L;
1505    }
1506
1507    if( boardnum == 56 &&
1508        nvram_match( "boardtype", "0x456" )
1509        && nvram_match( "boardrev", "0x10" ) )
1510    {
1511        cprintf( "router is wtr54gs\n" );
1512        setRouter( "Linksys WTR54GS" );
1513        return ROUTER_LINKSYS_WTR54GS;
1514    }
1515
1516    if( nvram_match( "boardnum", "WAP54GV3_8M_0614" )
1517        && ( nvram_match( "boardtype", "0x0467" )
1518             || nvram_match( "boardtype", "0x467" ) )
1519        && nvram_match( "WAPver", "3" ) )
1520    {
1521        cprintf( "router is WAP54G v3.x\n" );
1522        setRouter( "Linksys WAP54G v3.x" );
1523        return ROUTER_WAP54G_V3;
1524    }
1525
1526    setRouter( "Linksys WRT54G/GL/GS" );
1527    cprintf( "router is wrt54g\n" );
1528    return ROUTER_WRT54G;
1529#else
1530    eval( "event", "3", "1", "15" );
1531    return 0;
1532#endif
1533#endif
1534
1535}
1536static int router_type = -1;
1537int getRouterBrand(  )
1538{
1539    if( router_type == -1 )
1540        router_type = internal_getRouterBrand(  );
1541    return router_type;
1542}
1543
1544int get_ppp_pid( char *file )
1545{
1546    char buf[80];
1547    int pid = -1;
1548
1549    if( file_to_buf( file, buf, sizeof( buf ) ) )
1550    {
1551        char tmp[80], tmp1[80];
1552
1553        snprintf( tmp, sizeof( tmp ), "/var/run/%s.pid", buf );
1554        file_to_buf( tmp, tmp1, sizeof( tmp1 ) );
1555        pid = atoi( tmp1 );
1556    }
1557    return pid;
1558}
1559
1560int check_wan_link( int num )
1561{
1562    int wan_link = 0;
1563
1564    if( nvram_match( "wan_proto", "pptp" )
1565        || nvram_match( "wan_proto", "l2tp" )
1566        || nvram_match( "wan_proto", "pppoe" )
1567        || nvram_match( "wan_proto", "heartbeat" ) )
1568    {
1569        FILE *fp;
1570        char filename[80];
1571        char *name;
1572
1573        if( num == 0 )
1574            strcpy( filename, "/tmp/ppp/link" );
1575        if( ( fp = fopen( filename, "r" ) ) )
1576        {
1577            int pid = -1;
1578
1579            fclose( fp );
1580            if( nvram_match( "wan_proto", "heartbeat" ) )
1581            {
1582                char buf[20];
1583
1584                file_to_buf( "/tmp/ppp/link", buf, sizeof( buf ) );
1585                pid = atoi( buf );
1586            }
1587            else
1588                pid = get_ppp_pid( filename );
1589
1590            name = find_name_by_proc( pid );
1591            if( !strncmp( name, "pppoecd", 7 ) ||       // for PPPoE
1592                !strncmp( name, "pppd", 4 ) ||  // for PPTP
1593                !strncmp( name, "bpalogin", 8 ) )       // for HeartBeat
1594                wan_link = 1;   // connect
1595            else
1596            {
1597                printf( "The %s had been died, remove %s\n",
1598                        nvram_safe_get( "wan_proto" ), filename );
1599                wan_link = 0;   // For some reason, the pppoed had been died,
1600                // by link file still exist.
1601                unlink( filename );
1602            }
1603        }
1604    }
1605    else
1606    {
1607        if( nvram_invmatch( "wan_ipaddr", "0.0.0.0" ) )
1608            wan_link = 1;
1609    }
1610
1611    return wan_link;
1612}
1613
1614/*
1615 * Find process name by pid from /proc directory
1616 */
1617char *find_name_by_proc( int pid )
1618{
1619    FILE *fp;
1620    char line[254];
1621    char filename[80];
1622    static char name[80];
1623
1624    snprintf( filename, sizeof( filename ), "/proc/%d/status", pid );
1625
1626    if( ( fp = fopen( filename, "r" ) ) )
1627    {
1628        fgets( line, sizeof( line ), fp );
1629        /*
1630         * Buffer should contain a string like "Name: binary_name"
1631         */
1632        sscanf( line, "%*s %s", name );
1633        fclose( fp );
1634        return name;
1635    }
1636
1637    return "";
1638}
1639
1640int diag_led_4702( int type, int act )
1641{
1642
1643#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA) || defined(HAVE_MERAKI) || defined(HAVE_LS2) || defined(HAVE_WHRAG108) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_TW6600) || defined(HAVE_PB42) || defined(HAVE_LS5) || defined(HAVE_FONERA) || defined(HAVE_LSX) || defined(HAVE_DANUBE) || defined(HAVE_STORM) || defined(HAVE_ADM5120)
1644    return 0;
1645#else
1646    if( act == START_LED )
1647    {
1648        switch ( type )
1649        {
1650            case DMZ:
1651                system2( "echo 1 > /proc/sys/diag" );
1652                break;
1653        }
1654    }
1655    else
1656    {
1657        switch ( type )
1658        {
1659            case DMZ:
1660                system2( "echo 0 > /proc/sys/diag" );
1661                break;
1662        }
1663    }
1664    return 0;
1665#endif
1666}
1667
1668int C_led_4702( int i )
1669{
1670#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA) || defined(HAVE_MERAKI) || defined(HAVE_LS2) || defined(HAVE_WHRAG108) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_TW6600) || defined(HAVE_PB42) || defined(HAVE_LS5) || defined(HAVE_LSX) || defined(HAVE_DANUBE) || defined(HAVE_STORM) || defined(HAVE_ADM5120)
1671    return 0;
1672#else
1673    FILE *fp;
1674    char string[10];
1675    int flg;
1676
1677    memset( string, 0, 10 );
1678    /*
1679     * get diag before set
1680     */
1681    if( ( fp = fopen( "/proc/sys/diag", "r" ) ) )
1682    {
1683        fgets( string, sizeof( string ), fp );
1684        fclose( fp );
1685    }
1686    else
1687        perror( "/proc/sys/diag" );
1688
1689    if( i )
1690        flg = atoi( string ) | 0x10;
1691    else
1692        flg = atoi( string ) & 0xef;
1693
1694    memset( string, 0, 10 );
1695    sprintf( string, "%d", flg );
1696    if( ( fp = fopen( "/proc/sys/diag", "w" ) ) )
1697    {
1698        fputs( string, fp );
1699        fclose( fp );
1700    }
1701    else
1702        perror( "/proc/sys/diag" );
1703
1704    return 0;
1705#endif
1706}
1707
1708unsigned int read_gpio( char *device )
1709{
1710    FILE *fp;
1711    unsigned int val;
1712
1713    if( ( fp = fopen( device, "r" ) ) )
1714    {
1715        fread( &val, 4, 1, fp );
1716        fclose( fp );
1717        // fprintf(stderr, "----- gpio %s = [%X]\n",device,val);
1718        return val;
1719    }
1720    else
1721    {
1722        perror( device );
1723        return 0;
1724    }
1725}
1726
1727unsigned int write_gpio( char *device, unsigned int val )
1728{
1729    FILE *fp;
1730
1731    if( ( fp = fopen( device, "w" ) ) )
1732    {
1733        fwrite( &val, 4, 1, fp );
1734        fclose( fp );
1735        // fprintf(stderr, "----- set gpio %s = [%X]\n",device,val);
1736        return 1;
1737    }
1738    else
1739    {
1740        perror( device );
1741        return 0;
1742    }
1743}
1744
1745static char hw_error = 0;
1746int diag_led_4704( int type, int act )
1747{
1748#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA) || defined(HAVE_MERAKI)|| defined(HAVE_LS2) || defined(HAVE_WHRAG108) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_TW6600) || defined(HAVE_PB42) || defined(HAVE_LS5) || defined(HAVE_LSX) || defined(HAVE_DANUBE) || defined(HAVE_STORM) || defined(HAVE_ADM5120)
1749    return 0;
1750#else
1751    unsigned int control, in, outen, out;
1752
1753#ifdef BCM94712AGR
1754    /*
1755     * The router will crash, if we load the code into broadcom demo board.
1756     */
1757    return 1;
1758#endif
1759    // int brand;
1760    control = read_gpio( "/dev/gpio/control" );
1761    in = read_gpio( "/dev/gpio/in" );
1762    out = read_gpio( "/dev/gpio/out" );
1763    outen = read_gpio( "/dev/gpio/outen" );
1764
1765    write_gpio( "/dev/gpio/outen", ( outen & 0x7c ) | 0x83 );
1766    switch ( type )
1767    {
1768        case DIAG:              // GPIO 1
1769            if( hw_error )
1770            {
1771                write_gpio( "/dev/gpio/out", ( out & 0x7c ) | 0x00 );
1772                return 1;
1773            }
1774
1775            if( act == STOP_LED )
1776            {                   // stop blinking
1777                write_gpio( "/dev/gpio/out", ( out & 0x7c ) | 0x83 );
1778                // cprintf("tallest:=====( DIAG STOP_LED !!)=====\n");
1779            }
1780            else if( act == START_LED )
1781            {                   // start blinking
1782                write_gpio( "/dev/gpio/out", ( out & 0x7c ) | 0x81 );
1783                // cprintf("tallest:=====( DIAG START_LED !!)=====\n");
1784            }
1785            else if( act == MALFUNCTION_LED )
1786            {                   // start blinking
1787                write_gpio( "/dev/gpio/out", ( out & 0x7c ) | 0x00 );
1788                hw_error = 1;
1789                // cprintf("tallest:=====( DIAG MALFUNCTION_LED !!)=====\n");
1790            }
1791            break;
1792
1793    }
1794    return 1;
1795#endif
1796}
1797
1798int diag_led_4712( int type, int act )
1799{
1800    unsigned int control, in, outen, out, ctr_mask, out_mask;
1801
1802#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA)|| defined(HAVE_MERAKI) || defined(HAVE_LS2) || defined(HAVE_WHRAG108) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_TW6600) || defined(HAVE_PB42) || defined(HAVE_LS5) || defined(HAVE_LSX) || defined(HAVE_DANUBE) || defined(HAVE_STORM) || defined(HAVE_ADM5120)
1803    return 0;
1804#else
1805
1806#ifdef BCM94712AGR
1807    /*
1808     * The router will crash, if we load the code into broadcom demo board.
1809     */
1810    return 1;
1811#endif
1812    control = read_gpio( "/dev/gpio/control" );
1813    in = read_gpio( "/dev/gpio/in" );
1814    out = read_gpio( "/dev/gpio/out" );
1815    outen = read_gpio( "/dev/gpio/outen" );
1816
1817    ctr_mask = ~( 1 << type );
1818    out_mask = ( 1 << type );
1819
1820    write_gpio( "/dev/gpio/control", control & ctr_mask );
1821    write_gpio( "/dev/gpio/outen", outen | out_mask );
1822
1823    if( act == STOP_LED )
1824    {                           // stop blinking
1825        // cprintf("%s: Stop GPIO %d\n", __FUNCTION__, type);
1826        write_gpio( "/dev/gpio/out", out | out_mask );
1827    }
1828    else if( act == START_LED )
1829    {                           // start blinking
1830        // cprintf("%s: Start GPIO %d\n", __FUNCTION__, type);
1831        write_gpio( "/dev/gpio/out", out & ctr_mask );
1832    }
1833
1834    return 1;
1835#endif
1836}
1837
1838int C_led_4712( int i )
1839{
1840    if( i == 1 )
1841        return diag_led( DIAG, START_LED );
1842    else
1843        return diag_led( DIAG, STOP_LED );
1844}
1845
1846int C_led( int i )
1847{
1848    // show_hw_type(check_hw_type());
1849    int brand = getRouterBrand(  );
1850
1851    if( brand == ROUTER_WRT54G1X || brand == ROUTER_LINKSYS_WRT55AG )
1852        return C_led_4702( i );
1853    else if( brand == ROUTER_WRT54G )
1854        return C_led_4712( i );
1855    else
1856        return 0;
1857}
1858
1859int diag_led( int type, int act )
1860{
1861    int brand = getRouterBrand(  );
1862
1863    if( brand == ROUTER_WRT54G || brand == ROUTER_WRT54G3G
1864        || brand == ROUTER_WRT300NV11 )
1865        return diag_led_4712( type, act );
1866    else if( brand == ROUTER_WRT54G1X || brand == ROUTER_LINKSYS_WRT55AG )
1867        return diag_led_4702( type, act );
1868    else if( ( brand == ROUTER_WRTSL54GS || brand == ROUTER_WRT350N
1869               || brand == ROUTER_WRT310N
1870               || brand == ROUTER_BUFFALO_WZRG144NH ) && type == DIAG )
1871        return diag_led_4704( type, act );
1872    else
1873    {
1874        if( type == DMZ )
1875        {
1876            if( act == START_LED )
1877                return led_control( LED_DMZ, LED_ON );
1878            if( act == STOP_LED )
1879                return led_control( LED_DMZ, LED_OFF );
1880            return 1;
1881        }
1882    }
1883    return 0;
1884}
1885
1886#ifdef HAVE_MADWIFI
1887static char *stalist[] = {
1888    "ath0", "ath1", "ath2", "ath3", "ath4", "ath5", "ath6", "ath8", "ath9"
1889};
1890char *getSTA( void )
1891{
1892
1893#ifdef HAVE_WAVESAT
1894    if( nvram_match( "ofdm_mode", "sta" ) )
1895        return "ofdm";
1896#endif
1897    int c = getifcount( "wifi" );
1898    int i;
1899
1900    for( i = 0; i < c; i++ )
1901    {
1902        char mode[32];
1903        char netmode[32];
1904
1905        sprintf( mode, "ath%d_mode", i );
1906        sprintf( netmode, "ath%d_net_mode", i );
1907        if( nvram_match( mode, "sta" )
1908            && !nvram_match( netmode, "disabled" ) )
1909        {
1910            return stalist[i];
1911        }
1912
1913    }
1914    return NULL;
1915}
1916
1917char *getWET( void )
1918{
1919#ifdef HAVE_WAVESAT
1920    if( nvram_match( "ofdm_mode", "bridge" ) )
1921        return "ofdm";
1922#endif
1923    int c = getifcount( "wifi" );
1924    int i;
1925
1926    for( i = 0; i < c; i++ )
1927    {
1928        char mode[32];
1929        char netmode[32];
1930
1931        sprintf( mode, "ath%d_mode", i );
1932        sprintf( netmode, "ath%d_net_mode", i );
1933        if( nvram_match( mode, "wet" )
1934            && !nvram_match( netmode, "disabled" ) )
1935        {
1936            return stalist[i];
1937        }
1938
1939    }
1940    return NULL;
1941}
1942#else
1943char *getSTA(  )
1944{
1945    int c = get_wl_instances(  );
1946    int i;
1947
1948    for( i = 0; i < c; i++ )
1949    {
1950        if( nvram_nmatch( "sta", "wl%d_mode", i )
1951            || nvram_nmatch( "apsta", "wl%d_mode", i ) )
1952        {
1953            if( !nvram_nmatch( "disabled", "wl%d_net_mode", i ) )
1954                return get_wl_instance_name( i );
1955            // else
1956            // return nvram_nget ("wl%d_ifname", i);
1957        }
1958
1959    }
1960    return NULL;
1961}
1962
1963char *getWET(  )
1964{
1965    int c = get_wl_instances(  );
1966    int i;
1967
1968    for( i = 0; i < c; i++ )
1969    {
1970        if( nvram_nmatch( "wet", "wl%d_mode", i )
1971            || nvram_nmatch( "apstawet", "wl%d_mode", i ) )
1972        {
1973            if( !nvram_nmatch( "disabled", "wl%d_net_mode", i ) )
1974                return get_wl_instance_name( i );
1975            // else
1976            // return nvram_nget ("wl%d_ifname", i);
1977
1978        }
1979
1980    }
1981    return NULL;
1982}
1983
1984#endif
1985// note - broadcast addr returned in ipaddr
1986void get_broadcast( char *ipaddr, char *netmask )
1987{
1988    int ip2[4], mask2[4];
1989    unsigned char ip[4], mask[4];
1990
1991    if( !ipaddr || !netmask )
1992        return;
1993
1994    sscanf( ipaddr, "%d.%d.%d.%d", &ip2[0], &ip2[1], &ip2[2], &ip2[3] );
1995    sscanf( netmask, "%d.%d.%d.%d", &mask2[0], &mask2[1], &mask2[2],
1996            &mask2[3] );
1997    int i = 0;
1998
1999    for( i = 0; i < 4; i++ )
2000    {
2001        ip[i] = ip2[i];
2002        mask[i] = mask2[i];
2003        // ip[i] = (ip[i] & mask[i]) | !mask[i];
2004        ip[i] = ( ip[i] & mask[i] ) | ( 0xff & ~mask[i] );
2005    }
2006
2007    sprintf( ipaddr, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3] );
2008#ifdef WDS_DEBUG
2009    fprintf( fp, "get_broadcast return %s\n", value );
2010#endif
2011
2012}
2013
2014char *get_wan_face( void )
2015{
2016    static char localwanface[IFNAMSIZ];
2017
2018    /*
2019     * if (nvram_match ("pptpd_client_enable", "1")) { strncpy (localwanface,
2020     * "ppp0", IFNAMSIZ); return localwanface; }
2021     */
2022    if( nvram_match( "wan_proto", "pptp" )
2023        || nvram_match( "wan_proto", "l2tp" )
2024        || nvram_match( "wan_proto", "pppoe" ) )
2025    {
2026        if( nvram_match( "pppd_pppifname", "" ) )
2027            strncpy( localwanface, "ppp0", IFNAMSIZ );
2028        else
2029            strncpy( localwanface, nvram_safe_get( "pppd_pppifname" ),
2030                     IFNAMSIZ );
2031    }
2032#ifndef HAVE_MADWIFI
2033    else if( getSTA(  ) )
2034    {
2035        strcpy( localwanface, getSTA(  ) );
2036    }
2037#else
2038    else if( getSTA(  ) )
2039    {
2040        if( nvram_match( "wifi_bonding", "1" ) )
2041            strcpy( localwanface, "bond0" );
2042        else
2043            strcpy( localwanface, getSTA(  ) );
2044    }
2045#endif
2046    else
2047        strncpy( localwanface, nvram_safe_get( "wan_ifname" ), IFNAMSIZ );
2048
2049    return localwanface;
2050}
2051static int _pidof( const char *name, pid_t ** pids )
2052{
2053    const char *p;
2054    char *e;
2055    DIR *dir;
2056    struct dirent *de;
2057    pid_t i;
2058    int count;
2059    char buf[256];
2060
2061    count = 0;
2062    *pids = NULL;
2063    if( ( p = strchr( name, '/' ) ) != NULL )
2064        name = p + 1;
2065    if( ( dir = opendir( "/proc" ) ) != NULL )
2066    {
2067        while( ( de = readdir( dir ) ) != NULL )
2068        {
2069            i = strtol( de->d_name, &e, 10 );
2070            if( *e != 0 )
2071                continue;
2072            if( strcmp( name, psname( i, buf, sizeof( buf ) ) ) == 0 )
2073            {
2074                if( ( *pids =
2075                      realloc( *pids,
2076                               sizeof( pid_t ) * ( count + 1 ) ) ) == NULL )
2077                {
2078                    return -1;
2079                }
2080                ( *pids )[count++] = i;
2081            }
2082        }
2083    }
2084    closedir( dir );
2085    return count;
2086}
2087
2088int pidof( const char *name )
2089{
2090    pid_t *pids;
2091    pid_t p;
2092
2093    if( _pidof( name, &pids ) > 0 )
2094    {
2095        p = *pids;
2096        free( pids );
2097        return p;
2098    }
2099    return -1;
2100}
2101
2102int killall( const char *name, int sig )
2103{
2104    pid_t *pids;
2105    int i;
2106    int r;
2107
2108    if( ( i = _pidof( name, &pids ) ) > 0 )
2109    {
2110        r = 0;
2111        do
2112        {
2113            r |= kill( pids[--i], sig );
2114        }
2115        while( i > 0 );
2116        free( pids );
2117        return r;
2118    }
2119    return -2;
2120}
2121
2122void set_ip_forward( char c )
2123{
2124    FILE *fp;
2125
2126    if( ( fp = fopen( "/proc/sys/net/ipv4/ip_forward", "r+" ) ) )
2127    {
2128        fputc( c, fp );
2129        fclose( fp );
2130    }
2131    else
2132    {
2133        perror( "/proc/sys/net/ipv4/ip_forward" );
2134    }
2135}
2136int ifexists( const char *ifname )
2137{
2138    return getifcount( ifname ) > 0 ? 1 : 0;
2139}
2140
2141int getifcount( const char *ifprefix )
2142{
2143    /*
2144     * char devcall[128];
2145     *
2146     * sprintf (devcall, "cat /proc/net/dev|grep \"%s\"|wc -l", ifprefix);
2147     * FILE *in = popen (devcall, "rb"); if (in == NULL) return 0; int count;
2148     * fscanf (in, "%d", &count); pclose (in); return count;
2149     */
2150    char *iflist = malloc( 256 );
2151
2152    memset( iflist, 0, 256 );
2153    int c = getIfList( iflist, ifprefix );
2154
2155    free( iflist );
2156    return c;
2157}
2158
2159static void skipline( FILE * in )
2160{
2161    while( 1 )
2162    {
2163        int c = getc( in );
2164
2165        if( c == EOF )
2166            return;
2167        if( c == 0x0 )
2168            return;
2169        if( c == 0xa )
2170            return;
2171    }
2172}
2173
2174// returns a physical interfacelist filtered by ifprefix. if ifprefix is
2175// NULL, all valid interfaces will be returned
2176int getIfList( char *buffer, const char *ifprefix )
2177{
2178    FILE *in = fopen( "/proc/net/dev", "rb" );
2179    char ifname[32];
2180
2181    // skip the first 2 lines
2182    skipline( in );
2183    skipline( in );
2184    int ifcount = 0;
2185    int count = 0;
2186
2187    while( 1 )
2188    {
2189        int c = getc( in );
2190
2191        if( c == EOF )
2192        {
2193            if( count )
2194                buffer[strlen( buffer ) - 1] = 0;       // fixup last space
2195            fclose( in );
2196            return count;
2197        }
2198        if( c == 0 )
2199        {
2200            if( count )
2201                buffer[strlen( buffer ) - 1] = 0;       // fixup last space
2202            fclose( in );
2203            return count;
2204        }
2205        if( c == 0x20 )
2206            continue;
2207        if( c == ':' || ifcount == 30 )
2208        {
2209            ifname[ifcount++] = 0;
2210            int skip = 0;
2211
2212            if( ifprefix )
2213            {
2214                if( strncmp( ifname, ifprefix, strlen( ifprefix ) ) )
2215                {
2216                    skip = 1;
2217                }
2218            }
2219            else
2220            {
2221                if( !strncmp( ifname, "wifi", 4 ) )
2222                    skip = 1;
2223                if( !strncmp( ifname, "imq", 3 ) )
2224                    skip = 1;
2225                if( !strncmp( ifname, "lo", 2 ) )
2226                    skip = 1;
2227                if( !strncmp( ifname, "teql", 4 ) )
2228                    skip = 1;
2229                if( !strncmp( ifname, "gre", 3 ) )
2230                    skip = 1;
2231                if( !strncmp( ifname, "ppp", 3 ) )
2232                    skip = 1;
2233                if( !strncmp( ifname, "tun", 3 ) )
2234                    skip = 1;
2235                if( !strncmp( ifname, "tap", 3 ) )
2236                    skip = 1;
2237            }
2238            if( !skip )
2239            {
2240                strcat( buffer, ifname );
2241                strcat( buffer, " " );
2242                count++;
2243            }
2244            skip = 0;
2245            ifcount = 0;
2246            memset( ifname, 0, 32 );
2247            skipline( in );
2248            continue;
2249        }
2250        if( ifcount < 30 )
2251            ifname[ifcount++] = c;
2252    }
2253}
2254
2255/*
2256 * Example: legal_hwaddr("00:11:22:33:44:aB"); return true;
2257 * legal_hwaddr("00:11:22:33:44:5"); return false;
2258 * legal_hwaddr("00:11:22:33:44:HH"); return false;
2259 */
2260int sv_valid_hwaddr( char *value )
2261{
2262    unsigned int hwaddr[6];
2263    int tag = TRUE;
2264    int i, count;
2265
2266    /*
2267     * Check for bad, multicast, broadcast, or null address
2268     */
2269    for( i = 0, count = 0; *( value + i ); i++ )
2270    {
2271        if( *( value + i ) == ':' )
2272        {
2273            if( ( i + 1 ) % 3 != 0 )
2274            {
2275                tag = FALSE;
2276                break;
2277            }
2278            count++;
2279        }
2280        else if( ishexit( *( value + i ) ) )    /* one of 0 1 2 3 4 5 6 7 8 9
2281                                                 * a b c d e f A B C D E F */
2282            continue;
2283        else
2284        {
2285            tag = FALSE;
2286            break;
2287        }
2288    }
2289
2290    if( !tag || i != 17 || count != 5 ) /* must have 17's characters and 5's
2291                                         * ':' */
2292        tag = FALSE;
2293    else if( sscanf( value, "%x:%x:%x:%x:%x:%x",
2294                     &hwaddr[0], &hwaddr[1], &hwaddr[2],
2295                     &hwaddr[3], &hwaddr[4], &hwaddr[5] ) != 6 )
2296    {
2297        tag = FALSE;
2298    }
2299    else
2300        tag = TRUE;
2301#ifdef WDS_DEBUG
2302    if( tag == FALSE )
2303        fprintf( fp, "failed valid_hwaddr\n" );
2304#endif
2305
2306    return tag;
2307}
2308
2309int led_control( int type, int act )
2310/*
2311 * type: LED_POWER, LED_DIAG, LED_DMZ, LED_CONNECTED, LED_BRIDGE, LED_VPN,
2312 * LED_SES, LED_SES2, LED_WLAN act: LED_ON, LED_OFF, LED_FLASH
2313 */
2314{
2315#if defined(HAVE_GEMTEK) || defined(HAVE_RB500) || defined(HAVE_MAGICBOX) || defined(HAVE_MERAKI) || defined(HAVE_LS2) || defined(HAVE_X86) || defined(HAVE_CA8) || defined(HAVE_LS5)  && !defined(HAVE_DIR300) && !defined(HAVE_DIR400)
2316    return 0;
2317#else
2318
2319    int use_gpio = 0x0f;
2320    int gpio_value;
2321    int enable;
2322    int disable;
2323
2324    int power_gpio = 0x0f;
2325    int diag_gpio = 0x0f;
2326    int dmz_gpio = 0x0f;
2327    int connected_gpio = 0x0f;
2328    int bridge_gpio = 0x0f;
2329    int vpn_gpio = 0x0f;
2330    int ses_gpio = 0x0f;        // use for SES1 (Linksys), AOSS (Buffalo)
2331
2332    // ....
2333    int ses2_gpio = 0x0f;
2334    int wlan_gpio = 0x0f;       // use this only if wlan led is not
2335
2336    // controlled by hardware!
2337    int usb_gpio = 0x0f;
2338    int v1func = 0;
2339
2340    switch ( getRouterBrand(  ) )       // gpio definitions here: 0xYZ,
2341        // Y=0:normal, Y=1:inverted, Z:gpio
2342        // number (f=disabled)
2343    {
2344#ifndef HAVE_BUFFALO
2345        case ROUTER_BOARD_GATEWORX:
2346            connected_gpio = 0x3;
2347            break;
2348        case ROUTER_BOARD_GATEWORX_SWAP:
2349            connected_gpio = 0x4;
2350            break;
2351        case ROUTER_BOARD_STORM:
2352            connected_gpio = 0x5;
2353            diag_gpio = 0x3;
2354            break;
2355        case ROUTER_LINKSYS_WRH54G:
2356            diag_gpio = 0x11;   // power led blink / off to indicate factory
2357            // defaults
2358            break;
2359        case ROUTER_WRT54G:
2360        case ROUTER_WRT54G_V8:
2361            power_gpio = 0x01;
2362            dmz_gpio = 0x17;
2363            connected_gpio = 0x13;      // ses orange
2364            ses_gpio = 0x12;    // ses white
2365            ses2_gpio = 0x13;   // ses orange
2366            break;
2367        case ROUTER_WRT54G_V81:
2368            power_gpio = 0x11;
2369            dmz_gpio = 0x12;
2370            connected_gpio = 0x14;      // ses orange
2371            ses_gpio = 0x13;    // ses white
2372            ses2_gpio = 0x14;   // ses orange
2373            break;
2374        case ROUTER_WRT54G1X:
2375            connected_gpio = 0x13;
2376            v1func = 1;
2377            break;
2378        case ROUTER_WRT350N:
2379            connected_gpio = 0x13;
2380            power_gpio = 0x01;
2381            ses2_gpio = 0x13;   // ses orange
2382            // usb_gpio = 0x04;
2383            break;
2384        case ROUTER_WRT600N:
2385            connected_gpio = 0x13;
2386            // power_gpio = 0x01;
2387            ses2_gpio = 0x18;   // ses orange
2388            break;
2389        case ROUTER_LINKSYS_WRT55AG:
2390            connected_gpio = 0x13;
2391            break;
2392        case ROUTER_DLINK_DIR330:
2393            diag_gpio = 0x16;
2394            connected_gpio = 0x14;
2395            break;
2396#endif
2397        case ROUTER_BUFFALO_WBR54G:
2398            diag_gpio = 0x17;
2399            break;
2400        case ROUTER_BUFFALO_WBR2G54S:
2401            diag_gpio = 0x01;
2402            ses_gpio = 0x06;
2403            break;
2404        case ROUTER_BUFFALO_WLA2G54C:
2405            diag_gpio = 0x14;
2406            ses_gpio = 0x13;
2407            break;
2408        case ROUTER_BUFFALO_WLAH_G54:
2409            diag_gpio = 0x17;
2410            ses_gpio = 0x16;
2411            break;
2412        case ROUTER_BUFFALO_WAPM_HP_AM54G54:
2413            diag_gpio = 0x17;
2414            ses_gpio = 0x11;
2415            break;
2416        case ROUTER_BOARD_WHRAG108:
2417            diag_gpio = 0x17;
2418            bridge_gpio = 0x14;
2419            ses_gpio = 0x10;
2420            break;
2421        case ROUTER_BUFFALO_WHRG54S:
2422        case ROUTER_BUFFALO_WLI_TX4_G54HP:
2423            diag_gpio = 0x17;
2424            bridge_gpio = 0x11;
2425            ses_gpio = 0x16;
2426            break;
2427        case ROUTER_BUFFALO_WZRRSG54:
2428            diag_gpio = 0x17;
2429            vpn_gpio = 0x11;
2430            ses_gpio = 0x16;
2431            break;
2432        case ROUTER_BUFFALO_WZRG300N:
2433            diag_gpio = 0x17;
2434            bridge_gpio = 0x11;
2435            break;
2436        case ROUTER_BUFFALO_WZRG144NH:
2437            diag_gpio = 0x13;
2438            bridge_gpio = 0x11;
2439            ses_gpio = 0x12;
2440            break;
2441#ifndef HAVE_BUFFALO
2442#ifdef HAVE_DIR300
2443        case ROUTER_BOARD_FONERA:
2444            diag_gpio = 0x03;
2445            bridge_gpio = 0x04;
2446            ses_gpio = 0x01;
2447            break;
2448#endif
2449#ifdef HAVE_DIR400
2450        case ROUTER_BOARD_FONERA2200:
2451            diag_gpio = 0x03;
2452            bridge_gpio = 0x04;
2453            ses_gpio = 0x01;
2454            break;
2455#endif
2456#ifdef HAVE_WRK54G
2457        case ROUTER_BOARD_FONERA:
2458            diag_gpio = 0x17;
2459            dmz_gpio = 0x05;
2460            break;
2461#endif
2462        case ROUTER_BOARD_TW6600:
2463            diag_gpio = 0x17;
2464            bridge_gpio = 0x14;
2465            ses_gpio = 0x10;
2466            break;
2467        case ROUTER_MOTOROLA:
2468            power_gpio = 0x01;
2469            diag_gpio = 0x11;   // power led blink / off to indicate factory
2470            // defaults
2471            break;
2472        case ROUTER_RT210W:
2473            power_gpio = 0x15;
2474            diag_gpio = 0x05;   // power led blink / off to indicate factory
2475            // defaults
2476            connected_gpio = 0x10;
2477            wlan_gpio = 0x13;
2478            break;
2479        case ROUTER_RT480W:
2480        case ROUTER_BELKIN_F5D7230_V2000:
2481        case ROUTER_BELKIN_F5D7231:
2482            power_gpio = 0x15;
2483            diag_gpio = 0x05;   // power led blink / off to indicate factory
2484            // defaults
2485            connected_gpio = 0x10;
2486            break;
2487        case ROUTER_MICROSOFT_MN700:
2488            power_gpio = 0x06;
2489            diag_gpio = 0x16;   // power led blink / off to indicate factory
2490            // defaults
2491            break;
2492        case ROUTER_ASUS_WL500GD:
2493        case ROUTER_ASUS_WL520GUGC:
2494            diag_gpio = 0x00;   // power led blink / off to indicate factory
2495            // defaults
2496            break;
2497        case ROUTER_ASUS_WL500G_PRE:
2498            power_gpio = 0x11;
2499            diag_gpio = 0x01;   // power led blink / off to indicate factory
2500            // defaults
2501            break;
2502        case ROUTER_ASUS_WL550GE:
2503            power_gpio = 0x12;
2504            diag_gpio = 0x02;   // power led blink / off to indicate factory
2505            // defaults
2506            break;
2507        case ROUTER_WRT54G3G:
2508        case ROUTER_WRTSL54GS:
2509            power_gpio = 0x01;
2510            dmz_gpio = 0x10;
2511            connected_gpio = 0x17;      // ses orange
2512            ses_gpio = 0x15;    // ses white
2513            ses2_gpio = 0x17;   // ses orange
2514            break;
2515        case ROUTER_MOTOROLA_WE800G:
2516        case ROUTER_MOTOROLA_V1:
2517            diag_gpio = 0x13;
2518            wlan_gpio = 0x11;
2519            bridge_gpio = 0x15;
2520            break;
2521        case ROUTER_DELL_TRUEMOBILE_2300:
2522        case ROUTER_DELL_TRUEMOBILE_2300_V2:
2523            power_gpio = 0x17;
2524            diag_gpio = 0x07;   // power led blink / off to indicate factory
2525            // defaults
2526            wlan_gpio = 0x16;
2527            break;
2528        case ROUTER_NETGEAR_WNR834B:
2529            power_gpio = 0x14;
2530            diag_gpio = 0x15;
2531            wlan_gpio = 0x16;
2532            break;
2533        case ROUTER_SITECOM_WL105B:
2534            power_gpio = 0x03;
2535            diag_gpio = 0x13;   // power led blink / off to indicate factory
2536            // defaults
2537            wlan_gpio = 0x14;
2538            break;
2539        case ROUTER_WRT150N:
2540        case ROUTER_WRT300N:
2541            power_gpio = 0x01;
2542            diag_gpio = 0x11;   // power led blink / off to indicate fac.def.
2543            break;
2544        case ROUTER_WRT300NV11:
2545            ses_gpio = 0x15;
2546            // diag_gpio = 0x11; //power led blink / off to indicate fac.def.
2547            break;
2548        case ROUTER_WRT310N:
2549            connected_gpio = 0x13;
2550            power_gpio = 0x01;
2551            diag_gpio = 0x11;   // power led blink / off to indicate fac.def.
2552            ses2_gpio = 0x13;   // ses orange
2553        case ROUTER_WRT160N:
2554            power_gpio = 0x01;
2555            diag_gpio = 0x11;   // power led blink / off to indicate fac.def.
2556            //
2557            connected_gpio = 0x13;      // ses orange
2558            ses_gpio = 0x15;    // ses blue
2559            break;
2560        case ROUTER_ASUS_WL500G:
2561            power_gpio = 0x10;
2562            diag_gpio = 0x00;   // power led blink /off to indicate factory
2563            // defaults
2564            break;
2565        case ROUTER_ASUS_WL500W:
2566            power_gpio = 0x15;
2567            diag_gpio = 0x05;   // power led blink /off to indicate factory
2568            // defaults
2569            break;
2570        case ROUTER_LINKSYS_WTR54GS:
2571            diag_gpio = 0x01;
2572            break;
2573        case ROUTER_WAP54G_V1:
2574            diag_gpio = 0x13;
2575            wlan_gpio = 0x14;   // LINK led
2576            break;
2577        case ROUTER_WAP54G_V3:
2578            ses_gpio = 0x1c;
2579            connected_gpio = 0x06;
2580            break;
2581        case ROUTER_NETGEAR_WNR834BV2:
2582            power_gpio = 0x02;
2583            diag_gpio = 0x03;   // power led amber
2584            connected_gpio = 0x07;      // WAN led green
2585            break;
2586        case ROUTER_NETGEAR_WNDR3300:
2587            power_gpio = 0x05;
2588            diag_gpio = 0x15;   // power led blink /off to indicate factory
2589            // defaults
2590            break;
2591        case ROUTER_ASKEY_RT220XD:
2592            wlan_gpio = 0x10;
2593            dmz_gpio = 0x11;    // not soldered
2594            break;
2595        case ROUTER_WRT610N:
2596            power_gpio = 0x01;
2597            connected_gpio = 0x13;      // ses amber
2598            ses_gpio = 0x19;    // ses blue
2599            usb_gpio = 0x10;
2600            break;
2601#endif
2602    }
2603    if( type == LED_DIAG && v1func == 1 )
2604    {
2605        if( act == LED_ON )
2606            C_led( 1 );
2607        else
2608            C_led( 0 );
2609    }
2610
2611    switch ( type )
2612    {
2613        case LED_POWER:
2614            use_gpio = power_gpio;
2615            break;
2616        case LED_DIAG:
2617            use_gpio = diag_gpio;
2618            break;
2619        case LED_DMZ:
2620            use_gpio = dmz_gpio;
2621            break;
2622        case LED_CONNECTED:
2623            use_gpio = connected_gpio;
2624            break;
2625        case LED_BRIDGE:
2626            use_gpio = bridge_gpio;
2627            break;
2628        case LED_VPN:
2629            use_gpio = vpn_gpio;
2630            break;
2631        case LED_SES:
2632            use_gpio = ses_gpio;
2633            break;
2634        case LED_SES2:
2635            use_gpio = ses2_gpio;
2636            break;
2637        case LED_WLAN:
2638            use_gpio = wlan_gpio;
2639            break;
2640        case LED_USB:
2641            use_gpio = usb_gpio;
2642            break;
2643    }
2644    if( ( use_gpio & 0x0f ) != 0x0f )
2645    {
2646        gpio_value = use_gpio & 0x0f;
2647        enable = ( use_gpio & 0x10 ) == 0 ? 1 : 0;
2648        disable = ( use_gpio & 0x10 ) == 0 ? 0 : 1;
2649        switch ( act )
2650        {
2651            case LED_ON:
2652                set_gpio( gpio_value, enable );
2653                break;
2654            case LED_OFF:
2655                set_gpio( gpio_value, disable );
2656                break;
2657            case LED_FLASH:     // will lit the led for 1 sec.
2658                set_gpio( gpio_value, enable );
2659                sleep( 1 );
2660                set_gpio( gpio_value, disable );
2661                break;
2662        }
2663    }
2664    return 1;
2665
2666#endif
2667}
2668
2669int file_to_buf( char *path, char *buf, int len )
2670{
2671    FILE *fp;
2672
2673    memset( buf, 0, len );
2674
2675    if( ( fp = fopen( path, "r" ) ) )
2676    {
2677        fgets( buf, len, fp );
2678        fclose( fp );
2679        return 1;
2680    }
2681
2682    return 0;
2683}
2684
2685int ishexit( char c )
2686{
2687
2688    if( strchr( "01234567890abcdefABCDEF", c ) != ( char * )0 )
2689        return 1;
2690
2691    return 0;
2692}
2693
2694int getMTD( char *name )
2695{
2696    char buf[128];
2697    int device;
2698
2699    sprintf( buf, "cat /proc/mtd|grep \"%s\"", name );
2700    FILE *fp = popen( buf, "rb" );
2701
2702    fscanf( fp, "%s", &buf[0] );
2703    device = buf[3] - '0';
2704    pclose( fp );
2705    return device;
2706}
2707
2708int insmod( char *module )
2709{
2710    return eval( "insmod", module );
2711}
2712
2713void rmmod( char *module )
2714{
2715    return eval( "rmmod", module );
2716}
2717
2718#ifdef HAVE_X86
2719
2720static int fd;
2721
2722void SetEnvironment(  )
2723{
2724    system( "stty ispeed 2400 < /dev/tts/1" );
2725    system( "stty raw < /dev/tts/1" );
2726}
2727
2728int Cmd = 254;                  /* EZIO Command */
2729int cls = 1;                    /* Clear screen */
2730void Cls(  )
2731{
2732    write( fd, &Cmd, 1 );
2733    write( fd, &cls, 1 );
2734}
2735
2736int init = 0x28;
2737void Init(  )
2738{
2739    write( fd, &Cmd, 1 );
2740    write( fd, &init, 1 );
2741}
2742
2743int stopsend = 0x37;
2744void StopSend(  )
2745{
2746    write( fd, &Cmd, 1 );
2747    write( fd, &init, 1 );
2748}
2749
2750int home = 2;                   /* Home cursor */
2751void Home(  )
2752{
2753    write( fd, &Cmd, 1 );
2754    write( fd, &home, 1 );
2755}
2756
2757int readkey = 6;                /* Read key */
2758void ReadKey(  )
2759{
2760    write( fd, &Cmd, 1 );
2761    write( fd, &readkey, 1 );
2762}
2763
2764int blank = 8;                  /* Blank display */
2765void Blank(  )
2766{
2767    write( fd, &Cmd, 1 );
2768    write( fd, &blank, 1 );
2769}
2770
2771int hide = 12;                  /* Hide cursor & display blanked characters */
2772void Hide(  )
2773{
2774    write( fd, &Cmd, 1 );
2775    write( fd, &hide, 1 );
2776}
2777
2778int turn = 13;                  /* Turn On (blinking block cursor) */
2779void TurnOn(  )
2780{
2781    write( fd, &Cmd, 1 );
2782    write( fd, &turn, 1 );
2783}
2784
2785int show = 14;                  /* Show underline cursor */
2786void Show(  )
2787{
2788    write( fd, &Cmd, 1 );
2789    write( fd, &show, 1 );
2790}
2791
2792int movel = 16;                 /* Move cursor 1 character left */
2793void MoveL(  )
2794{
2795    write( fd, &Cmd, 1 );
2796    write( fd, &movel, 1 );
2797}
2798
2799int mover = 20;                 /* Move cursor 1 character right */
2800void MoveR(  )
2801{
2802    write( fd, &Cmd, 1 );
2803    write( fd, &mover, 1 );
2804}
2805
2806int scl = 24;                   /* Scroll cursor 1 character left */
2807void ScrollL(  )
2808{
2809    write( fd, &Cmd, 1 );
2810    write( fd, &scl, 1 );
2811}
2812
2813int scr = 28;                   /* Scroll cursor 1 character right */
2814void ScrollR(  )
2815{
2816    write( fd, &Cmd, 1 );
2817    write( fd, &scr, 1 );
2818}
2819
2820int setdis = 64;                /* Command */
2821void SetDis(  )
2822{
2823    write( fd, &Cmd, 1 );
2824    write( fd, &setdis, 1 );
2825
2826}
2827
2828int a, b;
2829void ShowMessage( char *str1, char *str2 )
2830{
2831    char nul[] = "                                       ";
2832
2833    a = strlen( str1 );
2834    b = 40 - a;
2835    write( fd, str1, a );
2836    write( fd, nul, b );
2837    write( fd, str2, strlen( str2 ) );
2838}
2839
2840void initlcd(  )
2841{
2842
2843    fd = open( "/dev/tts/1", O_RDWR );
2844
2845                                  /** Open Serial port (COM2) */
2846    if( fd > 0 )
2847    {
2848        close( fd );
2849        SetEnvironment(  );     /* Set RAW mode */
2850        fd = open( "/dev/tts/1", O_RDWR );
2851        Init(  );               /* Initialize EZIO twice */
2852        Init(  );
2853
2854        Cls(  );                /* Clear screen */
2855    }
2856    close( fd );
2857}
2858
2859void lcdmessage( char *message )
2860{
2861
2862    fd = open( "/dev/tts/1", O_RDWR );
2863                                   /** Open Serial port (COM2) */
2864
2865    if( fd > 0 )
2866    {
2867        Init(  );               /* Initialize EZIO twice */
2868        Init(  );
2869        SetDis(  );
2870        Cls(  );
2871        Home(  );
2872        ShowMessage( "State", message );
2873        close( fd );
2874    }
2875}
2876void lcdmessaged( char *dual, char *message )
2877{
2878
2879    fd = open( "/dev/tts/1", O_RDWR );
2880
2881                                  /** Open Serial port (COM2) */
2882
2883    if( fd > 0 )
2884    {
2885        Init(  );               /* Initialize EZIO twice */
2886        Init(  );
2887        SetDis(  );
2888        Cls(  );                /* Clear screen */
2889        Home(  );
2890        ShowMessage( dual, message );
2891        close( fd );
2892    }
2893}
2894
2895#endif
Note: See TracBrowser for help on using the repository browser.