@@ -672,7 +672,7 @@ static int thread_extension_bbr_mlr_cb(int8_t service_id, uint8_t source_address
672
672
uint32_t timeout_value ;
673
673
uint8_t bbr_rloc_addr [16 ];
674
674
uint8_t bbr_status = THREAD_BBR_STATUS_SUCCESS ;
675
- uint8_t payload [4 ];
675
+ uint8_t payload [4 + 18 ];
676
676
uint8_t * ptr ;
677
677
678
678
tr_info ("Thread BBR MLR.ntf receive" );
@@ -703,7 +703,7 @@ static int thread_extension_bbr_mlr_cb(int8_t service_id, uint8_t source_address
703
703
}
704
704
705
705
//check if commissioner
706
- if (2 <= thread_meshcop_tlv_data_get_uint16 (request_ptr -> payload_ptr , request_ptr -> payload_len , MESHCOP_TLV_COMMISSIONER_SESSION_ID , & session_id )) {
706
+ if (2 <= thread_meshcop_tlv_data_get_uint16 (request_ptr -> payload_ptr , request_ptr -> payload_len , TMFCOP_TLV_COMMISSIONER_SESSION_ID , & session_id )) {
707
707
// Session id present must be valid
708
708
tr_info ("message from commissioner" );
709
709
if (cur -> thread_info -> registered_commissioner .session_id != session_id ) {
@@ -712,32 +712,45 @@ static int thread_extension_bbr_mlr_cb(int8_t service_id, uint8_t source_address
712
712
goto send_response ;
713
713
}
714
714
thread_meshcop_tlv_data_get_uint32 (request_ptr -> payload_ptr , request_ptr -> payload_len , TMFCOP_TLV_TIMEOUT , & timeout_value );
715
- if (timeout_value == 0xffffffff ) {
716
- tr_info ("Store multicast address to NVM" );
717
- }
718
715
}
719
716
717
+ int16_t remaining = addr_len ;
718
+ uint8_t * addr_ptr = addr_data_ptr ;
719
+ uint8_t * invalid_addr_ptr = NULL ;
720
+
720
721
if ( addr_len < 16 ||
721
722
addr_len % 16 != 0 ) {
722
723
// Address must be more than 16 and can be multible
723
724
tr_err ("Invalid /n/mr message" );
724
- response_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST ;
725
+ if (addr_len >= 16 ) {
726
+ invalid_addr_ptr = addr_ptr ;
727
+ }
728
+ bbr_status = THREAD_BBR_STATUS_TARGET_EID_NOT_VALID ;
725
729
goto send_response ;
726
730
}
727
731
728
- int16_t remaining = addr_len ;
729
- uint8_t * addr_ptr = addr_data_ptr ;
730
-
731
732
while (remaining > 0 ) {
732
733
//Go through all addresses
733
- if (timeout_value == 0 ) {
734
- //tr_debug("Multicast address: %s delete", trace_ipv6(addr_ptr));
735
- addr_multicast_fwd_remove (cur , addr_ptr );
734
+ if (!addr_is_ipv6_multicast (addr_ptr )) {
735
+ bbr_status = THREAD_BBR_STATUS_TARGET_EID_NOT_VALID ;
736
+ if (!invalid_addr_ptr ) {
737
+ invalid_addr_ptr = addr_ptr ;
738
+ }
736
739
} else {
737
- //tr_debug("Multicast address: %s Timeout value: %"PRIu32, trace_ipv6(addr_ptr),timeout_value);
738
- multicast_fwd_add (this -> interface_id , addr_ptr , timeout_value );
739
- // send BMLR.ntf message to backend
740
- thread_extension_bbr_bmlr_req_send (this -> br_bb_service_id , this -> pbbr_multicast_address , addr_data_ptr , 16 , timeout_value );
740
+ if (timeout_value == 0 ) {
741
+ //tr_debug("Multicast address: %s delete", trace_ipv6(addr_ptr));
742
+ addr_multicast_fwd_remove (cur , addr_ptr );
743
+ // TODO remove address from NVM
744
+ tr_info ("delete multicast address from NVM" );
745
+ } else {
746
+ //tr_debug("Multicast address: %s Timeout value: %"PRIu32, trace_ipv6(addr_ptr),timeout_value);
747
+ multicast_fwd_add (this -> interface_id , addr_ptr , timeout_value );
748
+ if (timeout_value == 0xffffffff ) {
749
+ tr_info ("Store multicast address to NVM" );
750
+ }
751
+ // send BMLR.ntf message to backend
752
+ thread_extension_bbr_bmlr_req_send (this -> br_bb_service_id , this -> pbbr_multicast_address , addr_data_ptr , 16 , timeout_value );
753
+ }
741
754
}
742
755
addr_ptr += 16 ;
743
756
remaining -= 16 ;
@@ -748,6 +761,9 @@ static int thread_extension_bbr_mlr_cb(int8_t service_id, uint8_t source_address
748
761
749
762
if (request_ptr -> msg_type == COAP_MSG_TYPE_CONFIRMABLE ) {
750
763
ptr = thread_tmfcop_tlv_data_write_uint8 (ptr , TMFCOP_TLV_STATUS , bbr_status );
764
+ if (invalid_addr_ptr ) {
765
+ ptr = thread_meshcop_tlv_data_write (ptr , TMFCOP_TLV_IPV6_ADDRESS , 16 , invalid_addr_ptr );
766
+ }
751
767
coap_service_response_send (this -> coap_service_id , COAP_REQUEST_OPTIONS_NONE , request_ptr , response_code , COAP_CT_OCTET_STREAM , payload , ptr - payload );
752
768
return 0 ;
753
769
}
0 commit comments