From ea230615f91aadbc8fb9afd43431ba87618ebf15 Mon Sep 17 00:00:00 2001 From: logicog Date: Sat, 7 Feb 2026 18:05:23 +0100 Subject: [PATCH] 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. --- dhcp.c | 9 ++++----- httpd/page_impl.c | 1 - rtl837x_common.h | 1 + rtl837x_regs.h | 4 +++- rtl837x_stp.c | 8 ++++---- rtlplayground.c | 22 ++++++++++++++++++++-- uip/uip.c | 2 -- uip/uip_arp.c | 10 +++++----- uip/uip_arp.h | 2 -- 9 files changed, 37 insertions(+), 22 deletions(-) diff --git a/dhcp.c b/dhcp.c index ed49b5e..9febcca 100644 --- a/dhcp.c +++ b/dhcp.c @@ -12,7 +12,6 @@ #include "uip.h" #include "uip/uip.h" -extern __code struct uip_eth_addr uip_ethaddr; __xdata struct dhcp_state dhcp_state; __xdata uip_ipaddr_t server; @@ -104,7 +103,7 @@ void dhcp_prepare_request(void) DHCP_P->flags = 0; // Clear fields client_ip to bootp_file 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[1] = 0x82; 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_LEN; 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; } @@ -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[2]; 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[2]; 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); } diff --git a/httpd/page_impl.c b/httpd/page_impl.c index aa7e38f..f8d810b 100644 --- a/httpd/page_impl.c +++ b/httpd/page_impl.c @@ -29,7 +29,6 @@ extern __xdata uint16_t cont_len; extern __xdata uint32_t cont_addr; extern __code uint8_t * __code hex; 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 sfp_pins_last; diff --git a/rtl837x_common.h b/rtl837x_common.h index 3ff6fb8..6f02ed3 100644 --- a/rtl837x_common.h +++ b/rtl837x_common.h @@ -79,6 +79,7 @@ struct flash_region_t { }; 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) void print_string(__code char *p); diff --git a/rtl837x_regs.h b/rtl837x_regs.h index fcb2928..b6d0e54 100644 --- a/rtl837x_regs.h +++ b/rtl837x_regs.h @@ -2,7 +2,9 @@ #define _RTL837X_REGS_H_ #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 RESET_SOC_BIT 0 #define RESET_NIC_BIT 2 diff --git a/rtl837x_stp.c b/rtl837x_stp.c index e04be9a..33c29f1 100644 --- a/rtl837x_stp.c +++ b/rtl837x_stp.c @@ -17,7 +17,7 @@ extern __code struct machine machine; 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]; @@ -164,9 +164,9 @@ void stp_cnf_send(uint8_t port) STP_O->bpdu_type = 0x00; // Config 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); - 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.ext = 0x00; @@ -221,7 +221,7 @@ void stp_setup(void) __banked root_bridge.prio = 0x80; // This corresponds to 32768 root_bridge.ext = 0x00; - memcpyc(root_bridge.mac, uip_ethaddr.addr, 6); + memcpy(root_bridge.mac, uip_ethaddr.addr, 6); } diff --git a/rtlplayground.c b/rtlplayground.c index cd468dc..129b8e7 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -76,10 +76,11 @@ void crc16(__xdata uint8_t *v) __naked; __xdata uint8_t idle_ready; __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 netmask[] = { 255, 255, 255, 0}; +__xdata struct uip_eth_addr uip_ethaddr; + volatile __xdata uint32_t ticks; volatile __xdata uint8_t sec_counter; 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_draddr, gatewayIP[0], gatewayIP[1], gatewayIP[2], gatewayIP[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 init_smi(); - rtl8373_revision(); if (machine_detected.isRTL8373) rtl8373_init(); diff --git a/uip/uip.c b/uip/uip.c index f2d6767..40c018c 100644 --- a/uip/uip.c +++ b/uip/uip.c @@ -132,8 +132,6 @@ static __code const uip_ipaddr_t all_zeroes_addr = {0x0000,0x0000}; #endif /* UIP_CONF_IPV6 */ -extern __code struct uip_eth_addr uip_ethaddr; - #ifndef UIP_CONF_EXTERNAL_BUFFER u8_t uip_buf[UIP_BUFSIZE + 2]; /* The packet buffer that contains incoming packets. */ diff --git a/uip/uip_arp.c b/uip/uip_arp.c index 160dab1..8c9b2a8 100644 --- a/uip/uip_arp.c +++ b/uip/uip_arp.c @@ -306,8 +306,8 @@ uip_arp_arpin(void) __banked BUF_O->opcode = HTONS(2); memcpy(BUF_O->dhwaddr.addr, BUF->shwaddr.addr, 6); - memcpyc(BUF_O->shwaddr.addr, uip_ethaddr.addr, 6); - memcpyc(BUF_O->ethhdr.src.addr, uip_ethaddr.addr, 6); + memcpy(BUF_O->shwaddr.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); 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->dhwaddr.addr, 0x00, 6); - memcpyc(BUF_O->ethhdr.src.addr, uip_ethaddr.addr, 6); - memcpyc(BUF_O->shwaddr.addr, uip_ethaddr.addr, 6); + memcpy(BUF_O->ethhdr.src.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->sipaddr, uip_hostaddr); @@ -420,7 +420,7 @@ uip_arp_out(void) __banked /* Build an ethernet header. */ 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); diff --git a/uip/uip_arp.h b/uip/uip_arp.h index 6c8840b..833d7c2 100644 --- a/uip/uip_arp.h +++ b/uip/uip_arp.h @@ -55,8 +55,6 @@ #include "uip.h" #include "../rtl837x_common.h" -extern __code struct uip_eth_addr uip_ethaddr; - /** * The Ethernet header. */