Skip to content

Commit f8ae0e9

Browse files
author
Arto Kinnunen
committed
Merge remote-tracking branch 'origin/release_internal' into release_external
* origin/release_internal: Added support for handle RPL hop by Hop sender rank 0. Activated RPL force tunnel for wi-sun. RPL tunnel force functionality update RPL parent select timer random update from 1.0-1.2 to 1.0-1.5. MAC Ack wait fixed for OFDM (ARMmbed#2552) Fixed unused variable and function warnings. Wi-SUN bootstrap support RPL poison from Connected state to Discovery RPL Poison update
2 parents 3183d87 + 3275f83 commit f8ae0e9

File tree

19 files changed

+177
-47
lines changed

19 files changed

+177
-47
lines changed

source/6LoWPAN/Thread/thread_test_api.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ int_fast8_t arm_nwk_6lowpan_thread_test_add_neighbour(
7070
const uint8_t *id_mask,
7171
const uint8_t *route_data)
7272
{
73-
#ifdef HAVE_THREAD
73+
#ifdef HAVE_THREAD_ROUTER
7474
protocol_interface_info_entry_t *cur;
7575
cur = protocol_stack_interface_info_get_by_id(interface_id);
7676
if (!cur) {
@@ -94,7 +94,7 @@ int_fast8_t arm_nwk_6lowpan_thread_test_remove_neighbour(
9494
int8_t interface_id,
9595
uint16_t neighbour_short_addr)
9696
{
97-
#ifdef HAVE_THREAD
97+
#ifdef HAVE_THREAD_ROUTER
9898
protocol_interface_info_entry_t *cur;
9999
cur = protocol_stack_interface_info_get_by_id(interface_id);
100100
if (!cur) {
@@ -1220,7 +1220,7 @@ int8_t thread_test_initial_slaac_iid_set(int8_t interface_id, uint8_t *iid)
12201220

12211221
int8_t thread_test_router_id_request_send(int8_t interface_id, uint8_t status)
12221222
{
1223-
#ifdef HAVE_THREAD
1223+
#ifdef HAVE_THREAD_ROUTER
12241224
protocol_interface_info_entry_t *cur;
12251225

12261226
cur = protocol_stack_interface_info_get_by_id(interface_id);

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,6 +1086,32 @@ static int8_t ws_bootstrap_up(protocol_interface_info_entry_t *cur)
10861086
return ret_val;
10871087
}
10881088

1089+
void ws_bootstrap_disconnect(protocol_interface_info_entry_t *cur, ws_bootsrap_event_type_e event_type)
1090+
{
1091+
if (cur->nwk_bootstrap_state == ER_RPL_NETWORK_LEAVING) {
1092+
//Already moved to leaving state.
1093+
return;
1094+
}
1095+
1096+
if (cur->rpl_domain && cur->nwk_bootstrap_state == ER_BOOTSRAP_DONE) {
1097+
//Stop Asych Timer
1098+
ws_bootstrap_asynch_trickle_stop(cur);
1099+
tr_debug("Start Network soft leaving");
1100+
if (event_type == WS_FAST_DISCONNECT) {
1101+
rpl_control_instant_poison(cur, cur->rpl_domain);
1102+
cur->bootsrap_state_machine_cnt = 80; //Give 8 seconds time to send Poison
1103+
} else {
1104+
rpl_control_poison(cur->rpl_domain, 1);
1105+
cur->bootsrap_state_machine_cnt = 6000; //Give 10 minutes time for poison if RPL is not report
1106+
}
1107+
1108+
} else {
1109+
ws_bootstrap_event_discovery_start(cur);
1110+
}
1111+
cur->nwk_bootstrap_state = ER_RPL_NETWORK_LEAVING;
1112+
}
1113+
1114+
10891115
static void ws_bootstrap_asynch_trickle_stop(protocol_interface_info_entry_t *cur)
10901116
{
10911117
cur->ws_info->trickle_pas_running = false;
@@ -1638,7 +1664,7 @@ static void ws_bootstrap_pan_config_analyse(struct protocol_interface_info_entry
16381664
tr_debug("NEW Brodcast Schedule %u...BR rebooted", ws_bs_ie.broadcast_schedule_identifier);
16391665
cur->ws_info->ws_bsi_block.block_time = cur->ws_info->cfg->timing.pan_timeout;
16401666
cur->ws_info->ws_bsi_block.old_bsi = cur->ws_info->hopping_schdule.fhss_bsi;
1641-
ws_bootstrap_event_discovery_start(cur);
1667+
ws_bootstrap_event_disconnect(cur, WS_NORMAL_DISCONNECT);
16421668
}
16431669
return;
16441670
}
@@ -2364,7 +2390,11 @@ int ws_bootstrap_set_rf_config(protocol_interface_info_entry_t *cur, phy_rf_chan
23642390
set_request.value_size = sizeof(phy_rf_channel_configuration_s);
23652391
cur->mac_api->mlme_req(cur->mac_api, MLME_SET, &set_request);
23662392
// Set Ack wait duration
2367-
uint16_t ack_wait_symbols = WS_ACK_WAIT_SYMBOLS + (WS_TACK_MAX_MS * (rf_configs.datarate / 1000));
2393+
uint8_t bits_per_symbol = 1;
2394+
if (rf_configs.modulation == M_OFDM) {
2395+
bits_per_symbol = 4;
2396+
}
2397+
uint16_t ack_wait_symbols = WS_ACK_WAIT_SYMBOLS + (WS_TACK_MAX_MS * (rf_configs.datarate / 1000) / bits_per_symbol);
23682398
set_request.attr = macAckWaitDuration;
23692399
set_request.value_pointer = &ack_wait_symbols;
23702400
set_request.value_size = sizeof(ack_wait_symbols);
@@ -2553,6 +2583,15 @@ static void ws_bootstrap_rpl_callback(rpl_event_t event, void *handle)
25532583
if (!cur->rpl_domain || cur->interface_mode != INTERFACE_UP) {
25542584
return;
25552585
}
2586+
2587+
if (event == RPL_EVENT_POISON_FINISHED) {
2588+
//If we are waiting poison we will trig Discovery after couple seconds
2589+
if (cur->nwk_bootstrap_state == ER_RPL_NETWORK_LEAVING) {
2590+
cur->bootsrap_state_machine_cnt = 80; //Give 8 seconds time to send Poison
2591+
}
2592+
return;
2593+
}
2594+
25562595
// if waiting for RPL and
25572596
if (event == RPL_EVENT_DAO_DONE) {
25582597
// Trigger statemachine check
@@ -2832,6 +2871,7 @@ static void ws_bootstrap_rpl_activate(protocol_interface_info_entry_t *cur)
28322871
rpl_control_set_dao_retry_count(WS_MAX_DAO_RETRIES);
28332872
rpl_control_set_initial_dao_ack_wait(WS_MAX_DAO_INITIAL_TIMEOUT);
28342873
rpl_control_set_mrhof_parent_set_size(WS_MAX_PARENT_SET_COUNT);
2874+
rpl_control_set_force_tunnel(true);
28352875
if (cur->bootsrap_mode != ARM_NWK_BOOTSRAP_MODE_6LoWPAN_BORDER_ROUTER) {
28362876
rpl_control_set_memory_limits(WS_NODE_RPL_SOFT_MEM_LIMIT, WS_NODE_RPL_HARD_MEM_LIMIT);
28372877
}
@@ -3132,6 +3172,12 @@ void ws_bootstrap_event_routing_ready(protocol_interface_info_entry_t *cur)
31323172
{
31333173
ws_bootsrap_event_trig(WS_ROUTING_READY, cur->bootStrapId, ARM_LIB_LOW_PRIORITY_EVENT, NULL);
31343174
}
3175+
3176+
void ws_bootstrap_event_disconnect(protocol_interface_info_entry_t *cur, ws_bootsrap_event_type_e event_type)
3177+
{
3178+
ws_bootsrap_event_trig(event_type, cur->bootStrapId, ARM_LIB_LOW_PRIORITY_EVENT, NULL);
3179+
}
3180+
31353181
void ws_bootstrap_configuration_trickle_reset(protocol_interface_info_entry_t *cur)
31363182
{
31373183
trickle_inconsistent_heard(&cur->ws_info->trickle_pan_config, &cur->ws_info->trickle_params_pan_discovery);
@@ -3315,6 +3361,7 @@ static int8_t ws_bootstrap_backbone_ip_addr_get(protocol_interface_info_entry_t
33153361
return -1;
33163362
}
33173363

3364+
33183365
static void ws_bootstrap_event_handler(arm_event_s *event)
33193366
{
33203367
ws_bootsrap_event_type_e event_type;
@@ -3331,7 +3378,6 @@ static void ws_bootstrap_event_handler(arm_event_s *event)
33313378
break;
33323379
case WS_DISCOVERY_START:
33333380
tr_info("Discovery start");
3334-
33353381
protocol_mac_reset(cur);
33363382
ws_llc_reset(cur);
33373383
lowpan_adaptation_interface_reset(cur->id);
@@ -3467,6 +3513,12 @@ static void ws_bootstrap_event_handler(arm_event_s *event)
34673513
ws_bootstrap_advertise_start(cur);
34683514
ws_bootstrap_state_change(cur, ER_BOOTSRAP_DONE);
34693515
break;
3516+
case WS_FAST_DISCONNECT:
3517+
ws_bootstrap_disconnect(cur, WS_FAST_DISCONNECT);
3518+
break;
3519+
case WS_NORMAL_DISCONNECT:
3520+
ws_bootstrap_disconnect(cur, WS_NORMAL_DISCONNECT);
3521+
break;
34703522

34713523
default:
34723524
tr_err("Invalid event received");
@@ -3658,6 +3710,10 @@ void ws_bootstrap_state_machine(protocol_interface_info_entry_t *cur)
36583710
// Bootstrap_done event to application
36593711
nwk_bootsrap_state_update(ARM_NWK_BOOTSTRAP_READY, cur);
36603712
break;
3713+
case ER_RPL_NETWORK_LEAVING:
3714+
tr_debug("WS SM:RPL Leaving ready trigger discovery");
3715+
ws_bootstrap_event_discovery_start(cur);
3716+
break;
36613717
default:
36623718
tr_warn("WS SM:Invalid state %d", cur->nwk_bootstrap_state);
36633719
}
@@ -3743,9 +3799,10 @@ void ws_bootstrap_seconds_timer(protocol_interface_info_entry_t *cur, uint32_t s
37433799
}
37443800
} else {
37453801
// Border router has timed out
3802+
//Clear Timeout timer
37463803
cur->ws_info->pan_timeout_timer = 0;
37473804
tr_warn("Border router has timed out");
3748-
ws_bootstrap_event_discovery_start(cur);
3805+
ws_bootstrap_event_disconnect(cur, WS_FAST_DISCONNECT);
37493806
}
37503807
}
37513808
if (cur->ws_info->aro_registration_timer) {

source/6LoWPAN/ws/ws_bootstrap.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ typedef enum {
2424
WS_DISCOVERY_START, /**< discovery start*/
2525
WS_CONFIGURATION_START, /**< configuration learn start*/
2626
WS_OPERATION_START, /**< active operation start*/
27-
WS_ROUTING_READY /**< RPL routing connected to BR*/
27+
WS_ROUTING_READY, /**< RPL routing connected to BR*/
28+
WS_FAST_DISCONNECT, /**< Do fast timeout after Border router timeout*/
29+
WS_NORMAL_DISCONNECT /**< Border have been rebooted so Slow poison Process*/
2830
} ws_bootsrap_event_type_e;
2931

3032
#ifdef HAVE_WS
@@ -60,6 +62,8 @@ void ws_bootstrap_event_operation_start(protocol_interface_info_entry_t *cur);
6062

6163
void ws_bootstrap_event_routing_ready(protocol_interface_info_entry_t *cur);
6264

65+
void ws_bootstrap_event_disconnect(protocol_interface_info_entry_t *cur, ws_bootsrap_event_type_e event_type);
66+
6367
void ws_bootstrap_configuration_trickle_reset(protocol_interface_info_entry_t *cur);
6468

6569
void ws_bootstrap_seconds_timer(protocol_interface_info_entry_t *cur, uint32_t seconds);

source/MAC/IEEE802_15_4/mac_defines.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ typedef struct protocol_interface_rf_mac_setup {
272272
int8_t bc_timer_id;
273273
uint32_t mlme_tick_count;
274274
uint32_t symbol_rate;
275-
uint32_t symbol_time_us;
275+
uint32_t symbol_time_ns;
276276
uint32_t datarate;
277277
uint8_t max_ED;
278278
uint16_t mlme_ED_counter;

source/MAC/IEEE802_15_4/mac_mlme.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -652,11 +652,11 @@ void mac_extended_mac_set(protocol_interface_rf_mac_setup_s *rf_mac_setup, const
652652

653653
static uint32_t mac_calc_ack_wait_duration(protocol_interface_rf_mac_setup_s *rf_mac_setup, uint16_t symbols)
654654
{
655-
uint32_t AckWaitDuration = 0;
655+
uint32_t AckWaitDuration_us = 0;
656656
if (rf_mac_setup->rf_csma_extension_supported) {
657-
AckWaitDuration = symbols * rf_mac_setup->symbol_time_us;
657+
AckWaitDuration_us = (symbols * rf_mac_setup->symbol_time_ns) / 1000;
658658
}
659-
return AckWaitDuration;
659+
return AckWaitDuration_us;
660660
}
661661

662662
static int8_t mac_mlme_set_ack_wait_duration(protocol_interface_rf_mac_setup_s *rf_mac_setup, const mlme_set_t *set_req)
@@ -1107,8 +1107,8 @@ static int mac_mlme_set_symbol_rate(protocol_interface_rf_mac_setup_s *rf_mac_se
11071107
{
11081108
if (rf_mac_setup->rf_csma_extension_supported) {
11091109
rf_mac_setup->dev_driver->phy_driver->extension(PHY_EXTENSION_GET_SYMBOLS_PER_SECOND, (uint8_t *) &rf_mac_setup->symbol_rate);
1110-
rf_mac_setup->symbol_time_us = 1000000 / rf_mac_setup->symbol_rate;
1111-
tr_debug("SW-MAC driver support rf extension %"PRIu32" symbol/seconds %"PRIu32" us symbol time length", rf_mac_setup->symbol_rate, rf_mac_setup->symbol_time_us);
1110+
rf_mac_setup->symbol_time_ns = 1000000000 / rf_mac_setup->symbol_rate;
1111+
tr_debug("SW-MAC driver support rf extension %"PRIu32" symbol/seconds %"PRIu32" ns symbol time length", rf_mac_setup->symbol_rate, rf_mac_setup->symbol_time_ns);
11121112
return 0;
11131113
}
11141114
return -1;

source/MAC/IEEE802_15_4/mac_pd_sap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ uint32_t mac_csma_backoff_get(protocol_interface_rf_mac_setup_s *rf_mac_setup)
9797
uint32_t backoff_in_us;
9898
//Multiple aUnitBackoffPeriod symbol time
9999
if (rf_mac_setup->rf_csma_extension_supported) {
100-
backoff_in_us = backoff * rf_mac_setup->aUnitBackoffPeriod * rf_mac_setup->symbol_time_us;
100+
backoff_in_us = backoff * rf_mac_setup->aUnitBackoffPeriod * (rf_mac_setup->symbol_time_ns / 1000);
101101
} else {
102102
backoff_in_us = backoff * rf_mac_setup->backoff_period_in_10us * 10;
103103
}

source/NWK_INTERFACE/Include/protocol.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ typedef enum icmp_state {
124124
ER_BOOTSTRAP_NEW_FRAGMENT_START,
125125
ER_WAIT_RESTART,
126126
ER_RPL_LOCAL_REPAIR,
127+
ER_RPL_NETWORK_LEAVING,
127128
} icmp_state_t;
128129

129130
typedef enum {

source/RPL/rpl_control.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,12 @@ void rpl_control_set_mrhof_parent_set_size(uint16_t parent_set_size)
204204
rpl_policy_set_mrhof_parent_set_size(parent_set_size);
205205
}
206206

207+
/* True Force RPL to use IPv6 tunneling when it send and forward data to Border router direction, This feature is disabled by default */
208+
void rpl_control_set_force_tunnel(bool requested)
209+
{
210+
rpl_policy_force_tunnel_set(requested);
211+
}
212+
207213
/* Send address registration to either specified address, or to non-registered address */
208214
void rpl_control_register_address(protocol_interface_info_entry_t *interface, const uint8_t addr[16])
209215
{
@@ -399,6 +405,7 @@ static void rpl_control_etx_change_callback(int8_t nwk_id, uint16_t previous_et
399405
if (!cur || !cur->rpl_domain) {
400406
return;
401407
}
408+
(void) attribute_index;
402409
// ETX is "better" if now lower, or previous was "unknown" and new isn't infinite
403410
bool better = current_etx < previous_etx || (previous_etx == 0 && current_etx != 0xffff);
404411

source/RPL/rpl_control.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ typedef enum rpl_event {
3636
RPL_EVENT_LOCAL_REPAIR_START, /* RPL start scanning new parent by multicast DIS user can disable beacon request responser here*/
3737
RPL_EVENT_LOCAL_REPAIR_NO_MORE_DIS, /* RPL not sending DIS anymore user can report bootstrap error */
3838
RPL_EVENT_DAO_PARENT_ADD, /* RPL indicate that DAO downward Parent has been added */
39+
RPL_EVENT_POISON_FINISHED, /* RPL have finished Dodag Poison proces */
3940
} rpl_event_t;
4041

4142
typedef void rpl_domain_callback_t(rpl_event_t event, void *handle);
@@ -176,6 +177,7 @@ bool rpl_control_find_worst_neighbor(struct protocol_interface_info_entry *inter
176177

177178
/* Parent link confirmation API extension */
178179
void rpl_control_request_parent_link_confirmation(bool requested);
180+
void rpl_control_set_force_tunnel(bool requested);
179181
void rpl_control_set_dio_multicast_min_config_advertisment_count(uint8_t min_count);
180182
void rpl_control_set_address_registration_timeout(uint16_t timeout_in_minutes);
181183
void rpl_control_set_dao_retry_count(uint8_t count);
@@ -200,6 +202,7 @@ const rpl_dodag_conf_t *rpl_control_get_dodag_config(const struct rpl_instance *
200202
const uint8_t *rpl_control_preferred_parent_addr(const struct rpl_instance *instance, bool global);
201203
uint16_t rpl_control_current_rank(const struct rpl_instance *instance);
202204
uint8_t rpl_policy_mrhof_parent_set_size_get(const rpl_domain_t *domain);
205+
void rpl_control_instant_poison(struct protocol_interface_info_entry *cur, rpl_domain_t *domain);
203206

204207
#else /* HAVE_RPL */
205208

@@ -211,6 +214,7 @@ uint8_t rpl_policy_mrhof_parent_set_size_get(const rpl_domain_t *domain);
211214
#define rpl_control_address_register_done(interface, ll_addr, status) (false)
212215
#define rpl_policy_mrhof_parent_set_size_get(domain) (0)
213216
#define rpl_control_set_mrhof_parent_set_size(parent_set_size)
217+
#define rpl_control_instant_poison(cur, domain) ((void) 0)
214218
#endif /* HAVE_RPL */
215219

216220
#endif /* RPL_CONTROL_H_ */

source/RPL/rpl_data.c

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -334,8 +334,24 @@ static buffer_t *rpl_data_exthdr_provider_hbh_2(buffer_t *buf, rpl_instance_t *i
334334

335335
bool destination_in_instance = false;
336336
uint16_t ext_size = 0;
337-
if (addr_ipv6_equal(route_info->next_hop_addr, buf->dst_sa.address) ||
338-
addr_ipv6_equal(buf->dst_sa.address, dodag->id)) {
337+
338+
// Limit creation of multi-hop RPL packets
339+
// Previous code created multi-hop RPL packets as much as possible,
340+
// sending direct to border router in particular.
341+
// This has caused WiSUN interop problems, so limit this.
342+
// a) When creating a basic packet, have a policy option that prevents
343+
// direct RPL header insertion, forcing tunnelling. This means
344+
// we never put a RPL header on the innermost packet. Option is
345+
// off by default, except for WiSUN, as it increases packet size
346+
// when talking to the border router (eg DAOs).
347+
// b) When putting a packet into a tunnel, set the tunnel exit to the
348+
// next hop always, rather than having a special case for exiting
349+
// at the border router. This is probably a net benefit to packet
350+
// size because of the LL addresses used on the outer header, so
351+
// this is an unconditional change. Exception remains for local
352+
// DODAGs, where the destination address must be the DODAGID.
353+
if (addr_ipv6_equal(route_info->next_hop_addr, buf->dst_sa.address) || (!rpl_policy_force_tunnel() &&
354+
addr_ipv6_equal(buf->dst_sa.address, dodag->id))) {
339355
destination_in_instance = true;
340356

341357
if (buf->rpl_option) {
@@ -409,10 +425,12 @@ static buffer_t *rpl_data_exthdr_provider_hbh_2(buffer_t *buf, rpl_instance_t *i
409425
rpl_data_locate_info(buf, &opt, NULL);
410426
if (!opt) {
411427
*result = IPV6_EXTHDR_MODIFY_TUNNEL;
412-
// Tunnel to next hop in general case, but if going to DODAGID,
413-
// it can tunnel all the way (and it HAS to if it is a local
414-
// DODAG).
415-
if (!addr_ipv6_equal(buf->dst_sa.address, dodag->id)) {
428+
// Tunnel to next hop always, even if we could tunnel all
429+
// the way to DODAG root (this may be better for
430+
// packet compression, and it was found to be necessary for
431+
// Wi-SUN interoperability). Except for local DODAGs the
432+
// destination must be the DODAGID, so retain that in dst_sa.
433+
if (!rpl_instance_id_is_local(instance->id)) {
416434
memcpy(buf->dst_sa.address, route_info->next_hop_addr, 16);
417435
}
418436
buf->src_sa.addr_type = ADDR_NONE; // force auto-selection
@@ -427,18 +445,20 @@ static buffer_t *rpl_data_exthdr_provider_hbh_2(buffer_t *buf, rpl_instance_t *i
427445
* strictly less for Down packets and strictly greater for Up.
428446
*/
429447
sender_rank = common_read_16_bit(opt + 4);
430-
rpl_cmp_t cmp = rpl_rank_compare_dagrank_rank(dodag, sender_rank, instance->current_rank);
431-
rpl_cmp_t expected_cmp = (opt[2] & RPL_OPT_DOWN) ? RPL_CMP_LESS : RPL_CMP_GREATER;
432-
if (cmp != expected_cmp) {
433-
/* Set the Rank-Error bit; if already set, drop */
434-
if (opt[2] & RPL_OPT_RANK_ERROR) {
435-
protocol_stats_update(STATS_RPL_ROUTELOOP, 1);
436-
tr_info("Forwarding inconsistency R");
437-
rpl_instance_inconsistency(instance);
438-
*result = -1;
439-
return buf;
440-
} else {
441-
opt[2] |= RPL_OPT_RANK_ERROR;
448+
if (sender_rank != 0) {
449+
rpl_cmp_t cmp = rpl_rank_compare_dagrank_rank(dodag, sender_rank, instance->current_rank);
450+
rpl_cmp_t expected_cmp = (opt[2] & RPL_OPT_DOWN) ? RPL_CMP_LESS : RPL_CMP_GREATER;
451+
if (cmp != expected_cmp) {
452+
/* Set the Rank-Error bit; if already set, drop */
453+
if (opt[2] & RPL_OPT_RANK_ERROR) {
454+
protocol_stats_update(STATS_RPL_ROUTELOOP, 1);
455+
tr_info("Forwarding inconsistency R");
456+
rpl_instance_inconsistency(instance);
457+
*result = -1;
458+
return buf;
459+
} else {
460+
opt[2] |= RPL_OPT_RANK_ERROR;
461+
}
442462
}
443463
}
444464
}

0 commit comments

Comments
 (0)