/*
 * Copyright 2015-present 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.bgp.controller;

import java.util.List;

import org.onosproject.bgpio.protocol.BgpVersion;
import org.onosproject.bgpio.types.BgpValueType;

/**
 * Abstraction of an BGP session info. Maintian session parameters obtained during session creation.
 */
public interface BgpSessionInfo {
    /**
     * Gets the bgp session type iBGP/eBGP.
     *
     * @return isiBGPSession, true if session is of type internal, otherwise false.
     */
    boolean isIbgpSession();

    /**
     * Gets the negotiated hold time for the session.
     *
     * @return negotiated hold time.
     */
    short negotiatedholdTime();

    /**
     * Gets the BGP ID of BGP peer.
     *
     * @return bgp ID.
     */
    BgpId remoteBgpId();

    /**
     * Gets the BGP version of peer.
     *
     * @return bgp version.
     */
    BgpVersion remoteBgpVersion();

    /**
     * Gets the BGP remote bgp AS number.
     *
     * @return remoteBgpASNum peer AS number.
     */
    long remoteBgpASNum();

    /**
     * Gets the BGP peer hold time.
     *
     * @return bgp hold time.
     */
    short remoteBgpHoldTime();

    /**
     * Gets the BGP version for this bgp peer.
     *
     * @return bgp identifier.
     */
    int remoteBgpIdentifier();

    /**
     * Gets the BGP capabilities for this BGP peer.
     *
     * @return BGP peer capabilities.
     */
    List<BgpValueType> remoteBgpCapability();
}
