X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/962ca22d320ab9a7958afa00cae91a4f93d9a54e..01ce4cb6c05b9d2d05143d9b55111c344d8b6692:/package/broadcom-wl/src/wlc/wlc.c diff --git a/package/broadcom-wl/src/wlc/wlc.c b/package/broadcom-wl/src/wlc/wlc.c index 2d6b846a0..f5db9a763 100644 --- a/package/broadcom-wl/src/wlc/wlc.c +++ b/package/broadcom-wl/src/wlc/wlc.c @@ -92,7 +92,11 @@ struct wlc_call { /* can't use the system include because of the stupid broadcom header files */ extern struct ether_addr *ether_aton(const char *asc); -extern char *ether_ntoa(const struct ether_addr *addr); +static inline int my_ether_ntoa(unsigned char *ea, char *buf) +{ + return sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x", + ea[0], ea[1], ea[2], ea[3], ea[4], ea[5]); +} /* * find the starting point of wl.o in memory @@ -476,8 +480,10 @@ static int wlc_maclist(wlc_param param, void *data, void *value) ret = wl_ioctl(interface, (ioc >> 16) & 0xffff, wlbuf, sizeof(wlbuf)); if (!ret) - while (list->count) - str += sprintf(str, "%s%s", ((((char *) value) == str) ? "" : " "), ether_ntoa(&list->ea[list->count-- - 1])); + while (list->count) { + str += sprintf(str, "%s", ((((char *) value) == str) ? "" : " ")); + str += my_ether_ntoa((unsigned char *) &list->ea[list->count-- - 1], str); + } return ret; } else { @@ -663,14 +669,36 @@ static int wlc_ifname(wlc_param param, void *data, void *value) static int wlc_wdsmac(wlc_param param, void *data, void *value) { - static struct ether_addr mac; + unsigned char mac[6]; int ret = 0; ret = wl_ioctl(interface, WLC_WDS_GET_REMOTE_HWADDR, &mac, 6); - if (ret == 0) { - strcpy((char *) value, ether_ntoa(&mac)); - } + if (ret == 0) + my_ether_ntoa(mac, value); + + return ret; +} + +static int wlc_pmk(wlc_param param, void *data, void *value) +{ + int ret = -1; + char *str = (char *) value; + wsec_pmk_t pmk; + + /* driver doesn't support GET */ + + if ((param & PARAM_MODE) == SET) { + strncpy(pmk.key, value, WSEC_MAX_PSK_LEN); + pmk.key_len = strlen(value); + + if (pmk.key_len > WSEC_MAX_PSK_LEN) + pmk.key_len = WSEC_MAX_PSK_LEN; + pmk.flags = WSEC_PASSPHRASE; + + ret = wl_ioctl(interface, WLC_SET_WSEC_PMK, &pmk, sizeof(pmk)); + } + return ret; } @@ -859,6 +887,12 @@ static const struct wlc_call wlc_calls[] = { .data.str = "sup_wpa", .desc = "Built-in WPA supplicant" }, + { + .name = "passphrase", + .param = STRING, + .handler = wlc_pmk, + .desc = "Passphrase for built-in WPA supplicant", + }, { .name = "maxassoc", .param = INT, @@ -894,6 +928,20 @@ static const struct wlc_call wlc_calls[] = { .data.str = "wme_noack", .desc = "WME ACK disable request", }, + { + .name = "802.11d", + .param = INT, + .handler = wlc_ioctl, + .data.num = ((WLC_GET_REGULATORY << 16) | WLC_SET_REGULATORY), + .desc = "Enable/disable 802.11d regulatory management", + }, + { + .name = "802.11h", + .param = INT, + .handler = wlc_ioctl, + .data.num = ((WLC_GET_SPECT_MANAGMENT << 16) | WLC_SET_SPECT_MANAGMENT), + .desc = "Enable/disable 802.11h spectrum management", + }, { .name = "fragthresh", .param = INT,