diff --git a/apps/proxyarp/BUCK b/apps/proxyarp/BUCK
index 5406f4e62c..70e3c9df09 100644
--- a/apps/proxyarp/BUCK
+++ b/apps/proxyarp/BUCK
@@ -1,5 +1,6 @@
COMPILE_DEPS = [
'//lib:CORE_DEPS',
+ '//incubator/api:onos-incubator-api',
]
osgi_jar (
diff --git a/apps/proxyarp/pom.xml b/apps/proxyarp/pom.xml
index 86664f4c54..0d2b3a9721 100644
--- a/apps/proxyarp/pom.xml
+++ b/apps/proxyarp/pom.xml
@@ -43,6 +43,10 @@
org.osgi
org.osgi.compendium
+
+ org.onosproject
+ onos-incubator-api
+
diff --git a/apps/proxyarp/src/main/java/org/onosproject/proxyarp/DefaultProxyArp.java b/apps/proxyarp/src/main/java/org/onosproject/proxyarp/DefaultProxyArp.java
new file mode 100644
index 0000000000..175989ff97
--- /dev/null
+++ b/apps/proxyarp/src/main/java/org/onosproject/proxyarp/DefaultProxyArp.java
@@ -0,0 +1,97 @@
+/*
+ * 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.proxyarp;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.incubator.net.neighbour.DefaultNeighbourMessageHandler;
+import org.onosproject.incubator.net.neighbour.NeighbourResolutionService;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.edge.EdgePortEvent;
+import org.onosproject.net.edge.EdgePortListener;
+import org.onosproject.net.edge.EdgePortService;
+
+/**
+ * Implements proxy ARP and NDP functionality by considering the entire network
+ * as a single L2 broadcast domain.
+ *
+ * This application maintains a DefaultNeighbourMessageHandler on all edge ports
+ * in the network, and the handler implements the desired proxying functionality.
+ *
+ */
+@Component(immediate = true)
+public class DefaultProxyArp {
+
+ private static final String APP_NAME = "org.onosproject.proxyarp";
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected EdgePortService edgeService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected NeighbourResolutionService neighbourResolutionService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected CoreService coreService;
+
+ private ApplicationId appId;
+
+ private InternalEdgeListener edgeListener = new InternalEdgeListener();
+ private DefaultNeighbourMessageHandler defaultHandler = new DefaultNeighbourMessageHandler();
+
+ @Activate
+ protected void activate() {
+ appId = coreService.registerApplication(APP_NAME);
+
+ edgeService.addListener(edgeListener);
+ edgeService.getEdgePoints().forEach(this::addDefault);
+ }
+
+ @Deactivate
+ protected void deactivate() {
+ edgeService.removeListener(edgeListener);
+ neighbourResolutionService.unregisterNeighbourHandlers(appId);
+ }
+
+ private void addDefault(ConnectPoint port) {
+ neighbourResolutionService.registerNeighbourHandler(port, defaultHandler, appId);
+ }
+
+ private void removeDefault(ConnectPoint port) {
+ neighbourResolutionService.unregisterNeighbourHandler(port, defaultHandler, appId);
+ }
+
+ private class InternalEdgeListener implements EdgePortListener {
+ @Override
+ public void event(EdgePortEvent event) {
+ switch (event.type()) {
+ case EDGE_PORT_ADDED:
+ addDefault(event.subject());
+ break;
+ case EDGE_PORT_REMOVED:
+ removeDefault(event.subject());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
diff --git a/apps/proxyarp/src/main/java/org/onosproject/proxyarp/ProxyArp.java b/apps/proxyarp/src/main/java/org/onosproject/proxyarp/ProxyArp.java
index 612301e099..d441aeed58 100644
--- a/apps/proxyarp/src/main/java/org/onosproject/proxyarp/ProxyArp.java
+++ b/apps/proxyarp/src/main/java/org/onosproject/proxyarp/ProxyArp.java
@@ -51,8 +51,11 @@ import static org.slf4j.LoggerFactory.getLogger;
/**
* Sample reactive proxy arp application.
+ *
+ * @deprecated in Hummingbird release
*/
-@Component(immediate = true)
+@Deprecated
+@Component(enabled = false)
public class ProxyArp {
private final Logger log = getLogger(getClass());
diff --git a/apps/proxyarp/src/main/java/org/onosproject/proxyarp/package-info.java b/apps/proxyarp/src/main/java/org/onosproject/proxyarp/package-info.java
index d8ed846308..960382ff9c 100644
--- a/apps/proxyarp/src/main/java/org/onosproject/proxyarp/package-info.java
+++ b/apps/proxyarp/src/main/java/org/onosproject/proxyarp/package-info.java
@@ -15,6 +15,6 @@
*/
/**
- * Proxy Arp application that handles arp resolution for you.
+ * Application that handles ARP and NDP resolution on a single L2 broadcast domain.
*/
package org.onosproject.proxyarp;
diff --git a/cli/src/main/java/org/onosproject/cli/net/NeighbourHandlersListCommand.java b/cli/src/main/java/org/onosproject/cli/net/NeighbourHandlersListCommand.java
new file mode 100644
index 0000000000..1fd618eedd
--- /dev/null
+++ b/cli/src/main/java/org/onosproject/cli/net/NeighbourHandlersListCommand.java
@@ -0,0 +1,46 @@
+/*
+ * 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.cli.net;
+
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.incubator.net.neighbour.NeighbourResolutionService;
+
+/**
+ * Lists neighbour message handlers.
+ */
+@Command(scope = "onos", name = "neighbour-handlers",
+ description = "Lists neighbour message handlers")
+public class NeighbourHandlersListCommand extends AbstractShellCommand {
+
+ private static final String FORMAT = "%20s: interface=%s, class=%s";
+
+ @Override
+ protected void execute() {
+ NeighbourResolutionService service = get(NeighbourResolutionService.class);
+
+ service.getHandlerRegistrations().forEach((cp, list) -> {
+ list.forEach(hr -> print(FORMAT, cp, intfToName(hr.intf()),
+ hr.handler().getClass().getCanonicalName()));
+ });
+ }
+
+ private String intfToName(Interface intf) {
+ return (intf == null) ? "(None)" : intf.name();
+ }
+}
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 5664cc3816..4da1d8bd2c 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -485,6 +485,9 @@
+
+
+
diff --git a/core/api/src/main/java/org/onosproject/net/proxyarp/ProxyArpService.java b/core/api/src/main/java/org/onosproject/net/proxyarp/ProxyArpService.java
index 37d91a833c..015a26354b 100644
--- a/core/api/src/main/java/org/onosproject/net/proxyarp/ProxyArpService.java
+++ b/core/api/src/main/java/org/onosproject/net/proxyarp/ProxyArpService.java
@@ -22,8 +22,11 @@ import org.onosproject.net.packet.PacketContext;
/**
* Service for processing ARP or NDP requests on behalf of applications.
+ *
+ * @deprecated in Hummingbird release. Use NeighbourResolutionService instead.
*/
// TODO: move to the peer host package
+@Deprecated
public interface ProxyArpService {
/**
diff --git a/core/api/src/main/java/org/onosproject/net/proxyarp/ProxyArpStore.java b/core/api/src/main/java/org/onosproject/net/proxyarp/ProxyArpStore.java
index e386fb1460..708f92fa72 100644
--- a/core/api/src/main/java/org/onosproject/net/proxyarp/ProxyArpStore.java
+++ b/core/api/src/main/java/org/onosproject/net/proxyarp/ProxyArpStore.java
@@ -22,7 +22,11 @@ import java.nio.ByteBuffer;
/**
* State distribution mechanism for the proxy ARP service.
+ *
+ * @deprecated in Hummingbird release. This is no longer necessary as there are
+ * other solutions for the problem this was solving.
*/
+@Deprecated
public interface ProxyArpStore {
/**
diff --git a/core/net/src/main/java/org/onosproject/net/proxyarp/impl/ProxyArpManager.java b/core/net/src/main/java/org/onosproject/net/proxyarp/impl/ProxyArpManager.java
index 0c84651a37..3937e9c256 100644
--- a/core/net/src/main/java/org/onosproject/net/proxyarp/impl/ProxyArpManager.java
+++ b/core/net/src/main/java/org/onosproject/net/proxyarp/impl/ProxyArpManager.java
@@ -63,7 +63,12 @@ import static org.onosproject.security.AppGuard.checkPermission;
import static org.slf4j.LoggerFactory.getLogger;
import static org.onosproject.security.AppPermission.Type.*;
-
+/**
+ * Implementation of the proxy ARP service.
+ *
+ * @deprecated in Hummingbird release
+ */
+@Deprecated
@Component(immediate = true)
@Service
public class ProxyArpManager implements ProxyArpService {
diff --git a/core/store/dist/src/main/java/org/onosproject/store/proxyarp/impl/DistributedProxyArpStore.java b/core/store/dist/src/main/java/org/onosproject/store/proxyarp/impl/DistributedProxyArpStore.java
index f388aa9eb0..00768dcfce 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/proxyarp/impl/DistributedProxyArpStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/proxyarp/impl/DistributedProxyArpStore.java
@@ -50,7 +50,11 @@ import static org.onlab.util.Tools.groupedThreads;
/**
* Implementation of proxy ARP distribution mechanism.
+ *
+ * @deprecated in Hummingbird release. This is no longer necessary as there are
+ * other solutions for the problem this was solving.
*/
+@Deprecated
@Component(immediate = true)
@Service
public class DistributedProxyArpStore implements ProxyArpStore {
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourHandlerRegistration.java b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourHandlerRegistration.java
new file mode 100644
index 0000000000..cc800a3c56
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourHandlerRegistration.java
@@ -0,0 +1,47 @@
+/*
+ * 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 org.onosproject.core.ApplicationId;
+import org.onosproject.incubator.net.intf.Interface;
+
+/**
+ * Information about the registration of a neighbour message handler.
+ */
+public interface NeighbourHandlerRegistration {
+
+ /**
+ * Gets the interface of the registration.
+ *
+ * @return interface
+ */
+ Interface intf();
+
+ /**
+ * Gets the neighbour message handler.
+ *
+ * @return message handler
+ */
+ NeighbourMessageHandler handler();
+
+ /**
+ * Gets the ID of the application that registered the handler.
+ *
+ * @return application ID
+ */
+ ApplicationId appId();
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageContext.java b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageContext.java
index f498f17e8d..0c609ae05a 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageContext.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageContext.java
@@ -75,6 +75,16 @@ public interface NeighbourMessageContext {
*/
MacAddress srcMac();
+ /**
+ * Gets the destination MAC address of the message.
+ *
+ * Only valid for reply packets, will be null for request packets.
+ *
+ *
+ * @return target MAC address
+ */
+ MacAddress dstMac();
+
/**
* Gets the target IP address of the message.
*
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourResolutionService.java b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourResolutionService.java
index 94401ccf6a..4e4adb94ad 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourResolutionService.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourResolutionService.java
@@ -17,9 +17,13 @@
package org.onosproject.incubator.net.neighbour;
import com.google.common.annotations.Beta;
+import org.onosproject.core.ApplicationId;
import org.onosproject.incubator.net.intf.Interface;
import org.onosproject.net.ConnectPoint;
+import java.util.Collection;
+import java.util.Map;
+
/**
* Provides a means of registering logic for handling neighbour messages.
*/
@@ -32,8 +36,10 @@ public interface NeighbourResolutionService {
*
* @param connectPoint connect point
* @param handler neighbour message handler
+ * @param appId application ID
*/
- void registerNeighbourHandler(ConnectPoint connectPoint, NeighbourMessageHandler handler);
+ void registerNeighbourHandler(ConnectPoint connectPoint, NeighbourMessageHandler handler,
+ ApplicationId appId);
/**
* Registers a neighbour message handler for all neighbour messages incoming
@@ -42,8 +48,10 @@ public interface NeighbourResolutionService {
*
* @param intf interface
* @param handler neighbour message handler
+ * @param appId application ID
*/
- void registerNeighbourHandler(Interface intf, NeighbourMessageHandler handler);
+ void registerNeighbourHandler(Interface intf, NeighbourMessageHandler handler,
+ ApplicationId appId);
/**
* Unregisters a neighbour message handler that was assigned to a connect
@@ -51,14 +59,34 @@ public interface NeighbourResolutionService {
*
* @param connectPoint connect point
* @param handler neighbour message handler
+ * @param appId application ID
*/
- void unregisterNeighbourHandler(ConnectPoint connectPoint, NeighbourMessageHandler handler);
+ void unregisterNeighbourHandler(ConnectPoint connectPoint, NeighbourMessageHandler handler,
+ ApplicationId appId);
/**
* Unregisters a neighbour message handler that was assigned to an interface.
*
* @param intf interface
* @param handler neighbour message handler
+ * @param appId application ID
*/
- void unregisterNeighbourHandler(Interface intf, NeighbourMessageHandler handler);
+ void unregisterNeighbourHandler(Interface intf, NeighbourMessageHandler handler,
+ ApplicationId appId);
+
+ /**
+ * Unregisters all neighbour handlers that were registered by the given
+ * application.
+ *
+ * @param appId application ID
+ */
+ void unregisterNeighbourHandlers(ApplicationId appId);
+
+ /**
+ * Gets the neighbour message handlers that have been registered with the
+ * service.
+ *
+ * @return neighbour message handlers indexed by connect point
+ */
+ Map> getHandlerRegistrations();
}
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/DefaultNeighbourMessageContext.java b/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/DefaultNeighbourMessageContext.java
index e056f79449..44e97f9cad 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/DefaultNeighbourMessageContext.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/DefaultNeighbourMessageContext.java
@@ -105,7 +105,12 @@ public class DefaultNeighbourMessageContext implements NeighbourMessageContext {
@Override
public MacAddress srcMac() {
- return MacAddress.valueOf(eth.getSourceMACAddress());
+ return eth.getSourceMAC();
+ }
+
+ @Override
+ public MacAddress dstMac() {
+ return eth.getDestinationMAC();
}
@Override
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/NeighbourPacketManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/NeighbourPacketManager.java
index 2292ecbb2e..e0e9c98b36 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/NeighbourPacketManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/NeighbourPacketManager.java
@@ -16,9 +16,10 @@
package org.onosproject.incubator.net.neighbour.impl;
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Multimaps;
+import com.google.common.collect.SetMultimap;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
@@ -33,6 +34,7 @@ import org.onlab.packet.ICMP6;
import org.onlab.packet.IPv6;
import org.onlab.packet.Ip4Address;
import org.onlab.packet.Ip6Address;
+import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onlab.packet.VlanId;
import org.onlab.packet.ndp.NeighborAdvertisement;
@@ -42,6 +44,7 @@ import org.onosproject.cfg.ComponentConfigService;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.incubator.net.neighbour.NeighbourHandlerRegistration;
import org.onosproject.incubator.net.neighbour.NeighbourMessageActions;
import org.onosproject.incubator.net.neighbour.NeighbourMessageContext;
import org.onosproject.incubator.net.neighbour.NeighbourMessageHandler;
@@ -63,8 +66,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.ByteBuffer;
+import java.util.Collection;
import java.util.Dictionary;
-import java.util.List;
+import java.util.Iterator;
+import java.util.Map;
import java.util.Objects;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -79,7 +84,7 @@ import static org.onosproject.net.packet.PacketPriority.CONTROL;
* Manages handlers for neighbour messages.
*/
@Service
-@Component(immediate = true, enabled = false)
+@Component(immediate = true)
public class NeighbourPacketManager implements NeighbourResolutionService {
private final Logger log = LoggerFactory.getLogger(getClass());
@@ -106,8 +111,8 @@ public class NeighbourPacketManager implements NeighbourResolutionService {
private static final String APP_NAME = "org.onosproject.neighbour";
private ApplicationId appId;
- private ListMultimap packetHandlers =
- Multimaps.synchronizedListMultimap(LinkedListMultimap.create());
+ private SetMultimap packetHandlers =
+ Multimaps.synchronizedSetMultimap(HashMultimap.create());
private final InternalPacketProcessor processor = new InternalPacketProcessor();
private final InternalNeighbourMessageActions actions = new InternalNeighbourMessageActions();
@@ -191,23 +196,52 @@ public class NeighbourPacketManager implements NeighbourResolutionService {
}
@Override
- public void registerNeighbourHandler(ConnectPoint connectPoint, NeighbourMessageHandler handler) {
- packetHandlers.put(connectPoint, new HandlerRegistration(handler));
+ public void registerNeighbourHandler(ConnectPoint connectPoint,
+ NeighbourMessageHandler handler,
+ ApplicationId appId) {
+ packetHandlers.put(connectPoint, new HandlerRegistration(handler, appId));
}
@Override
- public void registerNeighbourHandler(Interface intf, NeighbourMessageHandler handler) {
- packetHandlers.put(intf.connectPoint(), new HandlerRegistration(handler, intf));
+ public void registerNeighbourHandler(Interface intf,
+ NeighbourMessageHandler handler,
+ ApplicationId appId) {
+ packetHandlers.put(intf.connectPoint(),
+ new HandlerRegistration(handler, intf, appId));
}
@Override
- public void unregisterNeighbourHandler(ConnectPoint connectPoint, NeighbourMessageHandler handler) {
- packetHandlers.remove(connectPoint, handler);
+ public void unregisterNeighbourHandler(ConnectPoint connectPoint,
+ NeighbourMessageHandler handler,
+ ApplicationId appId) {
+ packetHandlers.remove(connectPoint, new HandlerRegistration(handler, appId));
}
@Override
- public void unregisterNeighbourHandler(Interface intf, NeighbourMessageHandler handler) {
- packetHandlers.remove(intf.connectPoint(), handler);
+ public void unregisterNeighbourHandler(Interface intf,
+ NeighbourMessageHandler handler,
+ ApplicationId appId) {
+ packetHandlers.remove(intf.connectPoint(),
+ new HandlerRegistration(handler, intf, appId));
+ }
+
+ @Override
+ public void unregisterNeighbourHandlers(ApplicationId appId) {
+ synchronized (packetHandlers) {
+ Iterator it = packetHandlers.values().iterator();
+
+ while (it.hasNext()) {
+ NeighbourHandlerRegistration registration = it.next();
+ if (registration.appId().equals(appId)) {
+ it.remove();
+ }
+ }
+ }
+ }
+
+ @Override
+ public Map> getHandlerRegistrations() {
+ return ImmutableMap.copyOf(Multimaps.asMap(packetHandlers));
}
public void handlePacket(PacketContext context) {
@@ -227,7 +261,7 @@ public class NeighbourPacketManager implements NeighbourResolutionService {
}
private void handleMessage(NeighbourMessageContext context) {
- List handlers = packetHandlers.get(context.inPort());
+ Collection handlers = packetHandlers.get(context.inPort());
handlers.forEach(registration -> {
if (registration.intf() == null || matches(context, registration.intf())) {
@@ -236,18 +270,53 @@ public class NeighbourPacketManager implements NeighbourResolutionService {
});
}
+ /**
+ * Checks that incoming packet matches the parameters of the interface.
+ * This means that if the interface specifies a particular parameter
+ * (VLAN, IP address, etc.) then the incoming packet should match those
+ * parameters.
+ *
+ * @param context incoming message context
+ * @param intf interface to check
+ * @return true if the incoming message matches the interface, otherwise false
+ */
private boolean matches(NeighbourMessageContext context, Interface intf) {
checkNotNull(context);
checkNotNull(intf);
boolean matches = true;
+ // For non-broadcast packets, if the interface has a MAC address check that
+ // the destination MAC address of the packet matches the interface MAC
+ if (!context.dstMac().isBroadcast() &&
+ !intf.mac().equals(MacAddress.NONE) &&
+ !intf.mac().equals(context.dstMac())) {
+ matches = false;
+ }
+ // If the interface has a VLAN, check that the packet's VLAN matches
if (!intf.vlan().equals(VlanId.NONE) && !intf.vlan().equals(context.vlan())) {
matches = false;
}
+ // If the interface has IP addresses, check that the packet's target IP
+ // address matches one of the interface IP addresses
+ if (!intf.ipAddressesList().isEmpty() && !hasIp(intf, context.target())) {
+ matches = false;
+ }
return matches;
}
+ /**
+ * Returns true if the interface has the given IP address.
+ *
+ * @param intf interface to check
+ * @param ip IP address
+ * @return true if the IP is configured on the interface, otherwise false
+ */
+ private boolean hasIp(Interface intf, IpAddress ip) {
+ return intf.ipAddressesList().stream()
+ .anyMatch(intfAddress -> intfAddress.ipAddress().equals(ip));
+ }
+
private void reply(NeighbourMessageContext context, MacAddress targetMac) {
switch (context.protocol()) {
@@ -295,7 +364,7 @@ public class NeighbourPacketManager implements NeighbourResolutionService {
}
/**
- * Builds an Neighbor Discovery reply based on a request.
+ * Builds an NDP reply based on a request.
*
* @param srcIp the IP address to use as the reply source
* @param srcMac the MAC address to use as the reply source
@@ -336,17 +405,18 @@ public class NeighbourPacketManager implements NeighbourResolutionService {
/**
* Stores a neighbour message handler registration.
*/
- private class HandlerRegistration {
+ private class HandlerRegistration implements NeighbourHandlerRegistration {
private final Interface intf;
private final NeighbourMessageHandler handler;
+ private final ApplicationId appId;
/**
* Creates a new handler registration.
*
* @param handler neighbour message handler
*/
- public HandlerRegistration(NeighbourMessageHandler handler) {
- this(handler, null);
+ public HandlerRegistration(NeighbourMessageHandler handler, ApplicationId appId) {
+ this(handler, null, appId);
}
/**
@@ -355,29 +425,27 @@ public class NeighbourPacketManager implements NeighbourResolutionService {
* @param handler neighbour message handler
* @param intf interface
*/
- public HandlerRegistration(NeighbourMessageHandler handler, Interface intf) {
+ public HandlerRegistration(NeighbourMessageHandler handler, Interface intf, ApplicationId appId) {
this.intf = intf;
this.handler = handler;
+ this.appId = appId;
}
- /**
- * Gets the interface of the registration.
- *
- * @return interface
- */
+ @Override
public Interface intf() {
return intf;
}
- /**
- * Gets the neighbour message handler.
- *
- * @return message handler
- */
+ @Override
public NeighbourMessageHandler handler() {
return handler;
}
+ @Override
+ public ApplicationId appId() {
+ return appId;
+ }
+
@Override
public boolean equals(Object other) {
if (this == other) {
@@ -391,12 +459,13 @@ public class NeighbourPacketManager implements NeighbourResolutionService {
HandlerRegistration that = (HandlerRegistration) other;
return Objects.equals(intf, that.intf) &&
- Objects.equals(handler, that.handler);
+ Objects.equals(handler, that.handler) &&
+ Objects.equals(appId, that.appId);
}
@Override
public int hashCode() {
- return Objects.hash(intf, handler);
+ return Objects.hash(intf, handler, appId);
}
}
@@ -450,7 +519,7 @@ public class NeighbourPacketManager implements NeighbourResolutionService {
@Override
public void proxy(NeighbourMessageContext context, Interface outIntf) {
-
+ // TODO implement
}
@Override