aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroshmoun <oshmoun100@googlemail.com>2018-09-23 21:21:52 +0200
committeroshmoun <oshmoun100@googlemail.com>2018-09-23 22:53:25 +0200
commit629d5501ec1d30623f743d851fc7cfcc29a69149 (patch)
tree7374e7439487e56742759b992cff115f29d1a985
parentbde96e2544f00d1473802c752e6d8a4c4b738245 (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.mk4
-rw-r--r--macaddrsetup.c51
2 files changed, 45 insertions, 10 deletions
diff --git a/Android.mk b/Android.mk
index fc4912a..54ec53d 100644
--- a/Android.mk
+++ b/Android.mk
@@ -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
+}