android_device_allwinner-full/tulip-common/0002-support-setmacaddr-by-lcm.patch
2016-08-05 21:03:18 -04:00

206 lines
5.4 KiB
Diff

From 6552e769a6f23b867e828ce875932cba5fb66fa6 Mon Sep 17 00:00:00 2001
From: ldj <ludajunjunjun@126.com>
Date: Wed, 2 Dec 2015 14:35:30 +0800
Subject: [PATCH 2/2] support setmacaddr by lcm
---
setmacaddr/Android.mk | 13 +++++
setmacaddr/setmacaddr.c | 148 ++++++++++++++++++++++++++++++++++++++++++++++++
tulip-common.mk | 6 +-
3 files changed, 166 insertions(+), 1 deletion(-)
create mode 100755 setmacaddr/Android.mk
create mode 100755 setmacaddr/setmacaddr.c
diff --git a/setmacaddr/Android.mk b/setmacaddr/Android.mk
new file mode 100755
index 0000000..0d05569
--- /dev/null
+++ b/setmacaddr/Android.mk
@@ -0,0 +1,13 @@
+LOCAL_PATH:= $(call my-dir)
+# RTK mac
+include $(CLEAR_VARS)
+LOCAL_PRELINK_MODULE := false
+LOCAL_SHARED_LIBRARIES := libcutils
+LOCAL_LDLIBS += -Idl
+
+LOCAL_SRC_FILES := setmacaddr.c
+
+LOCAL_MODULE := setmacaddr
+
+LOCAL_MODULE_TAGS := optional
+include $(BUILD_EXECUTABLE)
diff --git a/setmacaddr/setmacaddr.c b/setmacaddr/setmacaddr.c
new file mode 100755
index 0000000..142ca5a
--- /dev/null
+++ b/setmacaddr/setmacaddr.c
@@ -0,0 +1,148 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <fcntl.h>
+
+#define LOG_TAG "setmacaddr"
+#include <utils/Log.h>
+
+#include <cutils/properties.h>
+
+#define PROPERTY_BT_BDADDR_PATH "ro.bt.bdaddr_path"
+
+#define MAC_PATH "/data/wifimac.txt"
+#define BTA_PATH "/data/btaddr.txt"
+#define STATIC_MAC_PATH "/mnt/private/ULI/factory/mac.txt"
+#define STATIC_BTA_PATH "/mnt/private/ULI/factory/btaddr.txt"
+
+#define MAC_LEN 20
+
+static int gen_randseed()
+{
+ int fd;
+ int rc;
+ unsigned int randseed;
+ size_t len;
+ struct timeval tval;
+
+ len = sizeof(randseed);
+ fd = open("/dev/urandom", O_RDONLY);
+ if (fd < 0)
+ {
+ ALOGD("%s: Open /dev/urandom fail\n", __FUNCTION__);
+ return -1;
+ }
+ rc = read(fd, &randseed, len);
+ close(fd);
+ if(rc <0)
+ {
+ if (gettimeofday(&tval, (struct timezone *)0) > 0)
+ randseed = (unsigned int) tval.tv_usec;
+ else
+ randseed = (unsigned int) time(NULL);
+
+ ALOGD("open /dev/urandom fail, using system time for randseed\n");
+ }
+ return randseed;
+}
+
+/*
+ * Get a Randon MAC addr, save to macaddr
+ *
+ */
+static int get_randon_mac(char *macaddr)
+{
+ int randseed;
+ int randvar1,randvar2;
+
+ randseed = gen_randseed();
+ if(randseed == -1)
+ return -1;
+ srand((unsigned int)randseed);
+
+ randvar1 = rand();
+ randvar2 = rand();
+ ALOGD("%s: randvar1 =0x%x, randvar2=0x%x",__FUNCTION__, randvar1,randvar2);
+
+ //sprintf(macaddr, "00:e0:4c:%02x:%02x:%02x",
+ //changed by tingle for 6 bytes random
+ //Byte1,bit0,bit1 can't be 1.
+ sprintf(macaddr, "%02x:%02x:%02x:%02x:%02x:%02x", \
+ (unsigned char)((randvar2)&0xFC), \
+ (unsigned char)((randvar2>>8)&0xFF), \
+ (unsigned char)((randvar2>>16)&0xFF), \
+ (unsigned char)((randvar1)&0xFF), \
+ (unsigned char)((randvar1>>8)&0xFF), \
+ (unsigned char)((randvar1>>16)&0xFF));
+
+ ALOGD("generate a new MAC address: %s", macaddr);
+
+ return 0;
+}
+
+/*
+ * Generate randon MAC addr, save in file, backup in bakfile
+ * if bakfile exist, use it
+ * if bakfile not exist, generate a new randon addr
+ */
+static void generate_mac(char* file, char* bakfile)
+{
+ char macaddr[MAC_LEN];
+ char cmd[128];
+
+ ALOGD("%s: file= %s bakfile= %s",__FUNCTION__, file, bakfile);
+
+ if (access(file, F_OK) == 0 && access(bakfile, F_OK) == 0) {
+ ALOGD("both file and bakfile exist, it is ok.");
+ return;
+ } else if (access(bakfile, F_OK) == 0) {
+ ALOGD("only bakfile exist, copy to file.");
+ sprintf(cmd, "cp %s %s && chmod 644 %s", bakfile, file, file);
+ ALOGD("cmd=%s", cmd);
+ system(cmd);
+ return;
+ } else if (access(file, F_OK) == 0) {
+ ALOGD("only file exist, copy to bakfile.");
+ sprintf(cmd, "cp %s %s && chmod 644 %s", file, bakfile, bakfile);
+ ALOGD("cmd=%s", cmd);
+ system(cmd);
+ return;
+ }
+
+ //or, should generate a new mac addr
+ if(get_randon_mac(macaddr) != 0) {
+ ALOGD("Generate a randon mac addr failed!!!");
+ return;
+ }
+ //save mac addr to file
+ sprintf(cmd, "echo %s > %s && chmod 644 %s", macaddr, file, file);
+ ALOGD("cmd=%s", cmd);
+ system(cmd);
+ //backup to bakfile
+ sprintf(cmd, "cp %s %s && chmod 644 %s", file, bakfile, bakfile);
+ ALOGD("cmd=%s", cmd);
+ system(cmd);
+}
+
+int main(int argc, char ** argv)
+{
+ char val[256];
+ char cmd[128];
+
+ if (access(STATIC_BTA_PATH, F_OK) != 0 && access(STATIC_MAC_PATH, F_OK) != 0) {
+ sprintf(cmd, "mkdir -p /mnt/private/ULI/factory");
+ ALOGD("cmd=%s", cmd);
+ system(cmd);
+ }
+
+
+ if(property_get(PROPERTY_BT_BDADDR_PATH, val, NULL)) {
+ generate_mac(val, STATIC_BTA_PATH);
+ } else {
+ generate_mac(BTA_PATH, STATIC_BTA_PATH);
+ }
+
+ generate_mac(MAC_PATH, STATIC_MAC_PATH);
+
+ return 0;
+}
diff --git a/tulip-common.mk b/tulip-common.mk
index 748f204..cdf3a3b 100755
--- a/tulip-common.mk
+++ b/tulip-common.mk
@@ -11,7 +11,11 @@ PRODUCT_PACKAGES += \
camera.tulip
PRODUCT_PACKAGES += \
- libion
+ libion \
+ setmacaddr
+# add for bluetooth addr
+PRODUCT_PROPERTY_OVERRIDES += \
+ ro.bt.bdaddr_path=/data/btaddr.txt
# audio
PRODUCT_PACKAGES += \
--
1.9.1