lin
2025-08-21 57113df3a0e2be01232281fad9a5f2c060567981
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/******************************************************************************
 *
 *  Copyright (C) 2020-2021 SeekWave Technology
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *
 ******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <utils/Log.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
 
#define MACDEF_FOR_INCAR 1
 
#define BD_ADDR_LEN 6
 
unsigned char bdaddr_lap[3] = {0x12, 0x24, 0x56};
char bdaddr_valid = 1;
extern char skw_btsnoop_path[];
 
extern void hex2String(unsigned char hex[], unsigned char str[], int N);
 
void skw_addr_gen_init()
{
    char basepath[PATH_MAX] = {0};
    char filepath[PATH_MAX] = {0};
    int size = strlen(skw_btsnoop_path);
    int i;
    for(i = size - 1; i > 0; i--)//get log dir
    {
        char ch = skw_btsnoop_path[i];
        if((ch == '/') || (ch == '\\'))
        {
            memcpy(basepath, skw_btsnoop_path, i);
            //ALOGD("cp:%d", i);
            break;
        }
    }
    snprintf(filepath, PATH_MAX, "%s/skwbdaddr.txt", basepath);
 
    ALOGD("%s, %s", __func__, filepath);
 
    FILE *fp = fopen(filepath, "r"); //read only
    if(fp == NULL)//file not exist
    {
        fp = fopen(filepath, "w"); //file not exist, create it
        srand(time(NULL));
        if(fp)
        {
            bdaddr_lap[0] = (unsigned char)(rand() & 0xFF);
            bdaddr_lap[1] = (unsigned char)(rand() & 0xFF);
            bdaddr_lap[2] = (unsigned char)(rand() & 0xFF);
            fwrite(bdaddr_lap, 3, 1, fp);
            fflush(fp);
            fclose(fp);
        }
        else
        {
            bdaddr_valid = 0;
        }
        //else use default addr
    }
    else
    {
        fread(bdaddr_lap, 3, 1, fp);
        fclose(fp);
    }
 
    ALOGD("%s, addr valid:%d, %02X %02X %02X", __func__, bdaddr_valid, bdaddr_lap[0], bdaddr_lap[1], bdaddr_lap[2]);
}
 
 
#if MACDEF_FOR_INCAR
 
#define VENDOR_REQ_TAG      0x56524551
#define VENDOR_READ_IO      _IOW('v', 0x01, unsigned int)
#define VENDOR_WRITE_IO     _IOW('v', 0x02, unsigned int)
 
#define VENDOR_SN_ID        1
#define VENDOR_WIFI_MAC_ID  2
#define VENDOR_LAN_MAC_ID   3
#define VENDOR_BLUETOOTH_ID 4
 
struct rk_vendor_req
{
    uint32_t tag;
    uint16_t id;
    uint16_t len;
    uint8_t data[1];
};
 
int m_get_mac_address(uint8_t *local_addr)
{
    int ret ;
    uint8_t p_buf[64];
    struct rk_vendor_req *req;
 
    req = (struct rk_vendor_req *)p_buf;
    int sys_fd = open("/dev/vendor_storage", O_RDWR, 0);
    if(sys_fd < 0)
    {
        ALOGE("vendor_storage open fail\n");
        return -1;
    }
 
    req->tag = VENDOR_REQ_TAG;
    req->id = VENDOR_BLUETOOTH_ID;
 
    req->len = 6;
    ret = ioctl(sys_fd, VENDOR_READ_IO, req);
    if (!ret)
    {
        //uint8_t str_buffer[32] = {0};
        int i = 0, j = BD_ADDR_LEN - 1;
        for(; i < BD_ADDR_LEN; i++, j--)
        {
            local_addr[i] = req->data[j];
        }
        //memcpy(local_addr, req->data, BD_ADDR_LEN);
        //hex2String(local_addr, str_buffer, BD_ADDR_LEN);
        //ALOGE("bt addr get ok:%s", str_buffer);
    }
 
    close(sys_fd);
    return 0;
}
 
 
#endif
 
char skw_addr_check_valid(unsigned char *bd_addr)
{
    uint32_t addr_check = 0;
    int i ;
    for( i = 0; i < BD_ADDR_LEN; i++)
    {
        addr_check += bd_addr[i];
    }
    return (addr_check > 0);
}
 
/*
Get bd addr from AP
if address exist, return 1, else 0
*/
char skw_addr_from_ap(unsigned char *bd_addr)
{
    memset(bd_addr, 0, BD_ADDR_LEN);
#if MACDEF_FOR_INCAR
    if(m_get_mac_address(bd_addr) == 0)
    {
        return skw_addr_check_valid(bd_addr);
    }
#endif
   return 0;
}
 
void skw_addr_get(unsigned char *buffer)
{
    if(bdaddr_valid > 0)
    {
        buffer[0] = bdaddr_lap[0];
        buffer[1] = bdaddr_lap[1];
        buffer[2] = bdaddr_lap[2];
    }
}