From 512639ddad65e788324207ab30ce955639aa5973 Mon Sep 17 00:00:00 2001 From: Daniel Czerwonk <daniel@dan-nrw.de> Date: Sun, 24 Jun 2018 11:51:46 +0200 Subject: [PATCH] 32bit asn open cap decoding --- main.go | 8 ++++---- protocols/bgp/packet/decoder.go | 20 ++++++++++++++++++++ protocols/bgp/server/fsm_open_sent_test.go | 2 +- protocols/bgp/server/fsm_test.go | 2 +- protocols/bgp/server/peer.go | 1 + 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index 22cba26f..0896ecc2 100644 --- a/main.go +++ b/main.go @@ -40,9 +40,9 @@ func main() { b.AddPeer(config.Peer{ AdminEnabled: true, - LocalAS: 6695, + LocalAS: 65200, PeerAS: 65300, - PeerAddress: net.IP([]byte{169, 254, 200, 1}), + PeerAddress: net.IP([]byte{172, 17, 0, 3}), LocalAddress: net.IP([]byte{169, 254, 200, 0}), ReconnectInterval: time.Second * 15, HoldTime: time.Second * 90, @@ -59,9 +59,9 @@ func main() { b.AddPeer(config.Peer{ AdminEnabled: true, - LocalAS: 6695, + LocalAS: 65200, PeerAS: 65100, - PeerAddress: net.IP([]byte{169, 254, 100, 0}), + PeerAddress: net.IP([]byte{172, 17, 0, 2}), LocalAddress: net.IP([]byte{169, 254, 100, 1}), ReconnectInterval: time.Second * 15, HoldTime: time.Second * 90, diff --git a/protocols/bgp/packet/decoder.go b/protocols/bgp/packet/decoder.go index cafc9b5a..9bb71f1a 100644 --- a/protocols/bgp/packet/decoder.go +++ b/protocols/bgp/packet/decoder.go @@ -242,6 +242,12 @@ func decodeCapability(buf *bytes.Buffer) (Capability, error) { return cap, fmt.Errorf("Unable to decode add path capability") } cap.Value = addPathCap + case ASN4CapabilityCode: + asn4Cap, err := decodeASN4Capability(buf) + if err != nil { + return cap, fmt.Errorf("Unable to decode 4 octet ASN capability") + } + cap.Value = asn4Cap default: for i := uint8(0); i < cap.Length; i++ { _, err := buf.ReadByte() @@ -270,6 +276,20 @@ func decodeAddPathCapability(buf *bytes.Buffer) (AddPathCapability, error) { return addPathCap, nil } +func decodeASN4Capability(buf *bytes.Buffer) (ASN4Capability, error) { + asn4Cap := ASN4Capability{} + fields := []interface{}{ + &asn4Cap.ASN4, + } + + err := decode(buf, fields) + if err != nil { + return asn4Cap, err + } + + return asn4Cap, nil +} + func validateOpen(msg *BGPOpen) error { if msg.Version != BGP4Version { return BGPError{ diff --git a/protocols/bgp/server/fsm_open_sent_test.go b/protocols/bgp/server/fsm_open_sent_test.go index d4f2634e..39057c64 100644 --- a/protocols/bgp/server/fsm_open_sent_test.go +++ b/protocols/bgp/server/fsm_open_sent_test.go @@ -65,7 +65,7 @@ func TestOpenMsgReceived(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - fsm := newFSM2(&Peer{ + fsm := newFSM2(&peer{ peerASN: test.asn, }) diff --git a/protocols/bgp/server/fsm_test.go b/protocols/bgp/server/fsm_test.go index 1dc8e9dd..c0b29393 100644 --- a/protocols/bgp/server/fsm_test.go +++ b/protocols/bgp/server/fsm_test.go @@ -70,7 +70,7 @@ func TestOpenMessage(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - p := Peer{ + p := peer{ localASN: test.localASN, holdTime: test.holdTime, routerID: test.routerID, diff --git a/protocols/bgp/server/peer.go b/protocols/bgp/server/peer.go index be8edab9..d12fbc00 100644 --- a/protocols/bgp/server/peer.go +++ b/protocols/bgp/server/peer.go @@ -108,6 +108,7 @@ func newPeer(c config.Peer, rib routingtable.RouteTableClient, server *bgpServer server: server, addr: c.PeerAddress, peerASN: c.PeerAS, + localASN: c.LocalAS, fsms: make([]*FSM, 0), rib: rib, addPathSend: c.AddPathSend, -- GitLab