Skip to content

Commit

Permalink
*: implement pub-sub communication for interface updates
Browse files Browse the repository at this point in the history
holo-interface previously unicasted all interface updates to
holo-routing, which then relayed them to all protocol instances. With
this change, holo-routing and protocol instances subscribe to specific
interface updates and receive them directly from holo-interface.

Message changes:
- Rename `InterfaceQuery` to `InterfaceSub` and introduce
  `InterfaceUnsub`
- Remove `InterfaceDump` (replaced by `InterfaceSub` where `ifname` is
  `None`)
- Rename `RouterIdQuery` to `RouterIdSub`

The topology tests reference data has been updated accordingly.

Signed-off-by: Renato Westphal <[email protected]>
  • Loading branch information
rwestphal committed Feb 8, 2025
1 parent 89dd679 commit 2e33eb6
Show file tree
Hide file tree
Showing 314 changed files with 835 additions and 1,671 deletions.
6 changes: 5 additions & 1 deletion holo-bfd/src/master.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,11 @@ impl ProtocolInstance for Master {

async fn init(&mut self) {
// Request information about all interfaces.
let _ = self.tx.ibus.interface.send(IbusMsg::InterfaceDump);
let _ = self.tx.ibus.interface.send(IbusMsg::InterfaceSub {
subscriber: self.tx.ibus.subscriber.clone(),
ifname: None,
af: None,
});
}

async fn process_ibus_msg(&mut self, msg: IbusMsg) {
Expand Down
2 changes: 1 addition & 1 deletion holo-bgp/src/instance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ impl ProtocolInstance for Instance {

async fn init(&mut self) {
// Request information about the system Router ID.
southbound::tx::router_id_query(&self.tx.ibus);
southbound::tx::router_id_sub(&self.tx.ibus);
}

async fn shutdown(mut self) {
Expand Down
6 changes: 4 additions & 2 deletions holo-bgp/src/southbound/tx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ use crate::rib::LocalRoute;

// ===== global functions =====

pub(crate) fn router_id_query(ibus_tx: &IbusChannelsTx) {
let _ = ibus_tx.interface.send(IbusMsg::RouterIdQuery);
pub(crate) fn router_id_sub(ibus_tx: &IbusChannelsTx) {
let _ = ibus_tx.interface.send(IbusMsg::RouterIdSub {
subscriber: ibus_tx.subscriber.clone(),
});
}

pub(crate) fn route_install(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"1.1.1.1"}}
{"Ibus":{"PolicyMatchSetsUpd":{"prefixes":[[["LOOPBACK","Ipv4"],{"name":"LOOPBACK","mode":"Ipv4","prefixes":[{"prefix":"1.1.1.1/32","masklen_lower":32,"masklen_upper":32}]}]],"neighbors":{},"tags":{},"bgp":{"as_paths":{},"comms":{},"ext_comms":{},"extv6_comms":{},"large_comms":{},"nexthops":{}}}}}
{"Ibus":{"PolicyUpd":{"name":"REDIST","stmts":{"1":{"name":"1","prefix_set_match_type":"Any","tag_set_match_type":"Any","conditions":[["MatchPrefixSet",{"MatchPrefixSet":"LOOPBACK"}]],"actions":[["Accept",{"Accept":true}]]}}}}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"RouterIdQuery"
{"RouterIdSub":{}}
{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}
{"NexthopTrack":"10.0.1.2"}
{"RouteIpAdd":{"protocol":"bgp","prefix":"2.2.2.2/32","distance":20,"metric":0,"tag":null,"nexthops":[{"Recursive":{"addr":"10.0.1.2","labels":[],"resolved":[]}}]}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"2.2.2.2"}}
{"Ibus":{"PolicyMatchSetsUpd":{"prefixes":[[["LOOPBACK","Ipv4"],{"name":"LOOPBACK","mode":"Ipv4","prefixes":[{"prefix":"2.2.2.2/32","masklen_lower":32,"masklen_upper":32}]}]],"neighbors":{},"tags":{},"bgp":{"as_paths":{},"comms":{},"ext_comms":{},"extv6_comms":{},"large_comms":{},"nexthops":{}}}}}
{"Ibus":{"PolicyUpd":{"name":"REDIST","stmts":{"1":{"name":"1","prefix_set_match_type":"Any","tag_set_match_type":"Any","conditions":[["MatchPrefixSet",{"MatchPrefixSet":"LOOPBACK"}]],"actions":[["Accept",{"Accept":true}]]}}}}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"RouterIdQuery"
{"RouterIdSub":{}}
{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}
{"NexthopTrack":"10.0.1.1"}
{"RouteIpAdd":{"protocol":"bgp","prefix":"1.1.1.1/32","distance":20,"metric":0,"tag":null,"nexthops":[{"Recursive":{"addr":"10.0.1.1","labels":[],"resolved":[]}}]}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"3.3.3.3"}}
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"3.3.3.3"}}
{"Ibus":{"PolicyMatchSetsUpd":{"prefixes":[[["LOOPBACK","Ipv4"],{"name":"LOOPBACK","mode":"Ipv4","prefixes":[{"prefix":"3.3.3.3/32","masklen_lower":32,"masklen_upper":32}]}]],"neighbors":{},"tags":{},"bgp":{"as_paths":{},"comms":{},"ext_comms":{},"extv6_comms":{},"large_comms":{},"nexthops":{}}}}}
{"Ibus":{"PolicyUpd":{"name":"REDIST","stmts":{"1":{"name":"1","prefix_set_match_type":"Any","tag_set_match_type":"Any","conditions":[["MatchPrefixSet",{"MatchPrefixSet":"LOOPBACK"}]],"actions":[["Accept",{"Accept":true}]]}}}}}
{"Protocol":{"TcpConnect":{"conn_info":{"local_addr":"10.0.2.3","local_port":43240,"remote_addr":"10.0.2.1","remote_port":179}}}}
{"Protocol":{"TriggerDecisionProcess":null}}
{"Protocol":{"TriggerDecisionProcess":null}}
{"Ibus":{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}}
{"Ibus":{"InterfaceQuery":{"ifname":"eth-rt4","af":"Ipv4"}}}
{"Ibus":{"InterfaceQuery":{"ifname":"lo","af":"Ipv4"}}}
{"Ibus":{"RouteRedistributeAdd":{"protocol":"direct","prefix":"3.3.3.3/32","distance":0,"metric":0,"tag":null,"nexthops":[{"Interface":{"ifindex":1}}]}}}
{"Ibus":{"RouteRedistributeAdd":{"protocol":"direct","prefix":"10.0.2.0/24","distance":0,"metric":0,"tag":null,"nexthops":[{"Interface":{"ifindex":4}}]}}}
{"Ibus":{"RouteRedistributeAdd":{"protocol":"direct","prefix":"172.16.1.0/24","distance":0,"metric":0,"tag":null,"nexthops":[{"Interface":{"ifindex":3}}]}}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"RouterIdQuery"
{"RouterIdSub":{}}
{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}
{"NexthopTrack":"10.0.2.1"}
{"RouteIpAdd":{"protocol":"bgp","prefix":"1.1.1.1/32","distance":20,"metric":0,"tag":null,"nexthops":[{"Recursive":{"addr":"10.0.2.1","labels":[],"resolved":[]}}]}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"4.4.4.4"}}
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"4.4.4.4"}}
{"Ibus":{"PolicyMatchSetsUpd":{"prefixes":[[["LOOPBACK","Ipv4"],{"name":"LOOPBACK","mode":"Ipv4","prefixes":[{"prefix":"4.4.4.4/32","masklen_lower":32,"masklen_upper":32}]}]],"neighbors":{},"tags":{},"bgp":{"as_paths":{},"comms":{},"ext_comms":{},"extv6_comms":{},"large_comms":{},"nexthops":{}}}}}
{"Ibus":{"PolicyUpd":{"name":"REDIST","stmts":{"1":{"name":"1","prefix_set_match_type":"Any","tag_set_match_type":"Any","conditions":[["MatchPrefixSet",{"MatchPrefixSet":"LOOPBACK"}]],"actions":[["Accept",{"Accept":true}]]}}}}}
{"Protocol":{"TcpConnect":{"conn_info":{"local_addr":"10.0.3.4","local_port":45164,"remote_addr":"10.0.3.2","remote_port":179}}}}
{"Protocol":{"TriggerDecisionProcess":null}}
{"Protocol":{"TriggerDecisionProcess":null}}
{"Ibus":{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}}
{"Ibus":{"InterfaceQuery":{"ifname":"eth-rt3","af":"Ipv4"}}}
{"Ibus":{"InterfaceQuery":{"ifname":"lo","af":"Ipv4"}}}
{"Ibus":{"RouteRedistributeAdd":{"protocol":"direct","prefix":"4.4.4.4/32","distance":0,"metric":0,"tag":null,"nexthops":[{"Interface":{"ifindex":1}}]}}}
{"Ibus":{"RouteRedistributeAdd":{"protocol":"direct","prefix":"10.0.3.0/24","distance":0,"metric":0,"tag":null,"nexthops":[{"Interface":{"ifindex":3}}]}}}
{"Ibus":{"RouteRedistributeAdd":{"protocol":"direct","prefix":"172.16.1.0/24","distance":0,"metric":0,"tag":null,"nexthops":[{"Interface":{"ifindex":2}}]}}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"RouterIdQuery"
{"RouterIdSub":{}}
{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}
{"NexthopTrack":"10.0.3.2"}
{"RouteIpAdd":{"protocol":"bgp","prefix":"1.1.1.1/32","distance":20,"metric":0,"tag":null,"nexthops":[{"Recursive":{"addr":"10.0.3.2","labels":[],"resolved":[]}}]}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"1.1.1.1"}}
{"Ibus":{"PolicyMatchSetsUpd":{"prefixes":[[["LOOPBACK","Ipv4"],{"name":"LOOPBACK","mode":"Ipv4","prefixes":[{"prefix":"1.1.1.1/32","masklen_lower":32,"masklen_upper":32}]}]],"neighbors":{},"tags":{},"bgp":{"as_paths":{},"comms":{},"ext_comms":{},"extv6_comms":{},"large_comms":{},"nexthops":{}}}}}
{"Ibus":{"PolicyUpd":{"name":"REDIST","stmts":{"1":{"name":"1","prefix_set_match_type":"Any","tag_set_match_type":"Any","conditions":[["MatchPrefixSet",{"MatchPrefixSet":"LOOPBACK"}]],"actions":[["Accept",{"Accept":true}]]}}}}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"RouterIdQuery"
{"RouterIdSub":{}}
{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}
{"NexthopTrack":"10.0.1.2"}
{"RouteIpAdd":{"protocol":"bgp","prefix":"2.2.2.2/32","distance":20,"metric":0,"tag":null,"nexthops":[{"Recursive":{"addr":"10.0.1.2","labels":[],"resolved":[]}}]}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"2.2.2.2"}}
{"Ibus":{"PolicyMatchSetsUpd":{"prefixes":[[["LOOPBACK","Ipv4"],{"name":"LOOPBACK","mode":"Ipv4","prefixes":[{"prefix":"2.2.2.2/32","masklen_lower":32,"masklen_upper":32}]}]],"neighbors":{},"tags":{},"bgp":{"as_paths":{},"comms":{},"ext_comms":{},"extv6_comms":{},"large_comms":{},"nexthops":{}}}}}
{"Ibus":{"PolicyUpd":{"name":"REDIST","stmts":{"1":{"name":"1","prefix_set_match_type":"Any","tag_set_match_type":"Any","conditions":[["MatchPrefixSet",{"MatchPrefixSet":"LOOPBACK"}]],"actions":[["Accept",{"Accept":true}]]}}}}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"RouterIdQuery"
{"RouterIdSub":{}}
{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}
{"NexthopTrack":"10.0.1.1"}
{"RouteIpAdd":{"protocol":"bgp","prefix":"1.1.1.1/32","distance":20,"metric":0,"tag":null,"nexthops":[{"Recursive":{"addr":"10.0.1.1","labels":[],"resolved":[]}}]}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"3.3.3.3"}}
{"Ibus":{"PolicyMatchSetsUpd":{"prefixes":[[["LOOPBACK","Ipv4"],{"name":"LOOPBACK","mode":"Ipv4","prefixes":[{"prefix":"3.3.3.3/32","masklen_lower":32,"masklen_upper":32}]}]],"neighbors":{},"tags":{},"bgp":{"as_paths":{},"comms":{},"ext_comms":{},"extv6_comms":{},"large_comms":{},"nexthops":{}}}}}
{"Ibus":{"PolicyUpd":{"name":"REDIST","stmts":{"1":{"name":"1","prefix_set_match_type":"Any","tag_set_match_type":"Any","conditions":[["MatchPrefixSet",{"MatchPrefixSet":"LOOPBACK"}]],"actions":[["Accept",{"Accept":true}]]}}}}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"RouterIdQuery"
{"RouterIdSub":{}}
{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}
{"NexthopTrack":"10.0.4.2"}
{"RouteIpAdd":{"protocol":"bgp","prefix":"1.1.1.1/32","distance":20,"metric":0,"tag":null,"nexthops":[{"Recursive":{"addr":"10.0.4.2","labels":[],"resolved":[]}}]}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"4.4.4.4"}}
{"Ibus":{"PolicyMatchSetsUpd":{"prefixes":[[["LOOPBACK","Ipv4"],{"name":"LOOPBACK","mode":"Ipv4","prefixes":[{"prefix":"4.4.4.4/32","masklen_lower":32,"masklen_upper":32}]}]],"neighbors":{},"tags":{},"bgp":{"as_paths":{},"comms":{},"ext_comms":{},"extv6_comms":{},"large_comms":{},"nexthops":{}}}}}
{"Ibus":{"PolicyUpd":{"name":"REDIST","stmts":{"1":{"name":"1","prefix_set_match_type":"Any","tag_set_match_type":"Any","conditions":[["MatchPrefixSet",{"MatchPrefixSet":"LOOPBACK"}]],"actions":[["Accept",{"Accept":true}]]}}}}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"RouterIdQuery"
{"RouterIdSub":{}}
{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}
{"NexthopTrack":"10.0.2.1"}
{"RouteIpAdd":{"protocol":"bgp","prefix":"1.1.1.1/32","distance":20,"metric":0,"tag":null,"nexthops":[{"Recursive":{"addr":"10.0.2.1","labels":[],"resolved":[]}}]}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"5.5.5.5"}}
{"Ibus":{"PolicyMatchSetsUpd":{"prefixes":[[["LOOPBACK","Ipv4"],{"name":"LOOPBACK","mode":"Ipv4","prefixes":[{"prefix":"5.5.5.5/32","masklen_lower":32,"masklen_upper":32}]}]],"neighbors":{},"tags":{},"bgp":{"as_paths":{},"comms":{},"ext_comms":{},"extv6_comms":{},"large_comms":{},"nexthops":{}}}}}
{"Ibus":{"PolicyUpd":{"name":"REDIST","stmts":{"1":{"name":"1","prefix_set_match_type":"Any","tag_set_match_type":"Any","conditions":[["MatchPrefixSet",{"MatchPrefixSet":"LOOPBACK"}]],"actions":[["Accept",{"Accept":true}]]}}}}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"RouterIdQuery"
{"RouterIdSub":{}}
{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}
{"NexthopTrack":"10.0.3.1"}
{"RouteIpAdd":{"protocol":"bgp","prefix":"1.1.1.1/32","distance":20,"metric":0,"tag":null,"nexthops":[{"Recursive":{"addr":"10.0.3.1","labels":[],"resolved":[]}}]}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
{"Ibus":"RouterIdQuery"}
{"Ibus":{"RouterIdUpdate":"6.6.6.6"}}
{"Ibus":{"PolicyMatchSetsUpd":{"prefixes":[[["LOOPBACK","Ipv4"],{"name":"LOOPBACK","mode":"Ipv4","prefixes":[{"prefix":"6.6.6.6/32","masklen_lower":32,"masklen_upper":32}]}]],"neighbors":{},"tags":{},"bgp":{"as_paths":{},"comms":{},"ext_comms":{},"extv6_comms":{},"large_comms":{},"nexthops":{}}}}}
{"Ibus":{"PolicyUpd":{"name":"REDIST","stmts":{"1":{"name":"1","prefix_set_match_type":"Any","tag_set_match_type":"Any","conditions":[["MatchPrefixSet",{"MatchPrefixSet":"LOOPBACK"}]],"actions":[["Accept",{"Accept":true}]]}}}}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"RouterIdQuery"
{"RouterIdSub":{}}
{"RouteRedistributeDump":{"protocol":"direct","af":"Ipv4"}}
{"NexthopTrack":"10.0.7.5"}
{"NexthopTrack":"10.0.5.3"}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{"NbrTx":{"SendMessage":{"nbr_addr":"10.0.7.5","msg":{"Open":{"version":4,"my_as":65006,"holdtime":90,"identifier":"6.6.6.6","capabilities":[{"MultiProtocol":{"afi":"Ipv4","safi":"Unicast"}},{"FourOctetAsNumber":{"asn":65006}},"RouteRefresh"]}}}}}
{"NbrTx":{"SendMessage":{"nbr_addr":"10.0.5.3","msg":{"Open":{"version":4,"my_as":65006,"holdtime":90,"identifier":"6.6.6.6","capabilities":[{"MultiProtocol":{"afi":"Ipv4","safi":"Unicast"}},{"FourOctetAsNumber":{"asn":65006}},"RouteRefresh"]}}}}}
{"NbrTx":{"SendMessage":{"nbr_addr":"10.0.5.3","msg":{"Keepalive":{}}}}}
{"NbrTx":{"SendMessage":{"nbr_addr":"10.0.6.4","msg":{"Open":{"version":4,"my_as":65006,"holdtime":90,"identifier":"6.6.6.6","capabilities":[{"MultiProtocol":{"afi":"Ipv4","safi":"Unicast"}},{"FourOctetAsNumber":{"asn":65006}},"RouteRefresh"]}}}}}
{"NbrTx":{"SendMessage":{"nbr_addr":"10.0.7.5","msg":{"Keepalive":{}}}}}
{"NbrTx":{"UpdateCapabilities":[{"MultiProtocol":{"afi":"Ipv4","safi":"Unicast"}},"FourOctetAsNumber","RouteRefresh"]}}
{"NbrTx":{"SendMessage":{"nbr_addr":"10.0.5.3","msg":{"Keepalive":{}}}}}
{"NbrTx":{"SendMessage":{"nbr_addr":"10.0.6.4","msg":{"Keepalive":{}}}}}
{"NbrTx":{"UpdateCapabilities":[{"MultiProtocol":{"afi":"Ipv4","safi":"Unicast"}},"FourOctetAsNumber","RouteRefresh"]}}
{"NbrTx":{"UpdateCapabilities":[{"MultiProtocol":{"afi":"Ipv4","safi":"Unicast"}},"FourOctetAsNumber","RouteRefresh"]}}
Expand Down
106 changes: 77 additions & 29 deletions holo-interface/src/ibus.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,58 +4,95 @@
// SPDX-License-Identifier: MIT
//

use std::collections::BTreeSet;
use std::net::Ipv4Addr;

use holo_utils::ibus::{IbusMsg, IbusSender};
use holo_utils::ip::IpNetworkKind;
use holo_utils::ip::{AddressFamily, IpNetworkKind};
use holo_utils::southbound::{AddressFlags, AddressMsg, InterfaceUpdateMsg};
use ipnetwork::IpNetwork;

use crate::interface::Interface;
use crate::interface::{Interface, InterfaceSub};
use crate::{Master, netlink};

// ===== global functions =====

pub(crate) async fn process_msg(master: &mut Master, msg: IbusMsg) {
match msg {
IbusMsg::InterfaceDump => {
for iface in master.interfaces.iter() {
notify_interface_update(&master.ibus_tx.routing, iface);
IbusMsg::InterfaceSub {
subscriber,
ifname,
af,
} => {
let subscriber = subscriber.unwrap();
let mut afs = BTreeSet::new();
if let Some(af) = af {
afs.insert(af);
} else {
afs.extend([AddressFamily::Ipv4, AddressFamily::Ipv6]);
}

if let Some(ifname) = ifname {
if let Some(iface) = master.interfaces.get_mut_by_name(&ifname)
{
notify_interface_update(&subscriber.tx, iface);
for iface_addr in
iface.addresses.values().filter(|iface_addr| {
afs.contains(&iface_addr.addr.address_family())
})
{
notify_addr_add(
&subscriber.tx,
iface.name.clone(),
iface_addr.addr,
iface_addr.flags,
);
}

for iface_addr in iface.addresses.values() {
notify_addr_add(
&master.ibus_tx.routing,
iface.name.clone(),
iface_addr.addr,
iface_addr.flags,
);
let sub = InterfaceSub::new(afs, subscriber.tx);
iface.subscriptions.insert(subscriber.id, sub);
}
} else {
for iface in master.interfaces.iter() {
notify_interface_update(&subscriber.tx, iface);
for iface_addr in
iface.addresses.values().filter(|iface_addr| {
afs.contains(&iface_addr.addr.address_family())
})
{
notify_addr_add(
&subscriber.tx,
iface.name.clone(),
iface_addr.addr,
iface_addr.flags,
);
}
}
let sub = InterfaceSub::new(afs, subscriber.tx);
master.interfaces.subscriptions.insert(subscriber.id, sub);
}
}
IbusMsg::InterfaceQuery { ifname, af } => {
if let Some(iface) = master.interfaces.get_by_name(&ifname) {
notify_interface_update(&master.ibus_tx.routing, iface);

for iface_addr in
iface.addresses.values().filter(|iface_addr| match af {
Some(af) => iface_addr.addr.address_family() == af,
None => true,
})
IbusMsg::InterfaceUnsub { subscriber, ifname } => {
let subscriber = subscriber.unwrap();
if let Some(ifname) = ifname {
if let Some(iface) = master.interfaces.get_mut_by_name(&ifname)
{
notify_addr_add(
&master.ibus_tx.routing,
iface.name.clone(),
iface_addr.addr,
iface_addr.flags,
);
iface.subscriptions.remove(&subscriber.id);
}
} else {
master.interfaces.subscriptions.remove(&subscriber.id);
}
}
IbusMsg::RouterIdQuery => {
IbusMsg::RouterIdSub { subscriber } => {
let subscriber = subscriber.unwrap();
notify_router_id_update(
&master.ibus_tx.routing,
&subscriber.tx,
master.interfaces.router_id(),
);
master
.interfaces
.router_id_subscriptions
.insert(subscriber.id, subscriber.tx);
}
IbusMsg::MacvlanAdd(msg) => {
if let Some(iface) = master.interfaces.get_by_name(&msg.parent_name)
Expand Down Expand Up @@ -101,6 +138,17 @@ pub(crate) async fn process_msg(master: &mut Master, msg: IbusMsg) {
.await;
}
}
IbusMsg::Disconnect { subscriber } => {
let subscriber = subscriber.unwrap();
master.interfaces.subscriptions.remove(&subscriber.id);
master
.interfaces
.router_id_subscriptions
.remove(&subscriber.id);
for iface in master.interfaces.iter_mut() {
iface.subscriptions.remove(&subscriber.id);
}
}
// Ignore other events.
_ => {}
}
Expand Down
Loading

0 comments on commit 2e33eb6

Please sign in to comment.