[ONOS-2602]Implement Link NLRI

Change-Id: Ia17868c0a2f701a88d82171943c52fe7b7880fba
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpLinkLsNlri.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpLinkLsNlri.java
index 1445c76..dab7a3d 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpLinkLsNlri.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpLinkLsNlri.java
@@ -29,19 +29,19 @@
      *
      * @return local node descriptors
      */
-    NodeDescriptors getLocalNodeDescriptors();
+    NodeDescriptors localNodeDescriptors();
 
     /**
      * Returns remote node descriptors.
      *
      * @return remote node descriptors
      */
-    NodeDescriptors getRemoteNodeDescriptors();
+    NodeDescriptors remoteNodeDescriptors();
 
     /**
      * Returns link descriptors.
      *
      * @return link descriptors
      */
-    List<BGPValueType> getLinkDescriptors();
+    List<BGPValueType> linkDescriptors();
 }
\ No newline at end of file
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLsNlriVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLsNlriVer4.java
new file mode 100755
index 0000000..6455945
--- /dev/null
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLsNlriVer4.java
@@ -0,0 +1,210 @@
+/*

+ * Copyright 2015 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.bgpio.protocol.linkstate;

+

+import java.util.List;

+

+import org.jboss.netty.buffer.ChannelBuffer;

+import org.onosproject.bgpio.exceptions.BGPParseException;

+import org.onosproject.bgpio.protocol.BgpLinkLsNlri;

+import org.onosproject.bgpio.protocol.NlriType;

+import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4.PROTOCOLTYPE;

+import org.onosproject.bgpio.types.BGPErrorType;

+import org.onosproject.bgpio.types.BGPValueType;

+import org.onosproject.bgpio.types.RouteDistinguisher;

+import org.onosproject.bgpio.util.Constants;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+

+import com.google.common.base.MoreObjects;

+

+/**

+ * Implementation of Link LS NLRI.

+ */

+public class BgpLinkLsNlriVer4 implements BgpLinkLsNlri {

+

+    /*

+     * REFERENCE : draft-ietf-idr-ls-distribution-11

+          0                   1                   2                   3

+          0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+         +-+-+-+-+-+-+-+-+

+         |  Protocol-ID  |

+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

+         |                           Identifier                          |

+         |                            (64 bits)                          |

+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

+         //               Local Node Descriptors (variable)             //

+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

+         //               Remote Node Descriptors (variable)            //

+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

+         //                  Link Descriptors (variable)                //

+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

+

+                          Figure : The Link NLRI format

+     */

+    private static final Logger log = LoggerFactory.getLogger(BgpLinkLsNlriVer4.class);

+    public static final int LINK_NLRITYPE = 2;

+

+    private BGPLinkLSIdentifier linkLSIdentifier;

+    private byte protocolId;

+    private long identifier;

+    private RouteDistinguisher routeDistinguisher;

+    private boolean isVpn;

+

+    /**

+     * Initialize fields.

+     */

+    public BgpLinkLsNlriVer4() {

+        this.protocolId = 0;

+        this.identifier = 0;

+        this.linkLSIdentifier = null;

+        this.routeDistinguisher = null;

+        this.isVpn = false;

+    }

+

+    /**

+     * Constructor to initialize parameters for BGP LinkLSNlri.

+     *

+     * @param protocolId protocol Id

+     * @param identifier field in BGP LinkLSNlri

+     * @param linkLSIdentifier link LS identifier

+     * @param routeDistinguisher route distinguisher from message

+     * @param isVpn vpn info availability in message

+     */

+    public BgpLinkLsNlriVer4(byte protocolId, long identifier, BGPLinkLSIdentifier linkLSIdentifier,

+                             RouteDistinguisher routeDistinguisher, boolean isVpn) {

+        this.protocolId = protocolId;

+        this.identifier = identifier;

+        this.linkLSIdentifier = linkLSIdentifier;

+        this.routeDistinguisher = routeDistinguisher;

+        this.isVpn = isVpn;

+    }

+

+    /**

+     * Reads from channelBuffer and parses Link LS Nlri.

+     *

+     * @param cb ChannelBuffer

+     * @param afi Address Family Identifier

+     * @param safi Subsequent Address Family Identifier

+     * @return object of this class

+     * @throws BGPParseException while parsing Link LS NLRI

+     */

+    public static BgpLinkLsNlriVer4 read(ChannelBuffer cb, short afi, byte safi) throws BGPParseException {

+        boolean isVpn = false;

+        RouteDistinguisher routeDistinguisher = null;

+        if ((afi == Constants.AFI_VALUE) && (safi == Constants.VPN_SAFI_VALUE)) {

+            routeDistinguisher = new RouteDistinguisher();

+            routeDistinguisher = RouteDistinguisher.read(cb);

+            isVpn = true;

+        } else {

+            isVpn = false;

+        }

+        byte protocolId = cb.readByte();

+        long identifier = cb.readLong();

+

+        BGPLinkLSIdentifier linkLSIdentifier = new BGPLinkLSIdentifier();

+        linkLSIdentifier = BGPLinkLSIdentifier.parseLinkIdendifier(cb, protocolId);

+        return new BgpLinkLsNlriVer4(protocolId, identifier, linkLSIdentifier, routeDistinguisher, isVpn);

+    }

+

+    @Override

+    public NlriType getNlriType() {

+        return NlriType.LINK;

+    }

+

+    @Override

+    public long getIdentifier() {

+        return this.identifier;

+    }

+

+    /**

+     * Set the link LS identifier.

+     *

+     * @param linkLSIdentifier link LS identifier to set

+     */

+    public void setLinkLSIdentifier(BGPLinkLSIdentifier linkLSIdentifier) {

+        this.linkLSIdentifier = linkLSIdentifier;

+    }

+

+    @Override

+    public PROTOCOLTYPE getProtocolId() throws BGPParseException {

+        switch (protocolId) {

+        case Constants.ISIS_LEVELONE:

+            return PROTOCOLTYPE.ISIS_LevelOne;

+        case Constants.ISIS_LEVELTWO:

+            return PROTOCOLTYPE.ISIS_LevelTwo;

+        case Constants.OSPFV2:

+            return PROTOCOLTYPE.OSPFv2;

+        case Constants.DIRECT:

+            return PROTOCOLTYPE.Direct;

+        case Constants.STATIC_CONFIGURATION:

+            return PROTOCOLTYPE.Static_Configuration;

+        case Constants.OSPFV3:

+            return PROTOCOLTYPE.OSPFv3;

+        default:

+            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, (byte) 0, null);

+        }

+    }

+

+    @Override

+    public NodeDescriptors localNodeDescriptors() {

+        return this.linkLSIdentifier.localNodeDescriptors();

+    }

+

+    @Override

+    public NodeDescriptors remoteNodeDescriptors() {

+        return this.linkLSIdentifier.remoteNodeDescriptors();

+    }

+

+    /**

+     * Returns whether VPN is present or not.

+     *

+     * @return whether VPN is present or not

+     */

+    public boolean isVpnPresent() {

+        return this.isVpn;

+    }

+

+    @Override

+    public RouteDistinguisher getRouteDistinguisher() {

+        return this.routeDistinguisher;

+    }

+

+    /**

+     * Returns link identifier.

+     *

+     * @return link identifier

+     */

+    public BGPLinkLSIdentifier getLinkIdentifier() {

+        return this.linkLSIdentifier;

+    }

+

+    @Override

+    public List<BGPValueType> linkDescriptors() {

+        return this.linkLSIdentifier.linkDescriptors();

+    }

+

+    @Override

+    public String toString() {

+        return MoreObjects.toStringHelper(getClass())

+                .omitNullValues()

+                .add("protocolId", protocolId)

+                .add("identifier", identifier)

+                .add("RouteDistinguisher ", routeDistinguisher)

+                .add("linkLSIdentifier", linkLSIdentifier)

+                .toString();

+    }

+}
\ No newline at end of file