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__
);
82 setenv("UDP_BIND_IP", "127.0.0.1", 1);
84 unsetenv("UDP_BIND_IP");
90 xstart("nas", "/etc/nas.conf", "/var/run/nas.pid", "lan");
91 if (foreach_wif(1, NULL
, is_sta
))
92 xstart("nas", "/etc/nas.wan.conf", "/var/run/nas.wan.pid", "wan");
94 #endif /* CONFIG_BCMWL5 */
97 // notify NAS of all wds up ifaces upon startup
99 char *ifname
, buf
[256];
101 if ((fd
= fopen("/proc/net/dev", "r")) != NULL
) {
102 fgets(buf
, sizeof(buf
) - 1, fd
); // header lines
103 fgets(buf
, sizeof(buf
) - 1, fd
);
104 while (fgets(buf
, sizeof(buf
) - 1, fd
)) {
105 if ((ifname
= strchr(buf
, ':')) == NULL
) continue;
107 if ((ifname
= strrchr(buf
, ' ')) == NULL
) ifname
= buf
;
109 if (strstr(ifname
, "wds")) {
123 _dprintf("%s: uptime=%ld\n", __FUNCTION__
, si
.uptime
);
125 _dprintf("%s\n", __FUNCTION__
);
131 #endif /* CONFIG_BCMWL5 */
134 void notify_nas(const char *ifname
)
139 _dprintf("%s: ifname=%s uptime=%ld\n", __FUNCTION__
, ifname
, si
.uptime
);
141 _dprintf("%s: ifname=%s\n", __FUNCTION__
, ifname
);
146 /* Inform driver to send up new WDS link event */
147 if (wl_iovar_setint((char *)ifname
, "wds_enable", 1)) {
148 _dprintf("%s: set wds_enable failed\n", ifname
);
151 #else /* !CONFIG_BCMWL5 */
153 if (!foreach_wif(1, NULL
, security_on
)) return;
159 while (pidof("nas") == -1) {
160 _dprintf("waiting for nas i=%d\n", i
);
162 syslog(LOG_ERR
, "Unable to find nas");
169 /* the wireless interface must be configured to run NAS */
170 wl_ioctl((char *)ifname
, WLC_GET_INSTANCE
, &unit
, sizeof(unit
));
172 xstart("nas4not", "lan", ifname
, "up", "auto",
173 nvram_safe_get(wl_nvname("crypto", unit
, 0)), // aes, tkip (aes+tkip ok?)
174 nvram_safe_get(wl_nvname("akm", unit
, 0)), // psk (only?)
175 nvram_safe_get(wl_nvname("wpa_psk", unit
, 0)), // shared key
176 nvram_safe_get(wl_nvname("ssid", unit
, 0)) // ssid
179 #endif /* CONFIG_BCMWL5 */
185 #if 0 // old stuff for ref
189 void del_wds_wsec(int unit, int which)
193 sprintf(name, "wl%d_wds%d", unit, which);
201 nvram_match("wl_mode", "sta") ? "-S" : "-A",
203 "-i", nvram_safe_get("wl_ifname"),
204 "-l", nvram_safe_get("lan_ifname"),
209 // WPA doesn't support shared key removed, handled during config set zzz
210 // if (strstr(nvram_safe_get("wl_akm"), "wpa") != NULL) {
211 // nvram_set("wl_auth", "0");
214 // if ((nvram_match("wl_mode", "sta")) && (nvram_match("wl_akm", "psk psk2"))) {
215 // nvram_set("wl_akm", "psk2");
223 static int get_wds_wsec(int unit, int which, char *mac, char *role, char *crypto, char *auth, char *ssid, char *pass)
228 sprintf(buf, "wl%d_wds%d", unit, which);
229 strlcpy(buf, nvram_safe_get(buf), sizeof(buf));
232 strcpy(mac, strsep(&next, ","));
235 strcpy(role, strsep(&next, ","));
238 strcpy(crypto, strsep(&next, ","));
241 strcpy(auth, strsep(&next, ","));
244 strcpy(ssid, strsep(&next, ","));
251 static void convert_wds(void)
256 if (nvram_match("wl_wds", "")) { // For Router, accept all WDS link
257 strcpy(wds_mac, "*");
259 else { // For AP, assign remote WDS MAC
260 strlcpy(wds_mac, nvram_safe_get("wl_wds"), sizeof(wds_mac));
264 // For WPA-PSK mode, we want to convert wl_wds_mac to wl0_wds0 ... wl0_wds255
265 if (strstr(nvram_safe_get("wl_akm"), "psk")) {
272 foreach(mac, wds_mac, next) {
273 snprintf(wl_wds, sizeof(wl_wds), "wl0_wds%d", i);
274 snprintf(buf, sizeof(buf), "%s,auto,%s,%s,%s,%s",
276 nvram_safe_get("wl_crypto"),
277 nvram_safe_get("wl_akm"),
278 nvram_safe_get("wl_ssid"),
279 nvram_safe_get("wl_wpa_psk"));
281 nvram_set(wl_wds, buf);
285 for (j = i; j < 20; j++)
292 void notify_nas(char *ifname
)
294 char *argv
[] = {"nas4not", "lan", ifname
, "up",
298 NULL
, /* passphrase */
301 char tmp
[100], prefix
[32];
303 char remote
[ETHER_ADDR_LEN
];
304 char ssid
[48], pass
[80], auth
[16], crypto
[16], role
[8];
307 /* the wireless interface must be configured to run NAS */
308 wl_ioctl(ifname
, WLC_GET_INSTANCE
, &unit
, sizeof(unit
));
309 sprintf(prefix
, "wl%d_", unit
);
310 if (nvram_match(strcat_r(prefix
, "akm", tmp
), "") && nvram_match(strcat_r(prefix
, "auth_mode", tmp
), "none")) {
314 // wait until nas is up and running
319 while (f_read("/tmp/nas.lan.pid", s
, sizeof(s
)) <= 0) {
321 cprintf("notify_nas: unable to find nas");
329 /* find WDS link configuration */
330 wl_ioctl(ifname
, WLC_WDS_GET_REMOTE_HWADDR
, remote
, ETHER_ADDR_LEN
);
331 for (i
= 0; i
< 20; ++i
) {
332 char mac
[ETHER_ADDR_STR_LEN
];
333 uint8 ea
[ETHER_ADDR_LEN
];
335 if (get_wds_wsec(unit
, i
, mac
, role
, crypto
, auth
, ssid
, pass
) &&
336 ether_atoe(mac
, ea
) && !bcmp(ea
, remote
, ETHER_ADDR_LEN
)) {
343 cprintf("notify_nas: get_wds_wsec(%d,%d) crypto=%s", unit
, i
, argv
[5]);
347 /* did not find WDS link configuration, use wireless' */
352 argv
[5] = nvram_safe_get(strcat_r(prefix
, "crypto", tmp
));
354 argv
[6] = nvram_safe_get(strcat_r(prefix
, "akm", tmp
));
356 argv
[7] = nvram_safe_get(strcat_r(prefix
, "wpa_psk", tmp
));
358 argv
[8] = nvram_safe_get(strcat_r(prefix
, "ssid", tmp
));
360 cprintf("notify_nas: i==MAX crypto=%s", argv
[5]);
366 for (i
= 0; argv
[i
]; ++i
) {
370 cprintf("notify_nas: %s", cl
);
374 _eval(argv
, ">/dev/console", 0, &pid
);