@@ -190,6 +190,8 @@ void bt_mesh_friend_clear_net_idx(u16_t net_idx)
190
190
}
191
191
}
192
192
193
+ static void enqueue_update (struct bt_mesh_friend * frnd , u8_t md );
194
+
193
195
void bt_mesh_friend_sec_update (u16_t net_idx )
194
196
{
195
197
int i ;
@@ -204,7 +206,7 @@ void bt_mesh_friend_sec_update(u16_t net_idx)
204
206
}
205
207
206
208
if (net_idx == BT_MESH_KEY_ANY || frnd -> net_idx == net_idx ) {
207
- frnd -> sec_update = 1U ;
209
+ enqueue_update ( frnd , 0x00 ) ;
208
210
}
209
211
}
210
212
}
@@ -653,7 +655,6 @@ static void enqueue_update(struct bt_mesh_friend *frnd, u8_t md)
653
655
return ;
654
656
}
655
657
656
- frnd -> sec_update = 0U ;
657
658
enqueue_buf (frnd , buf );
658
659
}
659
660
@@ -1057,10 +1058,6 @@ static void enqueue_friend_pdu(struct bt_mesh_friend *frnd,
1057
1058
BT_DBG ("type %u" , type );
1058
1059
1059
1060
if (type == BT_MESH_FRIEND_PDU_SINGLE ) {
1060
- if (frnd -> sec_update ) {
1061
- enqueue_update (frnd , 1 );
1062
- }
1063
-
1064
1061
enqueue_buf (frnd , buf );
1065
1062
return ;
1066
1063
}
@@ -1077,10 +1074,6 @@ static void enqueue_friend_pdu(struct bt_mesh_friend *frnd,
1077
1074
net_buf_slist_put (& seg -> queue , buf );
1078
1075
1079
1076
if (type == BT_MESH_FRIEND_PDU_COMPLETE ) {
1080
- if (frnd -> sec_update ) {
1081
- enqueue_update (frnd , 1 );
1082
- }
1083
-
1084
1077
sys_slist_merge_slist (& frnd -> queue , & seg -> queue );
1085
1078
1086
1079
frnd -> queue_size += seg -> seg_count ;
@@ -1127,6 +1120,38 @@ static void buf_send_end(int err, void *user_data)
1127
1120
}
1128
1121
}
1129
1122
1123
+ static void update_overwrite (struct net_buf * buf , u8_t md )
1124
+ {
1125
+ struct net_buf_simple_state state ;
1126
+ struct bt_mesh_ctl_friend_update * upd ;
1127
+
1128
+ if (buf -> len != 16 ) {
1129
+ return ;
1130
+ }
1131
+
1132
+ net_buf_simple_save (& buf -> b , & state );
1133
+
1134
+ net_buf_skip (buf , 1 ); /* skip IVI, NID */
1135
+
1136
+ if (!(net_buf_pull_u8 (buf ) >> 7 )) {
1137
+ goto end ;
1138
+ }
1139
+
1140
+ net_buf_skip (buf , 7 ); /* skip seqnum src dec*/
1141
+
1142
+ if (TRANS_CTL_OP ((u8_t * ) net_buf_pull_mem (buf , 1 ))
1143
+ != TRANS_CTL_OP_FRIEND_UPDATE ) {
1144
+ goto end ;
1145
+ }
1146
+
1147
+ upd = net_buf_pull_mem (buf , sizeof (* upd ));
1148
+ BT_DBG ("Update Previous Friend Update MD 0x%02x -> 0x%02x" , upd -> md , md );
1149
+ upd -> md = md ;
1150
+
1151
+ end :
1152
+ net_buf_simple_restore (& buf -> b , & state );
1153
+ }
1154
+
1130
1155
static void friend_timeout (struct k_work * work )
1131
1156
{
1132
1157
struct bt_mesh_friend * frnd = CONTAINER_OF (work , struct bt_mesh_friend ,
@@ -1136,6 +1161,8 @@ static void friend_timeout(struct k_work *work)
1136
1161
.end = buf_send_end ,
1137
1162
};
1138
1163
1164
+ u8_t md ;
1165
+
1139
1166
__ASSERT_NO_MSG (frnd -> pending_buf == 0U );
1140
1167
1141
1168
BT_DBG ("lpn 0x%04x send_last %u last %p" , frnd -> lpn ,
@@ -1161,6 +1188,10 @@ static void friend_timeout(struct k_work *work)
1161
1188
return ;
1162
1189
}
1163
1190
1191
+ md = (u8_t )(sys_slist_peek_head (& frnd -> queue ) != NULL );
1192
+
1193
+ update_overwrite (frnd -> last , md );
1194
+
1164
1195
if (encrypt_friend_pdu (frnd , frnd -> last , false)) {
1165
1196
return ;
1166
1197
}
0 commit comments