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