diff options
Diffstat (limited to 'pkg/tcpip/sample/wg_tunnel/gobgp/main.go')
-rw-r--r-- | pkg/tcpip/sample/wg_tunnel/gobgp/main.go | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/pkg/tcpip/sample/wg_tunnel/gobgp/main.go b/pkg/tcpip/sample/wg_tunnel/gobgp/main.go new file mode 100644 index 000000000..3f51adc69 --- /dev/null +++ b/pkg/tcpip/sample/wg_tunnel/gobgp/main.go @@ -0,0 +1,119 @@ +package main + +import ( + "context" + "time" + + "github.com/golang/protobuf/ptypes" + "github.com/golang/protobuf/ptypes/any" + api "github.com/osrg/gobgp/api" + gobgp "github.com/osrg/gobgp/pkg/server" + log "github.com/sirupsen/logrus" +) + +func main() { + log.SetLevel(log.DebugLevel) + s := gobgp.NewBgpServer() + go s.Serve() + + // global configuration + if err := s.StartBgp(context.Background(), &api.StartBgpRequest{ + Global: &api.Global{ + As: 65003, + RouterId: "10.0.255.254", + ListenPort: -1, // gobgp won't listen on tcp:179 + }, + }); err != nil { + log.Fatal(err) + } + + // monitor the change of the peer state + if err := s.MonitorPeer(context.Background(), &api.MonitorPeerRequest{}, func(p *api.Peer) { log.Info(p) }); err != nil { + log.Fatal(err) + } + + // neighbor configuration + n := &api.Peer{ + Conf: &api.PeerConf{ + NeighborAddress: "172.17.0.2", + PeerAs: 65002, + }, + } + + if err := s.AddPeer(context.Background(), &api.AddPeerRequest{ + Peer: n, + }); err != nil { + log.Fatal(err) + } + + // add routes + nlri, _ := ptypes.MarshalAny(&api.IPAddressPrefix{ + Prefix: "10.0.0.0", + PrefixLen: 24, + }) + + a1, _ := ptypes.MarshalAny(&api.OriginAttribute{ + Origin: 0, + }) + a2, _ := ptypes.MarshalAny(&api.NextHopAttribute{ + NextHop: "10.0.0.1", + }) + a3, _ := ptypes.MarshalAny(&api.AsPathAttribute{ + Segments: []*api.AsSegment{ + { + Type: 2, + Numbers: []uint32{6762, 39919, 65000, 35753, 65000}, + }, + }, + }) + attrs := []*any.Any{a1, a2, a3} + + _, err := s.AddPath(context.Background(), &api.AddPathRequest{ + Path: &api.Path{ + Family: &api.Family{Afi: api.Family_AFI_IP, Safi: api.Family_SAFI_UNICAST}, + Nlri: nlri, + Pattrs: attrs, + }, + }) + if err != nil { + log.Fatal(err) + } + + v6Family := &api.Family{ + Afi: api.Family_AFI_IP6, + Safi: api.Family_SAFI_UNICAST, + } + + // add v6 route + nlri, _ = ptypes.MarshalAny(&api.IPAddressPrefix{ + PrefixLen: 64, + Prefix: "2001:db8:1::", + }) + v6Attrs, _ := ptypes.MarshalAny(&api.MpReachNLRIAttribute{ + Family: v6Family, + NextHops: []string{"2001:db8::1"}, + Nlris: []*any.Any{nlri}, + }) + + c, _ := ptypes.MarshalAny(&api.CommunitiesAttribute{ + Communities: []uint32{100, 200}, + }) + + _, err = s.AddPath(context.Background(), &api.AddPathRequest{ + Path: &api.Path{ + Family: v6Family, + Nlri: nlri, + Pattrs: []*any.Any{a1, v6Attrs, c}, + }, + }) + if err != nil { + log.Fatal(err) + } + + s.ListPath(context.Background(), &api.ListPathRequest{Family: v6Family}, func(p *api.Destination) { + log.Info(p) + }) + + // do something useful here instead of exiting + time.Sleep(time.Minute * 3) +} |