# GoBGP as a Go Native BGP library This page explains how to use GoBGP as a Go Native BGP library. ## Contents - [Basic Example](#basic-example) ## Basic Example ```go package main import ( "context" "time" "github.com/sirupsen/logrus" apb "google.golang.org/protobuf/types/known/anypb" api "github.com/osrg/gobgp/v3/api" "github.com/osrg/gobgp/v3/pkg/log" "github.com/osrg/gobgp/v3/pkg/server" ) func main() { log := logrus.New() s := server.NewBgpServer(server.LoggerOption(&myLogger{logger: log})) go s.Serve() // global configuration if err := s.StartBgp(context.Background(), &api.StartBgpRequest{ Global: &api.Global{ Asn: 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.WatchEvent(context.Background(), &api.WatchEventRequest{Peer: &api.WatchEventRequest_Peer{},}, func(r *api.WatchEventResponse) { if p := r.GetPeer(); p != nil && p.Type == api.WatchEventResponse_PeerEvent_STATE { log.Info(p) } }); err != nil { log.Fatal(err) } // neighbor configuration n := &api.Peer{ Conf: &api.PeerConf{ NeighborAddress: "172.17.0.2", PeerAsn: 65002, }, } if err := s.AddPeer(context.Background(), &api.AddPeerRequest{ Peer: n, }); err != nil { log.Fatal(err) } // add routes nlri, _ := apb.New(&api.IPAddressPrefix{ Prefix: "10.0.0.0", PrefixLen: 24, }) a1, _ := apb.New(&api.OriginAttribute{ Origin: 0, }) a2, _ := apb.New(&api.NextHopAttribute{ NextHop: "10.0.0.1", }) a3, _ := apb.New(&api.AsPathAttribute{ Segments: []*api.AsSegment{ { Type: 2, Numbers: []uint32{6762, 39919, 65000, 35753, 65000}, }, }, }) attrs := []*apb.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, _ = apb.New(&api.IPAddressPrefix{ PrefixLen: 64, Prefix: "2001:db8:1::", }) v6Attrs, _ := apb.New(&api.MpReachNLRIAttribute{ Family: v6Family, NextHops: []string{"2001:db8::1"}, Nlris: []*apb.Any{nlri}, }) c, _ := apb.New(&api.CommunitiesAttribute{ Communities: []uint32{100, 200}, }) _, err = s.AddPath(context.Background(), &api.AddPathRequest{ Path: &api.Path{ Family: v6Family, Nlri: nlri, Pattrs: []*apb.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) } // implement github.com/osrg/gobgp/v3/pkg/log/Logger interface type myLogger struct { logger *logrus.Logger } func (l *myLogger) Panic(msg string, fields log.Fields) { l.logger.WithFields(logrus.Fields(fields)).Panic(msg) } func (l *myLogger) Fatal(msg string, fields log.Fields) { l.logger.WithFields(logrus.Fields(fields)).Fatal(msg) } func (l *myLogger) Error(msg string, fields log.Fields) { l.logger.WithFields(logrus.Fields(fields)).Error(msg) } func (l *myLogger) Warn(msg string, fields log.Fields) { l.logger.WithFields(logrus.Fields(fields)).Warn(msg) } func (l *myLogger) Info(msg string, fields log.Fields) { l.logger.WithFields(logrus.Fields(fields)).Info(msg) } func (l *myLogger) Debug(msg string, fields log.Fields) { l.logger.WithFields(logrus.Fields(fields)).Debug(msg) } func (l *myLogger) SetLevel(level log.LogLevel) { l.logger.SetLevel(logrus.Level(level)) } func (l *myLogger) GetLevel() log.LogLevel { return log.LogLevel(l.logger.GetLevel()) } ```