Use a MAC address based on the SoC's UUID

We use the SoC's UUID to generate a fixed MAC for a particular
switch device. The MAC generated uses a Realtek prefix and then
is followed by 3 bytes genertaed from the first 3 bytes of the
UUID xored with the last byte in order to prevent being able
to deduce the UUID from the public MAC.
This commit is contained in:
logicog
2026-02-08 15:49:49 +01:00
parent eafe2e96e8
commit ea230615f9
9 changed files with 37 additions and 22 deletions
+4 -5
View File
@@ -12,7 +12,6 @@
#include "uip.h" #include "uip.h"
#include "uip/uip.h" #include "uip/uip.h"
extern __code struct uip_eth_addr uip_ethaddr;
__xdata struct dhcp_state dhcp_state; __xdata struct dhcp_state dhcp_state;
__xdata uip_ipaddr_t server; __xdata uip_ipaddr_t server;
@@ -104,7 +103,7 @@ void dhcp_prepare_request(void)
DHCP_P->flags = 0; DHCP_P->flags = 0;
// Clear fields client_ip to bootp_file // Clear fields client_ip to bootp_file
memset(DHCP_P->client_ip, 0, 224); memset(DHCP_P->client_ip, 0, 224);
memcpyc(DHCP_P->client_addr, uip_ethaddr.addr, 6); memcpy(DHCP_P->client_addr, uip_ethaddr.addr, 6);
DHCP_P->cookie[0] = 0x63; DHCP_P->cookie[0] = 0x63;
DHCP_P->cookie[1] = 0x82; DHCP_P->cookie[1] = 0x82;
DHCP_P->cookie[2] = 0x53; DHCP_P->cookie[2] = 0x53;
@@ -117,7 +116,7 @@ void dhcp_addopt_client_id(void)
DHCP_OPT[dhcp_state.opt_ptr++] = DHCP_CLIENT_ID; DHCP_OPT[dhcp_state.opt_ptr++] = DHCP_CLIENT_ID;
DHCP_OPT[dhcp_state.opt_ptr++] = DHCP_CLIENT_ID_LEN; DHCP_OPT[dhcp_state.opt_ptr++] = DHCP_CLIENT_ID_LEN;
DHCP_OPT[dhcp_state.opt_ptr++] = DHCP_HW_TYPE_ETH; DHCP_OPT[dhcp_state.opt_ptr++] = DHCP_HW_TYPE_ETH;
memcpyc(&DHCP_OPT[dhcp_state.opt_ptr], uip_ethaddr.addr, 6); memcpy(&DHCP_OPT[dhcp_state.opt_ptr], uip_ethaddr.addr, 6);
dhcp_state.opt_ptr += 6; dhcp_state.opt_ptr += 6;
} }
@@ -130,7 +129,7 @@ void dhcp_addopt_request_ip(void)
DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.current_ip[1]; DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.current_ip[1];
DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.current_ip[2]; DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.current_ip[2];
DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.current_ip[3]; DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.current_ip[3];
memcpyc(&DHCP_OPT[dhcp_state.opt_ptr], uip_ethaddr.addr, 4); memcpy(&DHCP_OPT[dhcp_state.opt_ptr], uip_ethaddr.addr, 4);
} }
@@ -142,7 +141,7 @@ void dhcp_addopt_server_id(void)
DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.server[1]; DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.server[1];
DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.server[2]; DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.server[2];
DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.server[3]; DHCP_OPT[dhcp_state.opt_ptr++] = dhcp_state.server[3];
memcpyc(&DHCP_OPT[dhcp_state.opt_ptr], uip_ethaddr.addr, 4); memcpy(&DHCP_OPT[dhcp_state.opt_ptr], uip_ethaddr.addr, 4);
} }
-1
View File
@@ -29,7 +29,6 @@ extern __xdata uint16_t cont_len;
extern __xdata uint32_t cont_addr; extern __xdata uint32_t cont_addr;
extern __code uint8_t * __code hex; extern __code uint8_t * __code hex;
extern __xdata uip_ipaddr_t uip_hostaddr, uip_draddr, uip_netmask; extern __xdata uip_ipaddr_t uip_hostaddr, uip_draddr, uip_netmask;
extern __code struct uip_eth_addr uip_ethaddr;
extern __xdata uint8_t sfr_data[4]; extern __xdata uint8_t sfr_data[4];
extern __xdata uint8_t sfp_pins_last; extern __xdata uint8_t sfp_pins_last;
+1
View File
@@ -79,6 +79,7 @@ struct flash_region_t {
}; };
extern __xdata uint8_t uip_buf[UIP_CONF_BUFFER_SIZE+2]; extern __xdata uint8_t uip_buf[UIP_CONF_BUFFER_SIZE+2];
extern __xdata struct uip_eth_addr uip_ethaddr;
// Headers for calls in the common code area (HOME/BANK0) // Headers for calls in the common code area (HOME/BANK0)
void print_string(__code char *p); void print_string(__code char *p);
+3 -1
View File
@@ -2,7 +2,9 @@
#define _RTL837X_REGS_H_ #define _RTL837X_REGS_H_
#define RTL837X_REG_CHIP_ID 0x0004 #define RTL837X_REG_CHIP_ID 0x0004
#define RTL837X_REG_CHIP_INFO 0x000c #define RTL837X_REG_CHIP_INFO 0x000c
#define RTL837X_REG_CHIP_UUID 0x0010
#define RTL837X_REG_CHIP_LOT_NO 0x0014
#define RTL837X_REG_RESET 0x0024 #define RTL837X_REG_RESET 0x0024
#define RESET_SOC_BIT 0 #define RESET_SOC_BIT 0
#define RESET_NIC_BIT 2 #define RESET_NIC_BIT 2
+4 -4
View File
@@ -17,7 +17,7 @@
extern __code struct machine machine; extern __code struct machine machine;
extern __xdata uint8_t sfr_data[4]; extern __xdata uint8_t sfr_data[4];
extern __code struct uip_eth_addr uip_ethaddr; extern __xdata struct uip_eth_addr uip_ethaddr;
extern __xdata uint8_t uip_buf[UIP_CONF_BUFFER_SIZE + 2]; extern __xdata uint8_t uip_buf[UIP_CONF_BUFFER_SIZE + 2];
@@ -164,9 +164,9 @@ void stp_cnf_send(uint8_t port)
STP_O->bpdu_type = 0x00; // Config STP_O->bpdu_type = 0x00; // Config
STP_O->flags = 0x81; STP_O->flags = 0x81;
memcpyc(STP_O->src_addr, uip_ethaddr.addr, 6); memcpy(STP_O->src_addr, uip_ethaddr.addr, 6);
memcpy(STP_O->root.mac, root_bridge.mac, 6); memcpy(STP_O->root.mac, root_bridge.mac, 6);
memcpyc(STP_O->bridge.mac, uip_ethaddr.addr, 6); memcpy(STP_O->bridge.mac, uip_ethaddr.addr, 6);
STP_O->root.prio = root_bridge.prio; STP_O->root.prio = root_bridge.prio;
STP_O->root.ext = 0x00; STP_O->root.ext = 0x00;
@@ -221,7 +221,7 @@ void stp_setup(void) __banked
root_bridge.prio = 0x80; // This corresponds to 32768 root_bridge.prio = 0x80; // This corresponds to 32768
root_bridge.ext = 0x00; root_bridge.ext = 0x00;
memcpyc(root_bridge.mac, uip_ethaddr.addr, 6); memcpy(root_bridge.mac, uip_ethaddr.addr, 6);
} }
+20 -2
View File
@@ -76,10 +76,11 @@ void crc16(__xdata uint8_t *v) __naked;
__xdata uint8_t idle_ready; __xdata uint8_t idle_ready;
__code uint8_t ownIP[] = { 192, 168, 2, 2 }; __code uint8_t ownIP[] = { 192, 168, 2, 2 };
__code struct uip_eth_addr uip_ethaddr = {{ 0x1c, 0x2a, 0xa3, 0x23, 0x00, 0x02 }};
__code uint8_t gatewayIP[] = { 192, 168, 2, 22}; __code uint8_t gatewayIP[] = { 192, 168, 2, 22};
__code uint8_t netmask[] = { 255, 255, 255, 0}; __code uint8_t netmask[] = { 255, 255, 255, 0};
__xdata struct uip_eth_addr uip_ethaddr;
volatile __xdata uint32_t ticks; volatile __xdata uint32_t ticks;
volatile __xdata uint8_t sec_counter; volatile __xdata uint8_t sec_counter;
volatile __xdata uint16_t sleep_ticks; volatile __xdata uint16_t sleep_ticks;
@@ -1958,11 +1959,28 @@ void bootloader(void)
uip_ipaddr(&uip_hostaddr, ownIP[0], ownIP[1], ownIP[2], ownIP[3]); uip_ipaddr(&uip_hostaddr, ownIP[0], ownIP[1], ownIP[2], ownIP[3]);
uip_ipaddr(&uip_draddr, gatewayIP[0], gatewayIP[1], gatewayIP[2], gatewayIP[3]); uip_ipaddr(&uip_draddr, gatewayIP[0], gatewayIP[1], gatewayIP[2], gatewayIP[3]);
uip_ipaddr(&uip_netmask, netmask[0], netmask[1], netmask[2], netmask[3]); uip_ipaddr(&uip_netmask, netmask[0], netmask[1], netmask[2], netmask[3]);
reg_read_m(RTL837X_REG_CHIP_UUID);
#ifdef DEBUG
print_string("SoC UUID: "); print_sfr_data();
#endif
uip_ethaddr.addr[0] = 0x06; // LAA prefix
uip_ethaddr.addr[3] = sfr_data[0] ^ sfr_data[3];
uip_ethaddr.addr[4] = sfr_data[1] ^ sfr_data[3];
uip_ethaddr.addr[5] = sfr_data[2] ^ sfr_data[3];
reg_read_m(RTL837X_REG_CHIP_LOT_NO);
#ifdef DEBUG
print_string(", LOT: "); print_sfr_data(); write_char(' ');
#endif
uip_ethaddr.addr[1] = sfr_data[0] ^ sfr_data[2];
uip_ethaddr.addr[2] = sfr_data[1] ^ sfr_data[3];
print_string("Setting MAC to: ");
print_byte(uip_ethaddr.addr[0]); write_char(':'); print_byte(uip_ethaddr.addr[1]); write_char(':');
print_byte(uip_ethaddr.addr[2]); write_char(':'); print_byte(uip_ethaddr.addr[3]); write_char(':');
print_byte(uip_ethaddr.addr[4]); write_char(':'); print_byte(uip_ethaddr.addr[5]); write_char('\n');
REG_SET(RTL837X_PIN_MUX_2, 0x0); // Disable pins for ACL REG_SET(RTL837X_PIN_MUX_2, 0x0); // Disable pins for ACL
init_smi(); init_smi();
rtl8373_revision(); rtl8373_revision();
if (machine_detected.isRTL8373) if (machine_detected.isRTL8373)
rtl8373_init(); rtl8373_init();
-2
View File
@@ -132,8 +132,6 @@ static __code const uip_ipaddr_t all_zeroes_addr =
{0x0000,0x0000}; {0x0000,0x0000};
#endif /* UIP_CONF_IPV6 */ #endif /* UIP_CONF_IPV6 */
extern __code struct uip_eth_addr uip_ethaddr;
#ifndef UIP_CONF_EXTERNAL_BUFFER #ifndef UIP_CONF_EXTERNAL_BUFFER
u8_t uip_buf[UIP_BUFSIZE + 2]; /* The packet buffer that contains u8_t uip_buf[UIP_BUFSIZE + 2]; /* The packet buffer that contains
incoming packets. */ incoming packets. */
+5 -5
View File
@@ -306,8 +306,8 @@ uip_arp_arpin(void) __banked
BUF_O->opcode = HTONS(2); BUF_O->opcode = HTONS(2);
memcpy(BUF_O->dhwaddr.addr, BUF->shwaddr.addr, 6); memcpy(BUF_O->dhwaddr.addr, BUF->shwaddr.addr, 6);
memcpyc(BUF_O->shwaddr.addr, uip_ethaddr.addr, 6); memcpy(BUF_O->shwaddr.addr, uip_ethaddr.addr, 6);
memcpyc(BUF_O->ethhdr.src.addr, uip_ethaddr.addr, 6); memcpy(BUF_O->ethhdr.src.addr, uip_ethaddr.addr, 6);
memcpy(BUF_O->ethhdr.dest.addr, BUF->dhwaddr.addr, 6); memcpy(BUF_O->ethhdr.dest.addr, BUF->dhwaddr.addr, 6);
BUF_O->dipaddr[0] = BUF->sipaddr[0]; BUF_O->dipaddr[0] = BUF->sipaddr[0];
@@ -399,8 +399,8 @@ uip_arp_out(void) __banked
memset(BUF_O->ethhdr.dest.addr, 0xff, 6); memset(BUF_O->ethhdr.dest.addr, 0xff, 6);
memset(BUF_O->dhwaddr.addr, 0x00, 6); memset(BUF_O->dhwaddr.addr, 0x00, 6);
memcpyc(BUF_O->ethhdr.src.addr, uip_ethaddr.addr, 6); memcpy(BUF_O->ethhdr.src.addr, uip_ethaddr.addr, 6);
memcpyc(BUF_O->shwaddr.addr, uip_ethaddr.addr, 6); memcpy(BUF_O->shwaddr.addr, uip_ethaddr.addr, 6);
uip_ipaddr_copy(BUF_O->dipaddr, ipaddr); uip_ipaddr_copy(BUF_O->dipaddr, ipaddr);
uip_ipaddr_copy(BUF_O->sipaddr, uip_hostaddr); uip_ipaddr_copy(BUF_O->sipaddr, uip_hostaddr);
@@ -420,7 +420,7 @@ uip_arp_out(void) __banked
/* Build an ethernet header. */ /* Build an ethernet header. */
memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6); memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6);
} }
memcpyc(IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6); memcpy(IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
IPBUF->ethhdr.type = HTONS(UIP_ETHTYPE_IP); IPBUF->ethhdr.type = HTONS(UIP_ETHTYPE_IP);
-2
View File
@@ -55,8 +55,6 @@
#include "uip.h" #include "uip.h"
#include "../rtl837x_common.h" #include "../rtl837x_common.h"
extern __code struct uip_eth_addr uip_ethaddr;
/** /**
* The Ethernet header. * The Ethernet header.
*/ */