@@ -497,6 +497,54 @@ func TestAnnounceToAppliesSplitHorizon(t *testing.T) {
497497 }
498498}
499499
500+ // --- Origin filtering (don't send peer its own originated routes) ---
501+
502+ func TestAnnounceableOmitsRoutesOriginatedByPeer (t * testing.T ) {
503+ now := time .Date (2026 , 1 , 1 , 12 , 0 , 0 , 0 , time .UTC )
504+ tbl := NewTable (WithClock (fixedClock (now )))
505+
506+ // Route originated by peer-A, learned via peer-C (different NextHop).
507+ // Split horizon alone would NOT filter this, but origin filter must.
508+ mustUpdate (t , tbl , RouteEntry {
509+ Identity : "alice" , Origin : "peer-A" , NextHop : "peer-C" ,
510+ Hops : 3 , SeqNo : 1 , Source : RouteSourceAnnouncement ,
511+ })
512+ mustUpdate (t , tbl , RouteEntry {
513+ Identity : "bob" , Origin : "peer-B" , NextHop : "peer-C" ,
514+ Hops : 2 , SeqNo : 1 , Source : RouteSourceAnnouncement ,
515+ })
516+
517+ announceable := tbl .Announceable ("peer-A" )
518+ for _ , r := range announceable {
519+ if r .Origin == "peer-A" {
520+ t .Fatal ("origin filter: routes originated by peer-A must be excluded when announcing to peer-A" )
521+ }
522+ }
523+ if len (announceable ) != 1 || announceable [0 ].Identity != "bob" {
524+ t .Fatalf ("expected only bob's route, got %+v" , announceable )
525+ }
526+ }
527+
528+ func TestAnnounceToOmitsRoutesOriginatedByPeer (t * testing.T ) {
529+ now := time .Date (2026 , 1 , 1 , 12 , 0 , 0 , 0 , time .UTC )
530+ tbl := NewTable (WithClock (fixedClock (now )))
531+
532+ // Route originated by peer-A, learned via peer-C.
533+ mustUpdate (t , tbl , RouteEntry {
534+ Identity : "alice" , Origin : "peer-A" , NextHop : "peer-C" ,
535+ Hops : 3 , SeqNo : 1 , Source : RouteSourceAnnouncement ,
536+ })
537+ mustUpdate (t , tbl , RouteEntry {
538+ Identity : "bob" , Origin : "peer-B" , NextHop : "peer-C" ,
539+ Hops : 2 , SeqNo : 1 , Source : RouteSourceAnnouncement ,
540+ })
541+
542+ entries := tbl .AnnounceTo ("peer-A" )
543+ if len (entries ) != 1 || entries [0 ].Identity != "bob" {
544+ t .Fatalf ("origin filter should exclude alice's route: got %+v" , entries )
545+ }
546+ }
547+
500548func TestAnnounceToStripsInternalFields (t * testing.T ) {
501549 now := time .Date (2026 , 1 , 1 , 12 , 0 , 0 , 0 , time .UTC )
502550 tbl := NewTable (WithClock (fixedClock (now )))
0 commit comments