Re: [PATCH BlueZ] mesh: Fix IV recovery

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Rafał,

On Wed, 2020-01-08 at 10:16 +0100, Rafał Gajda wrote:
> This patch fixes saving IV received in SNB to storage.                                              
>                                                                                                     
> Previously after creating new node with IV 0 (or loading node with                                  
> IV > 0 but after long inactivity) first received SNB should update IV                               
> (and reset sequence number to 0 if necessary).                                                      
>                                                                                                     
> The bug would prevent new IV being saved in storage                                                 
> which resulted in sequence number being set to 0                                                    
> on first SNB received after every daemon reset                                                      
> but IV never being updated.                
> ---
>  mesh/net.c | 20 +++++++-------------
>  1 file changed, 7 insertions(+), 13 deletions(-)
> 
> diff --git a/mesh/net.c b/mesh/net.c
> index 5be95086d..1598933d4 100644
> --- a/mesh/net.c
> +++ b/mesh/net.c
> 

<...>

> @@ -2737,26 +2730,27 @@ static void update_iv_ivu_state(struct mesh_net *net, uint32_t iv_index,
>  		}
>  	} else if (ivu) {
>  		/* Ignore beacons with IVU if they come too soon */
> -		if (!local_ivu && net->iv_upd_state == IV_UPD_NORMAL_HOLD) {
> +		if (!net->iv_update &&
> +				net->iv_upd_state == IV_UPD_NORMAL_HOLD) {
>  			l_error("Update attempted too soon");
>  			return;
>  		}
>  
> -		if (!local_ivu) {
> +		if (!net->iv_update) {
>  			l_info("iv_upd_state = IV_UPD_UPDATING");
>  			net->iv_upd_state = IV_UPD_UPDATING;
>  			net->iv_update_timeout = l_timeout_create(
>  					IV_IDX_UPD_MIN, iv_upd_to, net, NULL);
>  		}
> -	} else if (local_ivu) {
> +	} else if (net->iv_update) {
>  		l_error("IVU clear attempted too soon");
>  		return;
>  	}
>  
> -	if ((iv_index - ivu) > (local_iv_index - local_ivu))
> +	if ((iv_index - ivu) > (net->iv_index - net->iv_update))
>  		mesh_net_set_seq_num(net, 0);
>  
> -	if (ivu != net->iv_update || local_iv_index != net->iv_index) {
> +	if (ivu != net->iv_update || iv_index != net->iv_index) {

Would it be fair to say that this is the *only* change to the code that fixes the logic that was
malfunctioning?

If so, I would like to shrink this patch to just:

-	if (ivu != net->iv_update || local_iv_index != net->iv_index) {
+	if (ivu != local_ivu || iv_index != local_iv_index) {


or, breaking this into a 2-patch patchset, where one of the patches removes the local caching of ivu and ivi,
and the second patch fixes the actual bug.

>  		struct mesh_config *cfg = node_config_get(net->node);
>  
>  		mesh_config_write_iv_index(cfg, iv_index, ivu);




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux