/* * 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 } }