/*
 * 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.routing.bgp;

import org.onlab.packet.Ip4Address;

import java.net.SocketAddress;

/**
 * Class for keeping information about a BGP session.
 *
 * There are two instances per each BGP peer session: one to keep the local
 * information about the BGP session, and another to keep information about
 * the remote BGP peer.
 */
public class BgpSessionInfo {
    private SocketAddress address;              // IP addr/port
    private Ip4Address ip4Address;              // IPv4 address
    private int bgpVersion;                     // 1 octet
    private long asNumber;                      // AS number: 2 octets
    private long as4Number;                     // AS4 number: 4 octets
    private long holdtime;                      // 2 octets
    private Ip4Address bgpId;                   // 4 octets -> IPv4 address
    private boolean mpExtensions;               // Multiprotocol Extensions
                                                // enabled: RFC 4760
    private boolean ipv4Unicast;                // IPv4/UNICAST AFI/SAFI
    private boolean ipv4Multicast;              // IPv4/MULTICAST AFI/SAFI
    private boolean ipv6Unicast;                // IPv6/UNICAST AFI/SAFI
    private boolean ipv6Multicast;              // IPv6/MULTICAST AFI/SAFI
    private boolean as4OctetCapability;         // AS 4 octet path capability

    /**
     * Gets the BGP session address: local or remote.
     *
     * @return the BGP session address
     */
    public SocketAddress address() {
        return this.address;
    }

    /**
     * Sets the BGP session address: local or remote.
     *
     * @param address the BGP session address to set
     */
    public void setAddress(SocketAddress address) {
        this.address = address;
    }

    /**
     * Gets the BGP session IPv4 address: local or remote.
     *
     * @return the BGP session IPv4 address
     */
    public Ip4Address ip4Address() {
        return this.ip4Address;
    }

    /**
     * Sets the BGP session IPv4 address: local or remote.
     *
     * @param ip4Address the BGP session IPv4 address to set
     */
    public void setIp4Address(Ip4Address ip4Address) {
        this.ip4Address = ip4Address;
    }

    /**
     * Gets the BGP session BGP version: local or remote.
     *
     * @return the BGP session BGP version
     */
    public int bgpVersion() {
        return this.bgpVersion;
    }

    /**
     * Sets the BGP session BGP version: local or remote.
     *
     * @param bgpVersion the BGP session BGP version to set
     */
    public void setBgpVersion(int bgpVersion) {
        this.bgpVersion = bgpVersion;
    }

    /**
     * Gets the BGP session AS number: local or remote.
     *
     * @return the BGP session AS number
     */
    public long asNumber() {
        return this.asNumber;
    }

    /**
     * Sets the BGP session AS number: local or remote.
     *
     * @param asNumber the BGP session AS number to set
     */
    public void setAsNumber(long asNumber) {
        this.asNumber = asNumber;
    }

    /**
     * Gets the BGP session AS4 number: local or remote.
     *
     * @return the BGP session AS4 number
     */
    public long as4Number() {
        return this.as4Number;
    }

    /**
     * Sets the BGP session AS4 number: local or remote.
     *
     * @param as4Number the BGP session AS4 number to set
     */
    public void setAs4Number(long as4Number) {
        this.as4Number = as4Number;
    }

    /**
     * Gets the BGP session holdtime: local or remote.
     *
     * @return the BGP session holdtime
     */
    public long holdtime() {
        return this.holdtime;
    }

    /**
     * Sets the BGP session holdtime: local or remote.
     *
     * @param holdtime the BGP session holdtime to set
     */
    public void setHoldtime(long holdtime) {
        this.holdtime = holdtime;
    }

    /**
     * Gets the BGP session BGP Identifier as an IPv4 address: local or remote.
     *
     * @return the BGP session BGP Identifier as an IPv4 address
     */
    public Ip4Address bgpId() {
        return this.bgpId;
    }

    /**
     * Sets the BGP session BGP Identifier as an IPv4 address: local or remote.
     *
     * @param bgpId the BGP session BGP Identifier to set
     */
    public void setBgpId(Ip4Address bgpId) {
        this.bgpId = bgpId;
    }

    /**
     * Gets the BGP Multiprotocol Extensions: local or remote.
     *
     * @return true if the BGP Multiprotocol Extensions are enabled, otherwise
     * false
     */
    public boolean mpExtensions() {
        return this.mpExtensions;
    }

    /**
     * Gets the BGP session AFI/SAFI configuration for IPv4 unicast: local or
     * remote.
     *
     * @return the BGP session AFI/SAFI configuration for IPv4 unicast
     */
    public boolean ipv4Unicast() {
        return ipv4Unicast;
    }

    /**
     * Sets the BGP session AFI/SAFI configuration for IPv4 unicast: local or
     * remote.
     */
    public void setIpv4Unicast() {
        this.mpExtensions = true;
        this.ipv4Unicast = true;
    }

    /**
     * Gets the BGP session AFI/SAFI configuration for IPv4 multicast: local or
     * remote.
     *
     * @return the BGP session AFI/SAFI configuration for IPv4 multicast
     */
    public boolean ipv4Multicast() {
        return ipv4Multicast;
    }

    /**
     * Sets the BGP session AFI/SAFI configuration for IPv4 multicast: local or
     * remote.
     */
    public void setIpv4Multicast() {
        this.mpExtensions = true;
        this.ipv4Multicast = true;
    }

    /**
     * Gets the BGP session AFI/SAFI configuration for IPv6 unicast: local or
     * remote.
     *
     * @return the BGP session AFI/SAFI configuration for IPv6 unicast
     */
    public boolean ipv6Unicast() {
        return ipv6Unicast;
    }

    /**
     * Sets the BGP session AFI/SAFI configuration for IPv6 unicast: local or
     * remote.
     */
    void setIpv6Unicast() {
        this.mpExtensions = true;
        this.ipv6Unicast = true;
    }

    /**
     * Gets the BGP session AFI/SAFI configuration for IPv6 multicast: local or
     * remote.
     *
     * @return the BGP session AFI/SAFI configuration for IPv6 multicast
     */
    public boolean ipv6Multicast() {
        return ipv6Multicast;
    }

    /**
     * Sets the BGP session AFI/SAFI configuration for IPv6 multicast: local or
     * remote.
     */
    public void setIpv6Multicast() {
        this.mpExtensions = true;
        this.ipv6Multicast = true;
    }

    /**
     * Gets the BGP session 4 octet AS path capability: local or remote.
     *
     * @return true when the BGP session has 4 octet AS path capability
     */
    public boolean as4OctetCapability() {
        return this.as4OctetCapability;
    }

    /**
     * Sets the BGP session 4 octet AS path capability.
     */
    public void setAs4OctetCapability() {
        this.as4OctetCapability = true;
    }
}
