api: kill api.Capability

keep protobuf structures simple

Signed-off-by: ISHIDA Wataru <[email protected]>
This commit is contained in:
ISHIDA Wataru
2015-09-08 13:13:37 +09:00
parent 9298e5eeca
commit d8dc45772c
10 changed files with 165 additions and 252 deletions
+7 -109
View File
@@ -15,9 +15,6 @@ It has these top-level messages:
PolicyArguments
MrtArguments
ModVrfArguments
GracefulRestartTuple
GracefulRestart
Capability
Path
Destination
PeerConf
@@ -131,44 +128,6 @@ func (x Operation) String() string {
return proto.EnumName(Operation_name, int32(x))
}
type BGP_CAPABILITY int32
const (
BGP_CAPABILITY_UNKNOWN_CAP BGP_CAPABILITY = 0
BGP_CAPABILITY_MULTIPROTOCOL BGP_CAPABILITY = 1
BGP_CAPABILITY_ROUTE_REFRESH BGP_CAPABILITY = 2
BGP_CAPABILITY_CARRYING_LABEL_INFO BGP_CAPABILITY = 4
BGP_CAPABILITY_GRACEFUL_RESTART BGP_CAPABILITY = 64
BGP_CAPABILITY_FOUR_OCTET_AS_NUMBER BGP_CAPABILITY = 65
BGP_CAPABILITY_ENHANCED_ROUTE_REFRESH BGP_CAPABILITY = 70
BGP_CAPABILITY_ROUTE_REFRESH_CISCO BGP_CAPABILITY = 128
)
var BGP_CAPABILITY_name = map[int32]string{
0: "UNKNOWN_CAP",
1: "MULTIPROTOCOL",
2: "ROUTE_REFRESH",
4: "CARRYING_LABEL_INFO",
64: "GRACEFUL_RESTART",
65: "FOUR_OCTET_AS_NUMBER",
70: "ENHANCED_ROUTE_REFRESH",
128: "ROUTE_REFRESH_CISCO",
}
var BGP_CAPABILITY_value = map[string]int32{
"UNKNOWN_CAP": 0,
"MULTIPROTOCOL": 1,
"ROUTE_REFRESH": 2,
"CARRYING_LABEL_INFO": 4,
"GRACEFUL_RESTART": 64,
"FOUR_OCTET_AS_NUMBER": 65,
"ENHANCED_ROUTE_REFRESH": 70,
"ROUTE_REFRESH_CISCO": 128,
}
func (x BGP_CAPABILITY) String() string {
return proto.EnumName(BGP_CAPABILITY_name, int32(x))
}
type Error_ErrorCode int32
const (
@@ -281,50 +240,6 @@ func (m *ModVrfArguments) GetVrf() *Vrf {
return nil
}
type GracefulRestartTuple struct {
Rf uint32 `protobuf:"varint,1,opt,name=rf" json:"rf,omitempty"`
Flags uint32 `protobuf:"varint,2,opt,name=flags" json:"flags,omitempty"`
}
func (m *GracefulRestartTuple) Reset() { *m = GracefulRestartTuple{} }
func (m *GracefulRestartTuple) String() string { return proto.CompactTextString(m) }
func (*GracefulRestartTuple) ProtoMessage() {}
type GracefulRestart struct {
Flags uint32 `protobuf:"varint,1,opt,name=flags" json:"flags,omitempty"`
Time uint32 `protobuf:"varint,2,opt,name=time" json:"time,omitempty"`
Tuples []*GracefulRestartTuple `protobuf:"bytes,3,rep,name=tuples" json:"tuples,omitempty"`
}
func (m *GracefulRestart) Reset() { *m = GracefulRestart{} }
func (m *GracefulRestart) String() string { return proto.CompactTextString(m) }
func (*GracefulRestart) ProtoMessage() {}
func (m *GracefulRestart) GetTuples() []*GracefulRestartTuple {
if m != nil {
return m.Tuples
}
return nil
}
type Capability struct {
Code BGP_CAPABILITY `protobuf:"varint,1,opt,name=code,enum=api.BGP_CAPABILITY" json:"code,omitempty"`
MultiProtocol uint32 `protobuf:"varint,2,opt,name=multi_protocol" json:"multi_protocol,omitempty"`
GracefulRestart *GracefulRestart `protobuf:"bytes,3,opt,name=graceful_restart" json:"graceful_restart,omitempty"`
Asn uint32 `protobuf:"varint,4,opt,name=asn" json:"asn,omitempty"`
}
func (m *Capability) Reset() { *m = Capability{} }
func (m *Capability) String() string { return proto.CompactTextString(m) }
func (*Capability) ProtoMessage() {}
func (m *Capability) GetGracefulRestart() *GracefulRestart {
if m != nil {
return m.GracefulRestart
}
return nil
}
type Path struct {
Nlri []byte `protobuf:"bytes,1,opt,name=nlri,proto3" json:"nlri,omitempty"`
Pattrs [][]byte `protobuf:"bytes,2,rep,name=pattrs,proto3" json:"pattrs,omitempty"`
@@ -357,35 +272,19 @@ func (m *Destination) GetPaths() []*Path {
}
type PeerConf struct {
RemoteIp string `protobuf:"bytes,1,opt,name=remote_ip" json:"remote_ip,omitempty"`
Id string `protobuf:"bytes,2,opt,name=id" json:"id,omitempty"`
RemoteAs uint32 `protobuf:"varint,3,opt,name=remote_as" json:"remote_as,omitempty"`
CapRefresh bool `protobuf:"varint,4,opt,name=cap_refresh" json:"cap_refresh,omitempty"`
CapEnhancedRefresh bool `protobuf:"varint,5,opt,name=cap_enhanced_refresh" json:"cap_enhanced_refresh,omitempty"`
RemoteCap []*Capability `protobuf:"bytes,6,rep,name=remote_cap" json:"remote_cap,omitempty"`
LocalCap []*Capability `protobuf:"bytes,7,rep,name=local_cap" json:"local_cap,omitempty"`
Holdtime uint32 `protobuf:"varint,8,opt,name=holdtime" json:"holdtime,omitempty"`
KeepaliveInterval uint32 `protobuf:"varint,9,opt,name=keepalive_interval" json:"keepalive_interval,omitempty"`
RemoteIp string `protobuf:"bytes,1,opt,name=remote_ip" json:"remote_ip,omitempty"`
Id string `protobuf:"bytes,2,opt,name=id" json:"id,omitempty"`
RemoteAs uint32 `protobuf:"varint,3,opt,name=remote_as" json:"remote_as,omitempty"`
RemoteCap [][]byte `protobuf:"bytes,6,rep,name=remote_cap,proto3" json:"remote_cap,omitempty"`
LocalCap [][]byte `protobuf:"bytes,7,rep,name=local_cap,proto3" json:"local_cap,omitempty"`
Holdtime uint32 `protobuf:"varint,8,opt,name=holdtime" json:"holdtime,omitempty"`
KeepaliveInterval uint32 `protobuf:"varint,9,opt,name=keepalive_interval" json:"keepalive_interval,omitempty"`
}
func (m *PeerConf) Reset() { *m = PeerConf{} }
func (m *PeerConf) String() string { return proto.CompactTextString(m) }
func (*PeerConf) ProtoMessage() {}
func (m *PeerConf) GetRemoteCap() []*Capability {
if m != nil {
return m.RemoteCap
}
return nil
}
func (m *PeerConf) GetLocalCap() []*Capability {
if m != nil {
return m.LocalCap
}
return nil
}
type PeerInfo struct {
BgpState string `protobuf:"bytes,1,opt,name=bgp_state" json:"bgp_state,omitempty"`
AdminState string `protobuf:"bytes,2,opt,name=admin_state" json:"admin_state,omitempty"`
@@ -788,7 +687,6 @@ func (*Vrf) ProtoMessage() {}
func init() {
proto.RegisterEnum("api.Resource", Resource_name, Resource_value)
proto.RegisterEnum("api.Operation", Operation_name, Operation_value)
proto.RegisterEnum("api.BGP_CAPABILITY", BGP_CAPABILITY_name, BGP_CAPABILITY_value)
proto.RegisterEnum("api.Error_ErrorCode", Error_ErrorCode_name, Error_ErrorCode_value)
}
+2 -33
View File
@@ -109,35 +109,6 @@ enum Operation {
DEL_ALL = 2;
}
enum BGP_CAPABILITY {
UNKNOWN_CAP = 0;
MULTIPROTOCOL = 1;
ROUTE_REFRESH = 2;
CARRYING_LABEL_INFO = 4;
GRACEFUL_RESTART = 64;
FOUR_OCTET_AS_NUMBER = 65;
ENHANCED_ROUTE_REFRESH = 70;
ROUTE_REFRESH_CISCO = 128;
}
message GracefulRestartTuple {
uint32 rf = 1;
uint32 flags = 2;
}
message GracefulRestart {
uint32 flags = 1;
uint32 time = 2;
repeated GracefulRestartTuple tuples = 3;
}
message Capability {
BGP_CAPABILITY code = 1;
uint32 multi_protocol = 2;
GracefulRestart graceful_restart = 3;
uint32 asn = 4;
}
message Path {
bytes nlri = 1;
repeated bytes pattrs = 2;
@@ -158,10 +129,8 @@ message PeerConf {
string remote_ip = 1;
string id = 2;
uint32 remote_as = 3;
bool cap_refresh = 4;
bool cap_enhanced_refresh = 5;
repeated Capability remote_cap = 6;
repeated Capability local_cap = 7;
repeated bytes remote_cap = 6;
repeated bytes local_cap = 7;
uint32 holdtime = 8;
uint32 keepalive_interval = 9;
}
+46 -5
View File
@@ -221,7 +221,48 @@ func (p paths) Less(i, j int) bool {
return strings.Less(0, 1)
}
type peers []*api.Peer
type PeerConf struct {
RemoteIp net.IP `json:"remote_ip,omitempty"`
Id net.IP `json:"id,omitempty"`
RemoteAs uint32 `json:"remote_as,omitempty"`
RemoteCap []bgp.ParameterCapabilityInterface `json:"remote_cap,omitempty"`
LocalCap []bgp.ParameterCapabilityInterface `json:"local_cap,omitempty"`
Holdtime uint32 `json:"holdtime,omitempty"`
KeepaliveInterval uint32 `json:"keepalive_interval,omitempty"`
}
type Peer struct {
Conf PeerConf `json:"conf,omitempty"`
Info *api.PeerInfo `json:"info,omitempty"`
}
func ApiStruct2Peer(p *api.Peer) *Peer {
localCaps := capabilities{}
remoteCaps := capabilities{}
for _, buf := range p.Conf.LocalCap {
c, _ := bgp.DecodeCapability(buf)
localCaps = append(localCaps, c)
}
for _, buf := range p.Conf.RemoteCap {
c, _ := bgp.DecodeCapability(buf)
remoteCaps = append(remoteCaps, c)
}
conf := PeerConf{
RemoteIp: net.ParseIP(p.Conf.RemoteIp),
Id: net.ParseIP(p.Conf.Id),
RemoteAs: p.Conf.RemoteAs,
RemoteCap: remoteCaps,
LocalCap: localCaps,
Holdtime: p.Conf.Holdtime,
KeepaliveInterval: p.Conf.KeepaliveInterval,
}
return &Peer{
Conf: conf,
Info: p.Info,
}
}
type peers []*Peer
func (p peers) Len() int {
return len(p)
@@ -232,8 +273,8 @@ func (p peers) Swap(i, j int) {
}
func (p peers) Less(i, j int) bool {
p1 := net.ParseIP(p[i].Conf.RemoteIp)
p2 := net.ParseIP(p[j].Conf.RemoteIp)
p1 := p[i].Conf.RemoteIp
p2 := p[j].Conf.RemoteIp
p1Isv4 := p1.To4() != nil
p2Isv4 := p2.To4() != nil
if p1Isv4 != p2Isv4 {
@@ -251,7 +292,7 @@ func (p peers) Less(i, j int) bool {
return strings.Less(0, 1)
}
type capabilities []*api.Capability
type capabilities []bgp.ParameterCapabilityInterface
func (c capabilities) Len() int {
return len(c)
@@ -262,7 +303,7 @@ func (c capabilities) Swap(i, j int) {
}
func (c capabilities) Less(i, j int) bool {
return c[i].Code < c[j].Code
return c[i].Code() < c[j].Code()
}
type prefixes []*api.PrefixSet
+20 -15
View File
@@ -59,7 +59,7 @@ func getNeighbors() (peers, error) {
}
}
}
m = append(m, p)
m = append(m, ApiStruct2Peer(p))
}
return m, nil
}
@@ -144,10 +144,11 @@ func showNeighbor(args []string) error {
id := &api.Arguments{
Name: args[0],
}
p, e := client.GetNeighbor(context.Background(), id)
peer, e := client.GetNeighbor(context.Background(), id)
if e != nil {
return e
}
p := ApiStruct2Peer(peer)
if globalOpts.Json {
j, _ := json.Marshal(p)
@@ -164,11 +165,13 @@ func showNeighbor(args []string) error {
fmt.Printf(" Neighbor capabilities:\n")
caps := capabilities{}
lookup := func(val *api.Capability, l capabilities) *api.Capability {
lookup := func(val bgp.ParameterCapabilityInterface, l capabilities) bgp.ParameterCapabilityInterface {
for _, v := range l {
if v.Code == val.Code {
if v.Code == api.BGP_CAPABILITY_MULTIPROTOCOL {
if v.MultiProtocol == val.MultiProtocol {
if v.Code() == val.Code() {
if v.Code() == bgp.BGP_CAP_MULTIPROTOCOL {
lhs := v.(*bgp.CapMultiProtocol).CapValue
rhs := val.(*bgp.CapMultiProtocol).CapValue
if lhs == rhs {
return v
}
continue
@@ -178,10 +181,12 @@ func showNeighbor(args []string) error {
}
return nil
}
caps = append(caps, p.Conf.LocalCap...)
for _, v := range p.Conf.RemoteCap {
if lookup(v, caps) == nil {
caps = append(caps, v)
for _, c := range p.Conf.LocalCap {
caps = append(caps, c)
}
for _, c := range p.Conf.RemoteCap {
if lookup(c, caps) == nil {
caps = append(caps, c)
}
}
@@ -201,15 +206,15 @@ func showNeighbor(args []string) error {
support += "received"
}
if c.Code != api.BGP_CAPABILITY_MULTIPROTOCOL {
fmt.Printf(" %s:\t%s\n", c.Code, support)
if c.Code() != bgp.BGP_CAP_MULTIPROTOCOL {
fmt.Printf(" %s:\t%s\n", c.Code(), support)
} else {
if firstMp {
fmt.Printf(" %s:\n", c.Code)
fmt.Printf(" %s:\n", c.Code())
firstMp = false
}
fmt.Printf(" %s:\t%s\n", bgp.RouteFamily(c.MultiProtocol), support)
m := c.(*bgp.CapMultiProtocol).CapValue
fmt.Printf(" %s:\t%s\n", m, support)
}
}
fmt.Print(" Message statistics:\n")
+12
View File
@@ -114,6 +114,18 @@ func decode_path(p *C.path) *C.char {
return C.CString(string(j))
}
//export decode_capabilities
func decode_capabilities(p *C.buf) *C.char {
buf := []byte(C.GoStringN(p.value, p.len))
c, err := bgp.DecodeCapability(buf)
if err != nil {
return nil
}
j, _ := json.Marshal(c)
return C.CString(string(j))
}
func main() {
// We need the main function to make possible
// CGO compiler to compile the package as C shared library
+68 -81
View File
@@ -20,7 +20,6 @@ import (
"encoding/binary"
"encoding/json"
"fmt"
"github.com/osrg/gobgp/api"
"math"
"net"
"reflect"
@@ -215,13 +214,12 @@ type ParameterCapabilityInterface interface {
Serialize() ([]byte, error)
Len() int
Code() BGPCapabilityCode
ToApiStruct() *api.Capability
}
type DefaultParameterCapability struct {
CapCode BGPCapabilityCode
CapLen uint8
CapValue []byte
CapCode BGPCapabilityCode `json:"code"`
CapLen uint8 `json:"-"`
CapValue []byte `json:"value,omitempty"`
}
func (c *DefaultParameterCapability) Code() BGPCapabilityCode {
@@ -253,20 +251,9 @@ func (c *DefaultParameterCapability) Len() int {
return int(c.CapLen + 2)
}
func (c *DefaultParameterCapability) ToApiStruct() *api.Capability {
return &api.Capability{
Code: api.BGP_CAPABILITY(c.Code()),
}
}
type CapMultiProtocolValue struct {
AFI uint16
SAFI uint8
}
type CapMultiProtocol struct {
DefaultParameterCapability
CapValue CapMultiProtocolValue
CapValue RouteFamily
}
func (c *CapMultiProtocol) DecodeFromBytes(data []byte) error {
@@ -275,35 +262,35 @@ func (c *CapMultiProtocol) DecodeFromBytes(data []byte) error {
if len(data) < 4 {
return fmt.Errorf("Not all CapabilityMultiProtocol bytes available")
}
c.CapValue.AFI = binary.BigEndian.Uint16(data[0:2])
c.CapValue.SAFI = data[3]
c.CapValue = AfiSafiToRouteFamily(binary.BigEndian.Uint16(data[0:2]), data[3])
return nil
}
func (c *CapMultiProtocol) Serialize() ([]byte, error) {
buf := make([]byte, 4)
binary.BigEndian.PutUint16(buf[0:], c.CapValue.AFI)
buf[3] = c.CapValue.SAFI
afi, safi := RouteFamilyToAfiSafi(c.CapValue)
binary.BigEndian.PutUint16(buf[0:], afi)
buf[3] = safi
c.DefaultParameterCapability.CapValue = buf
return c.DefaultParameterCapability.Serialize()
}
func (c *CapMultiProtocol) ToApiStruct() *api.Capability {
return &api.Capability{
Code: api.BGP_CAPABILITY(c.Code()),
MultiProtocol: uint32(AfiSafiToRouteFamily(c.CapValue.AFI, c.CapValue.SAFI)),
}
func (c *CapMultiProtocol) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
Code BGPCapabilityCode `json:"code"`
Value RouteFamily `json:"value"`
}{
Code: c.Code(),
Value: c.CapValue,
})
}
func NewCapMultiProtocol(afi uint16, safi uint8) *CapMultiProtocol {
func NewCapMultiProtocol(rf RouteFamily) *CapMultiProtocol {
return &CapMultiProtocol{
DefaultParameterCapability{
CapCode: BGP_CAP_MULTIPROTOCOL,
},
CapMultiProtocolValue{
AFI: afi,
SAFI: safi,
},
rf,
}
}
@@ -329,10 +316,20 @@ type CapGracefulRestartTuples struct {
Flags uint8
}
func (c CapGracefulRestartTuples) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
RouteFamily RouteFamily `json:"route_family"`
Flags uint8 `json:"flags"`
}{
RouteFamily: AfiSafiToRouteFamily(c.AFI, c.SAFI),
Flags: c.Flags,
})
}
type CapGracefulRestartValue struct {
Flags uint8
Time uint16
Tuples []CapGracefulRestartTuples
Flags uint8 `json:"flags"`
Time uint16 `json:"time"`
Tuples []CapGracefulRestartTuples `json"tuples"`
}
type CapGracefulRestart struct {
@@ -370,27 +367,6 @@ func (c *CapGracefulRestart) Serialize() ([]byte, error) {
return c.DefaultParameterCapability.Serialize()
}
func (c *CapGracefulRestart) ToApiStruct() *api.Capability {
value := &api.GracefulRestart{
Flags: uint32(c.CapValue.Flags),
Time: uint32(c.CapValue.Time),
}
tuples := []*api.GracefulRestartTuple{}
for _, t := range c.CapValue.Tuples {
tuple := &api.GracefulRestartTuple{
Rf: uint32(AfiSafiToRouteFamily(t.AFI, t.SAFI)),
Flags: uint32(t.Flags),
}
tuples = append(tuples, tuple)
}
value.Tuples = tuples
return &api.Capability{
Code: api.BGP_CAPABILITY(c.Code()),
GracefulRestart: value,
}
}
func NewCapGracefulRestart(flags uint8, time uint16, tuples []CapGracefulRestartTuples) *CapGracefulRestart {
return &CapGracefulRestart{
DefaultParameterCapability{
@@ -426,11 +402,14 @@ func (c *CapFourOctetASNumber) Serialize() ([]byte, error) {
return c.DefaultParameterCapability.Serialize()
}
func (c *CapFourOctetASNumber) ToApiStruct() *api.Capability {
return &api.Capability{
Code: api.BGP_CAPABILITY(c.Code()),
Asn: c.CapValue,
}
func (c *CapFourOctetASNumber) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
Code BGPCapabilityCode `json"code"`
Value uint32 `json"value"`
}{
Code: c.Code(),
Value: c.CapValue,
})
}
func NewCapFourOctetASNumber(asnum uint32) *CapFourOctetASNumber {
@@ -470,6 +449,33 @@ type CapUnknown struct {
DefaultParameterCapability
}
func DecodeCapability(data []byte) (ParameterCapabilityInterface, error) {
if len(data) < 2 {
return nil, fmt.Errorf("Not all ParameterCapability bytes available")
}
var c ParameterCapabilityInterface
switch BGPCapabilityCode(data[0]) {
case BGP_CAP_MULTIPROTOCOL:
c = &CapMultiProtocol{}
case BGP_CAP_ROUTE_REFRESH:
c = &CapRouteRefresh{}
case BGP_CAP_CARRYING_LABEL_INFO:
c = &CapCarryingLabelInfo{}
case BGP_CAP_GRACEFUL_RESTART:
c = &CapGracefulRestart{}
case BGP_CAP_FOUR_OCTET_AS_NUMBER:
c = &CapFourOctetASNumber{}
case BGP_CAP_ENHANCED_ROUTE_REFRESH:
c = &CapEnhancedRouteRefresh{}
case BGP_CAP_ROUTE_REFRESH_CISCO:
c = &CapRouteRefreshCisco{}
default:
c = &CapUnknown{}
}
err := c.DecodeFromBytes(data)
return c, err
}
type OptionParameterInterface interface {
Serialize() ([]byte, error)
}
@@ -485,28 +491,9 @@ func (o *OptionParameterCapability) DecodeFromBytes(data []byte) error {
return fmt.Errorf("Not all OptionParameterCapability bytes available")
}
for len(data) >= 2 {
var c ParameterCapabilityInterface
switch BGPCapabilityCode(data[0]) {
case BGP_CAP_MULTIPROTOCOL:
c = &CapMultiProtocol{}
case BGP_CAP_ROUTE_REFRESH:
c = &CapRouteRefresh{}
case BGP_CAP_CARRYING_LABEL_INFO:
c = &CapCarryingLabelInfo{}
case BGP_CAP_GRACEFUL_RESTART:
c = &CapGracefulRestart{}
case BGP_CAP_FOUR_OCTET_AS_NUMBER:
c = &CapFourOctetASNumber{}
case BGP_CAP_ENHANCED_ROUTE_REFRESH:
c = &CapEnhancedRouteRefresh{}
case BGP_CAP_ROUTE_REFRESH_CISCO:
c = &CapRouteRefreshCisco{}
default:
c = &CapUnknown{}
}
err := c.DecodeFromBytes(data)
c, err := DecodeCapability(data)
if err != nil {
return nil
return err
}
o.Capability = append(o.Capability, c)
data = data[c.Len():]
+1 -1
View File
@@ -25,7 +25,7 @@ func open() *BGPMessage {
p1 := NewOptionParameterCapability(
[]ParameterCapabilityInterface{NewCapRouteRefresh()})
p2 := NewOptionParameterCapability(
[]ParameterCapabilityInterface{NewCapMultiProtocol(3, 4)})
[]ParameterCapabilityInterface{NewCapMultiProtocol(RF_IPv4_UC)})
g := CapGracefulRestartTuples{4, 2, 3}
p3 := NewOptionParameterCapability(
[]ParameterCapabilityInterface{NewCapGracefulRestart(2, 100,
+1 -2
View File
@@ -391,8 +391,7 @@ func capabilitiesFromConfig(gConf *config.Global, pConf *config.Neighbor) []bgp.
caps = append(caps, bgp.NewCapRouteRefresh())
for _, rf := range pConf.AfiSafis.AfiSafiList {
k, _ := bgp.GetRouteFamily(rf.AfiSafiName)
afi, safi := bgp.RouteFamilyToAfiSafi(k)
caps = append(caps, bgp.NewCapMultiProtocol(afi, safi))
caps = append(caps, bgp.NewCapMultiProtocol(k))
}
caps = append(caps, bgp.NewCapFourOctetASNumber(gConf.GlobalConfig.As))
return caps
+1 -1
View File
@@ -313,7 +313,7 @@ func open() *bgp.BGPMessage {
p1 := bgp.NewOptionParameterCapability(
[]bgp.ParameterCapabilityInterface{bgp.NewCapRouteRefresh()})
p2 := bgp.NewOptionParameterCapability(
[]bgp.ParameterCapabilityInterface{bgp.NewCapMultiProtocol(3, 4)})
[]bgp.ParameterCapabilityInterface{bgp.NewCapMultiProtocol(bgp.RF_IPv4_UC)})
g := bgp.CapGracefulRestartTuples{4, 2, 3}
p3 := bgp.NewOptionParameterCapability(
[]bgp.ParameterCapabilityInterface{bgp.NewCapGracefulRestart(2, 100,
+7 -5
View File
@@ -135,7 +135,7 @@ func (peer *Peer) handleBGPmessage(m *bgp.BGPMessage) ([]*table.Path, bool, []*b
if c.Code() == bgp.BGP_CAP_MULTIPROTOCOL {
m := c.(*bgp.CapMultiProtocol)
r[bgp.AfiSafiToRouteFamily(m.CapValue.AFI, m.CapValue.SAFI)] = true
r[m.CapValue] = true
}
}
}
@@ -246,17 +246,19 @@ func (peer *Peer) ToApiStruct() *api.Peer {
f := peer.fsm
c := f.pConf
remoteCap := make([]*api.Capability, 0, len(peer.capMap))
remoteCap := make([][]byte, 0, len(peer.capMap))
for _, c := range peer.capMap {
for _, m := range c {
remoteCap = append(remoteCap, m.ToApiStruct())
buf, _ := m.Serialize()
remoteCap = append(remoteCap, buf)
}
}
caps := capabilitiesFromConfig(&peer.gConf, &peer.conf)
localCap := make([]*api.Capability, 0, len(caps))
localCap := make([][]byte, 0, len(caps))
for _, c := range caps {
localCap = append(localCap, c.ToApiStruct())
buf, _ := c.Serialize()
localCap = append(localCap, buf)
}
conf := &api.PeerConf{