/*
 * Copyright 2016 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.tetopology.management.api.node;

import org.onosproject.tetopology.management.api.EncodingType;
import org.onosproject.tetopology.management.api.SwitchingType;

import java.util.BitSet;
import java.util.List;

/**
 * Representation of a tunnel termination point.
 */
public interface TunnelTerminationPoint {
    /**
     * Indicates that the TTP supports one-plus-one protection.
     */
    public static final short BIT_1PLUS1_PROTECTION_CAPABLE = 0;

    /**
     * Indicates that the TTP is disabled.
     */
    public static final short BIT_DISABLED = 1;

    /**
     * Indicates that the TTP is operationally down.
     */
    public static final short BIT_STATUS_DOWN = 2;

    /**
     * Returns the tunnel termination point identifier.
     *
     * @return tunnel termination point id
     */
    long ttpId();

    /**
     * Returns the network layer switching type to which this TTP belongs.
     *
     * @return the switching type
     */
    SwitchingType switchingLayer();

    /**
     * Returns the network layer encoding type to which this TTP belongs.
     *
     * @return the encoding type
     */
    EncodingType encodingLayer();

    /**
     * Returns the flags of this TTP.
     *
     * @return the flags
     */
    BitSet flags();

    /**
     * Returns the supported inter-layer locks.
     *
     * @return list of inter-layer locks
     */
    List<Long> interLayerLockList();

    /**
     * Returns the local link connectivity list.
     *
     * @return the local link connectivity list
     */
    List<LocalLinkConnectivity> localLinkConnectivityList();

    /**
     * Returns the remaining adaptation bandwidth at each priority level.
     *
     * @return list of available adaptation bandwidth
     */
    float[] availAdaptBandwidth();
}
