@@ -91,6 +91,7 @@ typedef struct {
91
91
uint8_t ml_eid [8 ];
92
92
uint8_t target_eid [16 ];
93
93
uint16_t ttl ;
94
+ uint8_t dua_dad_repeat ;
94
95
ns_list_link_t link ;
95
96
} duplicate_dua_tr_t ;
96
97
@@ -101,6 +102,8 @@ static NS_LIST_DEFINE(duplicate_dua_tr_list, duplicate_dua_tr_t, link);
101
102
#define THREAD_BBR_DUA_REGISTRATION_TIMEOUT 3600
102
103
#define THREAD_BBR_DUA_REGISTRATION_DELAY 5000 // 5 seconds in ms
103
104
#define THREAD_BBR_BACKBONE_PORT 5683 //<* Backbone border router
105
+ #define THREAD_BBR_DUA_DAD_QUERY_TIMEOUT 1 // wait period for Duplicate Address Detection
106
+ #define THREAD_BBR_DUA_DAD_REPEATS 2 // multicast repeated as part of DUA
104
107
105
108
/*
106
109
0 – Successful registration
@@ -164,7 +167,8 @@ static duplicate_dua_tr_t *thread_border_router_dup_tr_create(int8_t interface_i
164
167
memcpy (this -> target_eid , target_eid_ptr ,16 );
165
168
memcpy (this -> source_address , source_addr_ptr , 16 );
166
169
memcpy (this -> ml_eid , ml_eid_ptr ,8 );
167
- this -> ttl = 2 ;
170
+ this -> dua_dad_repeat = THREAD_BBR_DUA_DAD_REPEATS ;
171
+ this -> ttl = THREAD_BBR_DUA_DAD_QUERY_TIMEOUT ;
168
172
return this ;
169
173
}
170
174
@@ -1062,6 +1066,31 @@ bool thread_extension_bbr_nd_query_process(protocol_interface_info_entry_t *cur,
1062
1066
1063
1067
}
1064
1068
1069
+ static void thread_extension_bbr_dad_process (protocol_interface_info_entry_t * cur , thread_pbbr_t * this , uint32_t seconds )
1070
+ {
1071
+ ns_list_foreach_safe (duplicate_dua_tr_t , cur_dup_tr , & duplicate_dua_tr_list ) {
1072
+ if (cur_dup_tr -> interface_id != cur -> id ) {
1073
+ continue ;
1074
+ }
1075
+ if (cur_dup_tr -> ttl > seconds ) {
1076
+ cur_dup_tr -> ttl -= seconds ;
1077
+ } else {
1078
+ cur_dup_tr -> dua_dad_repeat -- ;
1079
+ // repeat dad for one more time
1080
+ if (cur_dup_tr -> dua_dad_repeat > 0 ) {
1081
+ cur_dup_tr -> ttl = THREAD_BBR_DUA_DAD_QUERY_TIMEOUT ;
1082
+ thread_border_router_bb_qry_send (this ,cur_dup_tr -> target_eid ,NULL );
1083
+ return ;
1084
+ } else {
1085
+ // dad completed
1086
+ // send PRO_BB.ntf and delete dad entry
1087
+ thread_border_router_bb_ans_send (this , this -> pbbr_multicast_address , cur_dup_tr -> target_eid , cur_dup_tr -> ml_eid , 0 , thread_joiner_application_network_name_get (cur -> id ), NULL );
1088
+ thread_border_router_dup_tr_delete (cur_dup_tr );
1089
+ }
1090
+ }
1091
+ }
1092
+ }
1093
+
1065
1094
void thread_extension_bbr_route_update (protocol_interface_info_entry_t * cur )
1066
1095
{
1067
1096
// if we have DUA prefix in settings
@@ -1095,6 +1124,7 @@ void thread_extension_bbr_route_update(protocol_interface_info_entry_t *cur)
1095
1124
}
1096
1125
}
1097
1126
1127
+
1098
1128
void thread_extension_bbr_seconds_timer (int8_t interface_id , uint32_t seconds )
1099
1129
{
1100
1130
thread_pbbr_t * this = thread_bbr_find_by_interface (interface_id );
@@ -1146,15 +1176,8 @@ void thread_extension_bbr_seconds_timer(int8_t interface_id, uint32_t seconds)
1146
1176
// Check secondary state if we need to drop
1147
1177
1148
1178
// Check pending dua registrations
1149
- ns_list_foreach_safe (duplicate_dua_tr_t , cur_dup_tr , & duplicate_dua_tr_list ) {
1150
- if (cur_dup_tr -> interface_id == interface_id && cur_dup_tr -> ttl > seconds ) {
1151
- cur_dup_tr -> ttl -= seconds ;
1152
- // TODO Repeat the ANS 2 times.
1153
- } else {
1154
- // Timeout Remmove the duplicate detection timer
1155
- thread_border_router_dup_tr_delete (cur_dup_tr );
1156
- }
1157
- }
1179
+ thread_extension_bbr_dad_process (cur , this , seconds );
1180
+
1158
1181
if (this -> dua_timer_ticks ) {
1159
1182
if (this -> dua_timer_ticks > seconds ) {
1160
1183
this -> dua_timer_ticks -= seconds ;
0 commit comments