/*
 * Copyright 2016-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.net.neighbour;

import com.google.common.annotations.Beta;
import org.onlab.packet.Ethernet;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onlab.packet.VlanId;
import org.onosproject.net.intf.Interface;
import org.onosproject.net.ConnectPoint;

/**
 * Context of an incoming neighbor message (e.g. ARP, NDP).
 *
 * <p>This includes information about the message accessible through a
 * protocol-agnostic interface, as well as mechanisms to perform an action in
 * response to the incoming message.</p>
 */
@Beta
public interface NeighbourMessageContext {
    /**
     * Gets the port where the packet came in to the network.
     *
     * @return connect point
     */
    ConnectPoint inPort();

    /**
     * Gets the full parsed representation of the packet.
     *
     * @return ethernet header
     */
    Ethernet packet();

    /**
     * Gets the protocol of the packet.
     *
     * @return protocol
     */
    NeighbourProtocol protocol();

    /**
     * Gets the message type of the packet.
     *
     * @return message type
     */
    NeighbourMessageType type();

    /**
     * Gets the vlan of the packet, if any.
     *
     * @return vlan
     */
    VlanId vlan();

    /**
     * Gets the source MAC address of the message.
     *
     * @return source MAC address
     */
    MacAddress srcMac();

    /**
     * Gets the destination MAC address of the message.
     * <p>
     * Only valid for reply packets, will be null for request packets.
     * </p>
     *
     * @return target MAC address
     */
    MacAddress dstMac();

    /**
     * Gets the target IP address of the message.
     *
     * @return target IP address
     */
    IpAddress target();

    /**
     * Gets the source IP address of the message.
     *
     * @return source IP address
     */
    IpAddress sender();

    /**
     * Forwards the message to a given output port.
     *
     * @param outPort output port
     */
    void forward(ConnectPoint outPort);

    /**
     * Forwards the message to a given interface.
     * <p>
     * The message will be modified to fit the parameters of the outgoing
     * interface. For example, if the interface has a VLAN configured, the
     * outgoing packet will have that VLAN tag added.
     * </p>
     * @param outIntf output interface
     */
    void forward(Interface outIntf);

    /**
     * Replies to the request message with a given MAC address.
     *
     * @param targetMac target MAC address
     */
    void reply(MacAddress targetMac);

    /**
     * Floods the incoming message out all ports except the input port.
     */
    void flood();

    /**
     * Drops the incoming message.
     */
    void drop();
}
