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

Last change on this file since 10430 was 10430, checked in by eko, 5 years ago

just wnrb834bv2 det.

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