blob: f618d7b4d2965428440923fce880a796ece7955e [file] [log] [blame]
/*
* Copyright 2015-present Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.bgp;
import java.net.InetSocketAddress;
import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
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,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff};
public static final BgpHeader DEFAULT_OPEN_HEADER = new BgpHeader(MARKER,
(short) OPEN_MSG_MINIMUM_LENGTH, (byte) 0X01);
LinkedList<BgpValueType> capabilityTlv = new LinkedList<>();
public byte version;
public short asNumber;
public short holdTime;
public int bgpId;
public boolean isLargeAsCapabilitySet;
final BgpOpenMsgVer4 openMessage = new BgpOpenMsgVer4();
ChannelHandlerContext savedCtx;
/**
* Constructor to initialize all variables of BGP Open message.
*
* @param version BGP version in open message
* @param asNumber AS number in open message
* @param holdTime hold time in open message
* @param bgpId BGP identifier in open message
* @param capabilityTlv capabilities in open message
*/
public BgpPeerChannelHandlerTest(byte version,
short asNumber,
short holdTime,
int bgpId,
boolean isLargeAsCapabilitySet,
LinkedList<BgpValueType> capabilityTlv) {
this.version = version;
this.asNumber = asNumber;
this.holdTime = holdTime;
this.bgpId = bgpId;
this.isLargeAsCapabilitySet = isLargeAsCapabilitySet;
this.capabilityTlv = capabilityTlv;
}
/**
* closes the channel.
*/
void closeChannel() {
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 {
this.savedCtx = ctx;
BgpOpenMsgVer4 openMsg = new BgpOpenMsgVer4(DEFAULT_OPEN_HEADER,
this.version,
this.asNumber,
this.holdTime,
this.bgpId,
this.capabilityTlv);
ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
openMsg.writeTo(buffer);
ctx.getChannel().write(buffer);
TimeUnit.MILLISECONDS.sleep(100);
BgpKeepaliveMsgVer4 keepaliveMsg = new BgpKeepaliveMsgVer4();
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
public void channelDisconnected(ChannelHandlerContext ctx,
ChannelStateEvent channelEvent) {
//Do Nothing
}
}