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

Last change on this file since 11614 was 11614, checked in by BrainSlayer, 4 years ago

ralink requires manual channel selection for apsta

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