Did porting of PROXYARP and Forwarding to the new-datamodel branch.
Change-Id: Ibbc46e20e31627daf68149b7cb31b055d3441eaf
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ArpReplyNotification.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ArpReplyNotification.java
index 48d04e0..081101e 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ArpReplyNotification.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ArpReplyNotification.java
@@ -1,7 +1,6 @@
package net.onrc.onos.ofcontroller.proxyarp;
import java.io.Serializable;
-import java.net.InetAddress;
import net.floodlightcontroller.util.MACAddress;
@@ -13,15 +12,16 @@
private static final long serialVersionUID = 1L;
- private InetAddress targetAddress;
+ private int targetAddress;
private MACAddress targetMacAddress;
+ protected ArpReplyNotification() {}
/**
* Class constructor.
* @param targetAddress IP address received from the ARP reply
* @param targetMacAddress MAC address received from the ARP reply
*/
- public ArpReplyNotification(InetAddress targetAddress,
+ public ArpReplyNotification(int targetAddress,
MACAddress targetMacAddress) {
this.targetAddress = targetAddress;
this.targetMacAddress = targetMacAddress;
@@ -31,7 +31,7 @@
* Returns the IP address of the ARP reply.
* @return the IP address
*/
- public InetAddress getTargetAddress() {
+ public int getTargetAddress() {
return targetAddress;
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/BroadcastPacketOutNotification.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/BroadcastPacketOutNotification.java
index 22fe965..387414b 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/BroadcastPacketOutNotification.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/BroadcastPacketOutNotification.java
@@ -1,6 +1,6 @@
package net.onrc.onos.ofcontroller.proxyarp;
-import java.net.InetAddress;
+
// TODO This class is too generic to be handled by ProxyArpService.
// TODO The generic broadcast packet shouldn't contain an IP address which is
@@ -16,10 +16,16 @@
private static final long serialVersionUID = 1L;
- private final InetAddress address;
+ private final int address;
private final long inSwitch;
private final short inPort;
+ protected BroadcastPacketOutNotification() {
+ super();
+ this.address = -1;
+ this.inSwitch = -1;
+ this.inPort = -1;
+ }
/**
* Class constructor.
*
@@ -32,7 +38,7 @@
* @param inPort
* port number of the receiving port
*/
- public BroadcastPacketOutNotification(byte[] packet, InetAddress address,
+ public BroadcastPacketOutNotification(byte[] packet, int address,
long inSwitch, short inPort) {
super(packet);
@@ -40,7 +46,7 @@
this.inSwitch = inSwitch;
this.inPort = inPort;
}
-
+
/**
* Get the dpid of the switch the packet was received on.
*
@@ -65,7 +71,7 @@
* @return the target IP address for ARP packets, or null if the packet is
* not an ARP packet
*/
- public InetAddress getTargetAddress() {
+ public int getTargetAddress() {
return address;
}
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/PacketOutNotification.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/PacketOutNotification.java
index a201939..fb550cb 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/PacketOutNotification.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/PacketOutNotification.java
@@ -8,16 +8,20 @@
* abstract base class that will be subclassed by specific types of
* notifications.
*/
-public abstract class PacketOutNotification implements Serializable {
+public abstract class PacketOutNotification implements Serializable{
private static final long serialVersionUID = 1L;
protected final byte[] packet;
-
+
/**
* Class constructor.
* @param packet the packet data to send in the packet-out
*/
+ public PacketOutNotification() {
+ packet = null;
+ }
+
public PacketOutNotification(byte[] packet) {
this.packet = packet;
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
index d235c37..942194b 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
@@ -2,6 +2,7 @@
import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -26,7 +27,14 @@
import net.onrc.onos.datagrid.IEventChannelListener;
import net.onrc.onos.ofcontroller.bgproute.Interface;
import net.onrc.onos.ofcontroller.core.config.IConfigInfoService;
+import net.onrc.onos.ofcontroller.devicemanager.IOnosDeviceService;
import net.onrc.onos.ofcontroller.flowprogrammer.IFlowPusherService;
+import net.onrc.onos.ofcontroller.networkgraph.Device;
+import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
+import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
+import net.onrc.onos.ofcontroller.networkgraph.Switch;
+import net.onrc.onos.ofcontroller.util.Dpid;
+import net.onrc.onos.ofcontroller.util.Port;
import net.onrc.onos.ofcontroller.util.SwitchPort;
import net.onrc.onos.packet.ARP;
import net.onrc.onos.packet.Ethernet;
@@ -58,91 +66,135 @@
private IFloodlightProviderService floodlightProvider;
private IDatagridService datagrid;
- private IEventChannel<PacketOutNotification, PacketOutNotification> packetOutEventChannel;
- private IEventChannel<ArpReplyNotification, ArpReplyNotification> arpReplyEventChannel;
- private static final String PACKET_OUT_CHANNEL_NAME = "onos.packet_out";
+ private IEventChannel<Long, ArpReplyNotification> arpReplyEventChannel;
+ private IEventChannel<Long, BroadcastPacketOutNotification> broadcastPacketOutEventChannel;
+ private IEventChannel<Long, SinglePacketOutNotification> singlePacketOutEventChannel;
private static final String ARP_REPLY_CHANNEL_NAME = "onos.arp_reply";
- private PacketOutEventHandler packetOutEventHandler =
- new PacketOutEventHandler();
- private ArpReplyEventHandler arpReplyEventHandler =
- new ArpReplyEventHandler();
+ private static final String BROADCAST_PACKET_OUT_CHANNEL_NAME = "onos.broadcast_packet_out";
+ private static final String SINGLE_PACKET_OUT_CHANNEL_NAME = "onos.single_packet_out";
+ private ArpReplyEventHandler arpReplyEventHandler = new ArpReplyEventHandler();
+ private BroadcastPacketOutEventHandler broadcastPacketOutEventHandler = new BroadcastPacketOutEventHandler();
+ private SinglePacketOutEventHandler singlePacketOutEventHandler = new SinglePacketOutEventHandler();
private IConfigInfoService configService;
private IRestApiService restApi;
private IFlowPusherService flowPusher;
+
+ private INetworkGraphService networkGraphService;
+ private NetworkGraph networkGraph;
+ private IOnosDeviceService onosDeviceService;
private short vlan;
private static final short NO_VLAN = 0;
private SetMultimap<InetAddress, ArpRequest> arpRequests;
- //
- // TODO: Using PacketOutNotification as both the key and the
- // value is a hack that should be removed when this module is
- // refactored.
- //
- private class PacketOutEventHandler implements
- IEventChannelListener<PacketOutNotification, PacketOutNotification> {
- @Override
- public void entryAdded(PacketOutNotification packetOutNotification) {
- if (packetOutNotification instanceof SinglePacketOutNotification) {
- SinglePacketOutNotification notification =
- (SinglePacketOutNotification) packetOutNotification;
- sendArpRequestOutPort(notification.packet,
- notification.getOutSwitch(),
- notification.getOutPort());
+ private class BroadcastPacketOutEventHandler implements
+ IEventChannelListener<Long, BroadcastPacketOutNotification> {
- // set timestamp
- InetAddress addr = notification.getTargetAddress();
- if (addr != null) {
- for (ArpRequest request : arpRequests.get(addr)) {
- request.setRequestTime();
- }
+ @Override
+ public void entryAdded(BroadcastPacketOutNotification value) {
+ if(log.isTraceEnabled()) {
+ log.trace("entryAdded ip{}, sw {}, port {}, packet {}", value.getTargetAddress(), value.getInSwitch(), value.getInPort(), value.packet.length);
+ }
+ BroadcastPacketOutNotification notification = (BroadcastPacketOutNotification) value;
+ broadcastArpRequestOutMyEdge(notification.packet,
+ notification.getInSwitch(),
+ notification.getInPort());
+
+ // set timestamp
+ ByteBuffer buffer = ByteBuffer.allocate(4);
+ buffer.putInt(notification.getTargetAddress());
+ InetAddress addr = null;
+ try {
+ addr = InetAddress.getByAddress(buffer.array());
+ } catch (UnknownHostException e) {
+ log.error("Exception:", e);
+ }
+
+ if (addr != null) {
+ for (ArpRequest request : arpRequests.get(addr)) {
+ request.setRequestTime();
+ }
+ }
}
- } else if (packetOutNotification instanceof BroadcastPacketOutNotification) {
- BroadcastPacketOutNotification notification =
- (BroadcastPacketOutNotification) packetOutNotification;
- broadcastArpRequestOutMyEdge(notification.packet,
- notification.getInSwitch(),
- notification.getInPort());
-
- // set timestamp
- InetAddress addr = notification.getTargetAddress();
- if (addr != null) {
- for (ArpRequest request : arpRequests.get(addr)) {
- request.setRequestTime();
- }
+
+ @Override
+ public void entryUpdated(BroadcastPacketOutNotification value) {
+ log.debug("entryUpdated");
+ // TODO: For now, entryUpdated() is processed as entryAdded()
+ entryAdded(value);
}
- } else {
- log.warn("Unknown packet out notification received");
- }
- }
-
- @Override
- public void entryUpdated(PacketOutNotification packetOutNotification) {
- // TODO: For now, entryUpdated() is processed as entryAdded()
- entryAdded(packetOutNotification);
- }
-
- @Override
- public void entryRemoved(PacketOutNotification packetOutNotification) {
- // TODO: Not implemented. Revisit when this module is refactored
- }
+
+ @Override
+ public void entryRemoved(BroadcastPacketOutNotification value) {
+ log.debug("entryRemoved");
+ // TODO: Not implemented. Revisit when this module is refactored
+ }
+ }
+
+ private class SinglePacketOutEventHandler implements
+ IEventChannelListener<Long, SinglePacketOutNotification> {
+ @Override
+ public void entryAdded(SinglePacketOutNotification packetOutNotification) {
+ log.debug("entryAdded");
+ SinglePacketOutNotification notification =
+ (SinglePacketOutNotification) packetOutNotification;
+ sendArpRequestOutPort(notification.packet,
+ notification.getOutSwitch(),
+ notification.getOutPort());
+
+ // set timestamp
+ ByteBuffer buffer = ByteBuffer.allocate(4);
+ buffer.putInt(notification.getTargetAddress());
+ InetAddress addr = null;
+ try {
+ addr = InetAddress.getByAddress(buffer.array());
+ } catch (UnknownHostException e) {
+ log.error("Exception:", e);
+ }
+
+ if (addr != null) {
+ for (ArpRequest request : arpRequests.get(addr)) {
+ request.setRequestTime();
+ }
+ }
+ }
+
+ @Override
+ public void entryUpdated(SinglePacketOutNotification packetOutNotification) {
+ log.debug("entryUpdated");
+ // TODO: For now, entryUpdated() is processed as entryAdded()
+ entryAdded(packetOutNotification);
+ }
+
+ @Override
+ public void entryRemoved(SinglePacketOutNotification packetOutNotification) {
+ log.debug("entryRemoved");
+ // TODO: Not implemented. Revisit when this module is refactored
+ }
}
- //
- // TODO: Using ArpReplyNotification as both the key and the
- // value is a hack that should be removed when this module is
- // refactored.
- //
private class ArpReplyEventHandler implements
- IEventChannelListener<ArpReplyNotification, ArpReplyNotification> {
+ IEventChannelListener<Long, ArpReplyNotification> {
+
@Override
public void entryAdded(ArpReplyNotification arpReply) {
- log.debug("Received ARP reply notification for {}",
- arpReply.getTargetAddress());
- sendArpReplyToWaitingRequesters(arpReply.getTargetAddress(),
- arpReply.getTargetMacAddress());
+ log.debug("Received ARP reply notification for ip {}, mac {}",
+ arpReply.getTargetAddress(), arpReply.getTargetMacAddress());
+ ByteBuffer buffer = ByteBuffer.allocate(4);
+ buffer.putInt(arpReply.getTargetAddress());
+ InetAddress addr = null;
+ try {
+ addr = InetAddress.getByAddress(buffer.array());
+ } catch (UnknownHostException e) {
+ log.error("Exception:", e);
+ }
+
+ if(addr != null) {
+ sendArpReplyToWaitingRequesters(addr,
+ arpReply.getTargetMacAddress());
+ }
}
@Override
@@ -209,6 +261,10 @@
ProxyArpManager.this.sendArpReply(arpRequest, dpid, port,
macAddress);
}
+
+ public ARP getArpRequest() {
+ return arpRequest;
+ }
}
@Override
@@ -236,17 +292,20 @@
dependencies.add(IDatagridService.class);
dependencies.add(IConfigInfoService.class);
dependencies.add(IFlowPusherService.class);
+ dependencies.add(INetworkGraphService.class);
+ dependencies.add(IOnosDeviceService.class);
return dependencies;
}
@Override
public void init(FloodlightModuleContext context) {
- this.floodlightProvider = context
- .getServiceImpl(IFloodlightProviderService.class);
- this.datagrid = context.getServiceImpl(IDatagridService.class);
+ this.floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
this.configService = context.getServiceImpl(IConfigInfoService.class);
this.restApi = context.getServiceImpl(IRestApiService.class);
+ this.datagrid = context.getServiceImpl(IDatagridService.class);
this.flowPusher = context.getServiceImpl(IFlowPusherService.class);
+ this.networkGraphService = context.getServiceImpl(INetworkGraphService.class);
+ this.onosDeviceService = context.getServiceImpl(IOnosDeviceService.class);
// arpCache = new ArpCache();
@@ -262,22 +321,24 @@
restApi.addRestletRoutable(new ArpWebRoutable());
floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
-
+ networkGraph = networkGraphService.getNetworkGraph();
+
//
// Event notification setup: channels and event handlers
- //
- //
- // TODO: Using PacketOutNotification or ArpReplyNotification as both
- // the key and the value is a hack that should be removed when this
- // module is refactored.
- //
- packetOutEventChannel = datagrid.addListener(PACKET_OUT_CHANNEL_NAME,
- packetOutEventHandler,
- PacketOutNotification.class,
- PacketOutNotification.class);
+ //
+ broadcastPacketOutEventChannel = datagrid.addListener(BROADCAST_PACKET_OUT_CHANNEL_NAME,
+ broadcastPacketOutEventHandler,
+ Long.class,
+ BroadcastPacketOutNotification.class);
+
+ singlePacketOutEventChannel = datagrid.addListener(SINGLE_PACKET_OUT_CHANNEL_NAME,
+ singlePacketOutEventHandler,
+ Long.class,
+ SinglePacketOutNotification.class);
+
arpReplyEventChannel = datagrid.addListener(ARP_REPLY_CHANNEL_NAME,
arpReplyEventHandler,
- ArpReplyNotification.class,
+ Long.class,
ArpReplyNotification.class);
Timer arpTimer = new Timer("arp-processing");
@@ -313,19 +374,17 @@
log.debug("Cleaning expired ARP request for {}", entry
.getKey().getHostAddress());
- // If the ARP request is expired and then delete the device
- // TODO check whether this is OK from this thread
- // TODO: Fix the code below after deviceStorage was removed
- /*
- IDeviceObject targetDevice =
- deviceStorage.getDeviceByIP(InetAddresses.coerceToInteger(entry.getKey()));
- if (targetDevice != null) {
- deviceStorage.removeDevice(targetDevice);
- if (log.isDebugEnabled()) {
- log.debug("RemoveDevice: {} due to no have not recieve the ARP reply", targetDevice);
- }
- }
- */
+ // If the ARP request is expired and then delete the device
+ // TODO check whether this is OK from this thread
+ HostArpRequester requester = (HostArpRequester) request.requester;
+ ARP req = requester.getArpRequest();
+ Device targetDev = networkGraph.getDeviceByMac(MACAddress.valueOf(req.getTargetHardwareAddress()));
+ if(targetDev != null) {
+ onosDeviceService.deleteOnosDeviceByMac(MACAddress.valueOf(req.getTargetHardwareAddress()));
+ if (log.isDebugEnabled()) {
+ log.debug("RemoveDevice: {} due to no have not recieve the ARP reply", targetDev.getMacAddress());
+ }
+ }
it.remove();
@@ -434,90 +493,79 @@
// MACAddress macAddress = arpCache.lookup(target);
- arpRequests.put(
- target,
- new ArpRequest(new HostArpRequester(arp, sw.getId(), pi
- .getInPort()), false));
+ arpRequests.put(target, new ArpRequest(
+ new HostArpRequester(arp, sw.getId(), pi.getInPort()), false));
+
+ Device targetDevice = networkGraph.getDeviceByMac(MACAddress.valueOf(arp.getTargetHardwareAddress()));
- // TODO: Fix the code below after deviceStorage was removed
- /*
- IDeviceObject targetDevice =
- deviceStorage.getDeviceByIP(InetAddresses.coerceToInteger(target));
- */
+ if (targetDevice == null) {
+ if (log.isTraceEnabled()) {
+ log.trace("No device info found for {} - broadcasting",
+ target.getHostAddress());
+ }
+
+ // We don't know the device so broadcast the request out
+ BroadcastPacketOutNotification key =
+ new BroadcastPacketOutNotification(eth.serialize(),
+ ByteBuffer.wrap(arp.getTargetProtocolAddress()).getInt(), sw.getId(), pi.getInPort());
+ log.debug("broadcastPacketOutEventChannel mac {}, ip {}, dpid {}, port {}, paket {}", eth.getSourceMAC().toLong(),
+ ByteBuffer.wrap(arp.getTargetProtocolAddress()).getInt(), sw.getId(), pi.getInPort(), eth.serialize().length);
+ broadcastPacketOutEventChannel.addTransientEntry(eth.getDestinationMAC().toLong(), key);
+ }
+ else {
+ // Even if the device exists in our database, we do not reply to
+ // the request directly, but check whether the device is still valid
+ MACAddress macAddress = MACAddress.valueOf(arp.getTargetHardwareAddress());
- // TODO: Fix the code below after deviceStorage was removed
- /*
- if (targetDevice == null) {
- if (log.isTraceEnabled()) {
- log.trace("No device info found for {} - broadcasting",
- target.getHostAddress());
- }
+ if (log.isTraceEnabled()) {
+ log.trace("The target Device Record in DB is: {} => {} from ARP request host at {}/{}",
+ new Object [] {
+ inetAddressToString(arp.getTargetProtocolAddress()),
+ macAddress,
+ HexString.toHexString(sw.getId()), pi.getInPort()});
+ }
- // We don't know the device so broadcast the request out
- PacketOutNotification key =
- new BroadcastPacketOutNotification(eth.serialize(),
- target, sw.getId(),
- pi.getInPort());
- packetOutEventChannel.addTransientEntry(key, key);
- }
- else {
- // Even if the device exists in our database, we do not reply to
- // the request directly, but check whether the device is still valid
- MACAddress macAddress = MACAddress.valueOf(targetDevice.getMACAddress());
+ // sendArpReply(arp, sw.getId(), pi.getInPort(), macAddress);
- if (log.isTraceEnabled()) {
- log.trace("The target Device Record in DB is: {} => {} from ARP request host at {}/{}",
- new Object [] {
- inetAddressToString(arp.getTargetProtocolAddress()),
- macAddress,
- HexString.toHexString(sw.getId()), pi.getInPort()});
- }
+ Iterable<net.onrc.onos.ofcontroller.networkgraph.Port> outPorts = targetDevice.getAttachmentPoints();
- // sendArpReply(arp, sw.getId(), pi.getInPort(), macAddress);
+ if (!outPorts.iterator().hasNext()){
+ if (log.isTraceEnabled()) {
+ log.trace("Device {} exists but is not connected to any ports" +
+ " - broadcasting", macAddress);
+ }
+
+// BroadcastPacketOutNotification key =
+// new BroadcastPacketOutNotification(eth.serialize(),
+// target, sw.getId(), pi.getInPort());
+// broadcastPacketOutEventChannel.addTransientEntry(eth.getDestinationMAC().toLong(), key);
+ }
+ else {
+ for (net.onrc.onos.ofcontroller.networkgraph.Port portObject : outPorts) {
+ //long outSwitch = 0;
+ //short outPort = 0;
- Iterable<IPortObject> outPorts = targetDevice.getAttachedPorts();
-
- if (!outPorts.iterator().hasNext()){
- if (log.isTraceEnabled()) {
- log.trace("Device {} exists but is not connected to any ports" +
- " - broadcasting", macAddress);
- }
- PacketOutNotification key =
- new BroadcastPacketOutNotification(eth.serialize(),
- target, sw.getId(),
- pi.getInPort());
- packetOutEventChannel.addTransientEntry(key, key);
- }
- else {
- for (IPortObject portObject : outPorts) {
- //long outSwitch = 0;
- //short outPort = 0;
-
- // if (!portObject.getLinkedPorts().iterator().hasNext()) {
- // outPort = portObject.getNumber();
- // }
- if (portObject.getLinkedPorts().iterator().hasNext()) {
- continue;
- }
-
- short outPort = portObject.getNumber();
- ISwitchObject outSwitchObject = portObject.getSwitch();
- long outSwitch = HexString.toLong(outSwitchObject.getDPID());
-
- if (log.isTraceEnabled()) {
- log.trace("Probing device {} on port {}/{}",
- new Object[] {macAddress,
- HexString.toHexString(outSwitch), outPort});
- }
-
- PacketOutNotification key =
- new SinglePacketOutNotification(eth.serialize(),
- target, outSwitch, outPort);
- packetOutEventChannel.addTransientEntry(key, key);
- }
- }
- }
- */
+ if(portObject.getOutgoingLink() != null || portObject.getIncomingLink() != null) {
+ continue;
+ }
+
+ short outPort = portObject.getNumber().shortValue();
+ Switch outSwitchObject = portObject.getSwitch();
+ long outSwitch = outSwitchObject.getDpid();
+
+ if (log.isTraceEnabled()) {
+ log.trace("Probing device {} on port {}/{}",
+ new Object[] {macAddress,
+ HexString.toHexString(outSwitch), outPort});
+ }
+
+ SinglePacketOutNotification key =
+ new SinglePacketOutNotification(eth.serialize(),
+ ByteBuffer.wrap(target.getAddress()).getInt(), outSwitch, outPort);
+ singlePacketOutEventChannel.addTransientEntry(eth.getDestinationMAC().toLong(), key);
+ }
+ }
+ }
}
// Not used because device manager currently updates the database
@@ -613,16 +661,15 @@
}
// sendArpRequestToSwitches(ipAddress, eth.serialize());
- PacketOutNotification key =
- new SinglePacketOutNotification(eth.serialize(), ipAddress,
- intf.getDpid(), intf.getPort());
- packetOutEventChannel.addTransientEntry(key, key);
+ SinglePacketOutNotification key =
+ new SinglePacketOutNotification(eth.serialize(), ByteBuffer.wrap(ipAddress.getAddress()).getInt(),
+ intf.getDpid(), intf.getPort());
+ singlePacketOutEventChannel.addTransientEntry(MACAddress.valueOf(senderMacAddress).toLong(), key);
}
-
- private void sendArpRequestToSwitches(InetAddress dstAddress,
- byte[] arpRequest) {
- sendArpRequestToSwitches(dstAddress, arpRequest, 0,
- OFPort.OFPP_NONE.getValue());
+
+ private void sendArpRequestToSwitches(InetAddress dstAddress, byte[] arpRequest) {
+ sendArpRequestToSwitches(dstAddress, arpRequest, 0,
+ OFPort.OFPP_NONE.getValue());
}
private void sendArpRequestToSwitches(InetAddress dstAddress,
@@ -672,9 +719,10 @@
MACAddress mac = new MACAddress(arp.getSenderHardwareAddress());
- ArpReplyNotification key =
- new ArpReplyNotification(targetAddress, mac);
- arpReplyEventChannel.addTransientEntry(key, key);
+ ArpReplyNotification key =
+ new ArpReplyNotification(ByteBuffer.wrap(targetAddress.getAddress()).getInt(), mac);
+ log.debug("ArpReplyNotification ip {}, mac{}", ByteBuffer.wrap(targetAddress.getAddress()).getInt(), mac);
+ arpReplyEventChannel.addTransientEntry(mac.toLong(), key);
}
private void broadcastArpRequestOutMyEdge(byte[] arpRequest, long inSwitch,
@@ -689,30 +737,27 @@
List<OFAction> actions = new ArrayList<OFAction>();
- // TODO: Fix the code below after topoSwitchService was removed
- /*
- Iterable<IPortObject> ports
- = topoSwitchService.getPortsOnSwitch(sw.getStringId());
- if (ports == null) {
- continue;
- }
-
- for (IPortObject portObject : ports) {
- if (!portObject.getLinkedPorts().iterator().hasNext()) {
- short portNumber = portObject.getNumber();
-
- if (sw.getId() == inSwitch && portNumber == inPort) {
- // This is the port that the ARP message came in,
- // so don't broadcast out this port
- continue;
- }
-
- switchPorts.add(new SwitchPort(new Dpid(sw.getId()),
- new Port(portNumber)));
- actions.add(new OFActionOutput(portNumber));
- }
- }
- */
+ Switch graphSw = networkGraph.getSwitch(sw.getId());
+ Collection<net.onrc.onos.ofcontroller.networkgraph.Port> ports = graphSw.getPorts();
+
+ if (ports == null) {
+ continue;
+ }
+
+ for (net.onrc.onos.ofcontroller.networkgraph.Port portObject : ports) {
+ if (portObject.getOutgoingLink() == null && portObject.getNumber() > 0) {
+ Long portNumber = portObject.getNumber();
+
+ if (sw.getId() == inSwitch && portNumber.shortValue() == inPort) {
+ // This is the port that the ARP message came in,
+ // so don't broadcast out this port
+ continue;
+ }
+ switchPorts.add(new SwitchPort(new Dpid(sw.getId()),
+ new net.onrc.onos.ofcontroller.util.Port(portNumber.shortValue())));
+ actions.add(new OFActionOutput(portNumber.shortValue()));
+ }
+ }
po.setActions(actions);
short actionsLength = (short) (actions.size() * OFActionOutput.MINIMUM_LENGTH);
@@ -853,31 +898,6 @@
return new ArrayList<String>();
}
- /*
- @Override
- public void arpRequestNotification(ArpMessage arpMessage) {
- log.debug("Received ARP notification from other instances");
-
- switch (arpMessage.getType()){
- case REQUEST:
- if(arpMessage.getOutSwitch() == -1 || arpMessage.getOutPort() == -1){
- broadcastArpRequestOutMyEdge(arpMessage.getPacket(),
- arpMessage.getInSwitch(), arpMessage.getInPort());
- }else{
- sendArpRequestOutPort(arpMessage.getPacket(),arpMessage.getOutSwitch(),arpMessage.getOutPort());
- log.debug("OutSwitch in ARP request message is: {}; " +
- "OutPort in ARP request message is: {}",arpMessage.getOutSwitch(),arpMessage.getOutPort());
- }
- break;
- case REPLY:
- log.debug("Received ARP reply notification for {}",
- arpMessage.getAddress());
- sendArpReplyToWaitingRequesters(arpMessage.getAddress(),arpMessage.getMAC());
- break;
- }
- }
- */
-
private void sendArpReplyToWaitingRequesters(InetAddress address,
MACAddress mac) {
log.debug("Sending ARP reply for {} to requesters",
@@ -899,6 +919,7 @@
}
}
+ //TODO here, comment outed from long time ago. I will check if we need it later.
/*IDeviceObject deviceObject = deviceStorage.getDeviceByIP(
InetAddresses.coerceToInteger(address));
@@ -912,4 +933,4 @@
request.dispatchReply(address, mac);
}
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/SinglePacketOutNotification.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/SinglePacketOutNotification.java
index ab9a9b5..62d8086 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/SinglePacketOutNotification.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/SinglePacketOutNotification.java
@@ -1,6 +1,6 @@
package net.onrc.onos.ofcontroller.proxyarp;
-import java.net.InetAddress;
+
// TODO This class is too generic to be handled by ProxyArpService.
/**
@@ -10,7 +10,7 @@
private static final long serialVersionUID = 1L;
- private final InetAddress address;
+ private final int address;
private final long outSwitch;
private final short outPort;
@@ -21,7 +21,7 @@
* @param outSwitch the dpid of the switch to send the packet on
* @param outPort the port number of the port to send the packet out
*/
- public SinglePacketOutNotification(byte[] packet, InetAddress address,
+ public SinglePacketOutNotification(byte[] packet, int address,
long outSwitch, short outPort) {
super(packet);
@@ -51,7 +51,7 @@
* @return the target IP address for ARP packets, or null if the packet is
* not an ARP packet
*/
- public InetAddress getTargetAddress() {
+ public int getTargetAddress() {
return address;
}
}