diff --git a/zenoh/src/net/routing/hat/linkstate_peer/token.rs b/zenoh/src/net/routing/hat/linkstate_peer/token.rs index 0fa65481cc..27f1e1370b 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/token.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/token.rs @@ -294,10 +294,10 @@ fn simple_tokens(res: &Arc) -> Vec> { } #[inline] -fn remote_simple_tokens(res: &Arc, face: &Arc) -> bool { +fn remote_simple_tokens(tables: &Tables, res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| ctx.face.id != face.id && ctx.token) + .any(|ctx| (ctx.face.id != face.id || face.zid == tables.zid) && ctx.token) } #[inline] @@ -375,7 +375,7 @@ fn propagate_forget_simple_token( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_tokens(&m, &face) + && (remote_simple_tokens(tables, &m, &face) || remote_linkstatepeer_tokens(tables, &m)) }) }) { @@ -530,7 +530,7 @@ pub(super) fn undeclare_simple_token( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_tokens(&m, face) + && (remote_simple_tokens(tables, &m, face) || remote_linkstatepeer_tokens(tables, &m)) }) }) { @@ -643,7 +643,7 @@ pub(crate) fn declare_token_interest( if hat!(tables).linkstatepeer_tokens.iter().any(|token| { token.context.is_some() && token.matches(res) - && (remote_simple_tokens(token, face) + && (remote_simple_tokens(tables, token, face) || remote_linkstatepeer_tokens(tables, token)) }) { let id = if mode.future() { @@ -672,7 +672,7 @@ pub(crate) fn declare_token_interest( for token in &hat!(tables).linkstatepeer_tokens { if token.context.is_some() && token.matches(res) - && (remote_simple_tokens(token, face) + && (remote_simple_tokens(tables, token, face) || remote_linkstatepeer_tokens(tables, token)) { let id = if mode.future() { @@ -702,7 +702,7 @@ pub(crate) fn declare_token_interest( } else { for token in &hat!(tables).linkstatepeer_tokens { if token.context.is_some() - && (remote_simple_tokens(token, face) + && (remote_simple_tokens(tables, token, face) || remote_linkstatepeer_tokens(tables, token)) { let id = if mode.future() { diff --git a/zenoh/src/net/routing/hat/p2p_peer/token.rs b/zenoh/src/net/routing/hat/p2p_peer/token.rs index 539599d2a2..fa996433db 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/token.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/token.rs @@ -33,13 +33,13 @@ use crate::net::routing::{ #[inline] fn propagate_simple_token_to( - _tables: &mut Tables, + tables: &mut Tables, dst_face: &mut Arc, res: &Arc, src_face: &mut Arc, send_declare: &mut SendDeclare, ) { - if (src_face.id != dst_face.id || dst_face.whatami == WhatAmI::Client) + if (src_face.id != dst_face.id || dst_face.zid == tables.zid) && !face_hat!(dst_face).local_tokens.contains_key(res) && (src_face.whatami == WhatAmI::Client || dst_face.whatami == WhatAmI::Client) { @@ -173,10 +173,10 @@ fn simple_tokens(res: &Arc) -> Vec> { } #[inline] -fn remote_simple_tokens(res: &Arc, face: &Arc) -> bool { +fn remote_simple_tokens(tables: &Tables, res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| ctx.face.id != face.id && ctx.token) + .any(|ctx| (ctx.face.id != face.id || face.zid == tables.zid) && ctx.token) } fn propagate_forget_simple_token( @@ -234,7 +234,7 @@ fn propagate_forget_simple_token( { if !res.context().matches.iter().any(|m| { m.upgrade() - .is_some_and(|m| m.context.is_some() && remote_simple_tokens(&m, &face)) + .is_some_and(|m| m.context.is_some() && remote_simple_tokens(tables, &m, &face)) }) { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { send_declare( @@ -332,8 +332,9 @@ pub(super) fn undeclare_simple_token( .collect::>>() { if !res.context().matches.iter().any(|m| { - m.upgrade() - .is_some_and(|m| m.context.is_some() && remote_simple_tokens(&m, face)) + m.upgrade().is_some_and(|m| { + m.context.is_some() && remote_simple_tokens(tables, &m, face) + }) }) { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { send_declare( diff --git a/zenoh/src/net/routing/hat/router/token.rs b/zenoh/src/net/routing/hat/router/token.rs index 5677901987..1be66cb70b 100644 --- a/zenoh/src/net/routing/hat/router/token.rs +++ b/zenoh/src/net/routing/hat/router/token.rs @@ -88,7 +88,7 @@ fn propagate_simple_token_to( full_peer_net: bool, send_declare: &mut SendDeclare, ) { - if (src_face.id != dst_face.id || dst_face.whatami == WhatAmI::Client) + if (src_face.id != dst_face.id || dst_face.zid == tables.zid) && !face_hat!(dst_face).local_tokens.contains_key(res) && if full_peer_net { dst_face.whatami == WhatAmI::Client @@ -335,10 +335,10 @@ fn simple_tokens(res: &Arc) -> Vec> { } #[inline] -fn remote_simple_tokens(res: &Arc, face: &Arc) -> bool { +fn remote_simple_tokens(tables: &Tables, res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| ctx.face.id != face.id && ctx.token) + .any(|ctx| (ctx.face.id != face.id || face.zid == tables.zid) && ctx.token) } #[inline] @@ -446,7 +446,7 @@ fn propagate_forget_simple_token( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_tokens(&m, &face) + && (remote_simple_tokens(tables, &m, &face) || remote_linkstatepeer_tokens(tables, &m) || remote_router_tokens(tables, &m)) }) @@ -729,7 +729,7 @@ pub(super) fn undeclare_simple_token( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_tokens(&m, face) + && (remote_simple_tokens(tables, &m, face) || remote_linkstatepeer_tokens(tables, &m) || remote_router_tokens(tables, &m)) }) @@ -966,7 +966,7 @@ pub(crate) fn declare_token_interest( if hat!(tables).router_tokens.iter().any(|token| { token.context.is_some() && token.matches(res) - && (remote_simple_tokens(token, face) + && (remote_simple_tokens(tables, token, face) || remote_linkstatepeer_tokens(tables, token) || remote_router_tokens(tables, token)) }) {