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