blob: 307a7836c3c40895372268217c77431e93d1600f [file] [log] [blame]
/*
* Copyright 2016-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.incubator.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.incubator.net.intf.Interface;
import org.onosproject.net.ConnectPoint;
import static com.google.common.base.Preconditions.checkState;
/**
* 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 class NeighbourMessageContext {
private final NeighbourProtocol protocol;
private final NeighbourMessageType type;
private final IpAddress target;
private final IpAddress sender;
private final Ethernet eth;
private final ConnectPoint inPort;
private final NeighbourMessageActions actions;
/**
* Creates a new neighbour message context.
*
* @param actions actions
* @param eth ethernet frame
* @param inPort incoming port
* @param protocol message protocol
* @param type message type
* @param target target IP address
* @param sender sender IP address
*/
public NeighbourMessageContext(NeighbourMessageActions actions,
Ethernet eth, ConnectPoint inPort,
NeighbourProtocol protocol, NeighbourMessageType type,
IpAddress target, IpAddress sender) {
this.actions = actions;
this.eth = eth;
this.inPort = inPort;
this.protocol = protocol;
this.type = type;
this.target = target;
this.sender = sender;
}
/**
* Gets the port where the packet came in to the network.
*
* @return connect point
*/
public ConnectPoint inPort() {
return inPort;
}
/**
* Gets the full parsed representation of the packet.
*
* @return ethernet header
*/
public Ethernet packet() {
return eth;
}
/**
* Gets the protocol of the packet.
*
* @return protocol
*/
public NeighbourProtocol protocol() {
return protocol;
}
/**
* Gets the message type of the packet.
*
* @return message type
*/
public NeighbourMessageType type() {
return type;
}
/**
* Gets the vlan of the packet, if any.
*
* @return vlan
*/
public VlanId vlan() {
return VlanId.vlanId(eth.getVlanID());
}
/**
* Gets the source MAC address of the message.
*
* @return source MAC address
*/
public MacAddress srcMac() {
return MacAddress.valueOf(eth.getSourceMACAddress());
}
/**
* Gets the target IP address of the message.
*
* @return target IP address
*/
public IpAddress target() {
return target;
}
/**
* Gets the source IP address of the message.
*
* @return source IP address
*/
public IpAddress sender() {
return sender;
}
/**
* Proxies the message to a given output port.
*
* @param outPort output port
*/
public void proxy(ConnectPoint outPort) {
actions.proxy(this, outPort);
}
/**
* Proxies the message to a given interface.
*
* @param outIntf output interface
*/
public void proxy(Interface outIntf) {
actions.proxy(this, outIntf);
}
/**
* Replies to the request message with a given MAC address.
*
* @param targetMac target MAC address
*/
public void reply(MacAddress targetMac) {
checkState(type == NeighbourMessageType.REQUEST, "can only reply to requests");
actions.reply(this, targetMac);
}
/**
* Floods the incoming message out all ports except the input port.
*/
public void flood() {
actions.flood(this);
}
/**
* Drops the incoming message.
*/
public void drop() {
actions.drop(this);
}
}