summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--packet/bgp_test.go124
1 files changed, 124 insertions, 0 deletions
diff --git a/packet/bgp_test.go b/packet/bgp_test.go
new file mode 100644
index 00000000..fc0c9eb7
--- /dev/null
+++ b/packet/bgp_test.go
@@ -0,0 +1,124 @@
+package bgp
+
+import (
+ "bytes"
+ "net"
+ "testing"
+)
+
+func keepalive() *BGPMessage {
+ return NewBGPKeepAliveMessage()
+}
+
+func notification() *BGPMessage {
+ return NewBGPNotificationMessage(1, 2, nil)
+}
+
+func refresh() *BGPMessage {
+ return NewBGPRouteRefreshMessage(1, 2, 10)
+}
+
+func open() *BGPMessage {
+ p1 := NewOptionParameterCapability(
+ []ParameterCapabilityInterface{NewCapRouteRefresh()})
+ p2 := NewOptionParameterCapability(
+ []ParameterCapabilityInterface{NewCapMultiProtocol(3, 4)})
+ g := CapGracefulRestartTuples{4, 2, 3}
+ p3 := NewOptionParameterCapability(
+ []ParameterCapabilityInterface{NewCapGracefulRestart(2, 100,
+ []CapGracefulRestartTuples{g})})
+ p4 := NewOptionParameterCapability(
+ []ParameterCapabilityInterface{NewCapFourOctetASNumber(100000)})
+ return NewBGPOpenMessage(11033, 303, "100.4.10.3",
+ []OptionParameterInterface{p1, p2, p3, p4})
+}
+
+func update() *BGPMessage {
+ w1 := WithdrawnRoute{*NewIPAddrPrefix(23, "121.1.3.2")}
+ w2 := WithdrawnRoute{*NewIPAddrPrefix(17, "100.33.3.0")}
+ w := []WithdrawnRoute{w1, w2}
+
+ aspath := []AsPathParam{
+ AsPathParam{Type: 2, Num: 1, AS: []uint32{1000}},
+ AsPathParam{Type: 1, Num: 2, AS: []uint32{1001, 1002}},
+ AsPathParam{Type: 2, Num: 2, AS: []uint32{1003, 1004}},
+ }
+
+ aspath2 := []AsPathParam{
+ AsPathParam{Type: 2, Num: 1, AS: []uint32{1000000}},
+ AsPathParam{Type: 1, Num: 2, AS: []uint32{1000001, 1002}},
+ AsPathParam{Type: 2, Num: 2, AS: []uint32{1003, 100004}},
+ }
+
+ ecommunities := []ExtendedCommunityInterface{
+ &TwoOctetAsSpecificExtended{SubType: 1, AS: 10003, LocalAdmin: 3 << 20},
+ &FourOctetAsSpecificExtended{SubType: 2, AS: 1 << 20, LocalAdmin: 300},
+ &IPv4AddressSpecificExtended{SubType: 3, IPv4: net.ParseIP("192.2.1.2").To4(), LocalAdmin: 3000},
+ &OpaqueExtended{Value: []byte{0, 1, 2, 3, 4, 5, 6, 7}},
+ &UnknownExtended{Type: 99, Value: []byte{0, 1, 2, 3, 4, 5, 6, 7}},
+ }
+
+ mp_nlri := []AddrPrefixInterface{
+ NewLabelledVPNIPAddrPrefix(20, "192.0.9.0", *NewLabel(1, 2, 3),
+ NewRouteDistinguisherTwoOctetAS(256, 10000)),
+ NewLabelledVPNIPAddrPrefix(26, "192.10.8.192", *NewLabel(5, 6, 7, 8),
+ NewRouteDistinguisherIPAddressAS("10.0.1.1", 10001)),
+ }
+
+ mp_nlri2 := []AddrPrefixInterface{NewIPv6AddrPrefix(100,
+ "fe80:1234:1234:5667:8967:af12:8912:1023")}
+
+ mp_nlri3 := []AddrPrefixInterface{NewLabelledVPNIPv6AddrPrefix(100,
+ "fe80:1234:1234:5667:8967:af12:1203:33a1", *NewLabel(5, 6),
+ NewRouteDistinguisherFourOctetAS(5, 6))}
+
+ mp_nlri4 := []AddrPrefixInterface{NewLabelledIPAddrPrefix(25, "192.168.0.0",
+ *NewLabel(5, 6, 7))}
+
+ p := []PathAttributeInterface{
+ NewPathAttributeOrigin(3),
+ NewPathAttributeAsPath(aspath),
+ NewPathAttributeNextHop("129.1.1.2"),
+ NewPathAttributeMultiExitDisc(1 << 20),
+ NewPathAttributeLocalPref(1 << 22),
+ NewPathAttributeAtomicAggregate(),
+ NewPathAttributeAggregator(30002, "129.0.2.99"),
+ NewPathAttributeCommunities([]uint32{1, 3}),
+ NewPathAttributeOriginatorId("10.10.0.1"),
+ NewPathAttributeClusterList([]string{"10.10.0.2", "10.10.0.3"}),
+ NewPathAttributeExtendedCommunities(ecommunities),
+ NewPathAttributeAs4Path(aspath2),
+ NewPathAttributeAs4Aggregator(10000, "112.22.2.1"),
+ NewPathAttributeMpReachNLRI("112.22.2.0", mp_nlri),
+ NewPathAttributeMpReachNLRI("1023::", mp_nlri2),
+ NewPathAttributeMpReachNLRI("fe80::", mp_nlri3),
+ NewPathAttributeMpReachNLRI("129.1.1.1", mp_nlri4),
+ NewPathAttributeMpUnreachNLRI(mp_nlri),
+ &PathAttributeUnknown{
+ PathAttribute: PathAttribute{
+ Flags: 1,
+ Type: 100,
+ Value: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
+ },
+ },
+ }
+ n := []NLRInfo{*NewNLRInfo(24, "13.2.3.1")}
+ return NewBGPUpdateMessage(w, p, n)
+}
+
+func Test_Message(t *testing.T) {
+ l := []*BGPMessage{keepalive(), notification(), refresh(), open(), update()}
+ for _, m := range l {
+ buf1, _ := m.Serialize()
+ t.Log("LEN =", len(buf1))
+ msg, _ := ParseBGPMessage(buf1)
+ buf2, _ := msg.Serialize()
+ if bytes.Compare(buf1, buf2) == 0 {
+ t.Log("OK")
+ } else {
+ t.Error("Something wrong")
+ t.Error(len(buf1), &m, buf1)
+ t.Error(len(buf2), &msg, buf2)
+ }
+ }
+}