Skip to content

Commit

Permalink
Merge pull request #349 from eduazocar/feature/uniqueid
Browse files Browse the repository at this point in the history
sys/uniqueid: Uniqueid model RTOS
  • Loading branch information
CW-75 committed Sep 20, 2022
2 parents f425506 + cef73a6 commit 3d21b60
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 114 deletions.
7 changes: 5 additions & 2 deletions firmware/network/rpl_protocol/rpl_protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,15 +93,18 @@ int8_t rpl_setup(uint8_t mode) {
DEBUG("Error: could not get the iface.\n");
return -1;
}
err = rpl_init(iface_index);
if (mode == DAG)
{
err = rpl_init(iface_index);
}
if (err != 0) {
DEBUG("Error: couldn't init the RPL .\n");
return -1;
}
if (mode == DODAG || CONFIG_IS_DODAG == DODAG) {
err = get_ipv6_global(iface_index, &ip);
if (err < 0) {
subnet_to_ipv6(&ip);
get_uid_ipv6(&ip, KCONFIG_UID_OPTION || UNIQUEID_STATIC_MODE);
if (gnrc_netif_ipv6_addr_add(gnrc_netif_get_by_pid(iface_index), &ip, 64,
GNRC_NETIF_IPV6_ADDRS_FLAGS_STATE_VALID) < 0) {
DEBUG("Error: Couldn't add IPv6 global address\n");
Expand Down
11 changes: 11 additions & 0 deletions firmware/sys/Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
ifneq (,$(filter at_client,$(USEMODULE)))
DIRS += at_client
endif

ifneq (,$(filter serialization,$(USEMODULE)))
DIRS += serialization
endif

ifneq (,$(filter storage,$(USEMODULE)))
DIRS += storage
endif

ifneq (,$(filter uniqueid,$(USEMODULE)))
DIRS += uniqueid
endif

include $(RIOTBASE)/Makefile.base
23 changes: 1 addition & 22 deletions firmware/sys/uniqueid/Kconfig
Original file line number Diff line number Diff line change
@@ -1,20 +1,9 @@
menu "Uniqueid"

config SELECT_HEADER_IPV6
bool "Edit IPV6 Header"
default n

menu "Change default IPV6 header"
visible if SELECT_HEADER_IPV6
#comment "Header using in unique cpuid address"

config HEADER_ADDRESS_ID
string "IPV6 HEADER"
default "2001:db8:"

endmenu # Change default IPV6 header
default "2001:db8:1:1"

menu "Subnet"
choice IPV6_MODE
prompt "Select IPV6 Subnet mode"
config MODE_STATIC
Expand All @@ -24,16 +13,6 @@ menu "Subnet"
config MODE_RANDOM
bool "RANDOM"
endif

config MODE_MANUAL
bool "MANUAL"

endchoice

config SUBNET_ADDRESS_ID
string "IPV6 SUBNET"
default "1111:2222"
depends on MODE_MANUAL

endmenu # Prefix
endmenu
43 changes: 33 additions & 10 deletions firmware/sys/uniqueid/include/uniqueid.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,29 +32,52 @@
#ifdef __cplusplus
extern "C" {
#endif

#define LAST_OCTECTS (8)
#define OCTETS_BYTE_SIZE (8)

#ifdef CONFIG_MODE_STATIC
#define KCONFIG_UID_OPTION (UNIQUEID_STATIC_MODE)
#endif
#ifdef CONFIG_MODE_RANDOM
#define KCONFIG_UID_OPTION (UNIQUEID_RANDOM_MODE)
#endif

/**
* @brief Get the CPU unique ID of this platform
* This function gets base cpu address using cpuid_get
*
* @param id pointer to char array with CPUID_LEN size.
*
*/
#define CPUID(id) cpuid_get(id);
* @name Uniqueid modes
* @{
*/
typedef enum {
UNIQUEID_STATIC_MODE = 0,
UNIQUEID_RANDOM_MODE,
} uniqueid_mode_t;

/**@}*/

/**
* @brief Get the CPU unique ID of this platform
* This function gets base cpu address using cpuid_get
*
* @param id pointer to char array with CPUID_LEN size.
*
*/
#define CPUID(id) cpuid_get(id)

/**
* @brief union to get 32 bit random number and convert to a byte array.
*/

union random_buff {
uint8_t u8[4]; /*!< unint8 buff*/
uint32_t u32; /*!< uint32 address*/
uint8_t u8[8]; /*!< unint8 buff*/
uint32_t u32[2]; /*!< uint32 address*/
};
/**
* @brief This function get ipv6 address (mode: static (default), random, manual)
* @param [out] addr Address in ipv6 format
*/
void subnet_to_ipv6(ipv6_addr_t *addr);
void get_uid_ipv6(ipv6_addr_t *addr, uniqueid_mode_t mode);

uint32_t get_uid_seed(void *val, const uint8_t len);
#ifdef __cplusplus
}
#endif
Expand Down
65 changes: 30 additions & 35 deletions firmware/sys/uniqueid/uniqueid.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,50 +44,45 @@
#endif
#include "debug.h"

void subnet_to_ipv6(ipv6_addr_t *addr) {
(void)addr;
#ifdef CONFIG_MODE_STATIC
void get_uid_ipv6(ipv6_addr_t *addr, uniqueid_mode_t mode) {
ipv6_addr_t header = {
.u8 = {0},
};
char addr_cpu[CPUID_LEN] = {0};
CPUID(addr_cpu);
ipv6_addr_from_str(&header, CONFIG_HEADER_ADDRESS_ID);
memcpy((char *)addr->u8, (char *)header.u8, 4);
strncat((char *)addr->u8, addr_cpu, 4);

#endif
switch (mode) {
case UNIQUEID_STATIC_MODE:
ipv6_addr_from_str(&header, CONFIG_HEADER_ADDRESS_ID);
memcpy(addr->u8, header.u8, 8);
char addr_cpu[CPUID_LEN];
CPUID(addr_cpu);
memcpy(addr->u8 + LAST_OCTECTS, addr_cpu, CPUID_LEN <= 8? CPUID_LEN : OCTETS_BYTE_SIZE );
break;
case UNIQUEID_RANDOM_MODE:
ipv6_addr_from_str(&header, CONFIG_HEADER_ADDRESS_ID);
memcpy(addr->u8, header.u8, OCTETS_BYTE_SIZE);
union random_buff random_number = {0};
get_uid_seed(&random_number, OCTETS_BYTE_SIZE);
memcpy(addr->u8 + LAST_OCTECTS, random_number.u8, OCTETS_BYTE_SIZE);
break;
default:
break;
}
}

#ifdef CONFIG_MODE_RANDOM
ipv6_addr_t header = {
.u8 = {0},
};
union random_buff random_number;
ipv6_addr_from_str(&header, CONFIG_HEADER_ADDRESS_ID);
memcpy((char *)addr->u8, (char *)header.u8, 4);
uint32_t get_uid_seed(void *val, const uint8_t len) {
uint32_t rval;
#if (MODULE_AT86RF2XX || MODULE_AT86RF215)
int index = get_ieee802154_iface();
netif_t *iface = netif_get_by_id(index);
netif_get_opt(iface, NETOPT_RANDOM, 0, &random_number, sizeof(random_number));
netif_get_opt(iface, NETOPT_RANDOM, 0, &rval, sizeof(uint32_t));
#else
hwrng_init();
hwrng_read(&random_number, sizeof(random_number));
#endif
random_init(random_number.u32);
random_number.u32 = random_uint32();
strncat((char *)addr->u8, (char *)random_number.u8, 4);
hwrng_read(&rval, sizeof(rval));
#endif
for (uint8_t i = 0; i < len; i++) {
random_init(rval);
rval = random_uint32();
memcpy(((uint8_t*)val + i), &rval, sizeof(uint8_t));
}

#ifdef CONFIG_MODE_MANUAL
ipv6_addr_t header = {
.u8 = {0},
};
ipv6_addr_t subnet = {
.u8 = {0},
};
ipv6_addr_from_str(&header, CONFIG_HEADER_ADDRESS_ID);
ipv6_addr_from_str(&subnet, CONFIG_SUBNET_ADDRESS_ID);
memcpy((char *)addr->u8, (char *)header.u8, 4);
memcpy((char *)addr->u8 + 4, (char *)subnet.u8, 4);
#endif
return 0;
}
58 changes: 13 additions & 45 deletions tests/uniqueid/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,60 +29,28 @@
#include "uniqueid.h"
#include "unique_random.h"

void get_unique_from_mac(ipv6_addr_t *output) {
ipv6_addr_t header = {
.u8 = {0},
};
char addr_cpu[CPUID_LEN] = {0};
CPUID(addr_cpu);
ipv6_addr_from_str(&header, CONFIG_HEADER_ADDRESS_ID);
memcpy((char *)output->u8, (char *)header.u8, 4);
strncat((char *)output->u8, addr_cpu, 4);
ipv6_addr_print(output);
}
ipv6_addr_t addr;

void test_get_ipv6Address(void) {
#if CONFIG_MODE_STATIC || CONFIG_MODE_MANUAL
ipv6_addr_t ipv6 = {
.u8 = {0},
};
ipv6_addr_t output = {
.u8 = {0},
};
void test_get_ipv6_static(void){
get_uid_ipv6(&addr, UNIQUEID_STATIC_MODE);
ipv6_addr_print(&addr);
printf("\n");
subnet_to_ipv6(&ipv6);
ipv6_addr_print(&ipv6);
}

void test_get_ipv6_random(void){
get_uid_ipv6(&addr, UNIQUEID_RANDOM_MODE);
ipv6_addr_print(&addr);
printf("\n");
get_unique_from_mac(&output);
#if CONFIG_MODE_STATIC
TEST_ASSERT_EQUAL_INT(1, ipv6_addr_equal(&ipv6, &output));
#elif CONFIG_MODE_MANUAL
TEST_ASSERT_EQUAL_INT(1, !ipv6_addr_equal(&ipv6, &output));
#endif
#endif
}

#ifdef CONFIG_MODE_RANDOM
ipv6_addr_t output1 = {
.u8 = {0},
};
ipv6_addr_t output2 = {
.u8 = {0},
};
subnet_to_ipv6(&output1);
subnet_to_ipv6(&output2);
printf("\nFirst random IPv6\n");
ipv6_addr_print(&output1);
printf("\nSecond random IPv6\n");
ipv6_addr_print(&output2);
TEST_ASSERT_EQUAL_INT(0, ipv6_addr_equal(&output1, &output2));
printf("\n\nBinary data printed\n");
void test_uid_random_blocks(void){
random_generator(64);
#endif
}

Test *tests_get_unique_id(void) {
EMB_UNIT_TESTFIXTURES(fixtures){
new_TestFixture(test_get_ipv6Address),
new_TestFixture(test_get_ipv6_static),
new_TestFixture(test_get_ipv6_random),
};

EMB_UNIT_TESTCALLER(tests_get_unique_id, NULL, NULL, fixtures);
Expand Down

0 comments on commit 3d21b60

Please sign in to comment.