In tun mode, device's fake MAC address is derived from its EUI-64.
This commit is contained in:
parent
45db1a6faf
commit
efa214533c
52
tools/stm32w/wpcapslip6/wpcapslip6.c
Normal file → Executable file
52
tools/stm32w/wpcapslip6/wpcapslip6.c
Normal file → Executable file
|
@ -116,13 +116,11 @@ static bool clean_route = false;
|
||||||
static bool clean_neighb = false;
|
static bool clean_neighb = false;
|
||||||
static struct uip_eth_addr adapter_eth_addr;
|
static struct uip_eth_addr adapter_eth_addr;
|
||||||
static char * if_name;
|
static char * if_name;
|
||||||
static char * if_mac;
|
|
||||||
|
|
||||||
OSVERSIONINFO osVersionInfo;
|
OSVERSIONINFO osVersionInfo;
|
||||||
|
|
||||||
/* Fictitious Ethernet address of the attached device (used in tun mode). */
|
/* Fictitious Ethernet address of the attached device (used in tun mode). */
|
||||||
#define DEV_MAC_ADDR "02-00-00-00-00-02"
|
static struct uip_eth_addr dev_eth_addr = {{0x00,0x00,0x00,0x00,0x00,0x00}};
|
||||||
static const struct uip_eth_addr dev_eth_addr = {{0x02,0x00,0x00,0x00,0x00,0x02}};
|
|
||||||
|
|
||||||
|
|
||||||
static bool request_mac = true;
|
static bool request_mac = true;
|
||||||
|
@ -327,22 +325,51 @@ read_more:
|
||||||
if(inpktbuf[0] == '!') {
|
if(inpktbuf[0] == '!') {
|
||||||
if (inpktbuf[1] == 'M' && inbufptr == 18) {
|
if (inpktbuf[1] == 'M' && inbufptr == 18) {
|
||||||
/* Read gateway MAC address and autoconfigure tap0 interface */
|
/* Read gateway MAC address and autoconfigure tap0 interface */
|
||||||
char macs[24];
|
char macs64[24], macs48[18];
|
||||||
|
int addr_bytes[8];
|
||||||
int i, pos;
|
int i, pos;
|
||||||
for(i = 0, pos = 0; i < 16; i++) {
|
for(i = 0, pos = 0; i < 16; i++) {
|
||||||
macs[pos++] = inpktbuf[2 + i];
|
macs64[pos++] = inpktbuf[2 + i];
|
||||||
if ((i & 1) == 1 && i < 14) {
|
if ((i & 1) == 1 && i < 14) {
|
||||||
macs[pos++] = ':';
|
macs64[pos++] = '-';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
macs[pos] = '\0';
|
macs64[pos] = '\0';
|
||||||
printf("*** Gateway's MAC address: %s\n", macs);
|
printf("*** Gateway's MAC address: %s\n", macs64);
|
||||||
mac_received = true;
|
mac_received = true;
|
||||||
|
|
||||||
|
sscanf(macs64, "%2X-%2X-%2X-%2X-%2X-%2X-%2X-%2X",
|
||||||
|
&addr_bytes[0],
|
||||||
|
&addr_bytes[1],
|
||||||
|
&addr_bytes[2],
|
||||||
|
&addr_bytes[3],
|
||||||
|
&addr_bytes[4],
|
||||||
|
&addr_bytes[5],
|
||||||
|
&addr_bytes[6],
|
||||||
|
&addr_bytes[7]);
|
||||||
|
|
||||||
|
/* Form a fictitious MAC address for the attached device from its EUI-64 (2 middle bytes elided) */
|
||||||
|
addr_bytes[0] |= 0x02;
|
||||||
|
for(i=0;i<3;i++){
|
||||||
|
dev_eth_addr.addr[i] = addr_bytes[i];
|
||||||
|
}
|
||||||
|
for(i=3;i<6;i++){
|
||||||
|
dev_eth_addr.addr[i] = addr_bytes[i+2];
|
||||||
|
}
|
||||||
|
sprintf(macs48,"%02X-%02X-%02X-%02X-%02X-%02X",
|
||||||
|
dev_eth_addr.addr[0],
|
||||||
|
dev_eth_addr.addr[1],
|
||||||
|
dev_eth_addr.addr[2],
|
||||||
|
dev_eth_addr.addr[3],
|
||||||
|
dev_eth_addr.addr[4],
|
||||||
|
dev_eth_addr.addr[5]);
|
||||||
|
|
||||||
|
printf("Fictitious MAC-48: %s\n", macs48);
|
||||||
|
|
||||||
|
|
||||||
if(autoconf){
|
if(autoconf){
|
||||||
|
|
||||||
if(IPAddrFromPrefix(autoconf_addr, ipprefix, macs)!=0){
|
if(IPAddrFromPrefix(autoconf_addr, ipprefix, macs64)!=0){
|
||||||
fprintf(stderr, "Invalid IPv6 address.\n");
|
fprintf(stderr, "Invalid IPv6 address.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -353,13 +380,13 @@ read_more:
|
||||||
if(br_prefix != NULL){
|
if(br_prefix != NULL){
|
||||||
/* RPL Border Router mode. Add route towards LoWPAN. */
|
/* RPL Border Router mode. Add route towards LoWPAN. */
|
||||||
|
|
||||||
if(IPAddrFromPrefix(rem_ipaddr, br_prefix, macs)!=0){
|
if(IPAddrFromPrefix(rem_ipaddr, br_prefix, macs64)!=0){
|
||||||
fprintf(stderr, "Invalid IPv6 address.\n");
|
fprintf(stderr, "Invalid IPv6 address.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
addLoWPANRoute(if_name, br_prefix, rem_ipaddr);
|
addLoWPANRoute(if_name, br_prefix, rem_ipaddr);
|
||||||
addNeighbor(if_name, rem_ipaddr, if_mac);//DEV_MAC_ADDR);
|
addNeighbor(if_name, rem_ipaddr, macs48);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -860,7 +887,7 @@ int IPAddrFromPrefix(char * ipaddr, const char * ipprefix, const char * mac)
|
||||||
|
|
||||||
// sscanf requires int instead of 8-bit for hexadecimal variables.
|
// sscanf requires int instead of 8-bit for hexadecimal variables.
|
||||||
|
|
||||||
sscanf(mac, "%2X:%2X:%2X:%2X:%2X:%2X:%2X:%2X",
|
sscanf(mac, "%2X-%2X-%2X-%2X-%2X-%2X-%2X-%2X",
|
||||||
&addr_bytes[0],
|
&addr_bytes[0],
|
||||||
&addr_bytes[1],
|
&addr_bytes[1],
|
||||||
&addr_bytes[2],
|
&addr_bytes[2],
|
||||||
|
@ -1060,7 +1087,6 @@ main(int argc, char **argv)
|
||||||
(int *)&adapter_eth_addr.addr[2],(int *)&adapter_eth_addr.addr[3],
|
(int *)&adapter_eth_addr.addr[2],(int *)&adapter_eth_addr.addr[3],
|
||||||
(int *)&adapter_eth_addr.addr[4],(int *)&adapter_eth_addr.addr[5]);
|
(int *)&adapter_eth_addr.addr[4],(int *)&adapter_eth_addr.addr[5]);
|
||||||
if_name = wpcap_start(&adapter_eth_addr, verbose);
|
if_name = wpcap_start(&adapter_eth_addr, verbose);
|
||||||
if_mac = argv[1];
|
|
||||||
|
|
||||||
if(local_ipaddr!=NULL){
|
if(local_ipaddr!=NULL){
|
||||||
addAddress(if_name, local_ipaddr);
|
addAddress(if_name, local_ipaddr);
|
||||||
|
|
BIN
tools/stm32w/wpcapslip6/wpcapslip6.exe
Normal file → Executable file
BIN
tools/stm32w/wpcapslip6/wpcapslip6.exe
Normal file → Executable file
Binary file not shown.
Loading…
Reference in a new issue