Priyanka B
Committed by Gerrit Code Review

Implementation of Adj-In and Local RIB UT

Change-Id: I4cac90005f2d728006483b3c03ff0ff3c422f8ba
......@@ -16,7 +16,10 @@
package org.onosproject.bgp;
import com.google.common.net.InetAddresses;
import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelPipeline;
......@@ -31,22 +34,43 @@ import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import org.onlab.junit.TestUtils;
import org.onlab.junit.TestUtils.TestUtilsException;
import org.onlab.packet.Ip4Address;
import org.onlab.packet.IpAddress;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.onosproject.bgp.controller.BgpCfg;
import org.onosproject.bgp.controller.BgpId;
import org.onosproject.bgp.controller.impl.AdjRibIn;
import org.onosproject.bgp.controller.impl.BgpControllerImpl;
import org.onosproject.bgp.controller.impl.BgpLocalRibImpl;
import org.onosproject.bgp.controller.impl.BgpPeerImpl;
import org.onosproject.bgp.controller.impl.VpnAdjRibIn;
import org.onosproject.bgpio.protocol.linkstate.BgpLinkLSIdentifier;
import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSIdentifier;
import org.onosproject.bgpio.protocol.linkstate.BgpPrefixLSIdentifier;
import org.onosproject.bgpio.protocol.linkstate.NodeDescriptors;
import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetails;
import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetailsLocalRib;
import org.onosproject.bgpio.types.AutonomousSystemTlv;
import org.onosproject.bgpio.types.BgpLSIdentifierTlv;
import org.onosproject.bgpio.types.BgpValueType;
import org.onosproject.bgpio.types.FourOctetAsNumCapabilityTlv;
import org.onosproject.bgpio.types.IPReachabilityInformationTlv;
import org.onosproject.bgpio.types.IPv4AddressTlv;
import org.onosproject.bgpio.types.IsIsNonPseudonode;
import org.onosproject.bgpio.types.MultiProtocolExtnCapabilityTlv;
import org.onosproject.bgpio.types.IsIsPseudonode;
import org.onosproject.bgpio.types.RouteDistinguisher;
/**
* Test case for BGPControllerImpl.
......@@ -71,6 +95,9 @@ public class BgpControllerImplTest {
peer1 = new BgpPeerTest(version, asNumber,
holdTime, bgpId, isLargeAsCapabilitySet,
capabilityTlv);
peer2 = new BgpPeerTest(version, asNumber,
holdTime, bgpId, isLargeAsCapabilitySet,
capabilityTlv);
bgpControllerImpl = new BgpControllerImpl();
......@@ -93,6 +120,23 @@ public class BgpControllerImplTest {
bgpControllerImpl.getConfig().setState(BgpCfg.State.IP_AS_CONFIGURED);
bgpControllerImpl.getConfig().addPeer("127.0.0.1", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.9", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.33", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.10", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.20", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.30", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.40", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.50", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.60", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.70", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.80", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.90", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.91", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.92", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.99", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.94", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.95", 200);
bgpControllerImpl.getConfig().addPeer("127.0.0.35", 200);
}
@After
......@@ -104,7 +148,7 @@ public class BgpControllerImplTest {
private BgpControllerImpl bgpControllerImpl;
BgpPeerTest peer1;
BgpPeerTest peer2;
// The socket that the remote peers should connect to
private InetSocketAddress connectToSocket;
......@@ -254,6 +298,625 @@ public class BgpControllerImplTest {
}
/**
* Peer1 has Node NLRI (MpReach).
*/
@Test
public void testBgpUpdateMessage1() throws InterruptedException {
// Initiate the connections
peer1.peerChannelHandler.asNumber = 200;
peer1.peerChannelHandler.version = 4;
peer1.peerChannelHandler.holdTime = 120;
short afi = 16388;
byte res = 0;
byte safi = 71;
bgpControllerImpl.getConfig().setLsCapability(true);
BgpValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer1.peerChannelHandler.capabilityTlv.add(tempTlv1);
peer1.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.9", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer1
BgpId bgpId = new BgpId(IpAddress.valueOf("127.0.0.9"));
BgpPeerImpl peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
LinkedList<BgpValueType> subTlvs = new LinkedList<>();
BgpValueType tlv = AutonomousSystemTlv.of(2478);
subTlvs.add(tlv);
tlv = BgpLSIdentifierTlv.of(33686018);
subTlvs.add(tlv);
NodeDescriptors nodeDes = new NodeDescriptors(subTlvs, (short) 0x10, (short) 256);
BgpNodeLSIdentifier key = new BgpNodeLSIdentifier(nodeDes);
AdjRibIn adj = peer.adjRib();
//In Adj-RIB, nodeTree should contains specified key
assertThat(adj.nodeTree().containsKey(key), is(true));
BgpLocalRibImpl obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRib();
//In Local-RIB, nodeTree should contains specified key
assertThat(obj.nodeTree().containsKey(key), is(true));
}
/**
* Peer1 has Node NLRI (MpReach) and Peer2 has Node NLRI with same MpReach and MpUnReach.
*/
@Test
public void testBgpUpdateMessage2() throws InterruptedException, TestUtilsException {
// Initiate the connections
peer1.peerChannelHandler.asNumber = 200;
peer1.peerChannelHandler.version = 4;
peer1.peerChannelHandler.holdTime = 120;
short afi = 16388;
byte res = 0;
byte safi = 71;
bgpControllerImpl.getConfig().setLsCapability(true);
BgpValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer2.peerChannelHandler.capabilityTlv.add(tempTlv1);
Channel channel = peer1.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.95", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer1
BgpId bgpId = new BgpId(IpAddress.valueOf("127.0.0.95"));
BgpPeerImpl peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
LinkedList<BgpValueType> subTlvs = new LinkedList<>();
BgpValueType tlv = AutonomousSystemTlv.of(2478);
subTlvs.add(tlv);
tlv = BgpLSIdentifierTlv.of(33686018);
subTlvs.add(tlv);
NodeDescriptors nodeDes = new NodeDescriptors(subTlvs, (short) 0x10, (short) 256);
BgpNodeLSIdentifier key = new BgpNodeLSIdentifier(nodeDes);
TimeUnit.MILLISECONDS.sleep(500);
AdjRibIn adj = peer.adjRib();
//In Adj-RIB, nodeTree should contains specified key
assertThat(adj.nodeTree().containsKey(key), is(true));
BgpLocalRibImpl obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRib();
//In Local-RIB, nodeTree should contains specified key
assertThat(obj.nodeTree().containsKey(key), is(true));
peer2.peerChannelHandler.asNumber = 200;
peer2.peerChannelHandler.version = 4;
peer2.peerChannelHandler.holdTime = 120;
bgpControllerImpl.getConfig().setLsCapability(true);
tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer2.peerChannelHandler.capabilityTlv.add(tempTlv1);
peer2.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.70", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer2
bgpId = new BgpId(IpAddress.valueOf("127.0.0.70"));
peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
TimeUnit.MILLISECONDS.sleep(200);
adj = peer.adjRib();
//In Adj-RIB, nodetree should be empty
assertThat(adj.nodeTree().isEmpty(), is(true));
//Disconnect peer1
channel.disconnect();
channel.close();
obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRib();
TimeUnit.MILLISECONDS.sleep(200);
//In Local-RIB, nodetree should be empty
assertThat(obj.nodeTree().isEmpty(), is(true));
}
/**
* Peer1 has Link NLRI (MpReach).
*/
@Test
public void testBgpUpdateMessage3() throws InterruptedException, TestUtilsException {
// Initiate the connections
peer1.peerChannelHandler.asNumber = 200;
peer1.peerChannelHandler.version = 4;
peer1.peerChannelHandler.holdTime = 120;
short afi = 16388;
byte res = 0;
byte safi = 71;
bgpControllerImpl.getConfig().setLsCapability(true);
BgpValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer1.peerChannelHandler.capabilityTlv.add(tempTlv1);
peer1.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.10", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer1
BgpId bgpId = new BgpId(IpAddress.valueOf("127.0.0.10"));
BgpPeerImpl peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
LinkedList<BgpValueType> localNodeSubTlvs = new LinkedList<>();
LinkedList<BgpValueType> remoteNodeSubTlvs = new LinkedList<>();
BgpValueType tlv = AutonomousSystemTlv.of(2222);
localNodeSubTlvs.add(tlv);
remoteNodeSubTlvs.add(tlv);
tlv = BgpLSIdentifierTlv.of(33686018);
localNodeSubTlvs.add(tlv);
remoteNodeSubTlvs.add(tlv);
byte[] isoNodeID = new byte[] {0x19, 0x00, (byte) 0x95, 0x02, 0x50, 0x21 };
tlv = IsIsPseudonode.of(isoNodeID, (byte) 0x03);
localNodeSubTlvs.add(tlv);
isoNodeID = new byte[] {0x19, 0x00, (byte) 0x95, 0x02, 0x50, 0x21 };
tlv = IsIsNonPseudonode.of(isoNodeID);
remoteNodeSubTlvs.add(tlv);
NodeDescriptors localNodeDes = new NodeDescriptors(localNodeSubTlvs, (short) 0x1b, (short) 256);
NodeDescriptors remoteNodeDes = new NodeDescriptors(remoteNodeSubTlvs, (short) 0x1a, (short) 0x101);
LinkedList<BgpValueType> linkDescriptor = new LinkedList<>();
tlv = IPv4AddressTlv.of(Ip4Address.valueOf("2.2.2.2"), (short) 0x103);
linkDescriptor.add(tlv);
BgpLinkLSIdentifier key = new BgpLinkLSIdentifier(localNodeDes, remoteNodeDes, linkDescriptor);
TimeUnit.MILLISECONDS.sleep(200);
AdjRibIn adj = peer.adjRib();
//In Adj-RIB, linkTree should contain specified key
assertThat(adj.linkTree().containsKey(key), is(true));
BgpLocalRibImpl obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRib();
TimeUnit.MILLISECONDS.sleep(200);
//In Local-RIB, linkTree should contain specified key
assertThat(obj.linkTree().containsKey(key), is(true));
}
/**
* Peer1 has Node NLRI and Peer2 has Node NLRI with different MpReach and MpUnReach with VPN.
*/
@Test
public void testBgpUpdateMessage4() throws InterruptedException {
// Initiate the connections
peer1.peerChannelHandler.asNumber = 200;
peer1.peerChannelHandler.version = 4;
peer1.peerChannelHandler.holdTime = 120;
short afi = 16388;
byte res = 0;
byte safi = (byte) 0x80;
bgpControllerImpl.getConfig().setLsCapability(true);
BgpValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer1.peerChannelHandler.capabilityTlv.add(tempTlv1);
Channel channel = peer1.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.35", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer1
IpAddress ipAddress = IpAddress.valueOf("127.0.0.35");
BgpId bgpId = new BgpId(ipAddress);
BgpPeerImpl peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
LinkedList<BgpValueType> subTlvs1 = new LinkedList<>();
LinkedList<BgpValueType> subTlvs = new LinkedList<>();
BgpValueType tlv = AutonomousSystemTlv.of(2478);
subTlvs.add(tlv);
tlv = BgpLSIdentifierTlv.of(33686018);
subTlvs.add(tlv);
NodeDescriptors nodeDes = new NodeDescriptors(subTlvs, (short) 0x10, (short) 256);
BgpNodeLSIdentifier key = new BgpNodeLSIdentifier(nodeDes);
RouteDistinguisher rd = new RouteDistinguisher((long) 0x0A);
VpnAdjRibIn vpnAdj = peer.vpnAdjRib();
//In Adj-RIB, vpnNodeTree should contain rd
assertThat(vpnAdj.vpnNodeTree().containsKey(rd), is(true));
Map<BgpNodeLSIdentifier, PathAttrNlriDetails> treeValue = vpnAdj.vpnNodeTree().get(rd);
//In Adj-RIB, vpnNodeTree should contain rd key which contains specified value
assertThat(treeValue.containsKey(key), is(true));
BgpLocalRibImpl obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRibVpn();
//In Local-RIB, vpnNodeTree should contain rd
assertThat(obj.vpnNodeTree().containsKey(rd), is(true));
Map<BgpNodeLSIdentifier, PathAttrNlriDetailsLocalRib> value = obj.vpnNodeTree().get(rd);
//In Local-RIB, vpnNodeTree should contain rd key which contains specified value
assertThat(value.containsKey(key), is(true));
peer2.peerChannelHandler.asNumber = 200;
peer2.peerChannelHandler.version = 4;
peer2.peerChannelHandler.holdTime = 120;
bgpControllerImpl.getConfig().setLsCapability(true);
tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer1.peerChannelHandler.capabilityTlv.add(tempTlv1);
peer2.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.40", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer2
bgpId = new BgpId(IpAddress.valueOf("127.0.0.40"));
peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
tlv = AutonomousSystemTlv.of(686);
subTlvs1.add(tlv);
tlv = BgpLSIdentifierTlv.of(33686018);
subTlvs1.add(tlv);
nodeDes = new NodeDescriptors(subTlvs1, (short) 0x10, (short) 256);
key = new BgpNodeLSIdentifier(nodeDes);
vpnAdj = peer.vpnAdjRib();
//In Adj-RIB, vpnNodeTree should contain rd
assertThat(vpnAdj.vpnNodeTree().containsKey(rd), is(true));
treeValue = vpnAdj.vpnNodeTree().get(rd);
//In Adj-RIB, vpnNodeTree should contain rd key which contains specified value
assertThat(treeValue.containsKey(key), is(true));
//Disconnect peer1
channel.disconnect();
channel.close();
obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRibVpn();
//In Local-RIB, vpnNodeTree should contain rd
assertThat(obj.vpnNodeTree().containsKey(rd), is(true));
value = obj.vpnNodeTree().get(rd);
//In Local-RIB, vpnNodeTree should contain rd key which contains specified value
assertThat(value.containsKey(key), is(true));
}
/**
* Peer1 has Node NLRI and Peer2 has Node NLRI with different MpReach and MpUnReach.
*/
@Test
public void testBgpUpdateMessage5() throws InterruptedException, TestUtilsException {
// Initiate the connections
peer1.peerChannelHandler.asNumber = 200;
peer1.peerChannelHandler.version = 4;
peer1.peerChannelHandler.holdTime = 120;
short afi = 16388;
byte res = 0;
byte safi = 71;
bgpControllerImpl.getConfig().setLsCapability(true);
BgpValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer1.peerChannelHandler.capabilityTlv.add(tempTlv1);
Channel channel = peer1.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.99", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer1
BgpId bgpId = new BgpId(IpAddress.valueOf("127.0.0.99"));
BgpPeerImpl peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
LinkedList<BgpValueType> subTlvs = new LinkedList<>();
BgpValueType tlv = null;
tlv = AutonomousSystemTlv.of(2478);
subTlvs.add(tlv);
tlv = BgpLSIdentifierTlv.of(33686018);
subTlvs.add(tlv);
NodeDescriptors nodeDes = new NodeDescriptors(subTlvs, (short) 0x10, (short) 256);
BgpNodeLSIdentifier key = new BgpNodeLSIdentifier(nodeDes);
TimeUnit.MILLISECONDS.sleep(500);
AdjRibIn adj = peer.adjRib();
//In Adj-RIB, nodeTree should contain specified key
assertThat(adj.nodeTree().containsKey(key), is(true));
BgpLocalRibImpl obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRib();
//In Local-RIB, nodeTree should contain specified key
assertThat(obj.nodeTree().containsKey(key), is(true));
peer2.peerChannelHandler.asNumber = 200;
peer2.peerChannelHandler.version = 4;
peer2.peerChannelHandler.holdTime = 120;
bgpControllerImpl.getConfig().setLsCapability(true);
tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer2.peerChannelHandler.capabilityTlv.add(tempTlv1);
peer2.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.92", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer2
bgpId = new BgpId(IpAddress.valueOf("127.0.0.92"));
peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
adj = peer.adjRib();
//In Adj-RIB, nodetree should be empty
assertThat(adj.nodeTree().isEmpty(), is(true));
//peer1 disconnects
channel.disconnect();
channel.close();
obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRib();
TimeUnit.MILLISECONDS.sleep(200);
//In Local-RIB, nodeTree should be empty
assertThat(obj.nodeTree().isEmpty(), is(true));
}
/**
* Peer2 has Prefix NLRI (MpReach).
*/
@Test
public void testBgpUpdateMessage6() throws InterruptedException {
// Initiate the connections
peer1.peerChannelHandler.asNumber = 200;
peer1.peerChannelHandler.version = 4;
peer1.peerChannelHandler.holdTime = 120;
short afi = 16388;
byte res = 0;
byte safi = 71;
bgpControllerImpl.getConfig().setLsCapability(true);
BgpValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer1.peerChannelHandler.capabilityTlv.add(tempTlv1);
Channel channel = peer1.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.94", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer1
BgpId bgpId = new BgpId(IpAddress.valueOf("127.0.0.94"));
BgpPeerImpl peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
LinkedList<BgpValueType> subTlvs = new LinkedList<>();
BgpValueType tlv = AutonomousSystemTlv.of(2478);
subTlvs.add(tlv);
tlv = BgpLSIdentifierTlv.of(33686018);
subTlvs.add(tlv);
NodeDescriptors nodeDes = new NodeDescriptors(subTlvs, (short) 0x10, (short) 256);
BgpNodeLSIdentifier key = new BgpNodeLSIdentifier(nodeDes);
TimeUnit.MILLISECONDS.sleep(500);
AdjRibIn adj = peer.adjRib();
//In Adj-RIB, nodeTree should contain specified key
assertThat(adj.nodeTree().containsKey(key), is(true));
BgpLocalRibImpl obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRib();
//In Local-RIB, nodeTree should contain specified key
assertThat(obj.nodeTree().containsKey(key), is(true));
peer2.peerChannelHandler.asNumber = 200;
peer2.peerChannelHandler.version = 4;
peer2.peerChannelHandler.holdTime = 120;
bgpControllerImpl.getConfig().setLsCapability(true);
tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer2.peerChannelHandler.capabilityTlv.add(tempTlv1);
peer2.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.80", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer2
bgpId = new BgpId(IpAddress.valueOf("127.0.0.80"));
peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
TimeUnit.MILLISECONDS.sleep(500);
adj = peer.adjRib();
//In Adj-RIB, nodeTree should contain specified key
assertThat(adj.nodeTree().containsKey(key), is(true));
//peer1 disconnects
channel.disconnect();
channel.close();
obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRib();
TimeUnit.MILLISECONDS.sleep(200);
//In Local-RIB, nodeTree should contain specified key
assertThat(obj.nodeTree().containsKey(key), is(true));
}
/**
* Peer1 has Node NLRI (MpReach) and peer2 has Node NLRI with same MpReach and MpUnReach with IsIsNonPseudonode.
*/
@Test
public void testBgpUpdateMessage7() throws InterruptedException, TestUtilsException {
// Initiate the connections
peer1.peerChannelHandler.asNumber = 200;
peer1.peerChannelHandler.version = 4;
peer1.peerChannelHandler.holdTime = 120;
short afi = 16388;
byte res = 0;
byte safi = 71;
bgpControllerImpl.getConfig().setLsCapability(true);
BgpValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer1.peerChannelHandler.capabilityTlv.add(tempTlv1);
Channel channel = peer1.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.91", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer1
BgpId bgpId = new BgpId(IpAddress.valueOf("127.0.0.91"));
BgpPeerImpl peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
LinkedList<BgpValueType> subTlvs = new LinkedList<>();
LinkedList<BgpValueType> subTlvs1 = new LinkedList<>();
BgpValueType tlv = null;
tlv = AutonomousSystemTlv.of(2478);
subTlvs.add(tlv);
tlv = BgpLSIdentifierTlv.of(33686018);
subTlvs.add(tlv);
subTlvs1.add(tlv);
NodeDescriptors nodeDes = new NodeDescriptors(subTlvs, (short) 0x10, (short) 256);
BgpNodeLSIdentifier key = new BgpNodeLSIdentifier(nodeDes);
AdjRibIn adj = peer.adjRib();
//In Adj-RIB, nodeTree should contains specified key
assertThat(adj.nodeTree().containsKey(key), is(true));
BgpLocalRibImpl obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRib();
//In Local-RIB, nodeTree should contains specified key
assertThat(obj.nodeTree().containsKey(key), is(true));
peer2.peerChannelHandler.asNumber = 200;
peer2.peerChannelHandler.version = 4;
peer2.peerChannelHandler.holdTime = 120;
bgpControllerImpl.getConfig().setLsCapability(true);
tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer2.peerChannelHandler.capabilityTlv.add(tempTlv1);
peer2.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.90", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer2
bgpId = new BgpId(IpAddress.valueOf("127.0.0.90"));
peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
tlv = AutonomousSystemTlv.of(2222);
subTlvs1.add(tlv);
byte[] isoNodeID = new byte[] {0x19, 0x00, (byte) 0x95, 0x01, (byte) 0x90, 0x58};
tlv = IsIsNonPseudonode.of(isoNodeID);
subTlvs1.add(tlv);
nodeDes = new NodeDescriptors(subTlvs1, (short) 0x1a, (short) 256);
key = new BgpNodeLSIdentifier(nodeDes);
adj = peer.adjRib();
//In Adj-RIB, nodeTree should contains specified key
log.info("key " + key.toString());
log.info("adj.nodeTree() " + adj.nodeTree().toString());
assertThat(adj.nodeTree().containsKey(key), is(true));
//peer1 disconnects
channel.disconnect();
channel.close();
obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRib();
TimeUnit.MILLISECONDS.sleep(200);
//In Local-RIB, nodeTree should contains specified key
assertThat(obj.nodeTree().containsKey(key), is(true));
}
/**
* Peer1 has Prefix NLRI (MpReach).
*/
@Test
public void testBgpUpdateMessage8() throws InterruptedException {
// Initiate the connections
peer1.peerChannelHandler.asNumber = 200;
peer1.peerChannelHandler.version = 4;
peer1.peerChannelHandler.holdTime = 150;
short afi = 16388;
byte res = 0;
byte safi = 71;
bgpControllerImpl.getConfig().setLsCapability(true);
BgpValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer1.peerChannelHandler.capabilityTlv.add(tempTlv1);
peer1.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.20", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer1
BgpId bgpId = new BgpId(IpAddress.valueOf("127.0.0.20"));
BgpPeerImpl peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
LinkedList<BgpValueType> subTlvs = new LinkedList<>();
BgpValueType tlv = AutonomousSystemTlv.of(2222);
subTlvs.add(tlv);
tlv = BgpLSIdentifierTlv.of(33686018);
subTlvs.add(tlv);
byte[] isoNodeID = new byte[] {0x19, 0x21, 0x68, 0x07, 0x70, 0x01};
tlv = IsIsNonPseudonode.of(isoNodeID);
subTlvs.add(tlv);
NodeDescriptors nodeDes = new NodeDescriptors(subTlvs, (short) 0x1a, (short) 256);
LinkedList<BgpValueType> prefixDescriptor = new LinkedList<>();
byte[] prefix = new byte[] {0x20, (byte) 0xc0, (byte) 0xa8, 0x4d, 0x01};
ChannelBuffer tempCb = ChannelBuffers.dynamicBuffer();
tempCb.writeBytes(prefix);
tlv = IPReachabilityInformationTlv.read(tempCb, (short) 5);
prefixDescriptor.add(tlv);
BgpPrefixLSIdentifier key = new BgpPrefixLSIdentifier(nodeDes, prefixDescriptor);
AdjRibIn adj = peer.adjRib();
//In Adj-RIB, prefixTree should contain specified key
assertThat(adj.prefixTree().containsKey(key), is(true));
BgpLocalRibImpl obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRib();
//In Local-RIB, prefixTree should contain specified key
assertThat(obj.prefixTree().containsKey(key), is(true));
}
/**
* Peer1 has Node NLRI (MpReach) and Peer2 has node NLRI with different MpReach
* and MpUnReach with IsIsNonPseudonode.
*/
@Test
public void testBgpUpdateMessage9() throws InterruptedException {
// Initiate the connections
peer1.peerChannelHandler.asNumber = 200;
peer1.peerChannelHandler.version = 4;
peer1.peerChannelHandler.holdTime = 120;
short afi = 16388;
byte res = 0;
byte safi = (byte) 0x80;
bgpControllerImpl.getConfig().setLsCapability(true);
BgpValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer1.peerChannelHandler.capabilityTlv.add(tempTlv1);
Channel channel = peer1.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.30", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer1
BgpId bgpId = new BgpId(IpAddress.valueOf("127.0.0.30"));
BgpPeerImpl peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
LinkedList<BgpValueType> subTlvs = new LinkedList<>();
BgpValueType tlv = AutonomousSystemTlv.of(2478);
subTlvs.add(tlv);
tlv = BgpLSIdentifierTlv.of(33686018);
subTlvs.add(tlv);
NodeDescriptors nodeDes = new NodeDescriptors(subTlvs, (short) 0x10, (short) 256);
BgpNodeLSIdentifier key = new BgpNodeLSIdentifier(nodeDes);
RouteDistinguisher rd = new RouteDistinguisher((long) 0x0A);
VpnAdjRibIn vpnAdj = peer.vpnAdjRib();
//In Adj-RIB, vpnNodeTree should contain specified rd
assertThat(vpnAdj.vpnNodeTree().containsKey(rd), is(true));
Map<BgpNodeLSIdentifier, PathAttrNlriDetails> treeValue = vpnAdj.vpnNodeTree().get(rd);
//In Adj-RIB, vpnNodeTree should contain specified rd with specified value
assertThat(treeValue.containsKey(key), is(true));
BgpLocalRibImpl obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRibVpn();
//In Local-RIB, vpnNodeTree should contain specified rd
assertThat(obj.vpnNodeTree().containsKey(rd), is(true));
Map<BgpNodeLSIdentifier, PathAttrNlriDetailsLocalRib> value = obj.vpnNodeTree().get(rd);
//In Local-RIB, vpnNodeTree should contain specified rd with specified value
assertThat(value.containsKey(key), is(true));
peer2.peerChannelHandler.asNumber = 200;
peer2.peerChannelHandler.version = 4;
peer2.peerChannelHandler.holdTime = 120;
bgpControllerImpl.getConfig().setLsCapability(true);
tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
peer2.peerChannelHandler.capabilityTlv.add(tempTlv1);
peer2.connectFrom(connectToSocket, new InetSocketAddress("127.0.0.50", 0));
TimeUnit.MILLISECONDS.sleep(1000);
//Get peer2
bgpId = new BgpId(IpAddress.valueOf("127.0.0.50"));
peer = (BgpPeerImpl) bgpControllerImpl.getPeer(bgpId);
key = new BgpNodeLSIdentifier(nodeDes);
vpnAdj = peer.vpnAdjRib();
//In Adj-RIB, vpnNodeTree should be empty
assertThat(vpnAdj.vpnNodeTree().isEmpty(), is(true));
//peer1 disconnects
channel.disconnect();
channel.close();
obj = (BgpLocalRibImpl) bgpControllerImpl.bgpLocalRibVpn();
TimeUnit.MILLISECONDS.sleep(200);
//In Local-RIB, vpnNodeTree should be empty
assertThat(obj.vpnNodeTree().isEmpty(), is(true));
}
/**
* A class to capture the state for a BGP peer.
*/
private final class BgpPeerTest {
......@@ -296,5 +959,29 @@ public class BgpControllerImplTest {
peerBootstrap.setPipelineFactory(pipelineFactory);
peerBootstrap.connect(connectToSocket);
}
private Channel connectFrom(InetSocketAddress connectToSocket, SocketAddress localAddress)
throws InterruptedException {
ChannelFactory channelFactory =
new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());
ChannelPipelineFactory pipelineFactory = () -> {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("BgpPeerFrameDecoderTest",
peerFrameDecoder);
pipeline.addLast("BgpPeerChannelHandlerTest",
peerChannelHandler);
return pipeline;
};
peerBootstrap = new ClientBootstrap(channelFactory);
peerBootstrap.setOption("child.keepAlive", true);
peerBootstrap.setOption("child.tcpNoDelay", true);
peerBootstrap.setPipelineFactory(pipelineFactory);
Channel channel = peerBootstrap.connect(connectToSocket, localAddress).getChannel();
return channel;
}
}
}
\ No newline at end of file
......
......@@ -15,6 +15,7 @@
*/
package org.onosproject.bgp;
import java.net.InetSocketAddress;
import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
......@@ -27,8 +28,11 @@ import org.onosproject.bgpio.protocol.ver4.BgpKeepaliveMsgVer4;
import org.onosproject.bgpio.protocol.ver4.BgpOpenMsgVer4;
import org.onosproject.bgpio.types.BgpHeader;
import org.onosproject.bgpio.types.BgpValueType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BgpPeerChannelHandlerTest extends SimpleChannelHandler {
protected static final Logger log = LoggerFactory.getLogger(BgpPeerChannelHandlerTest.class);
public static final int OPEN_MSG_MINIMUM_LENGTH = 29;
public static final byte[] MARKER = new byte[] {(byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
......@@ -76,6 +80,306 @@ public class BgpPeerChannelHandlerTest extends SimpleChannelHandler {
savedCtx.getChannel().close();
}
/**
* Select update message buffer with VPN.
*
* @param select number to select update message buffer
* @return packet dump in byte array
*/
byte[] selectUpdateMessageVpn(int select) {
switch (select) {
case 5:
/**
* Node NLRI with VPN - MpReach.
*/
byte[] updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, 0x5E, 0x02, 0x00, 0x00, //withdrawn len
0x00, 0x47, //path attribute len
0x04, 0x01, 0x01, 0x02, //origin
0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
(byte) 0x80, 0x0e, 0x32, 0x40, 0x04, (byte) 0x80, //mpreach with safi = 80 vpn
0x04, 0x04, 0x00, 0x00, 0x01, //nexthop
0x00, //reserved
0x00, 0x01, 0x00, 0x25, //type ND LEN
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10,
0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02}; //node nlri
return updateMsg;
case 6:
/**
* Node NLRI MpReach and MpUnReach different with same VPN.
*/
updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x8D, 0x02, 0x00, 0x00, //withdrawn len
0x00, 0x76, //path attribute len
0x04, 0x01, 0x01, 0x02, //origin
0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
(byte) 0x80, 0x0e, 0x32, 0x40, 0x04, (byte) 0x80, //mpreach with safi = 80 vpn
0x04, 0x04, 0x00, 0x00, 0x01, //nexthop
0x00, //reserved
0x00, 0x01, 0x00, 0x25, //type ND LEN
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10,
0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //node nlri
(byte) 0x80, 0x0f, 0x2C, 0x40, 0x04, (byte) 0x80, //mpUnreach with safi = 80 VPN
0x00, 0x01, 0x00, 0x25, //type n len
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10,
0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, (byte) 0xae, //AutonomousSystemTlv
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02}; //BGPLSIdentifierTlv
return updateMsg;
case 7:
/**
* Node NLRI with same MpReach and MpUnReach with VPN.
*/
updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x8D, 0x02, 0x00, 0x00, //withdrawn len
0x00, 0x76, //path attribute len
0x04, 0x01, 0x01, 0x02, //origin
0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
(byte) 0x80, 0x0e, 0x32, 0x40, 0x04, (byte) 0x80, //mpreach with safi = 80 vpn
0x04, 0x04, 0x00, 0x00, 0x01, //nexthop
0x00, //reserved
0x00, 0x01, 0x00, 0x25, //type ND LEN
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10,
0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //node nlri
(byte) 0x80, 0x0f, 0x2C, 0x40, 0x04, (byte) 0x80, //mpUnreach with safi = 80 VPN
0x00, 0x01, 0x00, 0x25, //type n len
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10,
0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae, //AutonomousSystemTlv
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02}; //BGPLSIdentifierTlv
return updateMsg;
case 17:
/**
* Node NLRI with VPN - MpReach.
*/
updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, 0x5E, 0x02, 0x00, 0x00, //withdrawn len
0x00, 0x47, //path attribute len
0x04, 0x01, 0x01, 0x02, //origin
0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
(byte) 0x80, 0x0e, 0x32, 0x40, 0x04, (byte) 0x80, //mpreach with safi = 80 vpn
0x04, 0x04, 0x00, 0x00, 0x01, //nexthop
0x00, //reserved
0x00, 0x01, 0x00, 0x25, //type ND LEN
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10,
0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02}; //node nlri
return updateMsg;
default: return null;
}
}
/**
* Select update message buffer without VPN.
*
* @param select number to select update message buffer
* @return packet dump in byte array
*/
byte[] selectUpdateMsg(int select) {
switch (select) {
case 1:
/**
* Node NLRI - MpReach.
*/
byte[] updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, 0x56, 0x02, 0x00, 0x00, //withdrawn len
0x00, 0x3F, 0x04, 0x01, 0x01, 0x02, //origin
0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
(byte) 0x80, 0x0e, 0x2A, 0x40, 0x04, 0x47, //mpreach with safi = 71
0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x1D, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10,
0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02}; //node nlri
return updateMsg;
case 2:
/**
* Node NLRI with same MpReach and MpUnReach.
*/
updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x7D, 0x02, 0x00, 0x00, //withdrawn len
0x00, 0x66, 0x04, 0x01, 0x01, 0x02, 0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9,
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
(byte) 0x80, 0x0e, 0x2A, 0x40, 0x04, 0x47, //mpreach with safi = 71
0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x1D, //type n len
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
(byte) 0x80, 0x0f, 0x24, 0x40, 0x04, 0x47, //mpUnreach with safi = 71
0x00, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
};
return updateMsg;
case 3:
/**
* Link NLRI - MpReach.
*/
updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x8B, 0x02, 0x00, 0x04,
0x18, 0x0a, 0x01, 0x01, 0x00, 0x70, //path attribute len
0x04, 0x01, 0x01, 0x00, 0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x10, //med
(byte) 0x80, 0x0e, 0x5B, 0x40, 0x04, 0x47, //mpreach safi 71
0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x4E, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1b, //local node
0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02,
0x02, 0x03, 0x00, 0x07, 0x19, 0x00, (byte) 0x95, 0x02, 0x50, 0x21, 0x03,
0x01, 0x01, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02,
0x02, 0x03, 0x00, 0x06, 0x19, 0x00, (byte) 0x95, 0x02, 0x50, 0x21, //link nlri
0x01, 0x03, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02
};
return updateMsg;
case 4:
/**
* Prefix NLRI - MpReach.
*/
updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0xd6, 0x02, 0x00, 0x04,
0x18, 0x0a, 0x01, 0x01, 0x00, (byte) 0xbb, //path attribute len
0x04, 0x01, 0x01, 0x00, 0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x12, //med
(byte) 0x90, 0x0e, 0x00, (byte) 0xa5, 0x40, 0x04, 0x47, //mpreach
0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x30,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a, //local node
0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x00, 0x06, 0x19, 0x21, 0x68, 0x07,
0x70, 0x01, 0x01, 0x09, 0x00, 0x05, 0x20, (byte) 0xc0, (byte) 0xa8, 0x4d, 0x01, //prefix des
0x00, 0x03, 0x00, 0x30, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a,
0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02,
0x02, 0x03, 0x00, 0x06, 0x19, 0x00, (byte) 0x95, 0x02, 0x50, 0x21,
0x01, 0x09, 0x00, 0x05, 0x20, 0x15, 0x15, 0x15, 0x15, 0x00, 0x03, 0x00, 0x30,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02,
0x02, 0x03, 0x00, 0x06, 0x02, 0x20, 0x22, 0x02, 0x20, 0x22,
0x01, 0x09, 0x00, 0x05, 0x20, 0x16, 0x16, 0x16, 0x16}; // prefix nlri
return updateMsg;
case 8:
/**
* Node NLRI with different MpReach and MpUnReach with IsIsPseudonode.
*/
updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00,
(byte) 0x91, 0x02, 0x00, 0x00, 0x00, 0x7A, //path attribute len
0x04, 0x01, 0x01, 0x02, 0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9,
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
(byte) 0x80, 0x0e, 0x34, 0x40, 0x04, 0x47, //mpreach with safi = 71
0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00,
0x27, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03,
0x00, 0x06, 0x19, 0x00, (byte) 0x95, 0x01, (byte) 0x90, 0x58,
(byte) 0x80, 0x0f, 0x2E, 0x40, 0x04, 0x47, 0x00, 0x01, 0x00, 0x27, //mpUnreach
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
0x02, 0x03, 0x00, 0x06, 0x19, 0x00, (byte) 0x99, 0x01, (byte) 0x99, 0x58};
return updateMsg;
case 9:
/**
* Node NLRI with same MpReach and MpUnReach.
*/
updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x7D, 0x02, 0x00, 0x00, //withdrawn len
0x00, 0x66, 0x04, 0x01, 0x01, 0x02, //origin
0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
(byte) 0x80, 0x0e, 0x2A, 0x40, 0x04, 0x47, //mpreach with safi = 71
0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x1D, //type n len
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
(byte) 0x80, 0x0f, 0x24, 0x40, 0x04, 0x47, //mpUnreach with safi = 71
0x00, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
};
return updateMsg;
case 10:
/**
* Node NLRI with different MpReach and MpUnReach.
*/
updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x7D, 0x02, 0x00, 0x00, //withdrawn len
0x00, 0x66, 0x04, 0x01, 0x01, 0x02, //origin
0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
(byte) 0x80, 0x0e, 0x2A, 0x40, 0x04, 0x47, //mpreach with safi = 71
0x04, 0x04, 0x00, 0x00, 0x01, 0x00, //reserved
0x00, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
(byte) 0x80, 0x0f, 0x24, 0x40, 0x04, 0x47, //mpUnreach with safi = 71
0x00, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
};
return updateMsg;
case 12:
/**
* Node NLRI with same MpReach and MpUnReach with IsIsPseudonode.
*/
updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x91, 0x02, 0x00, 0x00, //withdrawn len
0x00, 0x7A, 0x04, 0x01, 0x01, 0x02, //origin
0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
(byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
(byte) 0x80, 0x0e, 0x34, 0x40, 0x04, 0x47, //mpreach with safi = 71
0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x27, //type n len
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
0x02, 0x03, 0x00, 0x06, 0x19, 0x00, (byte) 0x99, 0x01, (byte) 0x99, 0x58,
(byte) 0x80, 0x0f, 0x2E, 0x40, 0x04, 0x47, //mpUnreach with safi = 71
0x00, 0x01, 0x00, 0x27, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae, //AutonomousSystemTlv
0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
0x02, 0x03, 0x00, 0x06, 0x19, 0x00, (byte) 0x99, 0x01, (byte) 0x99, 0x58};
return updateMsg;
default: return null;
}
}
@Override
public void channelConnected(ChannelHandlerContext ctx,
ChannelStateEvent channelEvent) throws InterruptedException {
......@@ -97,6 +401,116 @@ public class BgpPeerChannelHandlerTest extends SimpleChannelHandler {
ChannelBuffer buffer1 = ChannelBuffers.dynamicBuffer();
keepaliveMsg.writeTo(buffer1);
ctx.getChannel().write(buffer1);
if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.1", 0).getAddress())) {
return;
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.9", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(1));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.33", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(2));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.10", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(3));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.20", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(4));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.30", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMessageVpn(5));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.40", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMessageVpn(6));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.50", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMessageVpn(7));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.60", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(8));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.70", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(9));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.80", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(10));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.90", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(8));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.92", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(12));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.91", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(1));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.9", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(1));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.99", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(1));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.94", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(1));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.35", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMessageVpn(17));
ctx.getChannel().write(bufferUp);
} else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
new InetSocketAddress("127.0.0.95", 0).getAddress())) {
ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
bufferUp.writeBytes(selectUpdateMsg(1));
ctx.getChannel().write(bufferUp);
}
}
@Override
......