-
Notifications
You must be signed in to change notification settings - Fork 641
/
watchdog.c
9357 lines (8388 loc) · 234 KB
/
watchdog.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
* Copyright 2004, ASUSTeK Inc.
* All Rights Reserved.
*
* THIS SOFTWARE IS OFFERED "AS IS", AND ASUS GRANTS NO WARRANTIES OF ANY
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
*
*/
#include <rc.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <shutils.h>
#include <stdarg.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <limits.h>
#ifdef RTCONFIG_RALINK
#include <ralink.h>
#endif
#ifdef RTCONFIG_QCA
#include <qca.h>
#if defined(RTCONFIG_WIFI_SON) && defined(RTCONFIG_AMAS)
#include <sys/mount.h>
#endif
#endif
#ifdef RTCONFIG_REALTEK
#include "realtek.h"
#endif
#include <shared.h>
#include <syslog.h>
#include <bcmnvram.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <math.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <sys/reboot.h>
#include <sys/sysinfo.h>
#ifdef RTCONFIG_USER_LOW_RSSI
#if defined(RTCONFIG_RALINK)
#include <typedefs.h>
#else
#include <wlioctl.h>
#include <wlutils.h>
#endif
#endif
#ifdef RTAC88U
#include <rtk_switch.h>
#endif
#if defined(RTCONFIG_NOTIFICATION_CENTER)
#include <libnt.h>
#endif
#if defined(RTCONFIG_LP5523)
#include <lp5523led.h>
#endif
#ifdef RTCONFIG_CFGSYNC
#include <cfg_event.h>
#endif
#ifdef RTCONFIG_AMAS
#include <amas_ob.h>
#ifdef RTCONFIG_LIBASUSLOG
#include <libasuslog.h>
#endif
#endif
#if defined(RTCONFIG_RGBLED)
#include <aura_rgb.h>
#ifdef GTAC2900
#define AURA_LED_RST "255,255,255,1,0,0" // White
#define AURA_LED_WPS "255,255,255,1,0,0" // White
#define AURA_LED_BTN "0,0,255,7,0,0" // Blue Comet
#define AURA_LED_OFF "0,0,0,1,0,0" // Off
#endif
#endif
#ifdef RTCONFIG_WL_SCHED_V2
#include <sched_v2.h>
#endif
#include <json.h>
#define BCM47XX_SOFTWARE_RESET 0x40 /* GPIO 6 */
#define RESET_WAIT 2 /* seconds */
#define RESET_WAIT_COUNT RESET_WAIT * 10 /* 10 times a second */
#define TEST_PERIOD 100 /* second */
#define NORMAL_PERIOD 1 /* second */
#define URGENT_PERIOD 100 * 1000 /* microsecond */
#define RUSHURGENT_PERIOD 50 * 1000 /* microsecond */
#define DAY_PERIOD 2 * 60 * 24 /* 1 day (in 30 sec periods) */
#define WPS_TIMEOUT_COUNT 121 * 20
#ifdef RTCONFIG_WPS_LED
#define WPS_SUCCESS_COUNT 3
#endif
#define WPS_WAIT 1 /* seconds */
#define WPS_WAIT_COUNT WPS_WAIT * 20 /* 20 times a second */
#ifdef BLUECAVE
static int bc_wps_led = 0;
#endif
#ifdef RTCONFIG_AMAS
#define AMESH_TIMEOUT_COUNT 30 * 20 /* 30 secnods */
struct time_mapping_s time_mapping;
#endif
#ifdef RTCONFIG_WPS_RST_BTN
#define WPS_RST_DO_WPS_COUNT ( 1*10) /* 1 seconds */
#define WPS_RST_DO_RESTORE_COUNT (10*10) /* 10 seconds */
#undef RESET_WAIT_COUNT
#define RESET_WAIT_COUNT WPS_RST_DO_RESTORE_COUNT
#endif /* RTCONFIG_WPS_RST_BTN */
#ifdef RTCONFIG_WPS_ALLLED_BTN
#define WPS_LED_WAIT_COUNT 15 //use URGENT_PERIOD, press 1.5 ~ 2.5 secs to turn LED on/off
#endif
#if defined(RTCONFIG_EJUSB_BTN)
#define EJUSB_WAIT_COUNT 2 /* 2 seconds */
#endif
//#if defined(RTCONFIG_JFFS2LOG) && defined(RTCONFIG_JFFS2)
#if defined(RTCONFIG_JFFS2LOG) && (defined(RTCONFIG_JFFS2)||defined(RTCONFIG_BRCM_NAND_JFFS2))
#define LOG_COMMIT_PERIOD 2 /* 2 x 30 seconds */
static int log_commit_count = 0;
#endif
#if defined(RTCONFIG_USB_MODEM)
#define LOG_MODEM_PERIOD 20 /* 10 minutes */
static int log_modem_count = 0;
#if defined(RTCONFIG_JFFS2) || defined(RTCONFIG_BRCM_NAND_JFFS2) || defined(RTCONFIG_UBIFS)
#define MODEM_FLOW_PERIOD 1
static int modem_flow_count = 0;
static int modem_data_save = 0;
#endif
#endif
#if 0 //defined(RTCONFIG_TOR) && (defined(RTCONFIG_JFFS2) || defined(RTCONFIG_BRCM_NAND_JFFS2))
#define TOR_CHECK_PERIOD 10 /* 10 x 30 seconds */
unsigned int tor_check_count = 0;
#endif
#ifdef RTCONFIG_REALTEK
#define REINIT_WEB_FILE ("/tmp/reinit_web")
#define PARAM_TEMP_FILE ("/tmp/flash_param")
#define PARAM_TEMP_FILE2 ("/tmp/flash_param2")
#endif
static sigset_t sigs_to_catch;
static struct itimerval itv;
/* to check watchdog alive */
#if ! (defined(RTCONFIG_QCA) || defined(RTCONFIG_RALINK))
static struct itimerval itv02;
#endif
static int watchdog_period = 0;
#ifdef WATCHDOG_PERIOD2
static int watchdog_period2 = 0;
#endif
#ifdef RTCONFIG_BCMARM
static int chkusb3_period = 0;
static int u3_chk_life = 6;
#endif
static int btn_pressed = 0;
static int btn_count = 0;
#ifdef BTN_SETUP
static int btn_pressed_setup = 0;
static int btn_count_setup = 0;
static int wsc_timeout = 0;
static int btn_count_setup_second = 0;
static int btn_pressed_toggle_radio = 0;
#endif
static long ddns_update_timer = 0;
#if defined(RTCONFIG_WIRELESS_SWITCH) && defined(RTCONFIG_DSL)
// for WLAN sw init, only for slide switch
static int wlan_sw_init = 0;
#elif defined(RTCONFIG_WIRELESS_SWITCH) && defined(RTCONFIG_QCA)
static int wifi_sw_old = -1;
#endif
#if defined(RTCONFIG_TURBO_BTN)
static int g_boost_status[BOOST_MODE_MAX] = { 0 };
#endif
#if (defined(RTCONFIG_LED_BTN) || (!defined(RTCONFIG_WIFI_TOG_BTN) && !defined(RTCONFIG_QCA) && !defined(RTCONFIG_WPS_ALLLED_BTN))) && !defined(RTAX82U) && !defined(DSL_AX82U)
#if defined(RTCONFIG_QCA)
static int LED_status_old = 0;
static int LED_status = 0;
#else
static int LED_status_old = -1;
static int LED_status = -1;
#endif
static int LED_status_changed = 0;
static int LED_status_first = 1;
static int LED_status_on = -1;
#ifdef RTAC87U
static int LED_switch_count = 0;
static int BTN_pressed_count = 0;
#endif
#endif
#if defined(RTCONFIG_WPS_ALLLED_BTN)
static int LED_status_old = -1;
static int LED_status = -1;
static int LED_status_changed = 0;
static int LED_status_on = -1;
static int BTN_pressed_count = 0;
#endif
#ifdef RTCONFIG_BCMWL6
static int wlonunit = -1;
#endif
extern int g_wsc_configured;
static unsigned int sigbones = 0;
void watch_sig(int signo) {
sigbones |= 1<<signo;
}
static void *fn_acts[_NSIG];
#define REGULAR_DDNS_CHECK 10 //10x30 sec
static int ddns_check_count = 0;
static int freeze_duck_count = 0;
static char time_zone_t[32]={0};
static const struct mfg_btn_s {
enum btn_id id;
char *name;
char *nv;
int (*pre_req)(void); /* Model-speceific prerequisite */
} mfg_btn_table[] = {
#ifndef RTCONFIG_N56U_SR2
{ BTN_RESET, "RESET", "btn_rst", NULL },
#endif
{ BTN_WPS, "WPS", "btn_ez", NULL },
#if defined(RTCONFIG_WIFI_TOG_BTN)
{ BTN_WIFI_TOG, "WIFI_TOG", "btn_wifi_toggle", NULL },
#endif
#ifdef RTCONFIG_WIRELESS_SWITCH
{ BTN_WIFI_SW, "WIFI_SW", "btn_wifi_sw", NULL },
#endif
#if defined(RTCONFIG_EJUSB_BTN)
{ BTN_EJUSB1, "EJECT USB1", "btn_ejusb_btn1", NULL },
{ BTN_EJUSB2, "EJECT USB2", "btn_ejusb_btn2", NULL },
#endif
#ifndef RTAC68U
#if defined(RTCONFIG_LED_BTN)
{ BTN_LED, "LED ON/OFF", "btn_led", NULL },
#endif
#endif
#if defined(RTCONFIG_TURBO_BTN)
{ BTN_TURBO, "TURBO", "btn_turbo", NULL },
#endif
{ BTN_ID_MAX, NULL, NULL, NULL },
};
#if defined(RTCONFIG_QCA)
static time_t g_t1;
#endif
/* ErP Test */
#ifdef RTCONFIG_ERP_TEST
#define MODE_NORMAL 0
#define MODE_PWRSAVE 1
#define NO_ASSOC_CHECK 6 // 6x30 sec
static int pwrsave_status = MODE_NORMAL;
static int no_assoc_check = 0;
#endif
void led_table_ctrl(int on_off);
#if defined(RTAC1200G) || defined(RTAC1200GP)
#define WDG_MONITOR_PERIOD 60 /* second */
static int wdg_timer_alive = 1;
#endif
#ifdef HND_ROUTER
const char *dw_aggled[]={"dw", "0x800c00b8", NULL};
const char *sw_aggled_alloff[]={"sw", "0x800c00b8", "0x40000", NULL};
const char *sw_aggled_allon[]={"sw", "0x800c00b8", "0x4008f", NULL};
const char *sw_aggled_extoff[]={"sw", "0x800c00b8", "0x4000f", NULL};
#ifdef RTCONFIG_BONDING
static int bs=-1, bs_pre=-1;
extern char *bs_desc[];
#endif
#endif
/* DEBUG DEFINE */
#define SCHED_DEBUG "/tmp/SCHED_DEBUG"
#define WL_SCHED_DBG(fmt,args...) \
if(nvram_get_int("sched_dbg") || f_exists(SCHED_DEBUG) > 0) { \
printf("[SCHED][%s:(%d)]"fmt, __FUNCTION__, __LINE__, ##args); \
}
void watchdog(int sig);
#if defined(RTCONFIG_RGBLED) && defined(GTAC2900)
void aura_led_control(char *rgb);
#endif
#if defined(RTCONFIG_NOTIFICATION_CENTER)
void RC_SEND_NT_EVENT(int NT_EVENT_FLAG, char *sub_event);
#endif
int
elm_of_strr(const char *strr[])
{
int num = 0;
while (strr[num++]);
return num-1;
}
void
sys_exit()
{
printf("[watchdog] sys_exit");
set_action(ACT_REBOOT);
kill(1, SIGTERM);
}
static void
alarmtimer(unsigned long sec, unsigned long usec)
{
itv.it_value.tv_sec = sec;
itv.it_value.tv_usec = usec;
itv.it_interval = itv.it_value;
setitimer(ITIMER_REAL, &itv, NULL);
}
/* to check watchdog alive */
#if ! (defined(RTCONFIG_QCA) || defined(RTCONFIG_RALINK))
static void
alarmtimer02(unsigned long sec, unsigned long usec)
{
itv02.it_value.tv_sec = sec;
itv02.it_value.tv_usec = usec;
itv02.it_interval = itv02.it_value;
setitimer(ITIMER_REAL, &itv02, NULL);
}
#endif
extern int no_need_to_start_wps();
extern void uptime_wait(int);
void led_control_normal(void)
{
#ifdef BLUECAVE
if(nvram_match("bc_ledbh", "wps_done"))
kill_pidfile_s("/var/run/sw_devled.pid", SIGUSR1);
return;
#endif
#if defined(RTCONFIG_ALPINE) || defined(RTCONFIG_LANTIQ) || defined(RPAC92)
return;
#endif
#ifdef RTAC87U
LED_switch_count = nvram_get_int("LED_switch_count");
#endif
#if defined(RTCONFIG_LED_BTN) || defined(RTCONFIG_WPS_ALLLED_BTN) || defined(RTCONFIG_TURBO_BTN) || (!defined(RTCONFIG_WIFI_TOG_BTN) && !defined(RTCONFIG_QCA))
if (inhibit_led_on()) return;
#endif
#ifdef RTCONFIG_WPS_LED
int v = LED_OFF;
// the behavior in normal when wps led != power led
// wps led = off, power led = on
if (nvram_match("wps_success", "1"))
v = LED_ON;
__wps_led_control(v);
#endif
#if !defined(RTCONFIG_CONCURRENTREPEATER)
led_control(LED_POWER, LED_ON);
#endif
#if defined(RTCONFIG_LOGO_LED) && !defined(GTAX11000) && !defined(GTAXE11000)
led_control(LED_LOGO, LED_ON);
#endif
#if defined(RTN11P) || defined(RTN300) || defined(RTN11P_B1)
led_control(LED_WPS, LED_ON); //wps led is also 2g led. and NO power led.
#else
if (nvram_get_int("led_pwr_gpio") != nvram_get_int("led_wps_gpio"))
led_control(LED_WPS, LED_OFF);
#endif
#if defined(RTCONFIG_RGBLED) && defined(GTAC2900)
if(nvram_match("dfs_aura_nt_ctrl", "1")){
nvram_set("pause_aura_rgb_nt", "0");
nvram_unset("dfs_aura_nt_ctrl");
return;
}
start_aurargb();
#endif
}
#ifndef HND_ROUTER
void erase_nvram(void)
{
switch (get_model()) {
case MODEL_BLUECAVE:
case MODEL_GTAC9600:
eval("cp", "-f", "/sbin/nvram.txt", "/tmp/nvram.txt");
eval("cp", "-f", "/sbin/nvram.txt", "/jffs/nvram.txt");
default:
#ifdef RTCONFIG_BCMARM
eval("mtd-erase2", "nvram");
#else
eval("mtd-erase","-d","nvram");
#endif
}
}
#endif
int init_toggle(void)
{
switch (get_model()) {
#ifdef RTCONFIG_WIFI_TOG_BTN
case MODEL_RTAC56S:
case MODEL_RTAC56U:
case MODEL_RTAC3200:
case MODEL_RTAC68U:
case MODEL_DSLAC68U:
case MODEL_RTAC87U:
case MODEL_RTAC5300:
case MODEL_GTAC5300:
case MODEL_RTAC88U:
case MODEL_RTAC86U:
case MODEL_RTAC3100:
case MODEL_RTAX88U:
case MODEL_GTAX11000:
case MODEL_RTAX92U:
case MODEL_RTAX95Q:
case MODEL_RTAX56_XD4:
case MODEL_CTAX56_XD4:
case MODEL_RTAX58U:
case MODEL_RTAX56U:
case MODEL_RTAX86U:
case MODEL_GTAXE11000:
nvram_set("btn_ez_radiotoggle", "1");
return BTN_WIFI_TOG;
#endif
default:
return BTN_WPS;
}
}
#ifdef RTCONFIG_REALTEK
/* [MUST]: Need to re-coding this part */
typedef struct rtk_wps_result{
int band;
char ssid[256];
char wsc_ssid[256];
int auth_type;
int encrypt;
int wsc_auth;
int wpa_auth;
char wpa_psk[256];
int psk_format;
char wsc_psk[256];
int wpa_suite;
int wpa2_suite;
int wep;
int wsc_enc;
}rtk_wps_result;
//#define SET_WPS_RESULT_TO_ROOT
#ifdef RTCONFIG_CONCURRENTREPEATER
#define RTK_SCAN_LIST_2G "/tmp/rtk_ss_list_2g"
#define RTK_SCAN_LIST_5G "/tmp/rtk_ss_list_5g"
#define MAX_WAIT_COUNT ((15*1000*1000)/(RUSHURGENT_PERIOD))
static int wait_5g_time = 0;
static int wait_2g_time = 0;
static int wps_2g_done = 0;
static int wps_5g_done = 0;
static rtk_wps_result wps_res_2g,wps_res_5g;
struct save_fuple {
int length;
char *cmppart;
char *setpart1;
char *setpart2;
};
static int rtk_comparetmp( char *arraylist[], int sizelist, char ssidptr1[], char *ssidptr2) {
int sizetmp = 0;
char ssidcat[128];
strcpy ( ssidcat, ssidptr1 );
strcat ( ssidcat, ssidptr2 );
while( sizetmp < sizelist) {
if( !strcmp( arraylist[sizetmp], ssidcat ) ) {
strcat ( ssidptr1, ssidptr2 );
return 1;
}
sizetmp ++;
}
return 0;
}
static char *rtk_readfile(char *fname,int *fsize)
{
FILE *fp;
unsigned long size,lsize;
char *pt;
int len;
char buf[100];
size=0;
pt=NULL;
fp=fopen(fname,"r");
if (!fp) return NULL;
while (1)
{
len=fread(buf,1,100,fp);
if (len==-1)
goto sysfail;
lsize=size;
size+=len;
pt=(char *)realloc(pt,size+1);
if (len==0)
{
pt[size]='\0';
break;
}
if (!pt)
goto sysfail;
memcpy(pt+lsize,buf,len);
}
fclose(fp);
pt[size]='\0';
*fsize=size;
return pt;
sysfail:
fclose(fp);
if (pt)
free(pt);
return NULL;
}
static int rtk_auto_detect_ssid(int band_chk,char* ssid_buf, char* result)
{
char file_name[128], substrl[128], strNULL[]="";
char *getptr1, *getptr2, *substrr, *gettmp[128];
int fsize, idlength=0, cmpresult=0;
struct stat status;
struct save_fuple *bandlist;
struct save_fuple getSsidRule0[] = {
{ 5 , "-2.4G" , "-5G" , "" },
{ 5 , "_2.4G" , "_5G" , "" },
{ 5 , ".2.4G" , ".5G" , "" },
{ 5 , " 2.4G" , " 5G" , "" },
{ 5 , "-2.4g" , "-5g" , "" },
{ 5 , "_2.4g" , "_5g" , "" },
{ 5 , ".2.4g" , ".5g" , "" },
{ 5 , " 2.4g" , " 5g" , "" },
{ 4 , "2.4G" , "5G" , "" },
{ 4 , "2.4g" , "5g" , "" },
{ 4 , "-2.4" , "-5" , "" },
{ 4 , "_2.4" , "_5" , "" },
{ 4 , ".2.4" , ".5" , "" },
{ 4 , " 2.4" , " 5" , "" },
{ 3 , "2.4" , "5" , "" },
{ 3 , "-2G" , "-5G" , "" },
{ 3 , "_2G" , "_5G" , "" },
{ 3 , ".2G" , ".5G" , "" },
{ 3 , " 2G" , " 5G" , "" },
{ 3 , "-2g" , "-5g" , "" },
{ 0 , "_2g" , "_5g" , "" },
{ 3 , ".2g" , ".5g" , "" },
{ 3 , " 2g" , " 5g" , "" },
{ 2 , "2G" , "5G" , "" },
{ 2 , "2g" , "5g" , "" },
{ 2 , "-2" , "-5" , "" },
{ 2 , "_2" , "_5" , "" },
{ 2 , ".2" , ".5" , "" },
{ 2 , " 2" , " 5" , "" },
{ 1 , "2" , "5" , "" },
{ 0 , "" , "-5G" , "" },
{ 0 , "" , "_5G" , "" },
{ 0 , "" , ".5G" , "" },
{ 0 , "" , " 5G" , "" },
{ 0 , "" , "-5g" , "" },
{ 0 , "" , "_5g" , "" },
{ 0 , "" , ".5g" , "" },
{ 0 , "" , " 5g" , "" },
{ 0 , "" , "5G" , "" },
{ 0 , "" , "5g" , "" },
{ 0 , "" , "-5" , "" },
{ 0 , "" , "_5" , "" },
{ 0 , "" , ".5" , "" },
{ 0 , "" , " 5" , "" },
{ 0 , "" , "5" , "" },
{ 0 , "" , "" , "" },
{ 99 , "" , "" , "" }
};
struct save_fuple getSsidRule1[] = {
{ 3 , "-5G" , "-2G" , "-2.4G" },
{ 3 , "_5G" , "_2G" , "_2.4G" },
{ 3 , ".5G" , ".2G" , ".2.4G" },
{ 3 , " 5G" , " 2G" , " 2.4G" },
{ 3 , "-5g" , "-2g" , "-2.4g" },
{ 3 , "_5g" , "_2g" , "_2.4g" },
{ 3 , ".5g" , ".2g" , ".2.4g" },
{ 3 , " 5g" , " 2g" , " 2.4g" },
{ 2 , "5G" , "2G" , "2.4G" },
{ 2 , "5g" , "2g" , "2.4g" },
{ 2 , "-5" , "-2" , "-2.4" },
{ 2 , "_5" , "_2" , "_2.4" },
{ 2 , ".5" , ".2" , ".2.4" },
{ 2 , " 5" , " 2" , " 2.4" },
{ 1 , "5" , "2" , "2.4" },
{ 0 , "" , "-2G" , "-2.4G" },
{ 0 , "" , "_2G" , "_2.4G" },
{ 0 , "" , ".2G" , ".2.4G" },
{ 0 , "" , " 2G" , " 2.4G" },
{ 0 , "" , "-2g" , "-2.4g" },
{ 0 , "" , "_2g" , "_2.4g" },
{ 0 , "" , ".2g" , ".2.4g" },
{ 0 , "" , " 2g" , " 2.4g" },
{ 0 , "" , "2G" , "2.4G" },
{ 0 , "" , "2g" , "2.4g" },
{ 0 , "" , "-2" , "-2.4" },
{ 0 , "" , "_2" , "_2.4" },
{ 0 , "" , ".2" , ".2.4" },
{ 0 , "" , " 2" , " 2.4" },
{ 0 , "" , "2" , "2.4" },
{ 0 , "" , "" , "" },
{ 99 , "" , "" , "" }
};
//Get another band's SSID list
if(band_chk == 0)
{
sprintf(file_name,RTK_SCAN_LIST_2G);
while(!stat("/var/pbc_state1_cancel", &status) != 0); // file exists, wps not stopped
}
else if(band_chk == 1)
{
sprintf(file_name,RTK_SCAN_LIST_5G);
while(!stat("/var/pbc_state2_cancel", &status) != 0); // file exists, wps not stopped
}
if( access( file_name, F_OK ) != -1 ) {
getptr1 = rtk_readfile(file_name, &fsize);
getptr2 = strstr(getptr1, "\n");
while( getptr2 != NULL ) {
*getptr2 = '\0';
gettmp[idlength] = getptr1;
getptr1 = getptr2 + 1;
getptr2 = strstr(getptr1, "\n");
idlength ++;
}
}
if ( band_chk )
bandlist = getSsidRule0;
else
bandlist = getSsidRule1;
//compare the SSID with SCAN LIST
while( bandlist->length != 99 ) {
if ( strlen(ssid_buf) > bandlist->length )
substrr = ssid_buf + strlen(ssid_buf) - bandlist->length;
else {
bandlist++;
continue;
}
if( bandlist->length == 0 ) {
strcpy( substrl, ssid_buf );
if ( rtk_comparetmp( gettmp, idlength, substrl, bandlist->setpart1 ) ) {
cmpresult=1;
break ;
}
if ( strcmp(bandlist->setpart2, "")) {
if ( rtk_comparetmp( gettmp, idlength, substrl, bandlist->setpart2 ) ) {
cmpresult=1;
break;
}
}
}
else if( !strcmp(substrr, bandlist->cmppart) ){
strncpy( substrl, ssid_buf, strlen(ssid_buf)-bandlist->length );
if( rtk_comparetmp( gettmp, idlength, substrl, bandlist->setpart1 ) ) {
cmpresult=1;
break;
}
if ( strcmp(bandlist->setpart2, "")) {
if ( rtk_comparetmp( gettmp, idlength, substrl, bandlist->setpart2 ) ) {
cmpresult=1;
break;
}
}
if ( rtk_comparetmp( gettmp, idlength, substrl, strNULL ) ) {
cmpresult = 1;
break;
}
}
bandlist++;
}
if( cmpresult == 1 ) {
TRACE_PT("=== Find the SSID : [ %s ]\n", substrl);
strcpy(result,substrl);
}
else
TRACE_PT("=== Can't find the SSID : [ ]\n");
return cmpresult;
}
#endif
static char *rtk_get_token(char *data, char *token)
{
char *ptr=data;
int len=0, idx=0;
while (*ptr && *ptr != '\n' ) {
if (*ptr == '=') {
if (len <= 1)
return NULL;
memcpy(token, data, len);
/* delete ending space */
for (idx=len-1; idx>=0; idx--) {
if (token[idx] != ' ')
break;
}
token[idx+1] = '\0';
return ptr+1;
}
len++;
ptr++;
}
return NULL;
}
static int rtk_get_value(char *data, char *value)
{
char *ptr=data;
int len=0, idx, i;
while (*ptr && *ptr != '\n' && *ptr != '\r') {
len++;
ptr++;
}
/* delete leading space */
idx = 0;
while (len-idx > 0) {
if (data[idx] != ' ')
break;
idx++;
}
len -= idx;
/* delete bracing '"' */
if (data[idx] == '"') {
for (i=idx+len-1; i>idx; i--) {
if (data[i] == '"') {
idx++;
len = i - idx;
}
break;
}
}
if (len > 0) {
memcpy(value, &data[idx], len);
value[len] = '\0';
}
return len;
}
int rtk_get_wps_result(char* result_file,rtk_wps_result* res)
{
FILE* fp;
char buffer[256] = {'\0'};
char value[100],token[40];
char* ptr;
if(result_file == NULL || res == NULL)
{
return -1;
}
fp = fopen(result_file,"r");
if(fp != NULL)
{
while(fgets(buffer,sizeof(buffer),fp))
{
ptr = rtk_get_token(buffer, token);
if (ptr == NULL)
continue;
if (rtk_get_value(ptr, value)==0)
continue;
if(strncmp(token,"INTERFACE",strlen("INTERFACE")) == 0)
{
#ifdef RPAC92
if (!strcmp(value, "wlan2") || !strcmp(value, "wlan2-vxd"))
#else
if (!strcmp(value, "wl0") || !strcmp(value, "wl0-vxd"))
#endif
res->band = 0;
else
res->band = 1;
TRACE_PT("band=%d\n",res->band);
continue;
}
if(strncmp(token,"SSID",strlen("SSID")) == 0)
{
strcpy(res->ssid,value);
TRACE_PT("SSID=%s\n",res->ssid);
continue;
}
if(strncmp(token,"WSC_SSID",strlen("WSC_SSID")) == 0)
{
strcpy(res->wsc_ssid,value);
TRACE_PT("WSC_SSID=%s\n",res->wsc_ssid);
continue;
}
if(strncmp(token,"AUTH_TYPE",strlen("AUTH_TYPE")) == 0)
{
res->auth_type = atoi(value);
TRACE_PT("auth_type:%d\n",res->auth_type);
continue;
}
if(strncmp(token,"ENCRYPT",strlen("ENCRYPT")) == 0)
{
res->encrypt = atoi(value);
TRACE_PT("ENCRYPT:%d\n",res->encrypt);
continue;
}
if(strncmp(token,"WSC_AUTH",strlen("WSC_AUTH")) == 0)
{
res->wsc_auth = atoi(value);
TRACE_PT("WSC_AUTH:%d\n",res->wsc_auth);
continue;
}
if(strncmp(token,"WPA_AUTH",strlen("WPA_AUTH")) == 0)
{
res->wpa_auth = atoi(value);
TRACE_PT("WPA_AUTH:%d\n",res->wpa_auth);
continue;
}
if(strncmp(token,"WPA_PSK",strlen("WPA_PSK")) == 0)
{
strcpy(res->wpa_psk,value);
TRACE_PT("WPA_PSK:%s\n",res->wpa_psk);
continue;
}
if(strncmp(token,"PSK_FORMAT",strlen("PSK_FORMAT")) == 0)
{
res->psk_format = atoi(value);
TRACE_PT("PSK_FORMAT:%d\n",res->psk_format);
continue;
}
if(strncmp(token,"WSC_PSK",strlen("WSC_PSK")) == 0)
{
strcpy(res->wsc_psk,value);
TRACE_PT("WSC_PSK:%s\n",res->wsc_psk);
continue;
}
if(strncmp(token,"WPA_CIPHER_SUITE",strlen("WPA_CIPHER_SUITE")) == 0)
{
res->wpa_suite = atoi(value);
TRACE_PT("WPA_CIPHER_SUITE:%d\n",res->wpa_suite);
continue;
}
if(strncmp(token,"WPA2_CIPHER_SUITE",strlen("WPA2_CIPHER_SUITE")) == 0)
{
res->wpa2_suite = atoi(value);
TRACE_PT("WPA2_CIPHER_SUITE:%d\n",res->wpa2_suite);
continue;
}
if(strncmp(token,"WEP",strlen("WEP")) == 0)
{
res->wep = atoi(value);
TRACE_PT("wep:%d\n",res->wep);
continue;
}
if(strncmp(token,"WSC_ENC",strlen("WSC_ENC")) == 0)
{
res->wsc_enc = atoi(value);
TRACE_PT("WSC_ENC:%d\n",res->wsc_enc);
continue;
}
}
fclose(fp);
}
return 0;
}
/* mode=0: Both get WiFi profile. mode=1: Only one band get WiFi profile. */
int set_wps_result_to_ap_nvram(int mode, int src_unit, int dst_unit)
{
char prefix[]="wlXXXXXX_";
char prefix_1[]="wlXXXXX.1";
char wlc_prefix[]="wlcXXXXX_";
char tmp[32] = {0}, buf[128] = {0};
int ncount;
#ifdef RTCONFIG_CONCURRENTREPEATER
snprintf(prefix, sizeof(prefix), "wl%d_", dst_unit);
snprintf(prefix_1, sizeof(prefix_1), "wl%d.1_", dst_unit);
snprintf(wlc_prefix, sizeof(wlc_prefix), "wlc%d_", src_unit);
#else
strcpy(prefix, "wl_");
strcpy(wlc_prefix, "wlc_");
#endif
/* Set SSID */
strcpy(buf, nvram_safe_get(strcat_r(wlc_prefix, "ssid", tmp)));
ncount = sizeof(buf) - strlen(buf) - 1;
if (src_unit == 0 && dst_unit == 0) // 2.4G to 2.4G
strncat(buf, "_RPT", ncount);
else if (src_unit == 0 && dst_unit == 1) // 2.4G to 5G
strncat(buf, "_RPT5G", ncount);
else if (src_unit == 1 && dst_unit == 0) // 5G to 2.4G
strncat(buf, "_RPT", ncount);
else if (src_unit == 1 && dst_unit == 1 && mode == 0) // 5G to 5G
strncat(buf, "_RPT", ncount);
else if (src_unit == 1 && dst_unit == 1 && mode != 0) // 5G to 5G
strncat(buf, "_RPT5G", ncount);
nvram_set(strcat_r(prefix, "ssid", tmp), buf);
#ifdef RTCONFIG_CONCURRENTREPEATER
nvram_set(strcat_r(prefix_1, "ssid", tmp), buf);
#endif
/* Set WPS PSK */
strcpy(buf, nvram_safe_get(strcat_r(wlc_prefix, "wpa_psk", tmp)));
nvram_set(strcat_r(prefix, "wpa_psk", tmp), buf);
#ifdef RTCONFIG_CONCURRENTREPEATER
nvram_set(strcat_r(prefix_1, "wpa_psk", tmp), buf);
#endif
/* Set auth node*/
strcpy(buf, nvram_safe_get(strcat_r(wlc_prefix, "auth_mode", tmp)));
nvram_set(strcat_r(prefix, "auth_mode_x", tmp), buf);
#ifdef RTCONFIG_CONCURRENTREPEATER
nvram_set(strcat_r(prefix_1, "auth_mode_x", tmp), buf);
#endif
/* Set crypto */
strcpy(buf, nvram_safe_get(strcat_r(wlc_prefix, "crypto", tmp)));
nvram_set(strcat_r(prefix, "crypto", tmp), buf);
#ifdef RTCONFIG_CONCURRENTREPEATER
nvram_set(strcat_r(prefix_1, "crypto", tmp), buf);
#endif
return 0;
}
int rtk_set_wps_result_to_nvram(rtk_wps_result res)
{
int sw_mode = -1;
int wps_band = -1;
char temp_str[64] = {'\0'};
char auth_mode_str[32] = {'\0'};
char crypto_str[32] = {'\0'};
char wlc_auth_mode[64];
char wlc_crypto[64];
sw_mode = sw_mode();
if(sw_mode == SW_MODE_REPEATER || (sw_mode == SW_MODE_AP && nvram_get_int("wlc_psta") == 1)) /* repeater mode & media bridge */
{
if(nvram_match("x_Setting","0")
#ifdef RTCONFIG_AMAS
&& !nvram_get_int("wps_amas_enrollee")
#endif
)
{
nvram_set("x_Setting","1");
}