mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Merge pull request #117 from logicog/uuid_mac
Generate a random stable locally administered addresses (LAA) MAC address based on the SoC's UUID + LOT number.
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,6 +3,8 @@
|
|||||||
|
|
||||||
#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
@@ -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
@@ -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();
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user