Skip to content

Commit d2ea325

Browse files
author
Mika Leppänen
committed
Moved DAD enabled check to Ipv6 SLAAC handler
Corrected also review defects.
1 parent 49994fc commit d2ea325

File tree

3 files changed

+51
-61
lines changed

3 files changed

+51
-61
lines changed

nanostack/ethernet_mac_api.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ typedef int8_t eth_mac_iid64_address_set(const eth_mac_api_t *api, const uint8_t
134134
/**
135135
* @brief Read 64 bit interface identifier
136136
* @param api API to handle the request
137-
* @paramiid64_buf Pointer where IID64 can be written
137+
* @param iid64_buf Pointer where IID64 can be written
138138
* @return 0 if successful, -1 otherwise
139139
*/
140140
typedef int8_t eth_mac_iid64_address_get(const eth_mac_api_t *api, uint8_t *iid64_buf);

source/NWK_INTERFACE/protocol_core.c

Lines changed: 45 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -868,93 +868,80 @@ protocol_interface_info_entry_t *protocol_stack_interface_generate_ethernet(eth_
868868
if (!api) {
869869
return NULL;
870870
}
871-
protocol_interface_info_entry_t *new_entry = NULL;
872871

873872
ns_list_foreach(protocol_interface_info_entry_t, cur, &protocol_interface_info_list) {
874873
if (cur->eth_mac_api == api) {
875874
return cur;
876875
}
877876
}
878877

879-
if (api) {
880-
new_entry = protocol_core_interface_ethernet_entry_get(api);
881-
882-
if (new_entry) {
883-
neighbor_cache_init(&(new_entry->neigh_cache));
884-
pan_blacklist_cache_init(&(new_entry->pan_blaclist_cache));
885-
pan_coordinator_blacklist_cache_init(&(new_entry->pan_cordinator_black_list));
886-
ipv6_neighbour_cache_init(&new_entry->ipv6_neighbour_cache, new_entry->id);
887-
addr_max_slaac_entries_set(new_entry, 16);
888-
uint8_t mac[6];
889-
int8_t error = api->mac48_get(api, mac);
890-
if (error) {
891-
tr_error("mac_ext_mac64_address_get failed: %d", error);
892-
ns_dyn_mem_free(new_entry);
893-
return NULL;
894-
}
895-
896-
protocol_stack_interface_iid_eui64_generate(new_entry, mac);
897-
ns_list_add_to_start(&protocol_interface_info_list, new_entry);
898-
899-
(void) ipv6_route_table_set_max_entries(new_entry->id, ROUTE_RADV, 16);
878+
protocol_interface_info_entry_t *new_entry = protocol_core_interface_ethernet_entry_get(api);
900879

901-
return new_entry;
902-
}
880+
if (!new_entry) {
881+
return NULL;
903882
}
904-
return NULL;
905-
}
906883

907-
void protocol_stack_interface_ppp_addr_notification(struct protocol_interface_info_entry *interface, const struct if_address_entry *addr, if_address_callback_t reason)
908-
{
909-
if (interface->dup_addr_detect_transmits == 0 && !addr_is_ipv6_link_local(addr->address) && reason == ADDR_CALLBACK_DAD_COMPLETE && addr->source == ADDR_SOURCE_SLAAC) {
910-
interface->global_address_available = true;
884+
neighbor_cache_init(&(new_entry->neigh_cache));
885+
pan_blacklist_cache_init(&(new_entry->pan_blaclist_cache));
886+
pan_coordinator_blacklist_cache_init(&(new_entry->pan_cordinator_black_list));
887+
ipv6_neighbour_cache_init(&new_entry->ipv6_neighbour_cache, new_entry->id);
888+
addr_max_slaac_entries_set(new_entry, 16);
889+
uint8_t mac[6];
890+
int8_t error = api->mac48_get(api, mac);
891+
if (error) {
892+
tr_error("mac_ext_mac64_address_get failed: %d", error);
893+
ns_dyn_mem_free(new_entry);
894+
return NULL;
911895
}
896+
897+
protocol_stack_interface_iid_eui64_generate(new_entry, mac);
898+
ns_list_add_to_start(&protocol_interface_info_list, new_entry);
899+
900+
(void) ipv6_route_table_set_max_entries(new_entry->id, ROUTE_RADV, 16);
901+
902+
return new_entry;
912903
}
913904

914905
protocol_interface_info_entry_t *protocol_stack_interface_generate_ppp(eth_mac_api_t *api)
915906
{
916907
if (!api) {
917908
return NULL;
918909
}
919-
protocol_interface_info_entry_t *new_entry = NULL;
920910

921911
ns_list_foreach(protocol_interface_info_entry_t, cur, &protocol_interface_info_list) {
922912
if (cur->eth_mac_api == api) {
923913
return cur;
924914
}
925915
}
926916

927-
if (api) {
928-
new_entry = protocol_core_interface_ethernet_entry_get(api);
929-
930-
if (new_entry) {
931-
neighbor_cache_init(&(new_entry->neigh_cache));
932-
pan_blacklist_cache_init(&(new_entry->pan_blaclist_cache));
933-
pan_coordinator_blacklist_cache_init(&(new_entry->pan_cordinator_black_list));
934-
ipv6_neighbour_cache_init(&new_entry->ipv6_neighbour_cache, new_entry->id);
935-
addr_max_slaac_entries_set(new_entry, 16);
936-
uint8_t iid64[8];
937-
int8_t error = api->iid64_get(api, iid64);
938-
if (error) {
939-
tr_error("iid64_get failed: %d", error);
940-
ns_dyn_mem_free(new_entry);
941-
return NULL;
942-
}
943-
memcpy(new_entry->iid_slaac, iid64, 8);
944-
memcpy(new_entry->iid_eui64, iid64, 8);
945-
new_entry->send_mld = false; // No mld for PPP
946-
new_entry->dup_addr_detect_transmits = 0; // No duplicate detection for PPP
917+
protocol_interface_info_entry_t *new_entry = protocol_core_interface_ethernet_entry_get(api);
918+
919+
if (!new_entry) {
920+
return NULL;
921+
}
947922

948-
ns_list_add_to_start(&protocol_interface_info_list, new_entry);
923+
neighbor_cache_init(&(new_entry->neigh_cache));
924+
pan_blacklist_cache_init(&(new_entry->pan_blaclist_cache));
925+
pan_coordinator_blacklist_cache_init(&(new_entry->pan_cordinator_black_list));
926+
ipv6_neighbour_cache_init(&new_entry->ipv6_neighbour_cache, new_entry->id);
927+
addr_max_slaac_entries_set(new_entry, 16);
928+
uint8_t iid64[8];
929+
int8_t error = api->iid64_get(api, iid64);
930+
if (error) {
931+
tr_error("iid64_get failed: %d", error);
932+
ns_dyn_mem_free(new_entry);
933+
return NULL;
934+
}
935+
memcpy(new_entry->iid_slaac, iid64, 8);
936+
memcpy(new_entry->iid_eui64, iid64, 8);
937+
new_entry->send_mld = false; // No mld for PPP
938+
new_entry->dup_addr_detect_transmits = 0; // No duplicate detection for PPP
949939

950-
(void) ipv6_route_table_set_max_entries(new_entry->id, ROUTE_RADV, 16);
940+
ns_list_add_to_start(&protocol_interface_info_list, new_entry);
951941

952-
addr_notification_register(protocol_stack_interface_ppp_addr_notification);
942+
(void) ipv6_route_table_set_max_entries(new_entry->id, ROUTE_RADV, 16);
953943

954-
return new_entry;
955-
}
956-
}
957-
return NULL;
944+
return new_entry;
958945
}
959946

960947
protocol_interface_info_entry_t *protocol_stack_interface_generate_lowpan(mac_api_t *api)

source/ipv6_stack/protocol_ipv6.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,7 @@ static uint8_t ethernet_llao_write(protocol_interface_info_entry_t *cur, uint8_t
246246
(void) must;
247247
(void) ip_addr;
248248

249-
uint8_t mac_not_set[8] = {0,0,0,0,0,0,0,0};
250-
if (memcmp(cur->mac, mac_not_set, 8) == 0) {
249+
if (memcmp(cur->mac, ADDR_EUI64_ZERO, 8) == 0) {
251250
return 0;
252251
}
253252

@@ -969,6 +968,10 @@ void ipv6_interface_slaac_handler(protocol_interface_info_entry_t *cur, const ui
969968
if (cur->ipv6_configure && cur->ipv6_configure->IPv6_ND_state == IPV6_ROUTER_SOLICATION) {
970969
cur->ipv6_configure->IPv6_ND_state = IPV6_GP_CONFIG;
971970
}
971+
// If DAD not enabled address is valid right away
972+
if (cur->dup_addr_detect_transmits == 0) {
973+
address_entry->cb(cur, address_entry, ADDR_CALLBACK_DAD_COMPLETE);
974+
}
972975
}
973976
}
974977

0 commit comments

Comments
 (0)