Initial import of CFM and SOAM api
Change-Id: Icf5cc2d5fb34b75460e80e8cced0d70265bcd33b
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/Component.java b/incubator/api/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/Component.java
new file mode 100644
index 0000000..9c3e726
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/Component.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.incubator.net.l2monitoring.cfm;
+
+import com.google.common.annotations.Beta;
+import org.onlab.packet.EthType;
+import org.onlab.packet.VlanId;
+
+import java.util.Collection;
+
+/**
+ * Components which can be managed in a manner equivalent to an 802.1Q bridge.
+ *
+ * Direct child of the {@link org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation}.
+ */
+public interface Component {
+
+ int componentId();
+
+ /**
+ * The VID(s) monitored by this MA, or 0, if the MA is not attached to any VID.
+ *
+ * The first VID returned is the MA's Primary VID
+ * @return A collection of VIDs
+ */
+ Collection<VlanId> vidList();
+
+ /**
+ * Defines how the MA can create MHFs (MIP Half Function) for this VID at this MA.
+ * @return An enumerated value
+ */
+ MhfCreationType mhfCreationType();
+
+ /**
+ * indicates what, if anything, is to be included in the Sender ID TLV.
+ * The Sender ID TLV is transmitted by MPs configured in this MA.
+ * @return An enumerated value
+ */
+ IdPermissionType idPermission();
+
+ /**
+ * Indicates the tag type for this component.
+ * @return The type of Tag active on this VLAN
+ */
+ @Beta
+ TagType tagType();
+
+ /**
+ * Builder for {@link org.onosproject.incubator.net.l2monitoring.cfm.Component}.
+ */
+ interface ComponentBuilder {
+
+ ComponentBuilder addToVidList(VlanId vid);
+
+ ComponentBuilder mhfCreationType(MhfCreationType mhfCreationType);
+
+ ComponentBuilder idPermission(IdPermissionType idPermission);
+
+ ComponentBuilder tagType(TagType tagType);
+
+ Component build();
+ }
+
+ /**
+ * An enumerated type defining how MHFs (MIP Half Function) can be created.
+ */
+ public enum MhfCreationType {
+ /**
+ * No MHFs can be created for this VID(s).
+ */
+ NONE,
+
+ /**
+ * MHFs can be created for this VID(s) on any Bridge Port through which the.
+ * VID(s) can pass where:
+ * - There are no lower active MD levels; or
+ * - There is a MEP at the next lower active MD-level on the port
+ */
+ DEFAULT,
+
+ /**
+ * MHFs can be created for this VID(s) only on Bridge Ports through which.
+ * this VID(s) can pass, and only if there is a MEP at the next
+ * lower active MD-level on the port.
+ */
+ EXPLICIT,
+
+ /**
+ * In the Maintenance Association managed object only, the control of MHF.
+ * creation is deferred to the corresponding variable in the
+ * enclosing Maintenance Domain
+ */
+ DEFER
+ }
+
+ /**
+ * An enumerated value indicating what, if anything, is to be included in.
+ * the Sender ID TLV transmitted by maintenance-points configured in the
+ * default Maintenance Domain
+ * reference
+ * [802.1q] 21.5.3, 12.14.3.1.3:e";
+ */
+ public enum IdPermissionType {
+ /**
+ * The Sender ID TLV is not to be sent.
+ */
+ NONE,
+
+ /**
+ * The Chassis ID Length, Chassis ID Subtype, and Chassis ID fields of the.
+ * Sender ID TLV are to be sent, but not the Management Address
+ * Length or Management Address fields.
+ */
+ CHASSIS,
+
+ /**
+ * The Management Address Length and Management Address of the Sender ID.
+ * TLV are to be sent, but the Chassis ID Length is to be
+ * transmitted with a 0 value, and the Chassis ID Subtype and
+ * Chassis ID fields not sent
+ */
+ MANAGE,
+
+ /**
+ * The Chassis ID Length, Chassis ID Subtype, Chassis ID, Management.
+ * Address Length, and Management Address fields are all to be sent
+ */
+ CHASSIS_MANAGE,
+
+ /**
+ * The contents of the Sender ID TLV are determined by the Maintenance.
+ * Domain managed object
+ */
+ DEFER
+ }
+
+ /**
+ * A choice of VLan tag type.
+ */
+ public enum TagType {
+ VLAN_NONE(EthType.EtherType.IPV4),
+ VLAN_CTAG(EthType.EtherType.VLAN),
+ VLAN_STAG(EthType.EtherType.QINQ);
+
+ private EthType.EtherType type = EthType.EtherType.IPV4;
+
+ TagType(EthType.EtherType type) {
+ this.type = type;
+ }
+
+ public EthType.EtherType getType() {
+ return type;
+ }
+
+ public static TagType fromEtherType(EthType.EtherType type) {
+ for (TagType tt:values()) {
+ if (tt.type.equals(type)) {
+ return tt;
+ }
+ }
+ throw new IllegalArgumentException("Unsupported EtherType: " + type);
+ }
+ }
+}