136 lines
3.3 KiB
C
136 lines
3.3 KiB
C
/*
|
|
* Copyright 2012 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
|
|
#include "wfc_util_log.h"
|
|
|
|
#define WFC_UTIL_RANDOM_MAC_HEADER "001122"
|
|
|
|
void wfc_util_htoa(unsigned char *pHexaBuff, int szHexaBuff, char *pAsciiStringBuff, int szAsciiStringBuff)
|
|
{
|
|
int i, j;
|
|
char hex_table[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
|
'A', 'B', 'C', 'D', 'E', 'F'};
|
|
|
|
if ((szHexaBuff*2) > szAsciiStringBuff) {
|
|
wfc_util_log_error("wfc_util_htoa : not enough buffer size(%d)", szAsciiStringBuff);
|
|
return;
|
|
}
|
|
|
|
memset(pAsciiStringBuff, 0, szAsciiStringBuff);
|
|
|
|
/* for (i = szHexaBuff-1, j = 0; i >= 0; i--, j += 2) { */
|
|
for (i = 0, j = 0; i < szHexaBuff; i++, j += 2) {
|
|
/*pAsciiStringBuff[j] = hex_table[(pHexaBuff[i] >> 4) & 0x0F];
|
|
*/
|
|
pAsciiStringBuff[j] = hex_table[pHexaBuff[i] >> 4];
|
|
pAsciiStringBuff[j + 1] = hex_table[pHexaBuff[i] & 0x0F];
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void wfc_util_atoh(char *pAsciiString, int szAsciiString, unsigned char *pHexaBuff, int szHexaBuff)
|
|
{
|
|
int i, pos;
|
|
char temp;
|
|
|
|
if ( 0!=(szAsciiString%2) || (szHexaBuff*2) < szAsciiString) {
|
|
wfc_util_log_error("wfc_util_atoh : not enough buffer size(%d)", szHexaBuff);
|
|
return;
|
|
}
|
|
|
|
memset(pHexaBuff, 0, szHexaBuff);
|
|
|
|
for (i=0 ; i<szAsciiString ; i++) {
|
|
|
|
/* pos = (szAsciiString - i - 1) / 2; */
|
|
pos = i / 2;
|
|
temp = pAsciiString[i];
|
|
|
|
if (temp >= '0' && temp <= '9') {
|
|
temp = temp - '0';
|
|
} else if ( temp >= 'a' && temp <= 'f' ) {
|
|
temp = temp - 'a' + 10;
|
|
} else if ( temp >= 'A' && temp <= 'F' ) {
|
|
temp = temp - 'A' + 10;
|
|
} else {
|
|
temp = 0;
|
|
}
|
|
|
|
if (0==i%2) {
|
|
pHexaBuff[pos] = temp<<4;
|
|
} else {
|
|
pHexaBuff[pos] |= temp;
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* wfc_util_is_random_mac
|
|
*
|
|
* return : it will return 1 if [mac_add] is same with WFC_UTIL_RANDOM_MAC_HEADER
|
|
* or will return 0 if not.
|
|
*/
|
|
int wfc_util_is_random_mac(char *mac_add)
|
|
{
|
|
if(0 == strncmp(mac_add, WFC_UTIL_RANDOM_MAC_HEADER, 6)) {
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* wfc_util_random_mac
|
|
*
|
|
* Create random MAC address
|
|
*
|
|
* return : void
|
|
*/
|
|
void wfc_util_random_mac(unsigned char* mac_addr)
|
|
{
|
|
unsigned long int rand_mac;
|
|
|
|
if(NULL == mac_addr) {
|
|
wfc_util_log_error("wfc_util_random_mac : buffer is NULL");
|
|
return;
|
|
}
|
|
|
|
/* Create random MAC address: offset 3, 4 and 5 */
|
|
srandom(time(NULL));
|
|
rand_mac=random();
|
|
|
|
#ifndef WFC_UTIL_RANDOM_MAC_HEADER
|
|
mac_addr[0] = (unsigned char)0x00;
|
|
mac_addr[1] = (unsigned char)0x11;
|
|
mac_addr[2] = (unsigned char)0x22;
|
|
#else /* WFC_UTIL_RANDOM_MAC_HEADER */
|
|
wfc_util_atoh(WFC_UTIL_RANDOM_MAC_HEADER, 6, mac_addr, 3);
|
|
#endif /* WFC_UTIL_RANDOM_MAC_HEADER */
|
|
mac_addr[3] = (unsigned char)rand_mac;
|
|
mac_addr[4] = (unsigned char)(rand_mac >> 8);
|
|
mac_addr[5] = (unsigned char)(rand_mac >> 16);
|
|
|
|
return;
|
|
}
|