Aaron Kruglikov
Committed by Gerrit Code Review

Include logic for cancelling requests for packets.

Change-Id: I8244b8e417dd2b4c6feae57b810fe750635e87a7
...@@ -54,7 +54,6 @@ import org.onosproject.net.packet.DefaultOutboundPacket; ...@@ -54,7 +54,6 @@ import org.onosproject.net.packet.DefaultOutboundPacket;
54 import org.onosproject.net.packet.InboundPacket; 54 import org.onosproject.net.packet.InboundPacket;
55 import org.onosproject.net.packet.OutboundPacket; 55 import org.onosproject.net.packet.OutboundPacket;
56 import org.onosproject.net.packet.PacketContext; 56 import org.onosproject.net.packet.PacketContext;
57 -import org.onosproject.net.packet.PacketPriority;
58 import org.onosproject.net.packet.PacketProcessor; 57 import org.onosproject.net.packet.PacketProcessor;
59 import org.onosproject.net.packet.PacketService; 58 import org.onosproject.net.packet.PacketService;
60 import org.onosproject.xosintegration.VoltTenantService; 59 import org.onosproject.xosintegration.VoltTenantService;
...@@ -71,6 +70,7 @@ import java.util.Map; ...@@ -71,6 +70,7 @@ import java.util.Map;
71 import java.util.Optional; 70 import java.util.Optional;
72 import java.util.Set; 71 import java.util.Set;
73 72
73 +import static org.onosproject.net.packet.PacketPriority.CONTROL;
74 import static org.slf4j.LoggerFactory.getLogger; 74 import static org.slf4j.LoggerFactory.getLogger;
75 75
76 76
...@@ -117,7 +117,7 @@ public class AAA { ...@@ -117,7 +117,7 @@ public class AAA {
117 // RADIUS server shared secret 117 // RADIUS server shared secret
118 private static final String DEFAULT_RADIUS_SECRET = "ONOSecret"; 118 private static final String DEFAULT_RADIUS_SECRET = "ONOSecret";
119 // RADIUS MAC address 119 // RADIUS MAC address
120 - private static final String RADIUS_MAC_ADDRESS = "00:00:00:00:01:10"; 120 + private static final String RADIUS_MAC_ADDRESS = "00:00:00:00:01:10";
121 // NAS MAC address 121 // NAS MAC address
122 private static final String NAS_MAC_ADDRESS = "00:00:00:00:10:01"; 122 private static final String NAS_MAC_ADDRESS = "00:00:00:00:10:01";
123 // Radius Switch Id 123 // Radius Switch Id
...@@ -130,7 +130,7 @@ public class AAA { ...@@ -130,7 +130,7 @@ public class AAA {
130 private String radiusIpAddress = DEFAULT_RADIUS_IP; 130 private String radiusIpAddress = DEFAULT_RADIUS_IP;
131 131
132 @Property(name = "nasIpAddress", value = DEFAULT_NAS_IP, 132 @Property(name = "nasIpAddress", value = DEFAULT_NAS_IP,
133 - label = "NAP IP Address") 133 + label = "NAS IP Address")
134 private String nasIpAddress = DEFAULT_NAS_IP; 134 private String nasIpAddress = DEFAULT_NAS_IP;
135 135
136 @Property(name = "radiusMacAddress", value = RADIUS_MAC_ADDRESS, 136 @Property(name = "radiusMacAddress", value = RADIUS_MAC_ADDRESS,
...@@ -138,7 +138,7 @@ public class AAA { ...@@ -138,7 +138,7 @@ public class AAA {
138 private String radiusMacAddress = RADIUS_MAC_ADDRESS; 138 private String radiusMacAddress = RADIUS_MAC_ADDRESS;
139 139
140 @Property(name = "nasMacAddress", value = NAS_MAC_ADDRESS, 140 @Property(name = "nasMacAddress", value = NAS_MAC_ADDRESS,
141 - label = "NAP MAC Address") 141 + label = "NAS MAC Address")
142 private String nasMacAddress = NAS_MAC_ADDRESS; 142 private String nasMacAddress = NAS_MAC_ADDRESS;
143 143
144 @Property(name = "radiusSecret", value = DEFAULT_RADIUS_SECRET, 144 @Property(name = "radiusSecret", value = DEFAULT_RADIUS_SECRET,
...@@ -205,12 +205,7 @@ public class AAA { ...@@ -205,12 +205,7 @@ public class AAA {
205 appId = coreService.registerApplication("org.onosproject.aaa"); 205 appId = coreService.registerApplication("org.onosproject.aaa");
206 // register our event handler 206 // register our event handler
207 packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 2); 207 packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 2);
208 - TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); 208 + requestIntercepts();
209 -
210 - selector.matchEthType(EthType.EtherType.EAPOL.ethType().toShort());
211 - packetService.requestPackets(selector.build(),
212 - PacketPriority.CONTROL, appId);
213 -
214 // Instantiate the map of the state machines 209 // Instantiate the map of the state machines
215 stateMachineMap = Collections.synchronizedMap(Maps.newHashMap()); 210 stateMachineMap = Collections.synchronizedMap(Maps.newHashMap());
216 211
...@@ -221,22 +216,45 @@ public class AAA { ...@@ -221,22 +216,45 @@ public class AAA {
221 @Deactivate 216 @Deactivate
222 public void deactivate() { 217 public void deactivate() {
223 cfgService.unregisterProperties(getClass(), false); 218 cfgService.unregisterProperties(getClass(), false);
219 +
220 + appId = coreService.registerApplication("org.onosproject.aaa");
221 + withdrawIntercepts();
224 // de-register and null our handler 222 // de-register and null our handler
225 packetService.removeProcessor(processor); 223 packetService.removeProcessor(processor);
226 processor = null; 224 processor = null;
227 } 225 }
228 226
229 /** 227 /**
228 + * Request packet in via PacketService.
229 + */
230 + private void requestIntercepts() {
231 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
232 + selector.matchEthType(EthType.EtherType.EAPOL.ethType().toShort());
233 + packetService.requestPackets(selector.build(),
234 + CONTROL, appId);
235 + }
236 +
237 + /**
238 + * Cancel request for packet in via PacketService.
239 + */
240 + private void withdrawIntercepts() {
241 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
242 + selector.matchEthType(EthType.EtherType.EAPOL.ethType().toShort());
243 + packetService.cancelPackets(selector.build(), CONTROL, appId);
244 + }
245 +
246 + /**
230 * Builds an EAPOL packet based on the given parameters. 247 * Builds an EAPOL packet based on the given parameters.
231 * 248 *
232 - * @param dstMac destination MAC address 249 + * @param dstMac destination MAC address
233 - * @param srcMac source MAC address 250 + * @param srcMac source MAC address
251 + * @param vlan vlan identifier
234 * @param eapolType EAPOL type 252 * @param eapolType EAPOL type
235 - * @param eap EAP payload 253 + * @param eap EAP payload
236 * @return Ethernet frame 254 * @return Ethernet frame
237 */ 255 */
238 private static Ethernet buildEapolResponse(MacAddress dstMac, MacAddress srcMac, 256 private static Ethernet buildEapolResponse(MacAddress dstMac, MacAddress srcMac,
239 - short vlan, byte eapolType, EAP eap) { 257 + short vlan, byte eapolType, EAP eap) {
240 258
241 Ethernet eth = new Ethernet(); 259 Ethernet eth = new Ethernet();
242 eth.setDestinationMACAddress(dstMac.toBytes()); 260 eth.setDestinationMACAddress(dstMac.toBytes());
...@@ -328,9 +346,9 @@ public class AAA { ...@@ -328,9 +346,9 @@ public class AAA {
328 346
329 //send an EAP Request/Identify to the supplicant 347 //send an EAP Request/Identify to the supplicant
330 EAP eapPayload = new EAP(EAP.REQUEST, stateMachine.getIdentifier(), EAP.ATTR_IDENTITY, null); 348 EAP eapPayload = new EAP(EAP.REQUEST, stateMachine.getIdentifier(), EAP.ATTR_IDENTITY, null);
331 - Ethernet eth = buildEapolResponse(srcMAC, MacAddress.valueOf(1L), 349 + Ethernet eth = buildEapolResponse(srcMAC, MacAddress.valueOf(1L),
332 - ethPkt.getVlanID(), EAPOL.EAPOL_PACKET, 350 + ethPkt.getVlanID(), EAPOL.EAPOL_PACKET,
333 - eapPayload); 351 + eapPayload);
334 stateMachine.supplicantAddress = srcMAC; 352 stateMachine.supplicantAddress = srcMAC;
335 stateMachine.vlanId = ethPkt.getVlanID(); 353 stateMachine.vlanId = ethPkt.getVlanID();
336 354
...@@ -350,13 +368,13 @@ public class AAA { ...@@ -350,13 +368,13 @@ public class AAA {
350 try { 368 try {
351 //request id access to RADIUS 369 //request id access to RADIUS
352 RADIUS radiusPayload = new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST, 370 RADIUS radiusPayload = new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST,
353 - eapPacket.getIdentifier()); 371 + eapPacket.getIdentifier());
354 radiusPayload.setIdentifier(stateMachine.getIdentifier()); 372 radiusPayload.setIdentifier(stateMachine.getIdentifier());
355 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME, 373 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME,
356 - eapPacket.getData()); 374 + eapPacket.getData());
357 stateMachine.setUsername(eapPacket.getData()); 375 stateMachine.setUsername(eapPacket.getData());
358 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP, 376 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP,
359 - AAA.this.parsedNasIpAddress.getAddress()); 377 + AAA.this.parsedNasIpAddress.getAddress());
360 378
361 radiusPayload.encapsulateMessage(eapPacket); 379 radiusPayload.encapsulateMessage(eapPacket);
362 380
...@@ -377,17 +395,17 @@ public class AAA { ...@@ -377,17 +395,17 @@ public class AAA {
377 if (eapPacket.getIdentifier() == stateMachine.getChallengeIdentifier()) { 395 if (eapPacket.getIdentifier() == stateMachine.getChallengeIdentifier()) {
378 //send the RADIUS challenge response 396 //send the RADIUS challenge response
379 RADIUS radiusPayload = new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST, 397 RADIUS radiusPayload = new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST,
380 - eapPacket.getIdentifier()); 398 + eapPacket.getIdentifier());
381 radiusPayload.setIdentifier(stateMachine.getChallengeIdentifier()); 399 radiusPayload.setIdentifier(stateMachine.getChallengeIdentifier());
382 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME, 400 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME,
383 - stateMachine.getUsername()); 401 + stateMachine.getUsername());
384 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP, 402 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP,
385 - AAA.this.parsedNasIpAddress.getAddress()); 403 + AAA.this.parsedNasIpAddress.getAddress());
386 404
387 radiusPayload.encapsulateMessage(eapPacket); 405 radiusPayload.encapsulateMessage(eapPacket);
388 406
389 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_STATE, 407 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_STATE,
390 - stateMachine.getChallengeState()); 408 + stateMachine.getChallengeState());
391 radiusPayload.addMessageAuthenticator(AAA.this.radiusSecret); 409 radiusPayload.addMessageAuthenticator(AAA.this.radiusSecret);
392 sendRadiusMessage(radiusPayload); 410 sendRadiusMessage(radiusPayload);
393 } 411 }
...@@ -396,17 +414,17 @@ public class AAA { ...@@ -396,17 +414,17 @@ public class AAA {
396 try { 414 try {
397 //request id access to RADIUS 415 //request id access to RADIUS
398 RADIUS radiusPayload = new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST, 416 RADIUS radiusPayload = new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST,
399 - eapPacket.getIdentifier()); 417 + eapPacket.getIdentifier());
400 radiusPayload.setIdentifier(stateMachine.getIdentifier()); 418 radiusPayload.setIdentifier(stateMachine.getIdentifier());
401 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME, 419 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME,
402 - stateMachine.getUsername()); 420 + stateMachine.getUsername());
403 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP, 421 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP,
404 - AAA.this.parsedNasIpAddress.getAddress()); 422 + AAA.this.parsedNasIpAddress.getAddress());
405 423
406 radiusPayload.encapsulateMessage(eapPacket); 424 radiusPayload.encapsulateMessage(eapPacket);
407 425
408 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_STATE, 426 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_STATE,
409 - stateMachine.getChallengeState()); 427 + stateMachine.getChallengeState());
410 stateMachine.setRequestAuthenticator(radiusPayload.generateAuthCode()); 428 stateMachine.setRequestAuthenticator(radiusPayload.generateAuthCode());
411 429
412 radiusPayload.addMessageAuthenticator(AAA.this.radiusSecret); 430 radiusPayload.addMessageAuthenticator(AAA.this.radiusSecret);
...@@ -447,7 +465,8 @@ public class AAA { ...@@ -447,7 +465,8 @@ public class AAA {
447 eapPayload = radiusPacket.decapsulateMessage(); 465 eapPayload = radiusPacket.decapsulateMessage();
448 stateMachine.setChallengeInfo(eapPayload.getIdentifier(), challengeState); 466 stateMachine.setChallengeInfo(eapPayload.getIdentifier(), challengeState);
449 eth = buildEapolResponse(stateMachine.supplicantAddress, 467 eth = buildEapolResponse(stateMachine.supplicantAddress,
450 - MacAddress.valueOf(1L), stateMachine.vlanId, EAPOL.EAPOL_PACKET, eapPayload); 468 + MacAddress.valueOf(1L), stateMachine.vlanId, EAPOL.EAPOL_PACKET,
469 + eapPayload);
451 this.sendPacketToSupplicant(eth, stateMachine.supplicantConnectpoint); 470 this.sendPacketToSupplicant(eth, stateMachine.supplicantConnectpoint);
452 break; 471 break;
453 case RADIUS.RADIUS_CODE_ACCESS_ACCEPT: 472 case RADIUS.RADIUS_CODE_ACCESS_ACCEPT:
...@@ -458,7 +477,8 @@ public class AAA { ...@@ -458,7 +477,8 @@ public class AAA {
458 eapPayload = new EAP(); 477 eapPayload = new EAP();
459 eapPayload = (EAP) eapPayload.deserialize(eapMessage, 0, eapMessage.length); 478 eapPayload = (EAP) eapPayload.deserialize(eapMessage, 0, eapMessage.length);
460 eth = buildEapolResponse(stateMachine.supplicantAddress, 479 eth = buildEapolResponse(stateMachine.supplicantAddress,
461 - MacAddress.valueOf(1L), stateMachine.vlanId, EAPOL.EAPOL_PACKET, eapPayload); 480 + MacAddress.valueOf(1L), stateMachine.vlanId, EAPOL.EAPOL_PACKET,
481 + eapPayload);
462 this.sendPacketToSupplicant(eth, stateMachine.supplicantConnectpoint); 482 this.sendPacketToSupplicant(eth, stateMachine.supplicantConnectpoint);
463 483
464 stateMachine.authorizeAccess(); 484 stateMachine.authorizeAccess();
...@@ -556,7 +576,7 @@ public class AAA { ...@@ -556,7 +576,7 @@ public class AAA {
556 TrafficTreatment treatment = DefaultTrafficTreatment.builder() 576 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
557 .setOutput(PortNumber.portNumber(Integer.parseInt(radiusPort))).build(); 577 .setOutput(PortNumber.portNumber(Integer.parseInt(radiusPort))).build();
558 OutboundPacket packet = new DefaultOutboundPacket(DeviceId.deviceId(radiusSwitch), 578 OutboundPacket packet = new DefaultOutboundPacket(DeviceId.deviceId(radiusSwitch),
559 - treatment, ByteBuffer.wrap(ethPkt.serialize())); 579 + treatment, ByteBuffer.wrap(ethPkt.serialize()));
560 packetService.emit(packet); 580 packetService.emit(packet);
561 581
562 } 582 }
...@@ -564,13 +584,13 @@ public class AAA { ...@@ -564,13 +584,13 @@ public class AAA {
564 /** 584 /**
565 * Send the ethernet packet to the supplicant. 585 * Send the ethernet packet to the supplicant.
566 * 586 *
567 - * @param ethernetPkt the ethernet packet 587 + * @param ethernetPkt the ethernet packet
568 * @param connectPoint the connect point to send out 588 * @param connectPoint the connect point to send out
569 */ 589 */
570 private void sendPacketToSupplicant(Ethernet ethernetPkt, ConnectPoint connectPoint) { 590 private void sendPacketToSupplicant(Ethernet ethernetPkt, ConnectPoint connectPoint) {
571 TrafficTreatment treatment = DefaultTrafficTreatment.builder().setOutput(connectPoint.port()).build(); 591 TrafficTreatment treatment = DefaultTrafficTreatment.builder().setOutput(connectPoint.port()).build();
572 OutboundPacket packet = new DefaultOutboundPacket(connectPoint.deviceId(), 592 OutboundPacket packet = new DefaultOutboundPacket(connectPoint.deviceId(),
573 - treatment, ByteBuffer.wrap(ethernetPkt.serialize())); 593 + treatment, ByteBuffer.wrap(ethernetPkt.serialize()));
574 packetService.emit(packet); 594 packetService.emit(packet);
575 } 595 }
576 596
......
...@@ -203,7 +203,7 @@ public class ReactiveForwarding { ...@@ -203,7 +203,7 @@ public class ReactiveForwarding {
203 } 203 }
204 204
205 /** 205 /**
206 - * Request packet in via PacketService. 206 + * Cancel request for packet in via PacketService.
207 */ 207 */
208 private void withdrawIntercepts() { 208 private void withdrawIntercepts() {
209 TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); 209 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
......
...@@ -23,8 +23,6 @@ import org.apache.felix.scr.annotations.Property; ...@@ -23,8 +23,6 @@ import org.apache.felix.scr.annotations.Property;
23 import org.apache.felix.scr.annotations.Reference; 23 import org.apache.felix.scr.annotations.Reference;
24 import org.apache.felix.scr.annotations.ReferenceCardinality; 24 import org.apache.felix.scr.annotations.ReferenceCardinality;
25 import org.onlab.packet.Ethernet; 25 import org.onlab.packet.Ethernet;
26 -import org.onlab.packet.ICMP6;
27 -import org.onlab.packet.IPv6;
28 import org.onosproject.cfg.ComponentConfigService; 26 import org.onosproject.cfg.ComponentConfigService;
29 import org.onosproject.core.ApplicationId; 27 import org.onosproject.core.ApplicationId;
30 import org.onosproject.core.CoreService; 28 import org.onosproject.core.CoreService;
...@@ -32,7 +30,6 @@ import org.onosproject.net.flow.DefaultTrafficSelector; ...@@ -32,7 +30,6 @@ import org.onosproject.net.flow.DefaultTrafficSelector;
32 import org.onosproject.net.flow.TrafficSelector; 30 import org.onosproject.net.flow.TrafficSelector;
33 import org.onosproject.net.packet.InboundPacket; 31 import org.onosproject.net.packet.InboundPacket;
34 import org.onosproject.net.packet.PacketContext; 32 import org.onosproject.net.packet.PacketContext;
35 -import org.onosproject.net.packet.PacketPriority;
36 import org.onosproject.net.packet.PacketProcessor; 33 import org.onosproject.net.packet.PacketProcessor;
37 import org.onosproject.net.packet.PacketService; 34 import org.onosproject.net.packet.PacketService;
38 import org.onosproject.net.proxyarp.ProxyArpService; 35 import org.onosproject.net.proxyarp.ProxyArpService;
...@@ -42,6 +39,12 @@ import org.slf4j.Logger; ...@@ -42,6 +39,12 @@ import org.slf4j.Logger;
42 import java.util.Dictionary; 39 import java.util.Dictionary;
43 40
44 import static com.google.common.base.Strings.isNullOrEmpty; 41 import static com.google.common.base.Strings.isNullOrEmpty;
42 +import static org.onlab.packet.Ethernet.TYPE_ARP;
43 +import static org.onlab.packet.Ethernet.TYPE_IPV6;
44 +import static org.onlab.packet.ICMP6.NEIGHBOR_ADVERTISEMENT;
45 +import static org.onlab.packet.ICMP6.NEIGHBOR_SOLICITATION;
46 +import static org.onlab.packet.IPv6.PROTOCOL_ICMP6;
47 +import static org.onosproject.net.packet.PacketPriority.CONTROL;
45 import static org.slf4j.LoggerFactory.getLogger; 48 import static org.slf4j.LoggerFactory.getLogger;
46 49
47 /** 50 /**
...@@ -86,8 +89,8 @@ public class ProxyArp { ...@@ -86,8 +89,8 @@ public class ProxyArp {
86 89
87 @Deactivate 90 @Deactivate
88 public void deactivate() { 91 public void deactivate() {
89 - // TODO revoke all packet requests when deactivate
90 cfgService.unregisterProperties(getClass(), false); 92 cfgService.unregisterProperties(getClass(), false);
93 + withdrawIntercepts();
91 packetService.removeProcessor(processor); 94 packetService.removeProcessor(processor);
92 processor = null; 95 processor = null;
93 log.info("Stopped"); 96 log.info("Stopped");
...@@ -95,7 +98,6 @@ public class ProxyArp { ...@@ -95,7 +98,6 @@ public class ProxyArp {
95 98
96 @Modified 99 @Modified
97 public void modified(ComponentContext context) { 100 public void modified(ComponentContext context) {
98 - // TODO revoke unnecessary packet requests when config being modified
99 readComponentConfiguration(context); 101 readComponentConfiguration(context);
100 requestPackests(); 102 requestPackests();
101 } 103 }
...@@ -106,27 +108,58 @@ public class ProxyArp { ...@@ -106,27 +108,58 @@ public class ProxyArp {
106 private void requestPackests() { 108 private void requestPackests() {
107 TrafficSelector.Builder selectorBuilder = 109 TrafficSelector.Builder selectorBuilder =
108 DefaultTrafficSelector.builder(); 110 DefaultTrafficSelector.builder();
109 - selectorBuilder.matchEthType(Ethernet.TYPE_ARP); 111 + selectorBuilder.matchEthType(TYPE_ARP);
110 packetService.requestPackets(selectorBuilder.build(), 112 packetService.requestPackets(selectorBuilder.build(),
111 - PacketPriority.CONTROL, appId); 113 + CONTROL, appId);
112 114
115 + selectorBuilder = DefaultTrafficSelector.builder();
116 + selectorBuilder.matchEthType(TYPE_IPV6);
117 + selectorBuilder.matchIPProtocol(PROTOCOL_ICMP6);
118 + selectorBuilder.matchIcmpv6Type(NEIGHBOR_SOLICITATION);
113 if (ipv6NeighborDiscovery) { 119 if (ipv6NeighborDiscovery) {
114 // IPv6 Neighbor Solicitation packet. 120 // IPv6 Neighbor Solicitation packet.
115 - selectorBuilder = DefaultTrafficSelector.builder();
116 - selectorBuilder.matchEthType(Ethernet.TYPE_IPV6);
117 - selectorBuilder.matchIPProtocol(IPv6.PROTOCOL_ICMP6);
118 - selectorBuilder.matchIcmpv6Type(ICMP6.NEIGHBOR_SOLICITATION);
119 packetService.requestPackets(selectorBuilder.build(), 121 packetService.requestPackets(selectorBuilder.build(),
120 - PacketPriority.CONTROL, appId); 122 + CONTROL, appId);
123 + } else {
124 + packetService.cancelPackets(selectorBuilder.build(),
125 + CONTROL, appId);
126 + }
121 127
122 - // IPv6 Neighbor Advertisement packet. 128 + // IPv6 Neighbor Advertisement packet.
123 - selectorBuilder = DefaultTrafficSelector.builder(); 129 + selectorBuilder = DefaultTrafficSelector.builder();
124 - selectorBuilder.matchEthType(Ethernet.TYPE_IPV6); 130 + selectorBuilder.matchEthType(TYPE_IPV6);
125 - selectorBuilder.matchIPProtocol(IPv6.PROTOCOL_ICMP6); 131 + selectorBuilder.matchIPProtocol(PROTOCOL_ICMP6);
126 - selectorBuilder.matchIcmpv6Type(ICMP6.NEIGHBOR_ADVERTISEMENT); 132 + selectorBuilder.matchIcmpv6Type(NEIGHBOR_ADVERTISEMENT);
133 + if (ipv6NeighborDiscovery) {
127 packetService.requestPackets(selectorBuilder.build(), 134 packetService.requestPackets(selectorBuilder.build(),
128 - PacketPriority.CONTROL, appId); 135 + CONTROL, appId);
136 + } else {
137 + packetService.cancelPackets(selectorBuilder.build(),
138 + CONTROL, appId);
129 } 139 }
140 +
141 +
142 + }
143 +
144 + /**
145 + * Cancel requested packet in via packet service.
146 + */
147 + private void withdrawIntercepts() {
148 + TrafficSelector.Builder selectorBuilder =
149 + DefaultTrafficSelector.builder();
150 + selectorBuilder.matchEthType(TYPE_ARP);
151 + packetService.cancelPackets(selectorBuilder.build(), CONTROL, appId);
152 + selectorBuilder = DefaultTrafficSelector.builder();
153 + selectorBuilder.matchEthType(TYPE_IPV6);
154 + selectorBuilder.matchIPProtocol(PROTOCOL_ICMP6);
155 + selectorBuilder.matchIcmpv6Type(NEIGHBOR_SOLICITATION);
156 + packetService.cancelPackets(selectorBuilder.build(), CONTROL, appId);
157 + selectorBuilder = DefaultTrafficSelector.builder();
158 + selectorBuilder.matchEthType(TYPE_IPV6);
159 + selectorBuilder.matchIPProtocol(PROTOCOL_ICMP6);
160 + selectorBuilder.matchIcmpv6Type(NEIGHBOR_ADVERTISEMENT);
161 + packetService.cancelPackets(selectorBuilder.build(), CONTROL, appId);
162 +
130 } 163 }
131 164
132 /** 165 /**
...@@ -187,7 +220,7 @@ public class ProxyArp { ...@@ -187,7 +220,7 @@ public class ProxyArp {
187 if (ethPkt == null) { 220 if (ethPkt == null) {
188 return; 221 return;
189 } 222 }
190 - if (!ipv6NeighborDiscovery && (ethPkt.getEtherType() == Ethernet.TYPE_IPV6)) { 223 + if (!ipv6NeighborDiscovery && (ethPkt.getEtherType() == TYPE_IPV6)) {
191 return; 224 return;
192 } 225 }
193 //handle the arp packet. 226 //handle the arp packet.
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 package org.onosproject.reactive.routing; 16 package org.onosproject.reactive.routing;
17 +
17 import org.apache.felix.scr.annotations.Activate; 18 import org.apache.felix.scr.annotations.Activate;
18 import org.apache.felix.scr.annotations.Component; 19 import org.apache.felix.scr.annotations.Component;
19 import org.apache.felix.scr.annotations.Deactivate; 20 import org.apache.felix.scr.annotations.Deactivate;
...@@ -37,7 +38,6 @@ import org.onosproject.net.packet.DefaultOutboundPacket; ...@@ -37,7 +38,6 @@ import org.onosproject.net.packet.DefaultOutboundPacket;
37 import org.onosproject.net.packet.InboundPacket; 38 import org.onosproject.net.packet.InboundPacket;
38 import org.onosproject.net.packet.OutboundPacket; 39 import org.onosproject.net.packet.OutboundPacket;
39 import org.onosproject.net.packet.PacketContext; 40 import org.onosproject.net.packet.PacketContext;
40 -import org.onosproject.net.packet.PacketPriority;
41 import org.onosproject.net.packet.PacketProcessor; 41 import org.onosproject.net.packet.PacketProcessor;
42 import org.onosproject.net.packet.PacketService; 42 import org.onosproject.net.packet.PacketService;
43 import org.onosproject.routing.RoutingService; 43 import org.onosproject.routing.RoutingService;
...@@ -46,6 +46,9 @@ import org.slf4j.Logger; ...@@ -46,6 +46,9 @@ import org.slf4j.Logger;
46 46
47 import java.nio.ByteBuffer; 47 import java.nio.ByteBuffer;
48 48
49 +import static org.onlab.packet.Ethernet.TYPE_ARP;
50 +import static org.onlab.packet.Ethernet.TYPE_IPV4;
51 +import static org.onosproject.net.packet.PacketPriority.REACTIVE;
49 import static org.slf4j.LoggerFactory.getLogger; 52 import static org.slf4j.LoggerFactory.getLogger;
50 53
51 /** 54 /**
...@@ -83,26 +86,46 @@ public class SdnIpReactiveRouting { ...@@ -83,26 +86,46 @@ public class SdnIpReactiveRouting {
83 appId = coreService.registerApplication(APP_NAME); 86 appId = coreService.registerApplication(APP_NAME);
84 packetService.addProcessor(processor, 87 packetService.addProcessor(processor,
85 PacketProcessor.ADVISOR_MAX + 2); 88 PacketProcessor.ADVISOR_MAX + 2);
86 - 89 + requestIntercepts();
87 - TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
88 - // TODO: to support IPv6 later
89 - selector.matchEthType(Ethernet.TYPE_IPV4);
90 - packetService.requestPackets(selector.build(),
91 - PacketPriority.REACTIVE, appId);
92 - selector.matchEthType(Ethernet.TYPE_ARP);
93 - packetService.requestPackets(selector.build(),
94 - PacketPriority.REACTIVE, appId);
95 -
96 log.info("SDN-IP Reactive Routing Started"); 90 log.info("SDN-IP Reactive Routing Started");
97 } 91 }
98 92
99 @Deactivate 93 @Deactivate
100 public void deactivate() { 94 public void deactivate() {
95 + withdrawIntercepts();
101 packetService.removeProcessor(processor); 96 packetService.removeProcessor(processor);
102 processor = null; 97 processor = null;
103 log.info("SDN-IP Reactive Routing Stopped"); 98 log.info("SDN-IP Reactive Routing Stopped");
104 } 99 }
105 100
101 + /**
102 + * Request packet in via the PacketService.
103 + */
104 + private void requestIntercepts() {
105 + //TODO: to support IPv6 later
106 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
107 + selector.matchEthType(TYPE_IPV4);
108 + packetService.requestPackets(selector.build(),
109 + REACTIVE, appId);
110 + selector.matchEthType(TYPE_ARP);
111 + packetService.requestPackets(selector.build(),
112 + REACTIVE, appId);
113 + }
114 +
115 + /**
116 + * Cancel request for packet in via PacketService.
117 + */
118 + private void withdrawIntercepts() {
119 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
120 + selector.matchEthType(TYPE_IPV4);
121 + packetService.requestPackets(selector.build(),
122 + REACTIVE, appId);
123 + selector = DefaultTrafficSelector.builder();
124 + selector.matchEthType(TYPE_ARP);
125 + packetService.requestPackets(selector.build(),
126 + REACTIVE, appId);
127 + }
128 +
106 private class ReactiveRoutingProcessor implements PacketProcessor { 129 private class ReactiveRoutingProcessor implements PacketProcessor {
107 @Override 130 @Override
108 public void process(PacketContext context) { 131 public void process(PacketContext context) {
...@@ -169,9 +192,9 @@ public class SdnIpReactiveRouting { ...@@ -169,9 +192,9 @@ public class SdnIpReactiveRouting {
169 /** 192 /**
170 * Emits the specified packet onto the network. 193 * Emits the specified packet onto the network.
171 * 194 *
172 - * @param context the packet context 195 + * @param context the packet context
173 * @param connectPoint the connect point where the packet should be 196 * @param connectPoint the connect point where the packet should be
174 - * sent out 197 + * sent out
175 */ 198 */
176 private void forwardPacketToDst(PacketContext context, 199 private void forwardPacketToDst(PacketContext context,
177 ConnectPoint connectPoint) { 200 ConnectPoint connectPoint) {
......
...@@ -81,24 +81,41 @@ public class VirtualPublicHosts { ...@@ -81,24 +81,41 @@ public class VirtualPublicHosts {
81 81
82 packetService.addProcessor(processor, 82 packetService.addProcessor(processor,
83 PacketProcessor.ADVISOR_MAX + 6); 83 PacketProcessor.ADVISOR_MAX + 6);
84 - 84 + requestIntercepts();
85 - TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
86 - // Only IPv4 is supported in current vBNG.
87 - selector.matchEthType(Ethernet.TYPE_ARP);
88 - packetService.requestPackets(selector.build(),
89 - PacketPriority.REACTIVE, appId);
90 -
91 log.info("vBNG virtual public hosts started"); 85 log.info("vBNG virtual public hosts started");
92 } 86 }
93 87
94 @Deactivate 88 @Deactivate
95 public void deactivate() { 89 public void deactivate() {
90 + withdrawIntercepts();
96 packetService.removeProcessor(processor); 91 packetService.removeProcessor(processor);
97 processor = null; 92 processor = null;
98 log.info("vBNG virtual public hosts Stopped"); 93 log.info("vBNG virtual public hosts Stopped");
99 } 94 }
100 95
101 /** 96 /**
97 + * Request packet in via PacketService.
98 + */
99 + private void requestIntercepts() {
100 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
101 + // Only IPv4 is supported in current vBNG.
102 + selector.matchEthType(Ethernet.TYPE_ARP);
103 + packetService.requestPackets(selector.build(),
104 + PacketPriority.REACTIVE, appId);
105 + }
106 +
107 + /**
108 + * Cancel request for packet in via PacketService.
109 + */
110 + private void withdrawIntercepts() {
111 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
112 + // Only IPv4 is supported in current vBNG.
113 + selector.matchEthType(Ethernet.TYPE_ARP);
114 + packetService.cancelPackets(selector.build(),
115 + PacketPriority.REACTIVE, appId);
116 + }
117 +
118 + /**
102 * This class filters out the ARP request packets, generates the ARP 119 * This class filters out the ARP request packets, generates the ARP
103 * reply packets, and emits those packets. 120 * reply packets, and emits those packets.
104 */ 121 */
......
...@@ -190,7 +190,7 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid ...@@ -190,7 +190,7 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid
190 private void withdrawIntercepts() { 190 private void withdrawIntercepts() {
191 TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); 191 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
192 selector.matchEthType(Ethernet.TYPE_ARP); 192 selector.matchEthType(Ethernet.TYPE_ARP);
193 - packetService.requestPackets(selector.build(), PacketPriority.CONTROL, appId); 193 + packetService.cancelPackets(selector.build(), PacketPriority.CONTROL, appId);
194 194
195 // IPv6 Neighbor Solicitation packet. 195 // IPv6 Neighbor Solicitation packet.
196 selector.matchEthType(Ethernet.TYPE_IPV6); 196 selector.matchEthType(Ethernet.TYPE_IPV6);
......
...@@ -145,7 +145,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { ...@@ -145,7 +145,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
145 // to load configuration at startup 145 // to load configuration at startup
146 modified(context); 146 modified(context);
147 if (disableLinkDiscovery) { 147 if (disableLinkDiscovery) {
148 - log.info("Link Discovery has been permanently disabled by configuration"); 148 + log.info("LinkDiscovery has been permanently disabled by configuration");
149 return; 149 return;
150 } 150 }
151 151
......