3 Copyright 2003, CyberTAN Inc. All Rights Reserved
5 This is UNPUBLISHED PROPRIETARY SOURCE CODE of CyberTAN Inc.
6 the contents of this file may not be disclosed to third parties,
7 copied or duplicated in any form without the prior written
8 permission of CyberTAN Inc.
10 This software should be used as a reference only, and it not
11 intended for production use!
13 THIS SOFTWARE IS OFFERED "AS IS", AND CYBERTAN GRANTS NO WARRANTIES OF ANY
14 KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. CYBERTAN
15 SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
16 FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE
21 Copyright 2005, Broadcom Corporation
24 THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
25 KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
26 SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
27 FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
33 #include <sys/sysinfo.h>
34 #include <sys/ioctl.h>
39 // ref: http://wiki.openwrt.org/OpenWrtDocs/nas
41 // #define DEBUG_TIMING
43 void notify_nas(const char *ifname
);
45 static int security_on(int idx
, int unit
, int subunit
, void *param
)
47 return nvram_get_int(wl_nvname("radio", unit
, 0)) && (!nvram_match(wl_nvname("security_mode", unit
, subunit
), "disabled"));
50 static int is_wds(int idx
, int unit
, int subunit
, void *param
)
52 return nvram_get_int(wl_nvname("radio", unit
, 0)) && nvram_get_int(wl_nvname("wds_enable", unit
, subunit
));
56 static int is_sta(int idx
, int unit
, int subunit
, void *param
)
58 return nvram_match(wl_nvname("mode", unit
, subunit
), "sta");
64 return foreach_wif(1, NULL
, is_wds
);
68 int wl_security_on(void) {
69 return foreach_wif(1, NULL
, security_on
);
72 static int nas_starter(int idx
, int unit
, int subunit
, void *param
) {
73 char unit_str
[] = "000000";
74 char lanN_ifname
[] = "lanXX_ifname";
75 char lanN_ifnames
[] = "lanXX_ifnames";
77 if(nvram_get_int(wl_nvname("bss_enabled", unit
, subunit
))) {
78 if (nvram_match(wl_nvname("mode", unit
, subunit
), "ap")) {
80 snprintf(unit_str
, sizeof(unit_str
), "%d.%d", unit
, subunit
);
82 snprintf(unit_str
, sizeof(unit_str
), "%d", unit
);
84 for(br
=3 ; br
>=0 ; br
--) {
91 snprintf(lanN_ifname
, sizeof(lanN_ifname
), "lan%s_ifname", bridge
);
92 snprintf(lanN_ifnames
, sizeof(lanN_ifnames
), "lan%s_ifnames", bridge
);
94 if(strstr(nvram_safe_get(lanN_ifnames
),nvram_safe_get(wl_nvname("ifname", unit
, subunit
))) != NULL
) {
95 xstart("/usr/sbin/nas.sh", unit_str
, nvram_safe_get(lanN_ifname
));
100 if(is_sta(idx
, unit
, subunit
, NULL
)) {
101 xstart("nas", "/etc/nas.wan.conf", "/var/run/nas.wan.pid", "wan");
107 #endif /* TCONFIG_VLAN */
111 if (!foreach_wif(1, NULL
, security_on
)) {
118 _dprintf("%s: uptime=%ld\n", __FUNCTION__
, si
.uptime
);
120 _dprintf("%s\n", __FUNCTION__
);
124 setenv("UDP_BIND_IP", "127.0.0.1", 1);
126 unsetenv("UDP_BIND_IP");
134 if(nvram_get_int("nas_alternate")) {
135 foreach_wif(1, NULL
, nas_starter
);
137 if(strstr(nvram_safe_get("lan_ifnames"),nvram_safe_get("wl0_ifname")) != NULL
)
138 xstart("nas", "/etc/nas.conf", "/var/run/nas.pid", "lan");
139 if(strstr(nvram_safe_get("lan1_ifnames"),nvram_safe_get("wl0_ifname")) != NULL
)
140 xstart("nas", "/etc/nas.conf", "/var/run/nas.pid", "lan1");
141 if(strstr(nvram_safe_get("lan2_ifnames"),nvram_safe_get("wl0_ifname")) != NULL
)
142 xstart("nas", "/etc/nas.conf", "/var/run/nas.pid", "lan2");
143 if(strstr(nvram_safe_get("lan3_ifnames"),nvram_safe_get("wl0_ifname")) != NULL
)
144 xstart("nas", "/etc/nas.conf", "/var/run/nas.pid", "lan3");
146 if (foreach_wif(1, NULL
, is_sta
))
147 xstart("nas", "/etc/nas.wan.conf", "/var/run/nas.wan.pid", "wan");
149 #else /* TCONFIG_VLAN */
150 xstart("nas", "/etc/nas.conf", "/var/run/nas.pid", "lan");
151 if (foreach_wif(1, NULL
, is_sta
))
152 xstart("nas", "/etc/nas.wan.conf", "/var/run/nas.wan.pid", "wan");
153 #endif /* TCONFIG_VLAN */
155 #endif /* CONFIG_BCMWL5 */
158 // notify NAS of all wds up ifaces upon startup
160 char *ifname
, buf
[256];
162 if ((fd
= fopen("/proc/net/dev", "r")) != NULL
) {
163 fgets(buf
, sizeof(buf
) - 1, fd
); // header lines
164 fgets(buf
, sizeof(buf
) - 1, fd
);
165 while (fgets(buf
, sizeof(buf
) - 1, fd
)) {
166 if ((ifname
= strchr(buf
, ':')) == NULL
) continue;
168 if ((ifname
= strrchr(buf
, ' ')) == NULL
) ifname
= buf
;
170 if (strstr(ifname
, "wds")) {
184 _dprintf("%s: uptime=%ld\n", __FUNCTION__
, si
.uptime
);
186 _dprintf("%s\n", __FUNCTION__
);
192 #endif /* CONFIG_BCMWL5 */
195 void notify_nas(const char *ifname
)
200 _dprintf("%s: ifname=%s uptime=%ld\n", __FUNCTION__
, ifname
, si
.uptime
);
202 _dprintf("%s: ifname=%s\n", __FUNCTION__
, ifname
);
207 /* Inform driver to send up new WDS link event */
208 if (wl_iovar_setint((char *)ifname
, "wds_enable", 1)) {
209 _dprintf("%s: set wds_enable failed\n", ifname
);
212 #else /* !CONFIG_BCMWL5 */
214 if (!foreach_wif(1, NULL
, security_on
)) return;
220 while (pidof("nas") == -1) {
221 _dprintf("waiting for nas i=%d\n", i
);
223 syslog(LOG_ERR
, "Unable to find nas");
230 /* the wireless interface must be configured to run NAS */
231 wl_ioctl((char *)ifname
, WLC_GET_INSTANCE
, &unit
, sizeof(unit
));
233 xstart("nas4not", "lan", ifname
, "up", "auto",
234 nvram_safe_get(wl_nvname("crypto", unit
, 0)), // aes, tkip (aes+tkip ok?)
235 nvram_safe_get(wl_nvname("akm", unit
, 0)), // psk (only?)
236 nvram_safe_get(wl_nvname("wpa_psk", unit
, 0)), // shared key
237 nvram_safe_get(wl_nvname("ssid", unit
, 0)) // ssid
240 #endif /* CONFIG_BCMWL5 */
246 #if 0 // old stuff for ref
250 void del_wds_wsec(int unit, int which)
254 sprintf(name, "wl%d_wds%d", unit, which);
262 nvram_match("wl_mode", "sta") ? "-S" : "-A",
264 "-i", nvram_safe_get("wl_ifname"),
265 "-l", nvram_safe_get("lan_ifname"),
270 // WPA doesn't support shared key removed, handled during config set zzz
271 // if (strstr(nvram_safe_get("wl_akm"), "wpa") != NULL) {
272 // nvram_set("wl_auth", "0");
275 // if ((nvram_match("wl_mode", "sta")) && (nvram_match("wl_akm", "psk psk2"))) {
276 // nvram_set("wl_akm", "psk2");
284 static int get_wds_wsec(int unit, int which, char *mac, char *role, char *crypto, char *auth, char *ssid, char *pass)
289 sprintf(buf, "wl%d_wds%d", unit, which);
290 strlcpy(buf, nvram_safe_get(buf), sizeof(buf));
293 strcpy(mac, strsep(&next, ","));
296 strcpy(role, strsep(&next, ","));
299 strcpy(crypto, strsep(&next, ","));
302 strcpy(auth, strsep(&next, ","));
305 strcpy(ssid, strsep(&next, ","));
312 static void convert_wds(void)
317 if (nvram_match("wl_wds", "")) { // For Router, accept all WDS link
318 strcpy(wds_mac, "*");
320 else { // For AP, assign remote WDS MAC
321 strlcpy(wds_mac, nvram_safe_get("wl_wds"), sizeof(wds_mac));
325 // For WPA-PSK mode, we want to convert wl_wds_mac to wl0_wds0 ... wl0_wds255
326 if (strstr(nvram_safe_get("wl_akm"), "psk")) {
333 foreach(mac, wds_mac, next) {
334 snprintf(wl_wds, sizeof(wl_wds), "wl0_wds%d", i);
335 snprintf(buf, sizeof(buf), "%s,auto,%s,%s,%s,%s",
337 nvram_safe_get("wl_crypto"),
338 nvram_safe_get("wl_akm"),
339 nvram_safe_get("wl_ssid"),
340 nvram_safe_get("wl_wpa_psk"));
342 nvram_set(wl_wds, buf);
346 for (j = i; j < 20; j++)
353 void notify_nas(char *ifname
)
355 char *argv
[] = {"nas4not", "lan", ifname
, "up",
359 NULL
, /* passphrase */
362 char tmp
[100], prefix
[32];
364 char remote
[ETHER_ADDR_LEN
];
365 char ssid
[48], pass
[80], auth
[16], crypto
[16], role
[8];
368 /* the wireless interface must be configured to run NAS */
369 wl_ioctl(ifname
, WLC_GET_INSTANCE
, &unit
, sizeof(unit
));
370 sprintf(prefix
, "wl%d_", unit
);
371 if (nvram_match(strcat_r(prefix
, "akm", tmp
), "") && nvram_match(strcat_r(prefix
, "auth_mode", tmp
), "none")) {
375 // wait until nas is up and running
380 while (f_read("/tmp/nas.lan.pid", s
, sizeof(s
)) <= 0) {
382 cprintf("notify_nas: unable to find nas");
390 /* find WDS link configuration */
391 wl_ioctl(ifname
, WLC_WDS_GET_REMOTE_HWADDR
, remote
, ETHER_ADDR_LEN
);
392 for (i
= 0; i
< 20; ++i
) {
393 char mac
[ETHER_ADDR_STR_LEN
];
394 uint8 ea
[ETHER_ADDR_LEN
];
396 if (get_wds_wsec(unit
, i
, mac
, role
, crypto
, auth
, ssid
, pass
) &&
397 ether_atoe(mac
, ea
) && !bcmp(ea
, remote
, ETHER_ADDR_LEN
)) {
404 cprintf("notify_nas: get_wds_wsec(%d,%d) crypto=%s", unit
, i
, argv
[5]);
408 /* did not find WDS link configuration, use wireless' */
413 argv
[5] = nvram_safe_get(strcat_r(prefix
, "crypto", tmp
));
415 argv
[6] = nvram_safe_get(strcat_r(prefix
, "akm", tmp
));
417 argv
[7] = nvram_safe_get(strcat_r(prefix
, "wpa_psk", tmp
));
419 argv
[8] = nvram_safe_get(strcat_r(prefix
, "ssid", tmp
));
421 cprintf("notify_nas: i==MAX crypto=%s", argv
[5]);
427 for (i
= 0; argv
[i
]; ++i
) {
431 cprintf("notify_nas: %s", cl
);
435 _eval(argv
, ">/dev/console", 0, &pid
);