@ -49,8 +49,7 @@ type linuxRouter struct {
tunname string
netMon * netmon . Monitor
health * health . Tracker
eventClient * eventbus . Client
ruleDeletedSub * eventbus . Subscriber [ netmon . RuleDeleted ]
eventSubs eventbus . Monitor
rulesAddedPub * eventbus . Publisher [ AddIPRules ]
unregNetMon func ( )
addrs map [ netip . Prefix ] bool
@ -100,7 +99,6 @@ func newUserspaceRouterAdvanced(logf logger.Logf, tunname string, netMon *netmon
tunname : tunname ,
netfilterMode : netfilterOff ,
netMon : netMon ,
eventClient : bus . Client ( "router-linux" ) ,
health : health ,
cmd : cmd ,
@ -108,9 +106,9 @@ func newUserspaceRouterAdvanced(logf logger.Logf, tunname string, netMon *netmon
ipRuleFixLimiter : rate . NewLimiter ( rate . Every ( 5 * time . Second ) , 10 ) ,
ipPolicyPrefBase : 5200 ,
}
r. ruleDeletedSub = eventbus . Subscribe [ netmon . RuleDeleted ] ( r . eventClient )
r . rulesAddedPub = eventbus . Publish [ AddIPRules ] ( r. eventClient )
go r . consumeEventbusTopics ( )
ec := bus . Client ( "router-linux" )
r . rulesAddedPub = eventbus . Publish [ AddIPRules ] ( ec )
r . eventSubs = ec . Monitor ( r . consumeEventbusTopics ( ec ) )
if r . useIPCommand ( ) {
r . ipRuleAvailable = ( cmd . run ( "ip" , "rule" ) == nil )
@ -159,13 +157,16 @@ func newUserspaceRouterAdvanced(logf logger.Logf, tunname string, netMon *netmon
// always handled in the order they are received, i.e. the next event is not
// read until the previous event's handler has returned. It returns when the
// [eventbus.Client] is closed.
func ( r * linuxRouter ) consumeEventbusTopics ( ) {
for {
select {
case <- r . eventClient . Done ( ) :
return
case rulesDeleted := <- r . ruleDeletedSub . Events ( ) :
r . onIPRuleDeleted ( rulesDeleted . Table , rulesDeleted . Priority )
func ( r * linuxRouter ) consumeEventbusTopics ( ec * eventbus . Client ) func ( * eventbus . Client ) {
ruleDeletedSub := eventbus . Subscribe [ netmon . RuleDeleted ] ( ec )
return func ( ec * eventbus . Client ) {
for {
select {
case <- ec . Done ( ) :
return
case rs := <- ruleDeletedSub . Events ( ) :
r . onIPRuleDeleted ( rs . Table , rs . Priority )
}
}
}
}
@ -362,7 +363,7 @@ func (r *linuxRouter) Close() error {
if r . unregNetMon != nil {
r . unregNetMon ( )
}
r . event Client . Close ( )
r . event Subs . Close ( )
if err := r . downInterface ( ) ; err != nil {
return err
}