1#ifndef __SHARED_H__
2#define __SHARED_H__
3
4#include <rtconfig.h>
5#include <netinet/in.h>
6#include <stdint.h>
7#include <errno.h>
8#include <net/if.h>
9#include <rtstate.h>
10#include <stdarg.h>
11
12#ifdef RTCONFIG_USB
13#include <mntent.h>	// !!TB
14#endif
15
16/* btn_XXX_gpio, led_XXX_gpio */
17#define GPIO_ACTIVE_LOW 0x1000
18#define GPIO_BLINK_LED	0x2000
19#define GPIO_PIN_MASK	0x00FF
20
21#define GPIO_DIR_IN	0
22#define GPIO_DIR_OUT	1
23
24#ifdef RTCONFIG_INTERNAL_GOBI
25#define DEF_SECOND_WANIF	"usb"
26#else
27#define DEF_SECOND_WANIF	"none"
28#endif
29
30#define ACTION_LOCK		"/var/lock/action"
31
32#ifdef RTCONFIG_PUSH_EMAIL
33//#define logmessage logmessage_push
34#define logmessage logmessage_normal	//tmp
35#else
36#define logmessage logmessage_normal
37#endif
38
39#ifdef RTCONFIG_DSL
40#define SYNC_LOG_FILE "/tmp/adsl/sync_status_log.txt"
41#define LOG_RECORD_FILE "/tmp/adsl/log_record.txt"
42#endif
43
44#define Y2K			946684800UL		// seconds since 1970
45
46#define ASIZE(array)	(sizeof(array) / sizeof(array[0]))
47
48#ifdef LINUX26
49#define	MTD_DEV(arg)	"/dev/mtd"#arg
50#define	MTD_BLKDEV(arg)	"/dev/mtdblock"#arg
51#define	DEV_GPIO(arg)	"/dev/gpio"#arg
52#else
53#define	MTD_DEV(arg)	"/dev/mtd/"#arg
54#define	MTD_BLKDEV(arg)	"/dev/mtdblock/"#arg
55#define	DEV_GPIO(arg)	"/dev/gpio/"#arg
56#endif
57
58#if defined(RTCONFIG_DEFAULT_AP_MODE)
59#define DUT_DOMAIN_NAME "ap.asus.com"
60#else
61#define DUT_DOMAIN_NAME "router.asus.com"
62#endif
63#define OLD_DUT_DOMAIN_NAME1 "www.asusnetwork.net"
64#define OLD_DUT_DOMAIN_NAME2 "www.asusrouter.com"
65
66//version.c
67extern const char *rt_version;
68extern const char *rt_serialno;
69extern const char *rt_extendno;
70extern const char *rt_buildname;
71extern const char *rt_buildinfo;
72extern const char *rt_swpjverno;
73
74#ifdef DEBUG_NOISY
75#define _dprintf		cprintf
76#define csprintf		cprintf
77#else
78#define _dprintf(args...)	do { } while(0)
79#define csprintf(args...)	do { } while(0)
80#endif
81
82#define ASUS_STOP_COMMIT	"asus_stop_commit"
83#define LED_CTRL_HIPRIO 	"LED_CTRL_HIPRIO"
84
85#ifdef RTCONFIG_IPV6
86enum {
87	IPV6_DISABLED = 0,
88	IPV6_NATIVE_DHCP,
89#ifdef RTCONFIG_6RELAYD
90	IPV6_PASSTHROUGH,
91#endif
92	IPV6_6TO4,
93	IPV6_6IN4,
94	IPV6_6RD,
95	IPV6_MANUAL
96};
97
98#ifndef RTF_UP
99/* Keep this in sync with /usr/src/linux/include/linux/route.h */
100#define RTF_UP		0x0001  /* route usable			*/
101#define RTF_GATEWAY     0x0002  /* destination is a gateway	*/
102#define RTF_HOST	0x0004  /* host entry (net otherwise)	*/
103#define RTF_REINSTATE   0x0008  /* reinstate route after tmout	*/
104#define RTF_DYNAMIC     0x0010  /* created dyn. (by redirect)	*/
105#define RTF_MODIFIED    0x0020  /* modified dyn. (by redirect)	*/
106#endif
107#ifndef RTF_DEFAULT
108#define	RTF_DEFAULT	0x00010000	/* default - learned via ND	*/
109#define	RTF_ADDRCONF	0x00040000	/* addrconf route - RA		*/
110#define	RTF_CACHE	0x01000000	/* cache entry			*/
111#endif
112#define IPV6_MASK (RTF_GATEWAY|RTF_HOST|RTF_DEFAULT|RTF_ADDRCONF|RTF_CACHE)
113#endif
114
115#define GIF_LINKLOCAL  0x0001  /* return link-local addr */
116#define GIF_PREFIXLEN  0x0002  /* return prefix length */
117#define GIF_PREFIX     0x0004  /* return prefix, not addr */
118
119#define EXTEND_AIHOME_API_LEVEL		6
120#define EXTEND_HTTPD_AIHOME_VER		0
121
122#define EXTEND_ASSIA_API_LEVEL		1
123
124enum {
125	FROM_BROWSER,
126	FROM_ASUSROUTER,
127	FROM_DUTUtil,
128	FROM_ASSIA,
129	FROM_IFTTT,
130	FROM_UNKNOWN
131};
132
133enum {
134	ACT_IDLE,
135	ACT_TFTP_UPGRADE_UNUSED,
136	ACT_WEB_UPGRADE,
137	ACT_WEBS_UPGRADE_UNUSED,
138	ACT_SW_RESTORE,
139	ACT_HW_RESTORE,
140	ACT_ERASE_NVRAM,
141	ACT_NVRAM_COMMIT,
142	ACT_REBOOT,
143	ACT_UNKNOWN
144};
145
146typedef struct {
147	int count;
148	struct {
149		struct in_addr addr;
150		unsigned short port;
151	} dns[3];
152} dns_list_t;
153
154typedef struct {
155	int count;
156	struct {
157		char name[IFNAMSIZ + 1];
158		char ip[sizeof("xxx.xxx.xxx.xxx") + 1];
159	} iface[2];
160} wanface_list_t;
161
162extern char *read_whole_file(const char *target);
163extern char *get_line_from_buffer(const char *buf, char *line, const int line_size);
164extern char *get_upper_str(const char *const str, char **target);
165extern int upper_strcmp(const char *const str1, const char *const str2);
166extern int upper_strncmp(const char *const str1, const char *const str2, int count);
167extern char *upper_strstr(const char *const str, const char *const target);
168
169extern void chld_reap(int sig);
170extern int get_wan_proto(void);
171#ifdef RTCONFIG_IPV6
172extern char *ipv6_nvname(const char *name);
173extern char *ipv6_nvname_by_unit(const char *name, int unit);
174extern int get_ipv6_service(void);
175extern int get_ipv6_service_by_unit(int unit);
176#define ipv6_enabled()	(get_ipv6_service() != IPV6_DISABLED)
177extern const char *ipv6_router_address(struct in6_addr *in6addr);
178extern const char *ipv6_gateway_address(void);
179#else
180#define ipv6_enabled()	(0)
181#endif
182extern void notice_set(const char *path, const char *format, ...);
183#if defined(RTAC1200HP)
184extern void led_5g_onoff(void);
185#endif
186extern void set_action(int a);
187extern int check_action(void);
188extern int wait_action_idle(int n);
189extern int wl_client(int unit, int subunit);
190extern const char *_getifaddr(const char *ifname, int family, int flags, char *buf, int size);
191extern const char *getifaddr(const char *ifname, int family, int flags);
192extern long uptime(void);
193extern char *wl_nvname(const char *nv, int unit, int subunit);
194extern int get_radio(int unit, int subunit);
195extern void set_radio(int on, int unit, int subunit);
196extern int nvram_get_int(const char *key);
197extern int nvram_set_int(const char *key, int value);
198extern double nvram_get_double(const char *key);
199extern int nvram_set_double(const char *key, double value);
200
201//	extern long nvram_xget_long(const char *name, long min, long max, long def);
202#ifdef RTCONFIG_SSH
203extern int nvram_get_file(const char *key, const char *fname, int max);
204extern int nvram_set_file(const char *key, const char *fname, int max);
205#endif
206extern int nvram_contains_word(const char *key, const char *word);
207extern int nvram_is_empty(const char *key);
208extern void nvram_commit_x(void);
209extern int connect_timeout(int fd, const struct sockaddr *addr, socklen_t len, int timeout);
210extern int mtd_getinfo(const char *mtdname, int *part, int *size);
211#if defined(RTCONFIG_UBIFS)
212extern int ubi_getinfo(const char *ubiname, int *dev, int *part, int *size);
213#endif
214extern int foreach_wif(int include_vifs, void *param,
215	int (*func)(int idx, int unit, int subunit, void *param));
216
217//shutils.c
218extern void dbgprintf (const char * format, ...); //Ren
219extern void cprintf(const char *format, ...);
220extern int _eval(char *const argv[], const char *path, int timeout, int *ppid);
221extern char *enc_str(char *str, char *enc_buf);
222extern char *dec_str(char *ec_str, char *dec_buf);
223
224// usb.c
225#ifdef RTCONFIG_USB
226extern char *detect_fs_type(char *device);
227extern struct mntent *findmntents(char *file, int swp,
228	int (*func)(struct mntent *mnt, uint flags), uint flags);
229extern int find_label_or_uuid(char *dev_name, char *label, char *uuid);
230extern void add_remove_usbhost(char *host, int add);
231
232#define DEV_DISCS_ROOT	"/dev/discs"
233
234/* Flags used in exec_for_host calls
235 */
236#define EFH_1ST_HOST	0x00000001	/* func is called for the 1st time for this host */
237#define EFH_1ST_DISC	0x00000002	/* func is called for the 1st time for this disc */
238#define EFH_HUNKNOWN	0x00000004	/* host is unknown */
239#define EFH_USER	0x00000008	/* process is user-initiated - either via Web GUI or a script */
240#define EFH_SHUTDN	0x00000010	/* exec_for_host is called at shutdown - system is stopping */
241#define EFH_HP_ADD	0x00000020	/* exec_for_host is called from "add" hotplug event */
242#define EFH_HP_REMOVE	0x00000040	/* exec_for_host is called from "remove" hotplug event */
243#define EFH_PRINT	0x00000080	/* output partition list to the web response */
244
245typedef int (*host_exec)(char *dev_name, int host_num, char *dsc_name, char *pt_name, uint flags);
246extern int exec_for_host(int host, int obsolete, uint flags, host_exec func);
247extern int is_no_partition(const char *discname);
248#endif //RTCONFIG_USB
249
250// id.c
251enum {
252	MODEL_UNKNOWN = 0,
253	MODEL_DSLN55U,
254	MODEL_DSLAC68U,
255	MODEL_EAN66,
256	MODEL_RTN11P,
257	MODEL_RTN300,
258	MODEL_RTN13U,
259	MODEL_RTN14U,
260	MODEL_RTAC52U,
261	MODEL_RTAC51U,
262	MODEL_RTN54U,
263	MODEL_RTAC54U,
264	MODEL_RTN56UB1,
265	MODEL_RTN56UB2,
266	MODEL_RTAC1200HP,
267	MODEL_RTAC55U,
268	MODEL_RTAC55UHP,
269	MODEL_RT4GAC55U,
270	MODEL_PLN12,
271	MODEL_PLAC56,
272	MODEL_PLAC66U,
273	MODEL_RTN36U3,
274	MODEL_RTN56U,
275	MODEL_RTN65U,
276	MODEL_RTN67U,
277	MODEL_RTN12,
278	MODEL_RTN12B1,
279	MODEL_RTN12C1,
280	MODEL_RTN12D1,
281	MODEL_RTN12VP,
282	MODEL_RTN12HP,
283	MODEL_RTN12HP_B1,
284	MODEL_APN12,
285	MODEL_APN12HP,
286	MODEL_RTN16,
287	MODEL_RTN18U,
288	MODEL_RTN15U,
289	MODEL_RTN53,
290	MODEL_RTN66U,
291	MODEL_RTAC66U,
292	MODEL_RTAC68U,
293	MODEL_RPAC68U,
294	MODEL_RTAC87U,
295	MODEL_RTAC56S,
296	MODEL_RTAC56U,
297	MODEL_RTAC53U,
298	MODEL_RTAC3200,
299	MODEL_RTAC88U,
300	MODEL_RTAC3100,
301	MODEL_RTAC5300,
302	MODEL_RTAC5300R,
303	MODEL_RTN14UHP,
304	MODEL_RTN10U,
305	MODEL_RTN10P,
306	MODEL_RTN10D1,
307	MODEL_RTN10PV2,
308	MODEL_RTAC1200G,
309	MODEL_RTAC1200GP,
310	MODEL_GENERIC
311};
312
313enum {
314	SWITCH_UNKNOWN,
315	SWITCH_BCM5325,
316	SWITCH_BCM53115,
317	SWITCH_BCM53125,
318	SWITCH_BCM5301x,
319	SWITCH_GENERIC
320};
321
322#define RTCONFIG_NVRAM_VER "1"
323
324/* NOTE: Do not insert new entries in the middle of this enum,
325 * always add them to the end! The numeric Hardware ID value is
326 * stored in the configuration file, and is used to determine
327 * whether or not this config file can be restored on the router.
328 */
329enum {
330	HW_BCM4702,
331	HW_BCM4712,
332	HW_BCM5325E,
333	HW_BCM4704_BCM5325F,
334	HW_BCM5352E,
335	HW_BCM5354G,
336	HW_BCM4712_BCM5325E,
337	HW_BCM4704_BCM5325F_EWC,
338	HW_BCM4705L_BCM5325E_EWC,
339	HW_BCM5350,
340	HW_BCM5356,
341	HW_BCM4716,
342	HW_BCM4718,
343	HW_BCM4717,
344	HW_BCM5365,
345	HW_BCM4785,
346	HW_UNKNOWN
347};
348
349#define SUP_SES			(1 << 0)
350#define SUP_BRAU		(1 << 1)
351#define SUP_AOSS_LED		(1 << 2)
352#define SUP_WHAM_LED		(1 << 3)
353#define SUP_HPAMP		(1 << 4)
354#define SUP_NONVE		(1 << 5)
355#define SUP_80211N		(1 << 6)
356#define SUP_1000ET		(1 << 7)
357
358extern int check_hw_type(void);
359//	extern int get_hardware(void) __attribute__ ((weak, alias ("check_hw_type")));
360extern int get_model(void);
361extern char *get_modelid(int model);
362extern char *get_productid(void);
363extern int get_switch(void);
364extern int supports(unsigned long attr);
365
366// pids.c
367extern int pids(char *appname);
368
369// process.c
370extern char *psname(int pid, char *buffer, int maxlen);
371extern int pidof(const char *name);
372extern int killall(const char *name, int sig);
373extern int process_exists(pid_t pid);
374extern int module_loaded(const char *module);
375
376// files.c
377extern int check_if_dir_empty(const char *dirpath);
378extern int file_lock(char *tag);
379extern void file_unlock(int lockfd);
380
381
382#define FW_CREATE	0
383#define FW_APPEND	1
384#define FW_NEWLINE	2
385
386#define ACTION_LOCK_FILE "/var/lock/a_w_l" // action write lock
387
388extern unsigned long f_size(const char *path);
389extern int f_exists(const char *file);
390extern int d_exists(const char *path);
391extern int f_read_excl(const char *path, void *buffer, int max);
392extern int f_read(const char *file, void *buffer, int max);												// returns bytes read
393extern int f_write_excl(const char *path, const void *buffer, int len, unsigned flags, unsigned cmode);
394extern int f_write(const char *file, const void *buffer, int len, unsigned flags, unsigned cmode);		//
395extern int f_read_string(const char *file, char *buffer, int max);										// returns bytes read, not including term; max includes term
396extern int f_write_string(const char *file, const char *buffer, unsigned flags, unsigned cmode);		//
397extern int f_read_alloc(const char *path, char **buffer, int max);
398extern int f_read_alloc_string(const char *path, char **buffer, int max);
399extern int f_wait_exists(const char *name, int max);
400extern int f_wait_notexists(const char *name, int max);
401
402
403// button & led
404#define BTN_RESET			0
405#define BTN_WPS				1
406#define BTN_FAN				2
407#define BTN_HAVE_FAN			3
408#define BTN_WIFI_SW			4
409#define BTN_SWMODE_SW_ROUTER		5
410#define BTN_SWMODE_SW_REPEATER		6
411#define BTN_SWMODE_SW_AP		7
412#define BTN_WIFI_TOG			8
413#define BTN_TURBO			9
414#define BTN_LED				0xA
415#define BTN_LTE				11
416
417enum led_id {
418	LED_POWER = 0,
419	LED_USB,
420	LED_WPS,
421	FAN,
422	HAVE_FAN,
423	LED_LAN,
424	LED_WAN,
425	LED_2G,
426	LED_5G,
427	LED_USB3,
428#ifdef RTCONFIG_LAN4WAN_LED
429	LED_LAN1,
430	LED_LAN2,
431	LED_LAN3,
432	LED_LAN4,
433#endif
434	LED_TURBO,
435	LED_WAN_RED,
436#ifdef RTCONFIG_QTN
437	BTN_QTN_RESET,	/* QTN platform uses led_control() to control this gpio. */
438#endif
439#ifdef RTCONFIG_LED_ALL
440	LED_ALL,
441#endif
442#ifdef RTCONFIG_INTERNAL_GOBI
443	LED_3G,
444	LED_LTE,
445	LED_SIG1,
446	LED_SIG2,
447	LED_SIG3,
448	LED_SIG4,
449#endif
450#if (defined(PLN12) || defined(PLAC56))
451	PLC_WAKE,
452	LED_POWER_RED,
453	LED_2G_GREEN,
454	LED_2G_ORANGE,
455	LED_2G_RED,
456	LED_5G_GREEN,
457	LED_5G_ORANGE,
458	LED_5G_RED,
459#endif
460#ifdef RTCONFIG_MMC_LED
461	LED_MMC,
462#endif
463#ifdef RTCONFIG_RESET_SWITCH
464	LED_RESET_SWITCH,
465#endif
466#if defined(RTAC5300) || defined(RTAC5300R)
467	RPM_FAN,	/* use to control FAN RPM (Hi/Lo) */
468#endif
469	LED_ID_MAX,	/* last item */
470};
471
472enum led_fan_mode_id {
473	LED_OFF = 0,
474	LED_ON,
475	FAN_OFF,
476	FAN_ON,
477	HAVE_FAN_OFF,
478	HAVE_FAN_ON,
479
480	LED_FAN_MODE_MAX,	/* last item */
481};
482
483static inline int have_usb3_led(int model)
484{
485	switch (model) {
486		case MODEL_RTN18U:
487		case MODEL_RTAC56U:
488		case MODEL_RTAC56S:
489		case MODEL_RTAC68U:
490#ifndef RTCONFIG_ETRON_XHCI_USB3_LED
491		case MODEL_RTAC55U:
492		case MODEL_RTAC55UHP:
493#endif
494		case MODEL_DSLAC68U:
495		case MODEL_RTAC3200:
496		case MODEL_RTAC88U:
497		case MODEL_RTAC3100:
498		case MODEL_RTAC5300:
499		case MODEL_RTAC5300R:
500			return 1;
501	}
502	return 0;
503}
504
505#define MAX_NR_WLVIF			3
506enum iface_id {
507	IFACE_INTERNET = 0,		/* INTERNET: Only one interface can be considered as INTERNET. */
508	IFACE_WIRED,
509	IFACE_BRIDGE,
510
511	IFACE_WL0,			/* WIRELESS0 */
512	IFACE_WL1,			/* WIRELESS1, may not exist. */
513
514	IFACE_MAIN_IF_MAX,
515
516	IFACE_WL0_0,					/* WIRELESS0.0 */
517	IFACE_WL1_0 = IFACE_WL0_0 + MAX_NR_WLVIF,	/* WIRELESS1.0, may not exist. */
518
519	IFACE_MAX,			/* last item */
520};
521
522struct if_stats {
523	char ifname[IFNAMSIZ];
524	unsigned long rx, tx;
525};
526
527/* INTERNET interface may varies at run-time.
528 * The rx_shift and tx_shirt are used to report
529 * continuously statistice information to upper-level code,
530 * e.g. Web UI
531 */
532struct ifaces_stats {
533	struct if_stats iface[IFACE_MAIN_IF_MAX];
534	unsigned long rx_shift, tx_shift;
535};
536
537
538#ifndef ARRAY_SIZE
539#define ARRAY_SIZE(ary) (sizeof(ary) / sizeof((ary)[0]))
540#endif
541
542#if defined(RTCONFIG_HAS_5G)
543#define MAX_NR_WL_IF			2
544#else	/* ! RTCONFIG_HAS_5G */
545#define MAX_NR_WL_IF			1	/* Single 2G */
546#endif	/* ! RTCONFIG_HAS_5G */
547
548#if defined(RTCONFIG_RALINK) || defined(RTCONFIG_QCA)
549static inline int __access_point_mode(int sw_mode)
550{
551	return (sw_mode == SW_MODE_AP);
552}
553
554static inline int access_point_mode(void)
555{
556	return __access_point_mode(nvram_get_int("sw_mode"));
557}
558
559#if defined(RTCONFIG_WIRELESSREPEATER)
560static inline int __repeater_mode(int sw_mode)
561{
562	return (sw_mode == SW_MODE_REPEATER
563#if defined(RTCONFIG_PROXYSTA)
564		&& nvram_get_int("wlc_psta") != 1
565#endif
566		);
567}
568static inline int repeater_mode(void)
569{
570	return __repeater_mode(nvram_get_int("sw_mode"));
571}
572#else
573static inline int __repeater_mode(int sw_mode) { return 0; }
574static inline int repeater_mode(void) { return 0; }
575#endif
576
577#if defined(RTCONFIG_WIRELESSREPEATER) && defined(RTCONFIG_PROXYSTA)
578static inline int __mediabridge_mode(int sw_mode)
579{
580	return (sw_mode == SW_MODE_REPEATER && nvram_get_int("wlc_psta") == 1);
581}
582static inline int mediabridge_mode(void)
583{
584	return __mediabridge_mode(nvram_get_int("sw_mode"));
585}
586#else
587static inline int __mediabridge_mode(int sw_mode) { return 0; }
588static inline int mediabridge_mode(void) { return 0; }
589#endif
590#else
591/* Should be Broadcom platform. */
592static inline int __access_point_mode(int sw_mode)
593{
594	return (sw_mode == SW_MODE_AP
595#if defined(RTCONFIG_PROXYSTA)
596		&& !nvram_get_int("wlc_psta")
597#endif
598		);
599}
600
601static inline int access_point_mode(void)
602{
603	return __access_point_mode(nvram_get_int("sw_mode"));
604}
605
606#if defined(RTCONFIG_WIRELESSREPEATER)
607static inline int __repeater_mode(int sw_mode)
608{
609	return (sw_mode == SW_MODE_REPEATER);
610}
611static inline int repeater_mode(void)
612{
613	return __repeater_mode(nvram_get_int("sw_mode"));
614}
615#else
616static inline int __repeater_mode(int sw_mode) { return 0; }
617static inline int repeater_mode(void) { return 0; }
618#endif
619
620#if defined(RTCONFIG_WIRELESSREPEATER) && defined(RTCONFIG_PROXYSTA)
621static inline int __mediabridge_mode(int sw_mode)
622{
623	return (sw_mode == SW_MODE_AP && nvram_get_int("wlc_psta") == 1);
624}
625static inline int mediabridge_mode(void)
626{
627	return __mediabridge_mode(nvram_get_int("sw_mode"));
628}
629#else
630static inline int __mediabridge_mode(int sw_mode) { return 0; }
631static inline int mediabridge_mode(void) { return 0; }
632#endif
633#endif	/* RTCONFIG_RALINK || RTCONFIG_QCA */
634
635static inline int get_wps_multiband(void)
636{
637#if defined(RTCONFIG_WPSMULTIBAND)
638	return nvram_get_int("wps_multiband");
639#else
640	return 0;
641#endif
642}
643
644static inline int get_radio_band(int band)
645{
646#if defined(RTCONFIG_WPSMULTIBAND)
647	(void) band;
648	return -1;
649#else
650	return band;
651#endif
652}
653
654#ifdef RTCONFIG_DUALWAN
655static inline int dualwan_unit__usbif(int unit)
656{
657	return (get_dualwan_by_unit(unit) == WANS_DUALWAN_IF_USB);
658}
659
660static inline int dualwan_unit__nonusbif(int unit)
661{
662	int type = get_dualwan_by_unit(unit);
663#ifdef RTCONFIG_MULTICAST_IPTV
664        return (type == WANS_DUALWAN_IF_WAN || type == WANS_DUALWAN_IF_DSL || type == WANS_DUALWAN_IF_LAN ||
665		type == WAN_UNIT_IPTV || type == WAN_UNIT_VOIP);
666#else
667	return (type == WANS_DUALWAN_IF_WAN || type == WANS_DUALWAN_IF_DSL || type == WANS_DUALWAN_IF_LAN);
668#endif
669}
670extern int get_usbif_dualwan_unit(void);
671extern int get_primaryif_dualwan_unit(void);
672#else
673static inline int dualwan_unit__usbif(int unit)
674{
675#ifdef RTCONFIG_USB_MODEM
676	return (unit == WAN_UNIT_SECOND);
677#else
678	return 0;
679#endif
680}
681
682static inline int dualwan_unit__nonusbif(int unit)
683{
684#ifdef RTCONFIG_MULTICAST_IPTV
685	return (unit == WAN_UNIT_FIRST || unit == WAN_UNIT_IPTV || unit == WAN_UNIT_VOIP);
686#else
687	return (unit == WAN_UNIT_FIRST);
688#endif
689}
690static inline int get_usbif_dualwan_unit(void)
691{
692#ifdef RTCONFIG_USB_MODEM
693	return WAN_UNIT_SECOND;
694#else
695	return -1;
696#endif
697}
698static inline int get_primaryif_dualwan_unit(void)
699{
700	return wan_primary_ifunit();
701}
702#endif
703
704#if defined RTCONFIG_RALINK
705static inline int guest_wlif(char *ifname)
706{
707	return strncmp(ifname, "ra", 2) == 0 && !strchr(ifname, '0');
708}
709#elif defined(RTCONFIG_QCA)
710static inline int guest_wlif(char *ifname)
711{
712	return strncmp(ifname, "ath00",5)==0 || strncmp(ifname, "ath10",5)==0;
713}
714#else
715/* Broadcom platform. */
716static inline int guest_wlif(char *ifname)
717{
718	return strncmp(ifname, "wl", 2) == 0 && strchr(ifname, '.');
719}
720#endif
721
722extern int init_gpio(void);
723extern int set_pwr_usb(int boolOn);
724extern int button_pressed(int which);
725extern int led_control(int which, int mode);
726
727/* api-*.c */
728extern uint32_t gpio_dir(uint32_t gpio, int dir);
729extern uint32_t set_gpio(uint32_t gpio, uint32_t value);
730extern uint32_t get_gpio(uint32_t gpio);
731extern int get_switch_model(void);
732extern uint32_t get_phy_speed(uint32_t portmask);
733#if defined(RTCONFIG_RALINK_MT7620)
734extern int get_mt7620_wan_unit_bytecount(int unit, unsigned long *tx, unsigned long *rx);
735#elif defined(RTCONFIG_RALINK_MT7621)
736extern int get_mt7621_wan_unit_bytecount(int unit, unsigned long *tx, unsigned long *rx);
737#endif
738/* sysdeps/ralink/ *.c */
739#if defined(RTCONFIG_RALINK)
740extern int rtkswitch_ioctl(int val, int val2);
741extern unsigned int rtkswitch_wanPort_phyStatus(int wan_unit);
742extern unsigned int rtkswitch_lanPorts_phyStatus(void);
743extern unsigned int rtkswitch_WanPort_phySpeed(void);
744extern int rtkswitch_WanPort_linkUp(void);
745extern int rtkswitch_WanPort_linkDown(void);
746extern int rtkswitch_LanPort_linkUp(void);
747extern int rtkswitch_LanPort_linkDown(void);
748extern int rtkswitch_AllPort_linkUp(void);
749extern int rtkswitch_AllPort_linkDown(void);
750extern int rtkswitch_Reset_Storm_Control(void);
751extern int ralink_gpio_read_bit(int idx);
752extern int ralink_gpio_write_bit(int idx, int value);
753extern char *wif_to_vif(char *wif);
754extern int ralink_gpio_init(unsigned int idx, int dir);
755extern int config_rtkswitch(int argc, char *argv[]);
756extern int get_channel_list_via_driver(int unit, char *buffer, int len);
757extern int get_channel_list_via_country(int unit, const char *country_code, char *buffer, int len);
758#if defined(RTCONFIG_RALINK_MT7620)
759extern int __mt7620_wan_bytecount(int unit, unsigned long *tx, unsigned long *rx);
760#elif defined(RTCONFIG_RALINK_MT7620)
761extern int __mt7621_wan_bytecount(int unit, unsigned long *tx, unsigned long *rx);
762#endif
763
764#elif defined(RTCONFIG_QCA)
765extern char *wif_to_vif(char *wif);
766extern int config_rtkswitch(int argc, char *argv[]);
767extern unsigned int rtkswitch_wanPort_phyStatus(int wan_unit);
768extern unsigned int rtkswitch_lanPorts_phyStatus(void);
769extern unsigned int rtkswitch_WanPort_phySpeed(void);
770extern void ATE_qca8337_port_status(void);
771#else
772#define wif_to_vif(wif) (wif)
773extern int config_rtkswitch(int argc, char *argv[]);
774extern unsigned int rtkswitch_lanPorts_phyStatus(void);
775#endif
776
777#if defined(RTCONFIG_QCA)
778extern unsigned int rtkswitch_wanPort_phyStatus(int wan_unit);
779extern unsigned int rtkswitch_lanPorts_phyStatus(void);
780extern unsigned int rtkswitch_WanPort_phySpeed(void);
781extern int rtkswitch_WanPort_linkUp(void);
782extern int rtkswitch_WanPort_linkDown(void);
783extern int rtkswitch_LanPort_linkUp(void);
784extern int rtkswitch_LanPort_linkDown(void);
785extern int rtkswitch_AllPort_linkUp(void);
786extern int rtkswitch_AllPort_linkDown(void);
787extern int rtkswitch_Reset_Storm_Control(void);
788extern int get_qca8337_PHY_power(int port);
789#endif
790
791// base64.c
792extern int base64_encode(unsigned char *in, char *out, int inlen);		// returns amount of out buffer used
793extern int base64_decode(const char *in, unsigned char *out, int inlen);	// returns amount of out buffer used
794extern int base64_encoded_len(int len);
795extern int base64_decoded_len(int len);										// maximum possible, not actual
796
797/* boardapi.c */
798extern int extract_gpio_pin(const char *gpio);
799extern int lanport_status(void);
800
801/* discover.c */
802extern int discover_all(void);
803
804// strings.c
805extern int char_to_ascii_safe(const char *output, const char *input, int outsize);
806extern void char_to_ascii(const char *output, const char *input);
807extern int ascii_to_char_safe(const char *output, const char *input, int outsize);
808extern void ascii_to_char(const char *output, const char *input);
809extern const char *find_word(const char *buffer, const char *word);
810extern int remove_word(char *buffer, const char *word);
811
812// file.c
813extern int check_if_file_exist(const char *file);
814extern int check_if_dir_exist(const char *file);
815extern int check_if_dir_writable(const char *dir);
816
817/* misc.c */
818extern char *get_productid(void);
819extern void logmessage_normal(char *logheader, char *fmt, ...);
820extern char *get_logfile_path(void);
821extern char *get_syslog_fname(unsigned int idx);
822#ifdef RTCONFIG_USB_MODEM
823extern char *get_modemlog_fname(void);
824#endif
825#if defined(RTCONFIG_SSH) || defined(RTCONFIG_HTTPS)
826extern int nvram_get_file(const char *key, const char *fname, int max);
827extern int nvram_set_file(const char *key, const char *fname, int max);
828#endif
829extern int free_caches(const char *clean_mode, const int clean_time, const unsigned int threshold);
830extern void iface_name_str(enum iface_id id, char *str);
831extern int load_ifaces_stats(struct ifaces_stats *old, struct ifaces_stats *new, char *exclude);
832extern int update_6rd_info(void);
833extern int is_private_subnet(const char *ip);
834extern const char *get_wanface(void);
835extern const char *get_wanip(void);
836extern int is_intf_up(const char* ifname);
837extern uint32_t crc_calc(uint32_t crc, const char *buf, int len);
838#ifdef RTCONFIG_IPV6
839extern const char *get_wan6face(void);
840extern const char *ipv6_router_address(struct in6_addr *in6addr);
841extern const char *ipv6_address(const char *ipaddr6);
842extern const char *ipv6_prefix(struct in6_addr *in6addr);
843#if 0 /* unused */
844extern const char *ipv6_prefix(const char *ifname);
845extern int ipv6_prefix_len(const char *ifname);
846#endif
847extern void reset_ipv6_linklocal_addr(const char *ifname, int flush);
848extern int with_ipv6_linklocal_addr(const char *ifname);
849#if 1 /* temporary till httpd route table redo */
850extern void ipv6_set_flags(char *flagstr, int flags);
851extern char* INET6_rresolve(struct sockaddr_in6 *sin6, int numeric);
852#endif
853extern const char *ipv6_gateway_address(void);
854#endif
855#ifdef RTCONFIG_OPENVPN
856#if defined(RTCONFIG_JFFS2) || defined(RTCONFIG_BRCM_NAND_JFFS2) || defined(RTCONFIG_UBIFS)
857#define OVPN_FS_PATH	"/jffs/openvpn"
858#define MAX_OVPN_CLIENT	5
859#else
860#define MAX_OVPN_CLIENT	1
861#endif
862extern char *get_parsed_crt(const char *name, char *buf, size_t buf_len);
863extern int set_crt_parsed(const char *name, char *file_path);
864extern int ovpn_crt_is_empty(const char *name);
865#endif
866extern int get_wifi_unit(char *wif);
867extern int is_psta(int unit);
868extern int is_psr(int unit);
869extern int psta_exist();
870extern int psta_exist_except(int unit);
871extern int psr_exist();
872extern int psr_exist_except(int unit);
873extern unsigned int netdev_calc(char *ifname, char *ifname_desc, unsigned long *rx, unsigned long *tx, char *ifname_desc2, unsigned long *rx2, unsigned long *tx2);
874extern int check_bwdpi_nvram_setting();
875extern void StampToDate(unsigned long timestamp, char *date);
876extern int check_filesize_over(char *path, long int size);
877extern time_t get_last_month_timestamp();
878extern int get_iface_hwaddr(char *name, unsigned char *hwaddr);
879#ifdef RTCONFIG_TRAFFIC_LIMITER
880extern int TL_UNIT_S; // traffic limiter dual wan unit start
881extern int TL_UNIT_E; // traffic limiter dual wan unit end
882extern unsigned int traffic_limiter_read_bit(const char *type);
883extern void traffic_limiter_set_bit(const char *type, int unit);
884extern void traffic_limiter_clear_bit(const char *type, int unit);
885extern double traffic_limiter_get_realtime(int unit);
886extern int traffic_limiter_dualwan_check(char *dualwan_mode);
887#endif
888
889/* mt7620.c */
890#if defined(RTCONFIG_RALINK_MT7620)
891extern void ATE_mt7620_esw_port_status(void);
892#elif defined(RTCONFIG_RALINK_MT7621)
893extern void ATE_mt7621_esw_port_status(void);
894#endif
895
896/* notify_rc.c */
897extern int notify_rc(const char *event_name);
898extern int notify_rc_after_wait(const char *event_name);
899extern int notify_rc_after_period_wait(const char *event_name, int wait);
900extern int notify_rc_and_wait(const char *event_name);
901extern int notify_rc_and_wait_1min(const char *event_name);
902extern int notify_rc_and_wait_2min(const char *event_name);
903extern int notify_rc_and_period_wait(const char *event_name, int wait);
904
905/* rtstate.c */
906extern char *get_wanx_ifname(int unit);
907extern int get_lanports_status(void);
908extern int set_wan_primary_ifunit(const int unit);
909#ifdef RTCONFIG_USB
910extern char *get_usb_xhci_port(int port);
911extern char *get_usb_ehci_port(int port);
912extern char *get_usb_ohci_port(int port);
913extern int get_usb_port_number(const char *usb_port);
914extern int get_usb_port_host(const char *usb_port);
915#endif
916#ifdef RTCONFIG_DUALWAN
917extern void set_wanscap_support(char *feature);
918extern void add_wanscap_support(char *feature);
919extern int get_wans_dualwan(void) ;
920extern int get_dualwan_by_unit(int unit) ;
921extern int get_dualwan_primary(void);
922extern int get_dualwan_secondary(void) ;
923#else
924static inline int get_wans_dualwan(void) { return WANS_DUALWAN_IF_WAN; }
925static inline int get_dualwan_by_unit(int unit) {
926#ifdef RTCONFIG_USB_MODEM
927	return ((unit == WAN_UNIT_FIRST)? WANS_DUALWAN_IF_WAN:WANS_DUALWAN_IF_USB);
928#else
929	return ((unit == WAN_UNIT_FIRST)? WANS_DUALWAN_IF_WAN:WANS_DUALWAN_IF_NONE);
930#endif
931}
932#endif
933extern void set_lan_phy(char *phy);
934extern void add_lan_phy(char *phy);
935extern void set_wan_phy(char *phy);
936extern void add_wan_phy(char *phy);
937
938/* semaphore.c */
939extern void init_spinlock(void);
940
941#if defined(RTCONFIG_WPS_LED)
942static inline int wps_led_control(int onoff)
943{
944	return led_control(LED_WPS, onoff);
945}
946
947static inline int __wps_led_control(int onoff)
948{
949	return led_control(LED_WPS, onoff);
950}
951#else
952static inline int wps_led_control(int onoff)
953{
954	if (nvram_get_int("led_pwr_gpio") != nvram_get_int("led_wps_gpio"))
955		return led_control(LED_WPS, onoff);
956	else
957		return led_control(LED_POWER, onoff);
958}
959
960/* If individual WPS LED absents, don't do anything. */
961static inline int __wps_led_control(int onoff) { return 0; }
962#endif
963
964enum {
965	YADNS_DISABLED = -1,
966	YADNS_BASIC,
967	YADNS_SAFE,
968	YADNS_FAMILY,
969	YADNS_COUNT,
970	YADNS_FIRST = YADNS_DISABLED + 1,
971};
972
973#ifdef RTCONFIG_YANDEXDNS
974#define YADNS_DNSPORT 1253
975int get_yandex_dns(int family, int mode, char **server, int max_count);
976#endif
977
978#if defined(RTCONFIG_WANRED_LED)
979static inline int wan_red_led_control(int onoff)
980{
981	return led_control(LED_WAN_RED, onoff);
982}
983#else
984static inline int wan_red_led_control(int onoff) { return 0; }
985#endif
986
987/* bled.c */
988#if defined(RTCONFIG_BLINK_LED)
989extern int __config_netdev_bled(const char *led_gpio, const char *ifname, unsigned int min_blink_speed, unsigned int interval);
990extern int config_netdev_bled(const char *led_gpio, const char *ifname);
991extern int set_bled_udef_pattern(const char *led_gpio, unsigned int interval, const char *pattern);
992extern int set_bled_normal_mode(const char *led_gpio);
993extern int set_bled_udef_pattern_mode(const char *led_gpio);
994extern int start_bled(unsigned int gpio_nr);
995extern int stop_bled(unsigned int gpio_nr);
996extern int del_bled(unsigned int gpio_nr);
997extern int append_netdev_bled_if(const char *led_gpio, const char *ifname);
998extern int remove_netdev_bled_if(const char *led_gpio, const char *ifname);
999extern int __config_swports_bled(const char *led_gpio, unsigned int port_mask, unsigned int min_blink_speed, unsigned int interval, int sleep);
1000extern int update_swports_bled(const char *led_gpio, unsigned int port_mask);
1001extern int __config_usbbus_bled(const char *led_gpio, char *bus_list, unsigned int min_blink_speed, unsigned int interval);
1002extern int is_swports_bled(const char *led_gpio);
1003#if (defined(PLN12) || defined(PLAC56))
1004extern void set_wifiled(int mode);
1005#endif
1006
1007static inline void enable_wifi_bled(char *ifname)
1008{
1009	int unit;
1010	int v = LED_ON;
1011
1012	if (!ifname || *ifname == '\0')
1013		return;
1014	unit = get_wifi_unit(ifname);
1015	if (unit < 0 || unit > 1) {
1016		return;
1017	}
1018
1019	if (!guest_wlif(ifname)) {
1020#if defined(RTCONFIG_QCA)
1021		v = LED_OFF;	/* WiFi not ready. Don't turn on WiFi LED here. */
1022#endif
1023#if defined(RTAC1200HP) || defined(RTN56UB1) || defined(RTN56UB2)
1024		if(!get_radio(1, 0) && unit==1) //*5G WiFi not ready. Don't turn on WiFi GPIO LED . */
1025		 	v=LED_OFF;
1026#endif
1027#if defined(RTN56UB1) || defined(RTN56UB2)
1028		if(!get_radio(0, 0) && unit==0) //*2G WiFi not ready. Don't turn on WiFi GPIO LED . */
1029		 	v=LED_OFF;
1030#endif
1031		led_control((!unit)? LED_2G:LED_5G, v);
1032	} else {
1033		append_netdev_bled_if((!unit)? "led_2g_gpio":"led_5g_gpio", ifname);
1034	}
1035}
1036
1037static inline void disable_wifi_bled(char *ifname)
1038{
1039	int unit;
1040
1041	if (!ifname || *ifname == '\0')
1042		return;
1043	unit = get_wifi_unit(ifname);
1044	if (unit < 0 || unit > 1)
1045		return;
1046
1047	if (!guest_wlif(ifname)) {
1048		led_control((!unit)? LED_2G:LED_5G, LED_OFF);
1049	} else {
1050		remove_netdev_bled_if((!unit)? "led_2g_gpio":"led_5g_gpio", ifname);
1051	}
1052}
1053
1054static inline int config_swports_bled(const char *led_gpio, unsigned int port_mask)
1055{
1056	unsigned int min_blink_speed = 10;	/* KB/s */
1057	unsigned int interval = 100;		/* ms */
1058
1059	return __config_swports_bled(led_gpio, port_mask, min_blink_speed, interval, 0);
1060}
1061
1062static inline int config_swports_bled_sleep(const char *led_gpio, unsigned int port_mask)
1063{
1064	unsigned int min_blink_speed = 10;	/* KB/s */
1065	unsigned int interval = 100;		/* ms */
1066
1067	return __config_swports_bled(led_gpio, port_mask, min_blink_speed, interval, 1);
1068}
1069
1070static inline int config_usbbus_bled(const char *led_gpio, char *bus_list)
1071{
1072	unsigned int min_blink_speed = 50;	/* KB/s */
1073	unsigned int interval = 100;		/* ms */
1074
1075	return __config_usbbus_bled(led_gpio, bus_list, min_blink_speed, interval);
1076}
1077#else	/* !RTCONFIG_BLINK_LED */
1078static inline int __config_netdev_bled(const char *led_gpio, const char *ifname, unsigned int min_blink_speed, unsigned int interval) { return 0; }
1079static inline int config_netdev_bled(const char *led_gpio, const char *ifname) { return 0; }
1080static inline int set_bled_udef_pattern(const char *led_gpio, unsigned int interval, const char *pattern) { return 0; }
1081static inline int set_bled_normal_mode(const char *led_gpio) { return 0; }
1082static inline int set_bled_udef_pattern_mode(const char *led_gpio) { return 0; }
1083static inline int start_bled(unsigned int gpio_nr) { return 0; }
1084static inline int stop_bled(unsigned int gpio_nr) { return 0; }
1085static inline int chg_bled_state(unsigned int gpio_nr) { return 0; }
1086static inline int del_bled(unsigned int gpio_nr) { return 0; }
1087static inline int append_netdev_bled_if(const char *led_gpio, const char *ifname) { return 0; }
1088static inline int remove_netdev_bled_if(const char *led_gpio, const char *ifname) { return 0; }
1089static inline int __config_swports_bled(const char *led_gpio, unsigned int port_mask, unsigned int min_blink_speed, unsigned int interval, int sleep) { return 0; }
1090static inline int update_swports_bled(const char *led_gpio, unsigned int port_mask) { return 0; }
1091static inline int __config_usbbus_bled(const char *led_gpio, char *bus_list, unsigned int min_blink_speed, unsigned int interval) { return 0; }
1092
1093static inline void enable_wifi_bled(char *ifname) { }
1094static inline void disable_wifi_bled(char *ifname) { }
1095static inline int config_swports_bled(const char *led_gpio, unsigned int port_mask) { return 0; }
1096static inline int config_swports_bled_sleep(const char *led_gpio, unsigned int port_mask) { return 0; }
1097static inline int config_usbbus_bled(const char *led_gpio, char *bus_list) { return 0; }
1098static inline int is_swports_bled(const char *led_gpio) { return 0; }
1099
1100#endif	/* RTCONFIG_BLINK_LED */
1101
1102#if defined(RTCONFIG_USB)
1103static inline int is_usb3_port(char *usb_node)
1104{
1105	if (!usb_node)
1106		return 0;
1107
1108	if (strstr(usb_node, get_usb_xhci_port(0)) || strstr(usb_node, get_usb_xhci_port(1)))
1109		return 1;
1110
1111#if defined(RTAC55U) || defined(RTAC55UHP)
1112	/* RT-AC55U equips external Etron XHCI host and enables QCA9557 internal EHCI host.
1113	 * To make sure port1 maps to physical USB3 port and port2 maps to physical USB2 port respectively,
1114	 * one of xhci usb bus is put to first item of ehci_ports whether USB2-only mode is enabled or not.
1115	 * Thus, we have to check first item of ehci_ports here.
1116	 */
1117	if (strstr(usb_node, get_usb_ehci_port(0)))
1118		return 1;
1119#endif
1120
1121	return 0;
1122}
1123#endif
1124
1125#ifdef RTCONFIG_BCM5301X_TRAFFIC_MONITOR
1126
1127#if defined(RTN18U) || defined(RTAC56U) || defined(RTAC56S) || defined(RTAC68U) || defined(RTAC3200) || defined(DSL_AC68U)
1128#define WAN0DEV "vlan2"
1129#endif
1130
1131#if defined(RTAC5300) || defined(RTAC5300R)
1132#define WAN0DEV "vlan2"
1133#endif
1134
1135#if defined(RTAC88U) || defined(RTAC3100)/* || defined(RTAC5300)*/
1136#ifdef RTCONFIG_EXT_RTL8365MB
1137#define WAN0DEV "vlan2"
1138#else
1139#define WAN0DEV "vlan2"
1140#endif
1141#endif
1142
1143#ifdef RTAC87U
1144#define WAN0DEV "vlan2"
1145#endif
1146#endif	/* RTCONFIG_BCM5301X_TRAFFIC_MONITOR */
1147
1148#endif	/* !__SHARED_H__ */
1149