Skip to content

Commit 70e56b1

Browse files
author
Juha Heiskanen
committed
Wi-sun DHCP client support and RPL prefix learn Callback
Wi-sun enable dhcpv6 client and DHCPv6 support RPL will indicate when user for learned prefix's or switch Parent
1 parent 3389b46 commit 70e56b1

File tree

8 files changed

+78
-17
lines changed

8 files changed

+78
-17
lines changed

source/6LoWPAN/Bootstraps/Generic/protocol_6lowpan_bootstrap.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1786,7 +1786,7 @@ int8_t arm_6lowpan_bootstarp_bootstrap_set(int8_t interface_id, net_6lowpan_mode
17861786
*/
17871787
if (cur->lowpan_info & INTERFACE_NWK_ROUTER_DEVICE) {
17881788
//rpl_control_set_domain_on_interface(cur, protocol_6lowpan_rpl_domain, true);
1789-
//rpl_control_set_callback(protocol_6lowpan_rpl_domain, protocol_6lowpan_bootstrap_rpl_callback, cur);
1789+
//rpl_control_set_callback(protocol_6lowpan_rpl_domain, protocol_6lowpan_bootstrap_rpl_callback, NULL, cur);
17901790
}
17911791
#endif
17921792
cur->configure_flags |= INTERFACE_BOOTSTRAP_DEFINED;
@@ -2181,7 +2181,7 @@ void nwk_6lowpan_nd_address_registartion_ready(protocol_interface_info_entry_t *
21812181
// arm_nwk_6lowpan_rpl_dodag_poison from a previous connection may have left force_leaf set
21822182
rpl_control_force_leaf(protocol_6lowpan_rpl_domain, false);
21832183
rpl_control_set_domain_on_interface(cur, protocol_6lowpan_rpl_domain, true);
2184-
rpl_control_set_callback(protocol_6lowpan_rpl_domain, protocol_6lowpan_bootstrap_rpl_callback, cur);
2184+
rpl_control_set_callback(protocol_6lowpan_rpl_domain, protocol_6lowpan_bootstrap_rpl_callback, NULL, cur);
21852185
}
21862186
// Send unicast DIS to coordinator
21872187
nwk_bootstrap_icmp_rpl_dis_coord_msg_tx(cur);

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "NWK_INTERFACE/Include/protocol.h"
3030
#include "6LoWPAN/Bootstraps/protocol_6lowpan.h"
3131
#include "6LoWPAN/Bootstraps/protocol_6lowpan_interface.h"
32+
#include "ipv6_stack/protocol_ipv6.h"
3233
#include "6LoWPAN/MAC/mac_helper.h"
3334
#include "6LoWPAN/MAC/mac_data_poll.h"
3435
#include "6LoWPAN/MAC/mpx_api.h"
@@ -57,7 +58,7 @@
5758
#include "Service_Libs/mac_neighbor_table/mac_neighbor_table.h"
5859
#include "Service_Libs/nd_proxy/nd_proxy.h"
5960
#include "platform/topo_trace.h"
60-
61+
#include "DHCPv6_client/dhcpv6_client_api.h"
6162
#include "net_rpl.h"
6263
#include "mac_api.h"
6364

@@ -127,7 +128,7 @@ static void ws_bootstrap_address_notification_cb(struct protocol_interface_info_
127128
}
128129
if (reason == ADDR_CALLBACK_DAD_COMPLETE) {
129130
//Trig Address Registartion only when Bootstrap is ready
130-
if (interface->nwk_bootstrap_state == ER_BOOTSRAP_DONE) {
131+
if (interface->nwk_bootstrap_state == ER_BOOTSRAP_DONE || addr->source == ADDR_SOURCE_DHCP) {
131132
ws_bootsrap_event_trig(WS_ADDRESS_ADDED, interface->bootStrapId, ARM_LIB_LOW_PRIORITY_EVENT, (void *)addr);
132133
}
133134
if (addr_ipv6_scope(addr->address,interface) > IPV6_SCOPE_LINK_LOCAL) {
@@ -604,6 +605,7 @@ static int8_t ws_bootstrap_up(protocol_interface_info_entry_t *cur)
604605
cur->ipv6_neighbour_cache.omit_aro_success = true;
605606
/* Disable NUD Probes */
606607
cur->ipv6_neighbour_cache.send_nud_probes = false;
608+
dhcp_client_init(cur->id);
607609

608610
ws_nud_table_reset(cur);
609611

@@ -627,6 +629,7 @@ static int8_t ws_bootstrap_down(protocol_interface_info_entry_t *cur)
627629
ws_llc_reset(cur);
628630
nd_proxy_downstream_interface_unregister(cur->id);
629631
ws_nud_table_reset(cur);
632+
dhcp_client_delete(cur->id);
630633

631634
return nwk_6lowpan_down(cur);
632635
}
@@ -1509,6 +1512,51 @@ static void ws_bootstrap_rpl_callback(rpl_event_t event, void *handle)
15091512
tr_info("RPL event %d", event);
15101513
}
15111514

1515+
static void ws_dhcp_client_global_adress_cb(int8_t interface, uint8_t dhcp_addr[static 16], uint8_t prefix[static 16], bool register_status)
1516+
{
1517+
(void)prefix;
1518+
(void)interface;
1519+
//TODO add handler for negative status
1520+
tr_debug("DHCPv6 %s status %u",trace_ipv6(dhcp_addr), register_status);
1521+
}
1522+
1523+
static bool ws_address_entry_available(uint8_t *prefixPtr, if_address_list_t *list)
1524+
{
1525+
bool addressReady = false;
1526+
ns_list_foreach(if_address_entry_t, entry, list) {
1527+
if (memcmp(entry->address, prefixPtr, 8) == 0) {
1528+
addressReady = true;
1529+
break;
1530+
}
1531+
}
1532+
return addressReady;
1533+
}
1534+
1535+
void ws_dhcp_client_address_request(protocol_interface_info_entry_t *cur, uint8_t *prefix, uint8_t *parent_link_local)
1536+
{
1537+
if (!ws_address_entry_available(prefix, &cur->ip_addresses)) {
1538+
if (dhcp_client_get_global_address(cur->id, parent_link_local, prefix, cur->mac, ws_dhcp_client_global_adress_cb) != 0) {
1539+
tr_error("DHCPp client request fail");
1540+
}
1541+
}
1542+
}
1543+
1544+
static void ws_rpl_prefix_callback(prefix_entry_t *prefix, void *handle, uint8_t *parent_link_local)
1545+
{
1546+
protocol_interface_info_entry_t *cur = (protocol_interface_info_entry_t*) handle;
1547+
/* Check if A-Flag.
1548+
* A RPL node may use this option for the purpose of Stateless Address Autoconfiguration (SLAAC)
1549+
* from a prefix advertised by a parent.
1550+
*/
1551+
if (prefix->options & PIO_A) {
1552+
if (icmpv6_slaac_prefix_update(cur, prefix->prefix, prefix->prefix_len, prefix->lifetime, prefix->preftime) != 0) {
1553+
ipv6_interface_slaac_handler(cur, prefix->prefix, prefix->prefix_len, prefix->lifetime, prefix->preftime);
1554+
}
1555+
} else if (prefix->prefix_len) {
1556+
ws_dhcp_client_address_request(cur, prefix->prefix, parent_link_local);
1557+
}
1558+
}
1559+
15121560
static void ws_bootstrap_rpl_activate(protocol_interface_info_entry_t *cur)
15131561
{
15141562
tr_debug("RPL Activate");
@@ -1517,7 +1565,7 @@ static void ws_bootstrap_rpl_activate(protocol_interface_info_entry_t *cur)
15171565

15181566
addr_add_router_groups(cur);
15191567
rpl_control_set_domain_on_interface(cur, protocol_6lowpan_rpl_domain, downstream);
1520-
rpl_control_set_callback(protocol_6lowpan_rpl_domain, ws_bootstrap_rpl_callback, cur);
1568+
rpl_control_set_callback(protocol_6lowpan_rpl_domain, ws_bootstrap_rpl_callback, ws_rpl_prefix_callback, cur);
15211569
// If i am router I Do this
15221570
rpl_control_force_leaf(protocol_6lowpan_rpl_domain, leaf);
15231571

source/6LoWPAN/ws/ws_bootstrap.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ void ws_nud_entry_remove_active(protocol_interface_info_entry_t *cur, void *neig
6262

6363
void ws_nud_active_timer(protocol_interface_info_entry_t *cur, uint16_t ticks);
6464

65+
void ws_dhcp_client_address_request(protocol_interface_info_entry_t *cur, uint8_t *prefix, uint8_t *parent_link_local);
66+
6567
#else
6668

6769
#define ws_bootstrap_init(interface_id, bootstrap_mode) (-1)

source/RPL/rpl_control.c

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -348,9 +348,10 @@ void rpl_control_remove_domain_from_interface(protocol_interface_info_entry_t *c
348348
}
349349
}
350350

351-
void rpl_control_set_callback(rpl_domain_t *domain, rpl_domain_callback_t callback, void *cb_handle)
351+
void rpl_control_set_callback(rpl_domain_t *domain, rpl_domain_callback_t callback, rpl_prefix_callback_t prefix_learn_cb, void *cb_handle)
352352
{
353353
domain->callback = callback;
354+
domain->prefix_cb = prefix_learn_cb;
354355
domain->cb_handle = cb_handle;
355356
}
356357

@@ -686,6 +687,12 @@ static void rpl_control_process_prefix_options(protocol_interface_info_entry_t *
686687
prefix_entry_t *prefix_entry = rpl_dodag_update_dio_prefix(dodag, prefix, prefix_len, flags, valid, preferred, false, true);
687688
if (prefix_entry && pref_parent) {
688689
rpl_control_process_prefix_option(prefix_entry, cur);
690+
rpl_domain_t *domain = cur->rpl_domain;
691+
if (domain && domain->prefix_cb) {
692+
uint8_t ll_address[16];
693+
memcpy(ll_address, rpl_neighbour_ll_address(pref_parent), 16);
694+
domain->prefix_cb(prefix_entry, domain->cb_handle,ll_address);
695+
}
689696
}
690697
}
691698

@@ -711,15 +718,7 @@ void rpl_control_process_prefix_option(prefix_entry_t *prefix, protocol_interfac
711718
//tr_debug("Register On Link Prefix to routing table");
712719
ipv6_route_add(prefix->prefix, prefix->prefix_len, cur->id, NULL, ROUTE_RADV, prefix->lifetime, 0);
713720
}
714-
/* Check if A-Flag.
715-
* A RPL node may use this option for the purpose of Stateless Address Autoconfiguration (SLAAC)
716-
* from a prefix advertised by a parent.
717-
*/
718-
if (prefix->options & PIO_A) {
719-
if (icmpv6_slaac_prefix_update(cur, prefix->prefix, prefix->prefix_len, prefix->lifetime, prefix->preftime) != 0) {
720-
ipv6_interface_slaac_handler(cur, prefix->prefix, prefix->prefix_len, prefix->lifetime, prefix->preftime);
721-
}
722-
}
721+
723722
}
724723

725724

source/RPL/rpl_control.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ typedef enum rpl_event {
4040

4141
typedef void rpl_domain_callback_t(rpl_event_t event, void *handle);
4242

43+
typedef void rpl_prefix_callback_t(struct prefix_entry_t *prefix, void *handle, uint8_t *parent_link_local);
44+
4345
typedef struct rpl_domain
4446
{
4547
NS_LIST_HEAD_INCOMPLETE(struct rpl_instance) instances;
@@ -52,6 +54,7 @@ typedef struct rpl_domain
5254
/* As part of shutdown, we can force entering leaf mode */
5355
bool force_leaf;
5456
rpl_domain_callback_t *callback;
57+
rpl_prefix_callback_t *prefix_cb;
5558
void *cb_handle;
5659
} rpl_domain_t;
5760

@@ -141,7 +144,7 @@ rpl_domain_t *rpl_control_create_domain(void);
141144
void rpl_control_delete_domain(rpl_domain_t *domain);
142145
void rpl_control_set_domain_on_interface(struct protocol_interface_info_entry *cur, rpl_domain_t *domain, bool downstream);
143146
void rpl_control_remove_domain_from_interface(struct protocol_interface_info_entry *cur);
144-
void rpl_control_set_callback(rpl_domain_t *domain, rpl_domain_callback_t callback, void *cb_handle);
147+
void rpl_control_set_callback(rpl_domain_t *domain, rpl_domain_callback_t callback, rpl_prefix_callback_t prefix_learn_cb, void *cb_handle);
145148

146149
/* Target publishing */
147150
void rpl_control_publish_host_address(rpl_domain_t *domain, const uint8_t addr[16], uint32_t lifetime);

source/RPL/rpl_upward.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,6 +1407,9 @@ void rpl_instance_run_parent_selection(rpl_instance_t *instance)
14071407
if (rpl_interface) {
14081408
ns_list_foreach(prefix_entry_t, prefix, &dodag->prefixes) {
14091409
rpl_control_process_prefix_option(prefix, rpl_interface);
1410+
if (instance->domain->prefix_cb) {
1411+
instance->domain->prefix_cb(prefix, rpl_interface, preferred_parent->ll_address);
1412+
}
14101413
}
14111414
}
14121415
}

source/nsconfig.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@
5757
#endif
5858
#endif /* HAVE_THREAD */
5959

60+
#if defined(HAVE_WS)
61+
#ifndef HAVE_DHCPV6
62+
#define HAVE_DHCPV6
63+
#endif
64+
#endif /* HAVE_WS */
65+
6066

6167
#endif // ifndef _NANOSTACK_SOURCE_CONFIG_H
6268

test/nanostack/unittest/stub/rpl_control_stub.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ void rpl_control_remove_domain_from_interface(protocol_interface_info_entry_t *c
9999

100100
}
101101

102-
void rpl_control_set_callback(rpl_domain_t *domain, rpl_domain_callback_t callback, void *cb_handle)
102+
void rpl_control_set_callback(rpl_domain_t *domain, rpl_domain_callback_t callback, rpl_prefix_callback_t prefix_learn_cb, void *cb_handle)
103103
{
104104

105105
}

0 commit comments

Comments
 (0)