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