diff options
| author | oshmoun <oshmoun100@googlemail.com> | 2018-09-23 21:21:52 +0200 |
|---|---|---|
| committer | oshmoun <oshmoun100@googlemail.com> | 2018-09-23 22:53:25 +0200 |
| commit | 629d5501ec1d30623f743d851fc7cfcc29a69149 (patch) | |
| tree | 7374e7439487e56742759b992cff115f29d1a985 | |
| parent | bde96e2544f00d1473802c752e6d8a4c4b738245 (diff) | |
macaddrsetup: add handling for brcmfmac wifi driver
brcmfmac does not use sysfs to acquite MAC addresses, but the normal kernel APIs.
Add code to run the required IOCTL to change the MAC address of the wlan0 interface.
Change-Id: I4e5f6d9daa377e29b23b823dbeec9a309293251b
| -rw-r--r-- | Android.mk | 4 | ||||
| -rw-r--r-- | macaddrsetup.c | 51 |
2 files changed, 45 insertions, 10 deletions
@@ -11,6 +11,10 @@ ifeq ($(WIFI_DRIVER_BUILT),qca_cld3) LOCAL_CFLAGS += -DQCA_CLD3_WIFI endif +ifeq ($(WIFI_DRIVER_BUILT),brcmfmac) +LOCAL_CFLAGS += -DBRCMFMAC +endif + ifeq ($(BOARD_HAS_MIRROR_MACADDRESS),true) LOCAL_CFLAGS += -DMIRROR_MAC_ADDRESS endif diff --git a/macaddrsetup.c b/macaddrsetup.c index 321e610..14933e3 100644 --- a/macaddrsetup.c +++ b/macaddrsetup.c @@ -5,6 +5,8 @@ #include <dlfcn.h> #include <string.h> #include <unistd.h> +#include <net/if_arp.h> +#include <net/if.h> #include <sys/stat.h> #include <sys/types.h> @@ -30,6 +32,11 @@ int main(int argc, char **argv) int (*ta_getsize)(uint32_t id, uint32_t *size) = NULL; int (*ta_read)(uint32_t id, void *buf, uint32_t size) = NULL; +#ifdef BRCMFMAC + struct ifreq ifr; + int sockfd; +#endif + // Sony had a check for ro.hardware here, but since all supported devices were added here anyways, // and the values are the same, it has been removed. wl_addr = 2560; @@ -115,14 +122,6 @@ int main(int argc, char **argv) } if (argc > 1) { - fpw = fopen(argv[1], "w"); - if (!fpw) { - SLOGE("failed to open %s for writing: %s\n", - argv[1], strerror(errno)); - ta_close(); - exit(1); - } - err = ta_getsize(wl_addr, &size); if (size != 6) { SLOGE("mac address have wrong size (%d) in miscta", size); @@ -138,7 +137,38 @@ int main(int argc, char **argv) fclose(fpw); exit(1); } - +#ifdef BRCMFMAC + sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (sockfd < 0) { + SLOGE("failed to open socket\n"); + ta_close(); + exit(1); + } + strcpy(ifr.ifr_name, "wlan0"); + ifr.ifr_hwaddr.sa_data[0] = buf[5]; + ifr.ifr_hwaddr.sa_data[1] = buf[4]; + ifr.ifr_hwaddr.sa_data[2] = buf[3]; + ifr.ifr_hwaddr.sa_data[3] = buf[2]; + ifr.ifr_hwaddr.sa_data[4] = buf[1]; + ifr.ifr_hwaddr.sa_data[5] = buf[0]; + ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; + ret = ioctl(sockfd, SIOCSIFHWADDR, &ifr); + if (ret != 0) { + SLOGE("failed to write WLAN mac address using ioctl %d\n", + ret); + ta_close(); + close(sockfd); + exit(1); + } + close(sockfd); +#else + fpw = fopen(argv[1], "w"); + if (!fpw) { + SLOGE("failed to open %s for writing: %s\n", + argv[1], strerror(errno)); + ta_close(); + exit(1); + } #ifdef QCA_CLD3_WIFI #ifdef MIRROR_MAC_ADDRESS ret = fprintf(fpw, "Intf0MacAddress=%02X%02X%02X%02X%02X%02X\nEND\n", @@ -158,6 +188,7 @@ int main(int argc, char **argv) fclose(fpw); exit(1); } +#endif } ta_close(); fclose(fpb); @@ -166,4 +197,4 @@ int main(int argc, char **argv) dlclose(ta_handle); return 0; -}
\ No newline at end of file +} |
