Include logic for cancelling requests for packets.
Change-Id: I8244b8e417dd2b4c6feae57b810fe750635e87a7
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 afcd4ee..6586a4e 100644
--- a/apps/proxyarp/src/main/java/org/onosproject/proxyarp/ProxyArp.java
+++ b/apps/proxyarp/src/main/java/org/onosproject/proxyarp/ProxyArp.java
@@ -23,8 +23,6 @@
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onlab.packet.Ethernet;
-import org.onlab.packet.ICMP6;
-import org.onlab.packet.IPv6;
import org.onosproject.cfg.ComponentConfigService;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
@@ -32,7 +30,6 @@
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.packet.InboundPacket;
import org.onosproject.net.packet.PacketContext;
-import org.onosproject.net.packet.PacketPriority;
import org.onosproject.net.packet.PacketProcessor;
import org.onosproject.net.packet.PacketService;
import org.onosproject.net.proxyarp.ProxyArpService;
@@ -42,6 +39,12 @@
import java.util.Dictionary;
import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.onlab.packet.Ethernet.TYPE_ARP;
+import static org.onlab.packet.Ethernet.TYPE_IPV6;
+import static org.onlab.packet.ICMP6.NEIGHBOR_ADVERTISEMENT;
+import static org.onlab.packet.ICMP6.NEIGHBOR_SOLICITATION;
+import static org.onlab.packet.IPv6.PROTOCOL_ICMP6;
+import static org.onosproject.net.packet.PacketPriority.CONTROL;
import static org.slf4j.LoggerFactory.getLogger;
/**
@@ -86,8 +89,8 @@
@Deactivate
public void deactivate() {
- // TODO revoke all packet requests when deactivate
cfgService.unregisterProperties(getClass(), false);
+ withdrawIntercepts();
packetService.removeProcessor(processor);
processor = null;
log.info("Stopped");
@@ -95,7 +98,6 @@
@Modified
public void modified(ComponentContext context) {
- // TODO revoke unnecessary packet requests when config being modified
readComponentConfiguration(context);
requestPackests();
}
@@ -106,27 +108,58 @@
private void requestPackests() {
TrafficSelector.Builder selectorBuilder =
DefaultTrafficSelector.builder();
- selectorBuilder.matchEthType(Ethernet.TYPE_ARP);
+ selectorBuilder.matchEthType(TYPE_ARP);
packetService.requestPackets(selectorBuilder.build(),
- PacketPriority.CONTROL, appId);
+ CONTROL, appId);
+ selectorBuilder = DefaultTrafficSelector.builder();
+ selectorBuilder.matchEthType(TYPE_IPV6);
+ selectorBuilder.matchIPProtocol(PROTOCOL_ICMP6);
+ selectorBuilder.matchIcmpv6Type(NEIGHBOR_SOLICITATION);
if (ipv6NeighborDiscovery) {
// IPv6 Neighbor Solicitation packet.
- selectorBuilder = DefaultTrafficSelector.builder();
- selectorBuilder.matchEthType(Ethernet.TYPE_IPV6);
- selectorBuilder.matchIPProtocol(IPv6.PROTOCOL_ICMP6);
- selectorBuilder.matchIcmpv6Type(ICMP6.NEIGHBOR_SOLICITATION);
packetService.requestPackets(selectorBuilder.build(),
- PacketPriority.CONTROL, appId);
-
- // IPv6 Neighbor Advertisement packet.
- selectorBuilder = DefaultTrafficSelector.builder();
- selectorBuilder.matchEthType(Ethernet.TYPE_IPV6);
- selectorBuilder.matchIPProtocol(IPv6.PROTOCOL_ICMP6);
- selectorBuilder.matchIcmpv6Type(ICMP6.NEIGHBOR_ADVERTISEMENT);
- packetService.requestPackets(selectorBuilder.build(),
- PacketPriority.CONTROL, appId);
+ CONTROL, appId);
+ } else {
+ packetService.cancelPackets(selectorBuilder.build(),
+ CONTROL, appId);
}
+
+ // IPv6 Neighbor Advertisement packet.
+ selectorBuilder = DefaultTrafficSelector.builder();
+ selectorBuilder.matchEthType(TYPE_IPV6);
+ selectorBuilder.matchIPProtocol(PROTOCOL_ICMP6);
+ selectorBuilder.matchIcmpv6Type(NEIGHBOR_ADVERTISEMENT);
+ if (ipv6NeighborDiscovery) {
+ packetService.requestPackets(selectorBuilder.build(),
+ CONTROL, appId);
+ } else {
+ packetService.cancelPackets(selectorBuilder.build(),
+ CONTROL, appId);
+ }
+
+
+ }
+
+ /**
+ * Cancel requested packet in via packet service.
+ */
+ private void withdrawIntercepts() {
+ TrafficSelector.Builder selectorBuilder =
+ DefaultTrafficSelector.builder();
+ selectorBuilder.matchEthType(TYPE_ARP);
+ packetService.cancelPackets(selectorBuilder.build(), CONTROL, appId);
+ selectorBuilder = DefaultTrafficSelector.builder();
+ selectorBuilder.matchEthType(TYPE_IPV6);
+ selectorBuilder.matchIPProtocol(PROTOCOL_ICMP6);
+ selectorBuilder.matchIcmpv6Type(NEIGHBOR_SOLICITATION);
+ packetService.cancelPackets(selectorBuilder.build(), CONTROL, appId);
+ selectorBuilder = DefaultTrafficSelector.builder();
+ selectorBuilder.matchEthType(TYPE_IPV6);
+ selectorBuilder.matchIPProtocol(PROTOCOL_ICMP6);
+ selectorBuilder.matchIcmpv6Type(NEIGHBOR_ADVERTISEMENT);
+ packetService.cancelPackets(selectorBuilder.build(), CONTROL, appId);
+
}
/**
@@ -187,7 +220,7 @@
if (ethPkt == null) {
return;
}
- if (!ipv6NeighborDiscovery && (ethPkt.getEtherType() == Ethernet.TYPE_IPV6)) {
+ if (!ipv6NeighborDiscovery && (ethPkt.getEtherType() == TYPE_IPV6)) {
return;
}
//handle the arp packet.