Support for setting the MPLS BOS indicator bit.

Change-Id: Ib42747445113aadb62fd161a1c79ca59783884af
diff --git a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
index 2dad08b..f0937a7 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
@@ -343,6 +343,11 @@
         }
 
         @Override
+        public Builder setMplsBos(boolean mplsBos) {
+            return add(Instructions.modMplsBos(mplsBos));
+        }
+
+        @Override
         public Builder decMplsTtl() {
             return add(Instructions.decMplsTtl());
         }
diff --git a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
index 042aeaf..b982199 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
@@ -227,6 +227,14 @@
         Builder setMpls(MplsLabel mplsLabel);
 
         /**
+         * Sets the mpls bottom-of-stack indicator bit.
+         *
+         * @param mplsBos boolean to set BOS=1 (true) or BOS=0 (false).
+         * @return a treatment builder.
+         */
+        Builder setMplsBos(boolean mplsBos);
+
+        /**
          * Decrement MPLS TTL.
          *
          * @return a treatment builder
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
index cd9ec96..97f57db 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
@@ -176,6 +176,16 @@
     }
 
     /**
+     * Creates a MPLS BOS bit modification.
+     *
+     * @param mplsBos MPLS BOS bit to set (true) or unset (false)
+     * @return a L2 Modification
+     */
+    public static L2ModificationInstruction modMplsBos(boolean mplsBos) {
+        return new L2ModificationInstruction.ModMplsBosInstruction(mplsBos);
+    }
+
+    /**
      * Creates a MPLS decrement TTL modification.
      *
      * @return a L2 Modification
@@ -673,6 +683,7 @@
             return false;
         }
     }
+
 }
 
 
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java
index bfb6300..cf6a1a2 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java
@@ -84,9 +84,14 @@
         VLAN_PUSH,
 
         /**
-         * Tunnle id modification.
+         * Tunnel id modification.
          */
-        TUNNEL_ID
+        TUNNEL_ID,
+
+        /**
+         * MPLS BOS instruction.
+         */
+        MPLS_BOS
     }
 
     // TODO: Create factory class 'Instructions' that will have various factory
@@ -371,6 +376,51 @@
     }
 
     /**
+     * Represents a MPLS BOS modification.
+     */
+    public static final class ModMplsBosInstruction
+            extends L2ModificationInstruction {
+
+        private final boolean mplsBos;
+
+        ModMplsBosInstruction(boolean mplsBos) {
+            this.mplsBos = mplsBos;
+        }
+
+        public boolean mplsBos() {
+            return mplsBos;
+        }
+
+        @Override
+        public L2SubType subtype() {
+            return L2SubType.MPLS_BOS;
+        }
+
+        @Override
+        public String toString() {
+            return toStringHelper(subtype().toString()).add("bos", mplsBos)
+                    .toString();
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(type(), subtype(), mplsBos);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj instanceof ModMplsBosInstruction) {
+                ModMplsBosInstruction that = (ModMplsBosInstruction) obj;
+                return Objects.equals(mplsBos, that.mplsBos());
+            }
+            return false;
+        }
+    }
+
+    /**
      * Represents a MPLS TTL modification.
      */
     public static final class ModMplsTtlInstruction