mirror of
https://github.com/akvorado/akvorado.git
synced 2025-12-11 22:14:02 +01:00
demoexporter/bmp: switch to GoBGP v4
This commit is contained in:
@@ -9,11 +9,12 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
"net/netip"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/osrg/gobgp/v3/pkg/packet/bgp"
|
"github.com/osrg/gobgp/v4/pkg/packet/bgp"
|
||||||
"github.com/osrg/gobgp/v3/pkg/packet/bmp"
|
"github.com/osrg/gobgp/v4/pkg/packet/bmp"
|
||||||
)
|
)
|
||||||
|
|
||||||
// startBMPClient starts the BMP client
|
// startBMPClient starts the BMP client
|
||||||
@@ -31,9 +32,9 @@ func (c *Component) startBMPClient(ctx context.Context) {
|
|||||||
buf := bytes.NewBuffer([]byte{})
|
buf := bytes.NewBuffer([]byte{})
|
||||||
peerHeader := bmp.NewBMPPeerHeader(
|
peerHeader := bmp.NewBMPPeerHeader(
|
||||||
bmp.BMP_PEER_TYPE_GLOBAL, 0, 0,
|
bmp.BMP_PEER_TYPE_GLOBAL, 0, 0,
|
||||||
c.config.PeerIP.Unmap().String(),
|
c.config.PeerIP,
|
||||||
uint32(c.config.PeerASN),
|
uint32(c.config.PeerASN),
|
||||||
"2.2.2.2",
|
netip.MustParseAddr("2.2.2.2"),
|
||||||
0)
|
0)
|
||||||
pkt, err := bmp.NewBMPInitiation([]bmp.BMPInfoTLVInterface{
|
pkt, err := bmp.NewBMPInitiation([]bmp.BMPInfoTLVInterface{
|
||||||
bmp.NewBMPInfoTLVString(bmp.BMP_INIT_TLV_TYPE_SYS_DESCR, "Fake exporter"),
|
bmp.NewBMPInfoTLVString(bmp.BMP_INIT_TLV_TYPE_SYS_DESCR, "Fake exporter"),
|
||||||
@@ -43,23 +44,31 @@ func (c *Component) startBMPClient(ctx context.Context) {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
buf.Write(pkt)
|
buf.Write(pkt)
|
||||||
pkt, err = bmp.NewBMPPeerUpNotification(*peerHeader, c.config.LocalIP.Unmap().String(), 179, 47647,
|
om1, err := bgp.NewBGPOpenMessage(c.config.LocalASN, 30, netip.MustParseAddr("1.1.1.1"),
|
||||||
bgp.NewBGPOpenMessage(c.config.LocalASN, 30, "1.1.1.1",
|
|
||||||
[]bgp.OptionParameterInterface{
|
[]bgp.OptionParameterInterface{
|
||||||
bgp.NewOptionParameterCapability([]bgp.ParameterCapabilityInterface{
|
bgp.NewOptionParameterCapability([]bgp.ParameterCapabilityInterface{
|
||||||
bgp.NewCapMultiProtocol(bgp.RF_IPv4_UC),
|
bgp.NewCapMultiProtocol(bgp.RF_IPv4_UC),
|
||||||
bgp.NewCapMultiProtocol(bgp.RF_IPv6_UC),
|
bgp.NewCapMultiProtocol(bgp.RF_IPv6_UC),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
),
|
)
|
||||||
bgp.NewBGPOpenMessage(c.config.PeerASN, 30, "2.2.2.2",
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
om2, err := bgp.NewBGPOpenMessage(c.config.PeerASN, 30, netip.MustParseAddr("2.2.2.2"),
|
||||||
[]bgp.OptionParameterInterface{
|
[]bgp.OptionParameterInterface{
|
||||||
bgp.NewOptionParameterCapability([]bgp.ParameterCapabilityInterface{
|
bgp.NewOptionParameterCapability([]bgp.ParameterCapabilityInterface{
|
||||||
bgp.NewCapMultiProtocol(bgp.RF_IPv4_UC),
|
bgp.NewCapMultiProtocol(bgp.RF_IPv4_UC),
|
||||||
bgp.NewCapMultiProtocol(bgp.RF_IPv6_UC),
|
bgp.NewCapMultiProtocol(bgp.RF_IPv6_UC),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
),
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
pkt, err = bmp.NewBMPPeerUpNotification(*peerHeader, c.config.LocalIP, 179, 47647,
|
||||||
|
om1,
|
||||||
|
om2,
|
||||||
).Serialize()
|
).Serialize()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@@ -67,28 +76,41 @@ func (c *Component) startBMPClient(ctx context.Context) {
|
|||||||
buf.Write(pkt)
|
buf.Write(pkt)
|
||||||
|
|
||||||
// Send the routes
|
// Send the routes
|
||||||
for _, af := range []bgp.RouteFamily{bgp.RF_IPv4_UC, bgp.RF_IPv6_UC} {
|
for _, af := range []bgp.Family{bgp.RF_IPv4_UC, bgp.RF_IPv6_UC} {
|
||||||
|
var nh netip.Addr
|
||||||
|
if af == bgp.RF_IPv4_UC {
|
||||||
|
nh = netip.MustParseAddr("192.0.2.1")
|
||||||
|
} else {
|
||||||
|
nh = netip.MustParseAddr("fe80::1")
|
||||||
|
}
|
||||||
for _, route := range c.config.Routes {
|
for _, route := range c.config.Routes {
|
||||||
prefixes := []bgp.AddrPrefixInterface{}
|
prefixes := []bgp.PathNLRI{}
|
||||||
|
|
||||||
for _, prefix := range route.Prefixes {
|
for _, prefix := range route.Prefixes {
|
||||||
if af == bgp.RF_IPv4_UC && prefix.Addr().Is4() {
|
if af == bgp.RF_IPv4_UC && prefix.Addr().Is4() || af == bgp.RF_IPv6_UC && prefix.Addr().Is6() {
|
||||||
prefixes = append(prefixes,
|
n, err := bgp.NewIPAddrPrefix(prefix)
|
||||||
bgp.NewIPAddrPrefix(uint8(prefix.Bits()), prefix.Addr().String()))
|
if err != nil {
|
||||||
} else if af == bgp.RF_IPv6_UC && prefix.Addr().Is6() {
|
panic(err)
|
||||||
prefixes = append(prefixes,
|
}
|
||||||
bgp.NewIPv6AddrPrefix(uint8(prefix.Bits()), prefix.Addr().String()))
|
prefixes = append(prefixes, bgp.PathNLRI{
|
||||||
|
NLRI: n,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(prefixes) == 0 {
|
if len(prefixes) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
nlri, err := bgp.NewPathAttributeMpReachNLRI(af, prefixes, nh)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
attrs := []bgp.PathAttributeInterface{
|
attrs := []bgp.PathAttributeInterface{
|
||||||
// bgp.NewPathAttributeNextHop("192.0.2.20"),
|
// bgp.NewPathAttributeNextHop("192.0.2.20"),
|
||||||
bgp.NewPathAttributeOrigin(1),
|
bgp.NewPathAttributeOrigin(1),
|
||||||
bgp.NewPathAttributeAsPath([]bgp.AsPathParamInterface{
|
bgp.NewPathAttributeAsPath([]bgp.AsPathParamInterface{
|
||||||
bgp.NewAs4PathParam(bgp.BGP_ASPATH_ATTR_TYPE_SEQ, route.ASPath),
|
bgp.NewAs4PathParam(bgp.BGP_ASPATH_ATTR_TYPE_SEQ, route.ASPath),
|
||||||
}),
|
}),
|
||||||
bgp.NewPathAttributeMpReachNLRI("fe80::1", prefixes),
|
nlri,
|
||||||
}
|
}
|
||||||
if route.Communities != nil {
|
if route.Communities != nil {
|
||||||
comms := make([]uint32, len(route.Communities))
|
comms := make([]uint32, len(route.Communities))
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
gobmp "github.com/osrg/gobgp/v3/pkg/packet/bmp"
|
gobmp "github.com/osrg/gobgp/v4/pkg/packet/bmp"
|
||||||
|
|
||||||
"akvorado/common/daemon"
|
"akvorado/common/daemon"
|
||||||
"akvorado/common/helpers"
|
"akvorado/common/helpers"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/osrg/gobgp/v3/pkg/packet/bgp"
|
"github.com/osrg/gobgp/v4/pkg/packet/bgp"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Configuration describes the configuration for the BMP component. Only one peer is emulated.
|
// Configuration describes the configuration for the BMP component. Only one peer is emulated.
|
||||||
|
|||||||
3
go.mod
3
go.mod
@@ -123,7 +123,7 @@ require (
|
|||||||
github.com/jackc/pgx/v5 v5.6.0 // indirect
|
github.com/jackc/pgx/v5 v5.6.0 // indirect
|
||||||
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
||||||
github.com/jellydator/ttlcache/v2 v2.11.1 // indirect
|
github.com/jellydator/ttlcache/v2 v2.11.1 // indirect
|
||||||
github.com/jessevdk/go-flags v1.5.0 // indirect
|
github.com/jessevdk/go-flags v1.6.1 // indirect
|
||||||
github.com/jhump/protoreflect v1.17.0 // indirect
|
github.com/jhump/protoreflect v1.17.0 // indirect
|
||||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
github.com/jinzhu/now v1.1.5 // indirect
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
@@ -146,6 +146,7 @@ require (
|
|||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/openconfig/grpctunnel v0.1.0 // indirect
|
github.com/openconfig/grpctunnel v0.1.0 // indirect
|
||||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||||
|
github.com/osrg/gobgp/v4 v4.0.0 // indirect
|
||||||
github.com/pascaldekloe/name v1.0.1 // indirect
|
github.com/pascaldekloe/name v1.0.1 // indirect
|
||||||
github.com/paulmach/orb v0.11.1 // indirect
|
github.com/paulmach/orb v0.11.1 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||||||
|
|||||||
6
go.sum
6
go.sum
@@ -159,6 +159,7 @@ github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqw
|
|||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||||
github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg=
|
github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg=
|
||||||
github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
|
github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
|
||||||
|
github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U=
|
||||||
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
|
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
|
||||||
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
|
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
|
||||||
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
|
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
|
||||||
@@ -237,6 +238,8 @@ github.com/jellydator/ttlcache/v2 v2.11.1/go.mod h1:RtE5Snf0/57e+2cLWFYWCCsLas2H
|
|||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
|
github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
|
||||||
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
|
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
|
||||||
|
github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4=
|
||||||
|
github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc=
|
||||||
github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94=
|
github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94=
|
||||||
github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8=
|
github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8=
|
||||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||||
@@ -338,6 +341,8 @@ github.com/oschwald/maxminddb-golang/v2 v2.0.0 h1:Gyljxck1kHbBxDgLM++NfDWBqvu1pW
|
|||||||
github.com/oschwald/maxminddb-golang/v2 v2.0.0/go.mod h1:gG4V88LsawPEqtbL1Veh1WRh+nVSYwXzJ1P5Fcn77g0=
|
github.com/oschwald/maxminddb-golang/v2 v2.0.0/go.mod h1:gG4V88LsawPEqtbL1Veh1WRh+nVSYwXzJ1P5Fcn77g0=
|
||||||
github.com/osrg/gobgp/v3 v3.37.0 h1:+ObuOdvj7G7nxrT0fKFta+EAupdWf/q1WzbXydr8IOY=
|
github.com/osrg/gobgp/v3 v3.37.0 h1:+ObuOdvj7G7nxrT0fKFta+EAupdWf/q1WzbXydr8IOY=
|
||||||
github.com/osrg/gobgp/v3 v3.37.0/go.mod h1:kVHVFy1/fyZHJ8P32+ctvPeJogn9qKwa1YCeMRXXrP0=
|
github.com/osrg/gobgp/v3 v3.37.0/go.mod h1:kVHVFy1/fyZHJ8P32+ctvPeJogn9qKwa1YCeMRXXrP0=
|
||||||
|
github.com/osrg/gobgp/v4 v4.0.0 h1:DCL7iWUAPgL/DDBp1FSdkayQ0ptYYkucpuMkre+HGaI=
|
||||||
|
github.com/osrg/gobgp/v4 v4.0.0/go.mod h1:1a0YiXMuyRPqcCX+fkXZ2UUtcOnUxAWynFunUOSZepk=
|
||||||
github.com/pascaldekloe/name v1.0.1 h1:9lnXOHeqeHHnWLbKfH6X98+4+ETVqFqxN09UXSjcMb0=
|
github.com/pascaldekloe/name v1.0.1 h1:9lnXOHeqeHHnWLbKfH6X98+4+ETVqFqxN09UXSjcMb0=
|
||||||
github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM=
|
github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM=
|
||||||
github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU=
|
github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU=
|
||||||
@@ -452,6 +457,7 @@ github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2W
|
|||||||
github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
|
github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
|
||||||
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
|
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
|
||||||
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
||||||
|
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
|
||||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
||||||
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
|
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
|
||||||
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
|
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
|
||||||
|
|||||||
Reference in New Issue
Block a user