BGP flow spec RIBin.

Change-Id: I4909bb6e579311a74e25cb44172a2a010faa4e85
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecDetails.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecDetails.java
index 994f656..7fe40e1 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecDetails.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecDetails.java
@@ -40,6 +40,14 @@
     }
 
     /**
+     * Flow specification details object constructor.
+     *
+     */
+    public BgpFlowSpecDetails() {
+
+    }
+
+    /**
      * Returns flow specification action tlv.
      *
      * @return flow specification action tlv
@@ -84,6 +92,15 @@
         return this.flowSpecComponents;
     }
 
+    /**
+     * Sets flow specification components.
+     *
+     * @param flowSpecComponents flow specification components
+     */
+    public void setFlowSpecComponents(List<BgpValueType> flowSpecComponents) {
+        this.flowSpecComponents = flowSpecComponents;
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(flowSpecComponents);
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefix.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefix.java
index a394839..8e83404 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefix.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefix.java
@@ -41,6 +41,14 @@
      * @param sourcePrefix source prefix
      */
     public BgpFlowSpecPrefix(IpPrefix destinationPrefix, IpPrefix sourcePrefix) {
+        if (destinationPrefix == null) {
+            destinationPrefix = IpPrefix.valueOf(0, 0);
+        }
+
+        if (sourcePrefix == null) {
+            sourcePrefix = IpPrefix.valueOf(0, 0);
+        }
+
         this.destinationPrefix = destinationPrefix;
         this.sourcePrefix = sourcePrefix;
     }
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpReachNlri.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpReachNlri.java
index a93725e..3a108e9 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpReachNlri.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpReachNlri.java
@@ -189,7 +189,7 @@
                                                && ((safi == Constants.SAFI_FLOWSPEC_VALUE)
                                                || (safi == Constants.VPN_SAFI_FLOWSPEC_VALUE))) {
                 List<BgpValueType> flowSpecComponents = new LinkedList<>();
-
+                RouteDistinguisher routeDistinguisher = null;
                 if (tempCb.readableBytes() > 0) {
                     BgpValueType flowSpecComponent = null;
 
@@ -203,6 +203,11 @@
                     }
 
                     byte reserved = tempCb.readByte();
+
+                    if (safi == Constants.VPN_SAFI_FLOWSPEC_VALUE) {
+                        routeDistinguisher = new RouteDistinguisher();
+                        routeDistinguisher = RouteDistinguisher.read(tempCb);
+                    }
                     short totNlriLen = tempCb.getByte(tempCb.readerIndex());
                     if (totNlriLen >= FLOW_SPEC_LEN) {
                         totNlriLen = tempCb.readShort();
@@ -260,7 +265,9 @@
                         flowSpecComponents.add(flowSpecComponent);
                     }
                 }
-                return new MpReachNlri(new BgpFlowSpecDetails(flowSpecComponents), afi, safi);
+                BgpFlowSpecDetails flowSpecDetails = new BgpFlowSpecDetails(flowSpecComponents);
+                flowSpecDetails.setRouteDistinguiher(routeDistinguisher);
+                return new MpReachNlri(flowSpecDetails, afi, safi);
             } else {
                 throw new BgpParseException("Not Supporting afi " + afi + "safi " + safi);
             }
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpUnReachNlri.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpUnReachNlri.java
index 076d8dd..f21a6be 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpUnReachNlri.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpUnReachNlri.java
@@ -154,9 +154,14 @@
                                                && ((safi == Constants.SAFI_FLOWSPEC_VALUE)
                                                || (safi == Constants.VPN_SAFI_FLOWSPEC_VALUE))) {
                 List<BgpValueType> flowSpecComponents = new LinkedList<>();
-
+                RouteDistinguisher routeDistinguisher = null;
                 if (tempCb.readableBytes() > 0) {
                     BgpValueType flowSpecComponent = null;
+
+                    if (safi == Constants.VPN_SAFI_FLOWSPEC_VALUE) {
+                        routeDistinguisher = new RouteDistinguisher();
+                        routeDistinguisher = RouteDistinguisher.read(tempCb);
+                    }
                     short totNlriLen = tempCb.getByte(tempCb.readerIndex());
                     if (totNlriLen >= FLOW_SPEC_LEN) {
                         totNlriLen = tempCb.readShort();
@@ -214,7 +219,9 @@
                         flowSpecComponents.add(flowSpecComponent);
                     }
                 }
-                return new MpUnReachNlri(new BgpFlowSpecDetails(flowSpecComponents), afi, safi);
+                BgpFlowSpecDetails flowSpecDetails = new BgpFlowSpecDetails(flowSpecComponents);
+                flowSpecDetails.setRouteDistinguiher(routeDistinguisher);
+                return new MpUnReachNlri(flowSpecDetails, afi, safi);
             } else {
                 //TODO: check with the values got from capability
                 throw new BgpParseException("Not Supporting afi " + afi + "safi " + safi);