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
);
69 if (!foreach_wif(1, NULL
, security_on
)) {
76 _dprintf("%s: uptime=%ld\n", __FUNCTION__
, si
.uptime
);
78 _dprintf("%s\n", __FUNCTION__
);
89 if(strstr(nvram_safe_get("lan_ifnames"),nvram_safe_get("wl0_ifname")) != NULL
)
90 xstart("nas", "/etc/nas.conf", "/var/run/nas.pid", "lan");
91 if(strstr(nvram_safe_get("lan1_ifnames"),nvram_safe_get("wl0_ifname")) != NULL
)
92 xstart("nas", "/etc/nas.conf", "/var/run/nas.pid", "lan1");
93 if(strstr(nvram_safe_get("lan2_ifnames"),nvram_safe_get("wl0_ifname")) != NULL
)
94 xstart("nas", "/etc/nas.conf", "/var/run/nas.pid", "lan2");
95 if(strstr(nvram_safe_get("lan3_ifnames"),nvram_safe_get("wl0_ifname")) != NULL
)
96 xstart("nas", "/etc/nas.conf", "/var/run/nas.pid", "lan3");
98 if (foreach_wif(1, NULL
, is_sta
))
99 xstart("nas", "/etc/nas.wan.conf", "/var/run/nas.wan.pid", "wan");
101 #endif /* CONFIG_BCMWL5 */
104 // notify NAS of all wds up ifaces upon startup
106 char *ifname
, buf
[256];
108 if ((fd
= fopen("/proc/net/dev", "r")) != NULL
) {
109 fgets(buf
, sizeof(buf
) - 1, fd
); // header lines
110 fgets(buf
, sizeof(buf
) - 1, fd
);
111 while (fgets(buf
, sizeof(buf
) - 1, fd
)) {
112 if ((ifname
= strchr(buf
, ':')) == NULL
) continue;
114 if ((ifname
= strrchr(buf
, ' ')) == NULL
) ifname
= buf
;
116 if (strstr(ifname
, "wds")) {
130 _dprintf("%s: uptime=%ld\n", __FUNCTION__
, si
.uptime
);
132 _dprintf("%s\n", __FUNCTION__
);
138 #endif /* CONFIG_BCMWL5 */
141 void notify_nas(const char *ifname
)
146 _dprintf("%s: ifname=%s uptime=%ld\n", __FUNCTION__
, ifname
, si
.uptime
);
148 _dprintf("%s: ifname=%s\n", __FUNCTION__
, ifname
);
153 /* Inform driver to send up new WDS link event */
154 if (wl_iovar_setint((char *)ifname
, "wds_enable", 1)) {
155 _dprintf("%s: set wds_enable failed\n", ifname
);
158 #else /* !CONFIG_BCMWL5 */
160 if (!foreach_wif(1, NULL
, security_on
)) return;
166 while (pidof("nas") == -1) {
167 _dprintf("waiting for nas i=%d\n", i
);
169 syslog(LOG_ERR
, "Unable to find nas");
176 /* the wireless interface must be configured to run NAS */
177 wl_ioctl((char *)ifname
, WLC_GET_INSTANCE
, &unit
, sizeof(unit
));
179 xstart("nas4not", "lan", ifname
, "up", "auto",
180 nvram_safe_get(wl_nvname("crypto", unit
, 0)), // aes, tkip (aes+tkip ok?)
181 nvram_safe_get(wl_nvname("akm", unit
, 0)), // psk (only?)
182 nvram_safe_get(wl_nvname("wpa_psk", unit
, 0)), // shared key
183 nvram_safe_get(wl_nvname("ssid", unit
, 0)) // ssid
186 #endif /* CONFIG_BCMWL5 */
192 #if 0 // old stuff for ref
196 void del_wds_wsec(int unit, int which)
200 sprintf(name, "wl%d_wds%d", unit, which);
208 nvram_match("wl_mode", "sta") ? "-S" : "-A",
210 "-i", nvram_safe_get("wl_ifname"),
211 "-l", nvram_safe_get("lan_ifname"),
216 // WPA doesn't support shared key removed, handled during config set zzz
217 // if (strstr(nvram_safe_get("wl_akm"), "wpa") != NULL) {
218 // nvram_set("wl_auth", "0");
221 // if ((nvram_match("wl_mode", "sta")) && (nvram_match("wl_akm", "psk psk2"))) {
222 // nvram_set("wl_akm", "psk2");
230 static int get_wds_wsec(int unit, int which, char *mac, char *role, char *crypto, char *auth, char *ssid, char *pass)
235 sprintf(buf, "wl%d_wds%d", unit, which);
236 strlcpy(buf, nvram_safe_get(buf), sizeof(buf));
239 strcpy(mac, strsep(&next, ","));
242 strcpy(role, strsep(&next, ","));
245 strcpy(crypto, strsep(&next, ","));
248 strcpy(auth, strsep(&next, ","));
251 strcpy(ssid, strsep(&next, ","));
258 static void convert_wds(void)
263 if (nvram_match("wl_wds", "")) { // For Router, accept all WDS link
264 strcpy(wds_mac, "*");
266 else { // For AP, assign remote WDS MAC
267 strlcpy(wds_mac, nvram_safe_get("wl_wds"), sizeof(wds_mac));
271 // For WPA-PSK mode, we want to convert wl_wds_mac to wl0_wds0 ... wl0_wds255
272 if (strstr(nvram_safe_get("wl_akm"), "psk")) {
279 foreach(mac, wds_mac, next) {
280 snprintf(wl_wds, sizeof(wl_wds), "wl0_wds%d", i);
281 snprintf(buf, sizeof(buf), "%s,auto,%s,%s,%s,%s",
283 nvram_safe_get("wl_crypto"),
284 nvram_safe_get("wl_akm"),
285 nvram_safe_get("wl_ssid"),
286 nvram_safe_get("wl_wpa_psk"));
288 nvram_set(wl_wds, buf);
292 for (j = i; j < 20; j++)
299 void notify_nas(char *ifname
)
301 char *argv
[] = {"nas4not", "lan", ifname
, "up",
305 NULL
, /* passphrase */
308 char tmp
[100], prefix
[32];
310 char remote
[ETHER_ADDR_LEN
];
311 char ssid
[48], pass
[80], auth
[16], crypto
[16], role
[8];
314 /* the wireless interface must be configured to run NAS */
315 wl_ioctl(ifname
, WLC_GET_INSTANCE
, &unit
, sizeof(unit
));
316 sprintf(prefix
, "wl%d_", unit
);
317 if (nvram_match(strcat_r(prefix
, "akm", tmp
), "") && nvram_match(strcat_r(prefix
, "auth_mode", tmp
), "none")) {
321 // wait until nas is up and running
326 while (f_read("/tmp/nas.lan.pid", s
, sizeof(s
)) <= 0) {
328 cprintf("notify_nas: unable to find nas");
336 /* find WDS link configuration */
337 wl_ioctl(ifname
, WLC_WDS_GET_REMOTE_HWADDR
, remote
, ETHER_ADDR_LEN
);
338 for (i
= 0; i
< 20; ++i
) {
339 char mac
[ETHER_ADDR_STR_LEN
];
340 uint8 ea
[ETHER_ADDR_LEN
];
342 if (get_wds_wsec(unit
, i
, mac
, role
, crypto
, auth
, ssid
, pass
) &&
343 ether_atoe(mac
, ea
) && !bcmp(ea
, remote
, ETHER_ADDR_LEN
)) {
350 cprintf("notify_nas: get_wds_wsec(%d,%d) crypto=%s", unit
, i
, argv
[5]);
354 /* did not find WDS link configuration, use wireless' */
359 argv
[5] = nvram_safe_get(strcat_r(prefix
, "crypto", tmp
));
361 argv
[6] = nvram_safe_get(strcat_r(prefix
, "akm", tmp
));
363 argv
[7] = nvram_safe_get(strcat_r(prefix
, "wpa_psk", tmp
));
365 argv
[8] = nvram_safe_get(strcat_r(prefix
, "ssid", tmp
));
367 cprintf("notify_nas: i==MAX crypto=%s", argv
[5]);
373 for (i
= 0; argv
[i
]; ++i
) {
377 cprintf("notify_nas: %s", cl
);
381 _eval(argv
, ">/dev/console", 0, &pid
);