@@ -86,6 +86,9 @@ type ManagerConfig struct {
8686 // liveness still tracks state and metrics, but will not install or
8787 // uninstall its routes in the kernel for that session.
8888 HonorPeerAdvertisedPassive bool
89+
90+ // Client version to advertise to peers in control packets.
91+ ClientVersion string
8992}
9093
9194// Validate fills defaults and enforces constraints for ManagerConfig.
@@ -142,6 +145,9 @@ func (c *ManagerConfig) Validate() error {
142145 if c .MaxEvents < 0 {
143146 return errors .New ("maxEvents must be greater than 0" )
144147 }
148+ if c .ClientVersion == "" {
149+ return errors .New ("clientVersion is required" )
150+ }
145151 return nil
146152}
147153
@@ -196,6 +202,11 @@ func NewManager(ctx context.Context, cfg *ManagerConfig) (*manager, error) {
196202 return nil , fmt .Errorf ("error validating manager config: %v" , err )
197203 }
198204
205+ clientVersion , err := ParseClientVersion (cfg .ClientVersion )
206+ if err != nil {
207+ return nil , fmt .Errorf ("error parsing client version: %v" , err )
208+ }
209+
199210 udp := cfg .UDP
200211 if udp == nil {
201212 var err error
@@ -242,7 +253,7 @@ func NewManager(ctx context.Context, cfg *ManagerConfig) (*manager, error) {
242253
243254 // Wire up IO loops.
244255 m .recv = NewReceiver (m .log , m .udp , m .HandleRx , m .metrics )
245- m .sched = NewScheduler (m .log , m .udp , m .onSessionDown , m .cfg .MaxEvents , m .cfg .EnablePeerMetrics , m .metrics , m .cfg .PassiveMode )
256+ m .sched = NewScheduler (m .log , m .udp , m .onSessionDown , m .cfg .MaxEvents , m .cfg .EnablePeerMetrics , m .metrics , m .cfg .PassiveMode , clientVersion )
246257
247258 // Receiver goroutine: parses control packets and dispatches to HandleRx.
248259 m .wg .Add (1 )
@@ -730,7 +741,10 @@ func (m *manager) onSessionUp(sess *Session) {
730741 "peer" , peer .String (),
731742 "route" , snap .Route .String (),
732743 "convergence" , convergence .String (),
733- "upSince" , snap .UpSince .UTC ().String ())
744+ "upSince" , snap .UpSince .UTC ().String (),
745+ "peerAdvertisedMode" , snap .PeerAdvertisedMode .String (),
746+ "peerClientVersion" , snap .PeerClientVersion .String (),
747+ )
734748}
735749
736750// onSessionDown withdraws the route if currently installed (unless PassiveMode
@@ -772,7 +786,9 @@ func (m *manager) onSessionDown(sess *Session) {
772786 "peer" , peer .String (),
773787 "routePresent" , route != nil ,
774788 "downSince" , snap .DownSince .UTC ().String (),
775- "downReason" , snap .LastDownReason .String ())
789+ "downReason" , snap .LastDownReason .String (),
790+ "peerClientVersion" , snap .PeerClientVersion .String (),
791+ )
776792 return
777793 }
778794
@@ -781,7 +797,9 @@ func (m *manager) onSessionDown(sess *Session) {
781797 "peer" , peer .String (),
782798 "route" , snap .Route .String (),
783799 "downSince" , snap .DownSince .UTC ().String (),
784- "downReason" , snap .LastDownReason .String ())
800+ "downReason" , snap .LastDownReason .String (),
801+ "peerClientVersion" , snap .PeerClientVersion .String (),
802+ )
785803 return
786804 }
787805
@@ -790,7 +808,9 @@ func (m *manager) onSessionDown(sess *Session) {
790808 "peer" , peer .String (),
791809 "route" , snap .Route .String (),
792810 "downSince" , snap .DownSince .UTC ().String (),
793- "downReason" , snap .LastDownReason .String ())
811+ "downReason" , snap .LastDownReason .String (),
812+ "peerClientVersion" , snap .PeerClientVersion .String (),
813+ )
794814 return
795815 }
796816
@@ -807,7 +827,9 @@ func (m *manager) onSessionDown(sess *Session) {
807827 "route" , snap .Route .String (),
808828 "convergence" , convergence .String (),
809829 "downSince" , snap .DownSince .UTC ().String (),
810- "downReason" , snap .LastDownReason .String ())
830+ "downReason" , snap .LastDownReason .String (),
831+ "peerClientVersion" , snap .PeerClientVersion .String (),
832+ )
811833}
812834
813835// isPeerEffectivelyPassive returns true when this session should not have its
0 commit comments