Luca Prete
Committed by Brian O'Connor

ONOS-5236 - Adapt SDN-IP to the new intent framework APIs

Change-Id: I89b60602247a25a1879e4394a60c57d480881f74
...@@ -21,6 +21,8 @@ import org.apache.felix.scr.annotations.Component; ...@@ -21,6 +21,8 @@ import org.apache.felix.scr.annotations.Component;
21 import org.apache.felix.scr.annotations.Deactivate; 21 import org.apache.felix.scr.annotations.Deactivate;
22 import org.apache.felix.scr.annotations.Reference; 22 import org.apache.felix.scr.annotations.Reference;
23 import org.apache.felix.scr.annotations.ReferenceCardinality; 23 import org.apache.felix.scr.annotations.ReferenceCardinality;
24 +import org.onlab.packet.Ethernet;
25 +import org.onlab.packet.VlanId;
24 import org.onosproject.core.ApplicationId; 26 import org.onosproject.core.ApplicationId;
25 import org.onosproject.core.CoreService; 27 import org.onosproject.core.CoreService;
26 import org.onosproject.incubator.net.intf.Interface; 28 import org.onosproject.incubator.net.intf.Interface;
...@@ -42,8 +44,6 @@ import org.onosproject.routing.config.BgpConfig; ...@@ -42,8 +44,6 @@ import org.onosproject.routing.config.BgpConfig;
42 import java.util.HashSet; 44 import java.util.HashSet;
43 import java.util.Set; 45 import java.util.Set;
44 46
45 -import static org.onosproject.net.HostId.hostId;
46 -
47 /** 47 /**
48 * Manages neighbour message handlers for the use case of internal BGP speakers 48 * Manages neighbour message handlers for the use case of internal BGP speakers
49 * connected to the network at some point that are exchanging neighbour 49 * connected to the network at some point that are exchanging neighbour
...@@ -154,11 +154,18 @@ public class BgpSpeakerNeighbourHandler { ...@@ -154,11 +154,18 @@ public class BgpSpeakerNeighbourHandler {
154 case REPLY: 154 case REPLY:
155 // Proxy replies over to our internal BGP speaker if the host 155 // Proxy replies over to our internal BGP speaker if the host
156 // is known to us 156 // is known to us
157 - Host h = hostService.getHost(hostId(context.dstMac(), context.vlan())); 157 + Host h = hostService.getHostsByMac(context.dstMac()).stream()
158 - 158 + .findFirst()
159 + .get();
159 if (h == null) { 160 if (h == null) {
160 context.drop(); 161 context.drop();
161 } else { 162 } else {
163 + VlanId bgpSpeakerVlanId = h.vlan();
164 + if (!bgpSpeakerVlanId.equals(VlanId.NONE)) {
165 + context.packet().setVlanID(bgpSpeakerVlanId.toShort());
166 + } else {
167 + context.packet().setVlanID(Ethernet.VLAN_UNTAGGED);
168 + }
162 context.forward(h.location()); 169 context.forward(h.location());
163 } 170 }
164 break; 171 break;
...@@ -179,9 +186,6 @@ public class BgpSpeakerNeighbourHandler { ...@@ -179,9 +186,6 @@ public class BgpSpeakerNeighbourHandler {
179 // For messages coming from a BGP speaker, look at the sender address 186 // For messages coming from a BGP speaker, look at the sender address
180 // to find the interface to proxy to 187 // to find the interface to proxy to
181 interfaceService.getInterfacesByIp(context.sender()) 188 interfaceService.getInterfacesByIp(context.sender())
182 - .stream()
183 - .filter(intf -> intf.vlan().equals(context.vlan()))
184 - .map(intf -> intf.connectPoint())
185 .forEach(context::forward); 189 .forEach(context::forward);
186 } 190 }
187 } 191 }
......
...@@ -239,16 +239,9 @@ public class PeerConnectivityManager { ...@@ -239,16 +239,9 @@ public class PeerConnectivityManager {
239 } 239 }
240 240
241 // Add VLAN treatment for traffic going from BGP speaker to BGP peer 241 // Add VLAN treatment for traffic going from BGP speaker to BGP peer
242 - if (!vlanOne.equals(vlanTwo)) { 242 + treatmentToPeer = applyVlanTreatment(vlanOne, vlanTwo, treatmentToPeer);
243 - if (vlanTwo.equals(VlanId.NONE)) {
244 - treatmentToPeer.popVlan();
245 - } else {
246 - treatmentToPeer.setVlanId(vlanTwo);
247 - }
248 - }
249 243
250 // Path from BGP speaker to BGP peer matching destination TCP port 179 244 // Path from BGP speaker to BGP peer matching destination TCP port 179
251 -
252 selector = buildSelector(tcpProtocol, 245 selector = buildSelector(tcpProtocol,
253 vlanOne, 246 vlanOne,
254 ipOne, 247 ipOne,
...@@ -309,13 +302,7 @@ public class PeerConnectivityManager { ...@@ -309,13 +302,7 @@ public class PeerConnectivityManager {
309 .build()); 302 .build());
310 303
311 // Add VLAN treatment for traffic going from BGP peer to BGP speaker 304 // Add VLAN treatment for traffic going from BGP peer to BGP speaker
312 - if (!vlanTwo.equals(vlanOne)) { 305 + treatmentToSpeaker = applyVlanTreatment(vlanTwo, vlanOne, treatmentToSpeaker);
313 - if (vlanOne.equals(VlanId.NONE)) {
314 - treatmentToSpeaker.popVlan();
315 - } else {
316 - treatmentToSpeaker.setVlanId(vlanOne);
317 - }
318 - }
319 306
320 // Path from BGP peer to BGP speaker matching destination TCP port 179 307 // Path from BGP peer to BGP speaker matching destination TCP port 179
321 selector = buildSelector(tcpProtocol, 308 selector = buildSelector(tcpProtocol,
...@@ -396,9 +383,9 @@ public class PeerConnectivityManager { ...@@ -396,9 +383,9 @@ public class PeerConnectivityManager {
396 Short dstTcpPort) { 383 Short dstTcpPort) {
397 TrafficSelector.Builder builder = DefaultTrafficSelector.builder().matchIPProtocol(ipProto); 384 TrafficSelector.Builder builder = DefaultTrafficSelector.builder().matchIPProtocol(ipProto);
398 385
399 - // Match on any VLAN Id if a VLAN Id configured on the ingress interface 386 + // Match on VLAN Id if a VLAN Id configured on the ingress interface
400 if (!ingressVlanId.equals(VlanId.NONE)) { 387 if (!ingressVlanId.equals(VlanId.NONE)) {
401 - builder.matchVlanId(VlanId.ANY); 388 + builder.matchVlanId(ingressVlanId);
402 } 389 }
403 390
404 if (dstIp.isIp4()) { 391 if (dstIp.isIp4()) {
...@@ -422,6 +409,31 @@ public class PeerConnectivityManager { ...@@ -422,6 +409,31 @@ public class PeerConnectivityManager {
422 return builder.build(); 409 return builder.build();
423 } 410 }
424 411
412 + /*
413 + * Adds the VLAN Id treatment before building the intents, depending on how
414 + * the VLAN Ids of the BGP speakers and the BGP peers are configured.
415 + */
416 + private TrafficTreatment.Builder applyVlanTreatment(VlanId vlanOne,
417 + VlanId vlanTwo,
418 + TrafficTreatment.Builder treatment) {
419 + if (!vlanOne.equals(vlanTwo)) {
420 + // VLANs are different. Do some VLAN treatment
421 + if (vlanTwo.equals(VlanId.NONE)) {
422 + // VLAN two is none. VLAN one is set. Do a pop
423 + treatment.popVlan();
424 + } else {
425 + // Either both VLANs are set or vlanOne is not
426 + if (vlanOne.equals(VlanId.NONE)) {
427 + // VLAN one is none. VLAN two is set. Push the VLAN header
428 + treatment.pushVlan();
429 + }
430 + // Set the VLAN Id to the egress VLAN Id
431 + treatment.setVlanId(vlanTwo);
432 + }
433 + }
434 + return treatment;
435 + }
436 +
425 /** 437 /**
426 * Builds an intent Key for a point-to-point intent based off the source 438 * Builds an intent Key for a point-to-point intent based off the source
427 * and destination IP address, as well as a suffix String to distinguish 439 * and destination IP address, as well as a suffix String to distinguish
......
...@@ -39,6 +39,7 @@ import org.onosproject.incubator.net.routing.RouteEvent; ...@@ -39,6 +39,7 @@ import org.onosproject.incubator.net.routing.RouteEvent;
39 import org.onosproject.incubator.net.routing.RouteListener; 39 import org.onosproject.incubator.net.routing.RouteListener;
40 import org.onosproject.incubator.net.routing.RouteService; 40 import org.onosproject.incubator.net.routing.RouteService;
41 import org.onosproject.net.ConnectPoint; 41 import org.onosproject.net.ConnectPoint;
42 +import org.onosproject.net.FilteredConnectPoint;
42 import org.onosproject.net.flow.DefaultTrafficSelector; 43 import org.onosproject.net.flow.DefaultTrafficSelector;
43 import org.onosproject.net.flow.DefaultTrafficTreatment; 44 import org.onosproject.net.flow.DefaultTrafficTreatment;
44 import org.onosproject.net.flow.TrafficSelector; 45 import org.onosproject.net.flow.TrafficSelector;
...@@ -51,7 +52,6 @@ import org.onosproject.routing.IntentSynchronizationService; ...@@ -51,7 +52,6 @@ import org.onosproject.routing.IntentSynchronizationService;
51 import org.slf4j.Logger; 52 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory; 53 import org.slf4j.LoggerFactory;
53 54
54 -import java.util.HashSet;
55 import java.util.Map; 55 import java.util.Map;
56 import java.util.Set; 56 import java.util.Set;
57 import java.util.concurrent.ConcurrentHashMap; 57 import java.util.concurrent.ConcurrentHashMap;
...@@ -160,66 +160,33 @@ public class SdnIpFib { ...@@ -160,66 +160,33 @@ public class SdnIpFib {
160 } 160 }
161 ConnectPoint egressPort = egressInterface.connectPoint(); 161 ConnectPoint egressPort = egressInterface.connectPoint();
162 162
163 - Set<Interface> ingressInterfaces = new HashSet<>();
164 - Set<ConnectPoint> ingressPorts = new HashSet<>();
165 log.debug("Generating intent for prefix {}, next hop mac {}", 163 log.debug("Generating intent for prefix {}, next hop mac {}",
166 prefix, nextHopMacAddress); 164 prefix, nextHopMacAddress);
167 165
168 - TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); 166 + Set<FilteredConnectPoint> ingressFilteredCPs = Sets.newHashSet();
169 167
170 - // Get ingress interfaces and ports
171 // TODO this should be only peering interfaces 168 // TODO this should be only peering interfaces
172 interfaceService.getInterfaces().stream() 169 interfaceService.getInterfaces().stream()
173 - .filter(intf -> !intf.equals(egressInterface))
174 - .filter(intf -> !intf.connectPoint().equals(egressPort))
175 .forEach(intf -> { 170 .forEach(intf -> {
176 - ingressInterfaces.add(intf); 171 + // Get ony ingress interfaces with IPs configured
177 - ConnectPoint ingressPort = intf.connectPoint(); 172 + if (validIngressIntf(intf, egressInterface)) {
178 - ingressPorts.add(ingressPort); 173 + TrafficSelector.Builder selector =
179 - }); 174 + buildIngressTrafficSelector(intf, prefix);
180 - 175 + FilteredConnectPoint ingressFilteredCP =
181 - // By default the ingress traffic is not tagged 176 + new FilteredConnectPoint(intf.connectPoint(), selector.build());
182 - VlanId ingressVlanId = VlanId.NONE; 177 + ingressFilteredCPs.add(ingressFilteredCP);
183 -
184 - // Match VLAN Id ANY if the source VLAN Id is not null
185 - // TODO need to be able to set a different VLAN Id per ingress interface
186 - for (Interface intf : ingressInterfaces) {
187 - if (!intf.vlan().equals(VlanId.NONE)) {
188 - selector.matchVlanId(VlanId.ANY);
189 - ingressVlanId = intf.vlan();
190 - }
191 - }
192 -
193 - // Match the destination IP prefix at the first hop
194 - if (prefix.isIp4()) {
195 - selector.matchEthType(Ethernet.TYPE_IPV4);
196 - // if it is default route, then we do not need match destination
197 - // IP address
198 - if (prefix.prefixLength() != 0) {
199 - selector.matchIPDst(prefix);
200 - }
201 - } else {
202 - selector.matchEthType(Ethernet.TYPE_IPV6);
203 - // if it is default route, then we do not need match destination
204 - // IP address
205 - if (prefix.prefixLength() != 0) {
206 - selector.matchIPv6Dst(prefix);
207 - }
208 } 178 }
179 + });
209 180
210 - // Rewrite the destination MAC address 181 + // Build treatment: rewrite the destination MAC address
211 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder() 182 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder()
212 .setEthDst(nextHopMacAddress); 183 .setEthDst(nextHopMacAddress);
213 184
214 - // Set egress VLAN Id 185 + // Build the egress selector for VLAN Id
215 - // TODO need to make the comparison with different ingress VLAN Ids 186 + TrafficSelector.Builder selector =
216 - if (!ingressVlanId.equals(egressInterface.vlan())) { 187 + buildTrafficSelector(egressInterface);
217 - if (egressInterface.vlan().equals(VlanId.NONE)) { 188 + FilteredConnectPoint egressFilteredCP =
218 - treatment.popVlan(); 189 + new FilteredConnectPoint(egressPort, selector.build());
219 - } else {
220 - treatment.setVlanId(egressInterface.vlan());
221 - }
222 - }
223 190
224 // Set priority 191 // Set priority
225 int priority = 192 int priority =
...@@ -231,25 +198,38 @@ public class SdnIpFib { ...@@ -231,25 +198,38 @@ public class SdnIpFib {
231 return MultiPointToSinglePointIntent.builder() 198 return MultiPointToSinglePointIntent.builder()
232 .appId(appId) 199 .appId(appId)
233 .key(key) 200 .key(key)
234 - .selector(selector.build()) 201 + .filteredIngressPoints(ingressFilteredCPs)
202 + .filteredEgressPoint(egressFilteredCP)
235 .treatment(treatment.build()) 203 .treatment(treatment.build())
236 - .ingressPoints(ingressPorts)
237 - .egressPoint(egressPort)
238 .priority(priority) 204 .priority(priority)
239 .constraints(CONSTRAINTS) 205 .constraints(CONSTRAINTS)
240 .build(); 206 .build();
241 } 207 }
242 208
243 - private void updateInterface(Interface intf) { 209 + private void addInterface(Interface intf) {
244 synchronized (this) { 210 synchronized (this) {
245 for (Map.Entry<IpPrefix, MultiPointToSinglePointIntent> entry : routeIntents.entrySet()) { 211 for (Map.Entry<IpPrefix, MultiPointToSinglePointIntent> entry : routeIntents.entrySet()) {
212 + // Retrieve the IP prefix and affected intent
213 + IpPrefix prefix = entry.getKey();
246 MultiPointToSinglePointIntent intent = entry.getValue(); 214 MultiPointToSinglePointIntent intent = entry.getValue();
247 - Set<ConnectPoint> ingress = Sets.newHashSet(intent.ingressPoints());
248 - ingress.add(intf.connectPoint());
249 215
216 + // Add new ingress FilteredConnectPoint
217 + Set<FilteredConnectPoint> ingressFilteredCPs =
218 + Sets.newHashSet(intent.filteredIngressPoints());
219 +
220 + // Create the new traffic selector
221 + TrafficSelector.Builder selector =
222 + buildIngressTrafficSelector(intf, prefix);
223 +
224 + // Create the Filtered ConnectPoint and add it to the existing set
225 + FilteredConnectPoint newIngressFilteredCP =
226 + new FilteredConnectPoint(intf.connectPoint(), selector.build());
227 + ingressFilteredCPs.add(newIngressFilteredCP);
228 +
229 + // Create new intent
250 MultiPointToSinglePointIntent newIntent = 230 MultiPointToSinglePointIntent newIntent =
251 MultiPointToSinglePointIntent.builder(intent) 231 MultiPointToSinglePointIntent.builder(intent)
252 - .ingressPoints(ingress) 232 + .filteredIngressPoints(ingressFilteredCPs)
253 .build(); 233 .build();
254 234
255 routeIntents.put(entry.getKey(), newIntent); 235 routeIntents.put(entry.getKey(), newIntent);
...@@ -258,31 +238,117 @@ public class SdnIpFib { ...@@ -258,31 +238,117 @@ public class SdnIpFib {
258 } 238 }
259 } 239 }
260 240
241 + /*
242 + * Handles the case in which an existing interface gets removed.
243 + */
261 private void removeInterface(Interface intf) { 244 private void removeInterface(Interface intf) {
262 synchronized (this) { 245 synchronized (this) {
263 for (Map.Entry<IpPrefix, MultiPointToSinglePointIntent> entry : routeIntents.entrySet()) { 246 for (Map.Entry<IpPrefix, MultiPointToSinglePointIntent> entry : routeIntents.entrySet()) {
247 + // Retrieve the IP prefix and intent possibly affected
248 + IpPrefix prefix = entry.getKey();
264 MultiPointToSinglePointIntent intent = entry.getValue(); 249 MultiPointToSinglePointIntent intent = entry.getValue();
265 - if (intent.egressPoint().equals(intf.connectPoint())) { 250 +
266 - // This intent just lost its head. Remove it and let 251 + // The interface removed might be an ingress interface, so the
267 - // higher layer routing reroute. 252 + // selector needs to match on the interface tagging params and
253 + // on the prefix
254 + TrafficSelector.Builder ingressSelector =
255 + buildIngressTrafficSelector(intf, prefix);
256 + FilteredConnectPoint removedIngressFilteredCP =
257 + new FilteredConnectPoint(intf.connectPoint(),
258 + ingressSelector.build());
259 +
260 + // The interface removed might be an egress interface, so the
261 + // selector needs to match only on the interface tagging params
262 + TrafficSelector.Builder selector = buildTrafficSelector(intf);
263 + FilteredConnectPoint removedEgressFilteredCP =
264 + new FilteredConnectPoint(intf.connectPoint(), selector.build());
265 +
266 + if (intent.filteredEgressPoint().equals(removedEgressFilteredCP)) {
267 + // The interface is an egress interface for the intent.
268 + // This intent just lost its head. Remove it and let higher
269 + // layer routing reroute
268 intentSynchronizer.withdraw(routeIntents.remove(entry.getKey())); 270 intentSynchronizer.withdraw(routeIntents.remove(entry.getKey()));
269 } else { 271 } else {
270 - if (intent.ingressPoints().contains(intf.connectPoint())) { 272 + if (intent.filteredIngressPoints().contains(removedIngressFilteredCP)) {
271 - 273 + // The FilteredConnectPoint is an ingress
272 - Set<ConnectPoint> ingress = Sets.newHashSet(intent.ingressPoints()); 274 + // FilteredConnectPoint for the intent
273 - ingress.remove(intf.connectPoint()); 275 + Set<FilteredConnectPoint> ingressFilteredCPs =
274 - 276 + Sets.newHashSet(intent.filteredIngressPoints());
277 +
278 + // Remove FilteredConnectPoint from the existing set
279 + ingressFilteredCPs.remove(removedIngressFilteredCP);
280 +
281 + if (!ingressFilteredCPs.isEmpty()) {
282 + // There are still ingress points. Create a new
283 + // intent and resubmit
275 MultiPointToSinglePointIntent newIntent = 284 MultiPointToSinglePointIntent newIntent =
276 MultiPointToSinglePointIntent.builder(intent) 285 MultiPointToSinglePointIntent.builder(intent)
277 - .ingressPoints(ingress) 286 + .filteredIngressPoints(ingressFilteredCPs)
278 .build(); 287 .build();
279 288
280 routeIntents.put(entry.getKey(), newIntent); 289 routeIntents.put(entry.getKey(), newIntent);
281 intentSynchronizer.submit(newIntent); 290 intentSynchronizer.submit(newIntent);
291 + } else {
292 + // No more ingress FilteredConnectPoint. Withdraw
293 + //the intent
294 + intentSynchronizer.withdraw(routeIntents.remove(entry.getKey()));
295 + }
296 + }
297 + }
298 + }
299 + }
300 + }
301 +
302 + /*
303 + * Builds an ingress traffic selector builder given an ingress interface and
304 + * the IP prefix to be reached.
305 + */
306 + private TrafficSelector.Builder buildIngressTrafficSelector(Interface intf, IpPrefix prefix) {
307 + TrafficSelector.Builder selector = buildTrafficSelector(intf);
308 +
309 + // Match the destination IP prefix at the first hop
310 + if (prefix.isIp4()) {
311 + selector.matchEthType(Ethernet.TYPE_IPV4);
312 + // if it is default route, then we do not need match destination
313 + // IP address
314 + if (prefix.prefixLength() != 0) {
315 + selector.matchIPDst(prefix);
316 + }
317 + } else {
318 + selector.matchEthType(Ethernet.TYPE_IPV6);
319 + // if it is default route, then we do not need match destination
320 + // IP address
321 + if (prefix.prefixLength() != 0) {
322 + selector.matchIPv6Dst(prefix);
323 + }
282 } 324 }
325 + return selector;
326 + }
327 +
328 + /*
329 + * Builds a traffic selector builder based on interface tagging settings.
330 + */
331 + private TrafficSelector.Builder buildTrafficSelector(Interface intf) {
332 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
333 +
334 + // TODO: Consider other tag types
335 + // Match the VlanId if specified in the network interface configuration
336 + VlanId vlanId = intf.vlan();
337 + if (!vlanId.equals(VlanId.NONE)) {
338 + selector.matchVlanId(vlanId);
283 } 339 }
340 + return selector;
284 } 341 }
342 +
343 + // Check if the interface is an ingress interface with IPs configured
344 + private boolean validIngressIntf(Interface intf, Interface egressInterface) {
345 + if (!intf.equals(egressInterface) &&
346 + !intf.ipAddressesList().isEmpty() &&
347 + // TODO: An egress point might have two routers connected on different interfaces
348 + !intf.connectPoint().equals(egressInterface.connectPoint())) {
349 + return true;
285 } 350 }
351 + return false;
286 } 352 }
287 353
288 private class InternalRouteListener implements RouteListener { 354 private class InternalRouteListener implements RouteListener {
...@@ -308,9 +374,11 @@ public class SdnIpFib { ...@@ -308,9 +374,11 @@ public class SdnIpFib {
308 public void event(InterfaceEvent event) { 374 public void event(InterfaceEvent event) {
309 switch (event.type()) { 375 switch (event.type()) {
310 case INTERFACE_ADDED: 376 case INTERFACE_ADDED:
311 - updateInterface(event.subject()); 377 + addInterface(event.subject());
312 break; 378 break;
313 case INTERFACE_UPDATED: 379 case INTERFACE_UPDATED:
380 + removeInterface(event.prevSubject());
381 + addInterface(event.subject());
314 break; 382 break;
315 case INTERFACE_REMOVED: 383 case INTERFACE_REMOVED:
316 removeInterface(event.subject()); 384 removeInterface(event.subject());
......
...@@ -316,7 +316,7 @@ public class PeerConnectivityManagerTest extends AbstractIntentTest { ...@@ -316,7 +316,7 @@ public class PeerConnectivityManagerTest extends AbstractIntentTest {
316 .matchIPDst(IpPrefix.valueOf(dstPrefix)); 316 .matchIPDst(IpPrefix.valueOf(dstPrefix));
317 317
318 if (!srcVlanId.equals(VlanId.NONE)) { 318 if (!srcVlanId.equals(VlanId.NONE)) {
319 - builder.matchVlanId(VlanId.ANY); 319 + builder.matchVlanId(srcVlanId);
320 } 320 }
321 321
322 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); 322 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
...@@ -495,7 +495,7 @@ public class PeerConnectivityManagerTest extends AbstractIntentTest { ...@@ -495,7 +495,7 @@ public class PeerConnectivityManagerTest extends AbstractIntentTest {
495 .matchIPDst(IpPrefix.valueOf(dstPrefix)); 495 .matchIPDst(IpPrefix.valueOf(dstPrefix));
496 496
497 if (!srcVlanId.equals(VlanId.NONE)) { 497 if (!srcVlanId.equals(VlanId.NONE)) {
498 - builder.matchVlanId(VlanId.ANY); 498 + builder.matchVlanId(srcVlanId);
499 } 499 }
500 500
501 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); 501 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
......
1 -/*
2 - * Copyright 2016-present Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.sdnip;
18 -
19 -import com.google.common.collect.Lists;
20 -import com.google.common.collect.Sets;
21 -import org.junit.Before;
22 -import org.junit.Test;
23 -import org.onlab.packet.Ethernet;
24 -import org.onlab.packet.Ip4Address;
25 -import org.onlab.packet.Ip4Prefix;
26 -import org.onlab.packet.IpPrefix;
27 -import org.onlab.packet.MacAddress;
28 -import org.onlab.packet.VlanId;
29 -import org.onosproject.TestApplicationId;
30 -import org.onosproject.core.ApplicationId;
31 -import org.onosproject.core.CoreServiceAdapter;
32 -import org.onosproject.incubator.net.intf.Interface;
33 -import org.onosproject.incubator.net.intf.InterfaceListener;
34 -import org.onosproject.incubator.net.intf.InterfaceService;
35 -import org.onosproject.incubator.net.intf.InterfaceServiceAdapter;
36 -import org.onosproject.incubator.net.routing.ResolvedRoute;
37 -import org.onosproject.incubator.net.routing.RouteEvent;
38 -import org.onosproject.incubator.net.routing.RouteListener;
39 -import org.onosproject.incubator.net.routing.RouteServiceAdapter;
40 -import org.onosproject.net.ConnectPoint;
41 -import org.onosproject.net.DeviceId;
42 -import org.onosproject.net.PortNumber;
43 -import org.onosproject.net.flow.DefaultTrafficSelector;
44 -import org.onosproject.net.flow.DefaultTrafficTreatment;
45 -import org.onosproject.net.flow.TrafficSelector;
46 -import org.onosproject.net.flow.TrafficTreatment;
47 -import org.onosproject.net.host.InterfaceIpAddress;
48 -import org.onosproject.net.intent.AbstractIntentTest;
49 -import org.onosproject.net.intent.Key;
50 -import org.onosproject.net.intent.MultiPointToSinglePointIntent;
51 -import org.onosproject.routing.IntentSynchronizationService;
52 -
53 -import java.util.Collections;
54 -import java.util.HashSet;
55 -import java.util.List;
56 -import java.util.Set;
57 -
58 -import static org.easymock.EasyMock.*;
59 -import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
60 -
61 -/**
62 - * Unit tests for SdnIpFib.
63 - */
64 -public class SdnIpFibNoVlanstoVlanTest extends AbstractIntentTest {
65 -
66 - private InterfaceService interfaceService;
67 -
68 - private static final ConnectPoint SW1_ETH1 = new ConnectPoint(
69 - DeviceId.deviceId("of:0000000000000001"),
70 - PortNumber.portNumber(1));
71 -
72 - private static final ConnectPoint SW2_ETH1 = new ConnectPoint(
73 - DeviceId.deviceId("of:0000000000000002"),
74 - PortNumber.portNumber(1));
75 -
76 - private static final ConnectPoint SW3_ETH1 = new ConnectPoint(
77 - DeviceId.deviceId("of:0000000000000003"),
78 - PortNumber.portNumber(1));
79 -
80 - private static final IpPrefix PREFIX1 = Ip4Prefix.valueOf("1.1.1.0/24");
81 -
82 - private SdnIpFib sdnipFib;
83 - private IntentSynchronizationService intentSynchronizer;
84 - private final Set<Interface> interfaces = Sets.newHashSet();
85 -
86 - private static final ApplicationId APPID = TestApplicationId.create("SDNIP");
87 -
88 - private RouteListener routeListener;
89 - private InterfaceListener interfaceListener;
90 -
91 - @Before
92 - public void setUp() throws Exception {
93 - super.setUp();
94 -
95 - interfaceService = createMock(InterfaceService.class);
96 -
97 - interfaceService.addListener(anyObject(InterfaceListener.class));
98 - expectLastCall().andDelegateTo(new InterfaceServiceDelegate());
99 -
100 - // These will set expectations on routingConfig and interfaceService
101 - setUpInterfaceService();
102 -
103 - replay(interfaceService);
104 -
105 - intentSynchronizer = createMock(IntentSynchronizationService.class);
106 -
107 - sdnipFib = new SdnIpFib();
108 - sdnipFib.routeService = new TestRouteService();
109 - sdnipFib.coreService = new TestCoreService();
110 - sdnipFib.interfaceService = interfaceService;
111 - sdnipFib.intentSynchronizer = intentSynchronizer;
112 -
113 - sdnipFib.activate();
114 - }
115 -
116 - /**
117 - * Sets up the interface service.
118 - */
119 - private void setUpInterfaceService() {
120 - List<InterfaceIpAddress> interfaceIpAddresses1 = Lists.newArrayList();
121 - interfaceIpAddresses1.add(InterfaceIpAddress.valueOf("192.168.10.101/24"));
122 - Interface sw1Eth1 = new Interface("sw1-eth1", SW1_ETH1,
123 - interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"),
124 - VlanId.NONE);
125 - interfaces.add(sw1Eth1);
126 -
127 - List<InterfaceIpAddress> interfaceIpAddresses2 = Lists.newArrayList();
128 - interfaceIpAddresses2.add(InterfaceIpAddress.valueOf("192.168.20.101/24"));
129 - Interface sw2Eth1 = new Interface("sw2-eth1", SW2_ETH1,
130 - interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"),
131 - VlanId.NONE);
132 - interfaces.add(sw2Eth1);
133 -
134 - InterfaceIpAddress interfaceIpAddress3 = InterfaceIpAddress.valueOf("192.168.30.101/24");
135 - Interface sw3Eth1 = new Interface("sw3-eth1", SW3_ETH1,
136 - Lists.newArrayList(interfaceIpAddress3),
137 - MacAddress.valueOf("00:00:00:00:00:03"),
138 - VlanId.vlanId((short) 1));
139 - interfaces.add(sw3Eth1);
140 -
141 - expect(interfaceService.getInterfacesByPort(SW1_ETH1)).andReturn(
142 - Collections.singleton(sw1Eth1)).anyTimes();
143 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.10.1")))
144 - .andReturn(sw1Eth1).anyTimes();
145 - expect(interfaceService.getInterfacesByPort(SW2_ETH1)).andReturn(
146 - Collections.singleton(sw2Eth1)).anyTimes();
147 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.20.1")))
148 - .andReturn(sw2Eth1).anyTimes();
149 - expect(interfaceService.getInterfacesByPort(SW3_ETH1)).andReturn(
150 - Collections.singleton(sw3Eth1)).anyTimes();
151 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.30.1")))
152 - .andReturn(sw3Eth1).anyTimes();
153 - expect(interfaceService.getInterfaces()).andReturn(interfaces).anyTimes();
154 - }
155 -
156 - /**
157 - * Tests adding a route. Ingresses with no VLAN and next hop with VLAN.
158 - *
159 - * We verify that the synchronizer records the correct state and that the
160 - * correct intent is submitted to the IntentService.
161 - */
162 - @Test
163 - public void testRouteAdd() {
164 - ResolvedRoute route = new ResolvedRoute(PREFIX1,
165 - Ip4Address.valueOf("192.168.30.1"),
166 - MacAddress.valueOf("00:00:00:00:00:03"));
167 -
168 - // Construct a MultiPointToSinglePointIntent intent
169 - TrafficSelector.Builder selectorBuilder =
170 - DefaultTrafficSelector.builder();
171 - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4)
172 - .matchIPDst(PREFIX1);
173 -
174 - TrafficTreatment.Builder treatmentBuilder =
175 - DefaultTrafficTreatment.builder();
176 - treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03"))
177 - .setVlanId(VlanId.vlanId((short) 1));
178 -
179 - Set<ConnectPoint> ingressPoints = new HashSet<>();
180 - ingressPoints.add(SW1_ETH1);
181 - ingressPoints.add(SW2_ETH1);
182 -
183 - MultiPointToSinglePointIntent intent =
184 - MultiPointToSinglePointIntent.builder()
185 - .appId(APPID)
186 - .key(Key.of(PREFIX1.toString(), APPID))
187 - .selector(selectorBuilder.build())
188 - .treatment(treatmentBuilder.build())
189 - .ingressPoints(ingressPoints)
190 - .egressPoint(SW3_ETH1)
191 - .constraints(SdnIpFib.CONSTRAINTS)
192 - .build();
193 -
194 - // Setup the expected intents
195 - intentSynchronizer.submit(eqExceptId(intent));
196 -
197 - replay(intentSynchronizer);
198 -
199 - // Send in the added event
200 - routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_ADDED, route));
201 -
202 - verify(intentSynchronizer);
203 - }
204 -
205 - private class TestCoreService extends CoreServiceAdapter {
206 - @Override
207 - public ApplicationId getAppId(String name) {
208 - return APPID;
209 - }
210 - }
211 -
212 - private class TestRouteService extends RouteServiceAdapter {
213 - @Override
214 - public void addListener(RouteListener routeListener) {
215 - SdnIpFibNoVlanstoVlanTest.this.routeListener = routeListener;
216 - }
217 - }
218 -
219 - private class InterfaceServiceDelegate extends InterfaceServiceAdapter {
220 - @Override
221 - public void addListener(InterfaceListener listener) {
222 - SdnIpFibNoVlanstoVlanTest.this.interfaceListener = listener;
223 - }
224 - }
225 -}
1 /* 1 /*
2 - * Copyright 2016-present Open Networking Laboratory 2 + * Copyright 2015-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -23,6 +23,7 @@ import org.junit.Test; ...@@ -23,6 +23,7 @@ import org.junit.Test;
23 import org.onlab.packet.Ethernet; 23 import org.onlab.packet.Ethernet;
24 import org.onlab.packet.Ip4Address; 24 import org.onlab.packet.Ip4Address;
25 import org.onlab.packet.Ip4Prefix; 25 import org.onlab.packet.Ip4Prefix;
26 +import org.onlab.packet.IpAddress;
26 import org.onlab.packet.IpPrefix; 27 import org.onlab.packet.IpPrefix;
27 import org.onlab.packet.MacAddress; 28 import org.onlab.packet.MacAddress;
28 import org.onlab.packet.VlanId; 29 import org.onlab.packet.VlanId;
...@@ -40,6 +41,7 @@ import org.onosproject.incubator.net.routing.RouteListener; ...@@ -40,6 +41,7 @@ import org.onosproject.incubator.net.routing.RouteListener;
40 import org.onosproject.incubator.net.routing.RouteServiceAdapter; 41 import org.onosproject.incubator.net.routing.RouteServiceAdapter;
41 import org.onosproject.net.ConnectPoint; 42 import org.onosproject.net.ConnectPoint;
42 import org.onosproject.net.DeviceId; 43 import org.onosproject.net.DeviceId;
44 +import org.onosproject.net.FilteredConnectPoint;
43 import org.onosproject.net.PortNumber; 45 import org.onosproject.net.PortNumber;
44 import org.onosproject.net.flow.DefaultTrafficSelector; 46 import org.onosproject.net.flow.DefaultTrafficSelector;
45 import org.onosproject.net.flow.DefaultTrafficTreatment; 47 import org.onosproject.net.flow.DefaultTrafficTreatment;
...@@ -52,7 +54,6 @@ import org.onosproject.net.intent.MultiPointToSinglePointIntent; ...@@ -52,7 +54,6 @@ import org.onosproject.net.intent.MultiPointToSinglePointIntent;
52 import org.onosproject.routing.IntentSynchronizationService; 54 import org.onosproject.routing.IntentSynchronizationService;
53 55
54 import java.util.Collections; 56 import java.util.Collections;
55 -import java.util.HashSet;
56 import java.util.List; 57 import java.util.List;
57 import java.util.Set; 58 import java.util.Set;
58 59
...@@ -68,7 +69,7 @@ import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId; ...@@ -68,7 +69,7 @@ import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
68 /** 69 /**
69 * Unit tests for SdnIpFib. 70 * Unit tests for SdnIpFib.
70 */ 71 */
71 -public class SdnIpFibNoVlansTest extends AbstractIntentTest { 72 +public class SdnIpFibTest extends AbstractIntentTest {
72 73
73 private InterfaceService interfaceService; 74 private InterfaceService interfaceService;
74 75
...@@ -88,7 +89,30 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest { ...@@ -88,7 +89,30 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest {
88 DeviceId.deviceId("of:0000000000000004"), 89 DeviceId.deviceId("of:0000000000000004"),
89 PortNumber.portNumber(1)); 90 PortNumber.portNumber(1));
90 91
92 + private static final MacAddress MAC1 = MacAddress.valueOf("00:00:00:00:00:01");
93 + private static final MacAddress MAC2 = MacAddress.valueOf("00:00:00:00:00:02");
94 + private static final MacAddress MAC3 = MacAddress.valueOf("00:00:00:00:00:03");
95 + private static final MacAddress MAC4 = MacAddress.valueOf("00:00:00:00:00:04");
96 +
97 + private static final VlanId NO_VLAN = VlanId.NONE;
98 + private static final VlanId VLAN10 = VlanId.vlanId(Short.valueOf("10"));
99 + private static final VlanId VLAN20 = VlanId.vlanId(Short.valueOf("20"));
100 +
101 + private static final InterfaceIpAddress IIP1 =
102 + InterfaceIpAddress.valueOf("192.168.10.101/24");
103 + private static final InterfaceIpAddress IIP2 =
104 + InterfaceIpAddress.valueOf("192.168.20.101/24");
105 + private static final InterfaceIpAddress IIP3 =
106 + InterfaceIpAddress.valueOf("192.168.30.101/24");
107 + private static final InterfaceIpAddress IIP4 =
108 + InterfaceIpAddress.valueOf("192.168.40.101/24");
109 +
110 + private static final IpAddress IP1 = Ip4Address.valueOf("192.168.10.1");
111 + private static final IpAddress IP2 = Ip4Address.valueOf("192.168.20.1");
112 + private static final IpAddress IP3 = Ip4Address.valueOf("192.168.30.1");
113 +
91 private static final IpPrefix PREFIX1 = Ip4Prefix.valueOf("1.1.1.0/24"); 114 private static final IpPrefix PREFIX1 = Ip4Prefix.valueOf("1.1.1.0/24");
115 + private static final IpPrefix PREFIX2 = Ip4Prefix.valueOf("1.1.2.0/24");
92 116
93 private SdnIpFib sdnipFib; 117 private SdnIpFib sdnipFib;
94 private IntentSynchronizationService intentSynchronizer; 118 private IntentSynchronizationService intentSynchronizer;
...@@ -128,77 +152,72 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest { ...@@ -128,77 +152,72 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest {
128 * Sets up the interface service. 152 * Sets up the interface service.
129 */ 153 */
130 private void setUpInterfaceService() { 154 private void setUpInterfaceService() {
131 - List<InterfaceIpAddress> interfaceIpAddresses1 = Lists.newArrayList(); 155 + List<InterfaceIpAddress> iIps1 = Lists.newArrayList();
132 - interfaceIpAddresses1.add(InterfaceIpAddress.valueOf("192.168.10.101/24")); 156 + iIps1.add(IIP1);
133 - Interface sw1Eth1 = new Interface("sw1-eth1", SW1_ETH1, 157 + Interface sw1Eth1 = new Interface("sw1-eth1", SW1_ETH1, iIps1, MAC1, VLAN10);
134 - interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"),
135 - VlanId.NONE);
136 interfaces.add(sw1Eth1); 158 interfaces.add(sw1Eth1);
137 159
138 - List<InterfaceIpAddress> interfaceIpAddresses2 = Lists.newArrayList(); 160 + List<InterfaceIpAddress> iIps2 = Lists.newArrayList();
139 - interfaceIpAddresses2.add(InterfaceIpAddress.valueOf("192.168.20.101/24")); 161 + iIps2.add(IIP2);
140 - Interface sw2Eth1 = new Interface("sw2-eth1", SW2_ETH1, 162 + Interface sw2Eth1 = new Interface("sw2-eth1", SW2_ETH1, iIps2, MAC2, VLAN20);
141 - interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"),
142 - VlanId.NONE);
143 interfaces.add(sw2Eth1); 163 interfaces.add(sw2Eth1);
144 164
145 - InterfaceIpAddress interfaceIpAddress3 = InterfaceIpAddress.valueOf("192.168.30.101/24"); 165 + List<InterfaceIpAddress> iIps3 = Lists.newArrayList();
146 - Interface sw3Eth1 = new Interface("sw3-eth1", SW3_ETH1, 166 + iIps3.add(IIP3);
147 - Lists.newArrayList(interfaceIpAddress3), 167 + Interface sw3Eth1 = new Interface("sw3-eth1", SW3_ETH1, iIps3, MAC3, NO_VLAN);
148 - MacAddress.valueOf("00:00:00:00:00:03"),
149 - VlanId.NONE);
150 interfaces.add(sw3Eth1); 168 interfaces.add(sw3Eth1);
151 169
152 expect(interfaceService.getInterfacesByPort(SW1_ETH1)).andReturn( 170 expect(interfaceService.getInterfacesByPort(SW1_ETH1)).andReturn(
153 Collections.singleton(sw1Eth1)).anyTimes(); 171 Collections.singleton(sw1Eth1)).anyTimes();
154 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.10.1"))) 172 + expect(interfaceService.getMatchingInterface(IP1))
155 .andReturn(sw1Eth1).anyTimes(); 173 .andReturn(sw1Eth1).anyTimes();
156 expect(interfaceService.getInterfacesByPort(SW2_ETH1)).andReturn( 174 expect(interfaceService.getInterfacesByPort(SW2_ETH1)).andReturn(
157 Collections.singleton(sw2Eth1)).anyTimes(); 175 Collections.singleton(sw2Eth1)).anyTimes();
158 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.20.1"))) 176 + expect(interfaceService.getMatchingInterface(IP2))
159 .andReturn(sw2Eth1).anyTimes(); 177 .andReturn(sw2Eth1).anyTimes();
160 expect(interfaceService.getInterfacesByPort(SW3_ETH1)).andReturn( 178 expect(interfaceService.getInterfacesByPort(SW3_ETH1)).andReturn(
161 Collections.singleton(sw3Eth1)).anyTimes(); 179 Collections.singleton(sw3Eth1)).anyTimes();
162 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.30.1"))) 180 + expect(interfaceService.getMatchingInterface(IP3))
163 .andReturn(sw3Eth1).anyTimes(); 181 .andReturn(sw3Eth1).anyTimes();
164 expect(interfaceService.getInterfaces()).andReturn(interfaces).anyTimes(); 182 expect(interfaceService.getInterfaces()).andReturn(interfaces).anyTimes();
165 } 183 }
166 184
167 /** 185 /**
168 - * Tests adding a route. All interfaces have no VLAN Ids configured. 186 + * Tests adding a route. The egress interface has no VLAN configured.
169 * 187 *
170 * We verify that the synchronizer records the correct state and that the 188 * We verify that the synchronizer records the correct state and that the
171 * correct intent is submitted to the IntentService. 189 * correct intent is submitted to the IntentService.
172 */ 190 */
173 @Test 191 @Test
174 - public void testRouteAddNoVlans() { 192 + public void testRouteAddToNoVlan() {
175 - ResolvedRoute route = new ResolvedRoute(PREFIX1, 193 + // Build the expected route
176 - Ip4Address.valueOf("192.168.30.1"), 194 + ResolvedRoute route = new ResolvedRoute(PREFIX1, IP3, MAC3);
177 - MacAddress.valueOf("00:00:00:00:00:03"));
178 195
179 - // Construct a MultiPointToSinglePointIntent intent 196 + MultiPointToSinglePointIntent intent =
180 - TrafficSelector.Builder selectorBuilder = 197 + createIntentToThreeSrcOneTwo(PREFIX1);
181 - DefaultTrafficSelector.builder();
182 - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1);
183 198
184 - TrafficTreatment.Builder treatmentBuilder = 199 + // Setup the expected intents
185 - DefaultTrafficTreatment.builder(); 200 + intentSynchronizer.submit(eqExceptId(intent));
186 - treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03")); 201 + replay(intentSynchronizer);
187 202
188 - Set<ConnectPoint> ingressPoints = new HashSet<>(); 203 + // Send in the added event
189 - ingressPoints.add(SW1_ETH1); 204 + routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_ADDED, route));
190 - ingressPoints.add(SW2_ETH1);
191 205
192 - MultiPointToSinglePointIntent intent = 206 + verify(intentSynchronizer);
193 - MultiPointToSinglePointIntent.builder() 207 + }
194 - .appId(APPID) 208 +
195 - .key(Key.of(PREFIX1.toString(), APPID)) 209 + /**
196 - .selector(selectorBuilder.build()) 210 + * Tests adding a route. The egress interface has a VLAN configured.
197 - .treatment(treatmentBuilder.build()) 211 + *
198 - .ingressPoints(ingressPoints) 212 + * We verify that the synchronizer records the correct state and that the
199 - .egressPoint(SW3_ETH1) 213 + * correct intent is submitted to the IntentService.
200 - .constraints(SdnIpFib.CONSTRAINTS) 214 + */
201 - .build(); 215 + @Test
216 + public void testRouteAddToVlan() {
217 + // Build the expected route
218 + ResolvedRoute route = new ResolvedRoute(PREFIX2, IP1, MAC1);
219 +
220 + MultiPointToSinglePointIntent intent = createIntentToOne(PREFIX2);
202 221
203 // Setup the expected intents 222 // Setup the expected intents
204 intentSynchronizer.submit(eqExceptId(intent)); 223 intentSynchronizer.submit(eqExceptId(intent));
...@@ -213,52 +232,68 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest { ...@@ -213,52 +232,68 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest {
213 /** 232 /**
214 * Tests updating a route. 233 * Tests updating a route.
215 * 234 *
235 + * We first add a route from a next-hop with no vlan. We then announce the
236 + * same route from another next-hop with a vlan.
237 + *
216 * We verify that the synchronizer records the correct state and that the 238 * We verify that the synchronizer records the correct state and that the
217 * correct intent is submitted to the IntentService. 239 * correct intent is submitted to the IntentService.
218 */ 240 */
219 @Test 241 @Test
220 - public void testRouteUpdate() { 242 + public void testRouteUpdatesToVlan() {
221 - // Add a route first 243 + // Add a route first to a destination with no VLAN
222 - testRouteAddNoVlans(); 244 + testRouteAddToNoVlan();
223 245
224 - // Start to construct a new route entry and new intent 246 + // Build the new route entries for prefix1 and prefix2
225 - ResolvedRoute route = new ResolvedRoute(PREFIX1, 247 + ResolvedRoute routePrefixOne = new ResolvedRoute(PREFIX1, IP1, MAC1);
226 - Ip4Address.valueOf("192.168.20.1"),
227 - MacAddress.valueOf("00:00:00:00:00:02"));
228 248
229 - // Construct a new MultiPointToSinglePointIntent intent 249 + // Create the new expected intents
230 - TrafficSelector.Builder selectorBuilderNew = 250 + MultiPointToSinglePointIntent newPrefixOneIntent = createIntentToOne(PREFIX1);
231 - DefaultTrafficSelector.builder();
232 - selectorBuilderNew.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1);
233 251
234 - TrafficTreatment.Builder treatmentBuilderNew = 252 + // Set up test expectation
235 - DefaultTrafficTreatment.builder(); 253 + reset(intentSynchronizer);
236 - treatmentBuilderNew.setEthDst(MacAddress.valueOf("00:00:00:00:00:02"));
237 254
238 - Set<ConnectPoint> ingressPointsNew = new HashSet<>(); 255 + // Setup the expected intents
239 - ingressPointsNew.add(SW1_ETH1); 256 + intentSynchronizer.submit(eqExceptId(newPrefixOneIntent));
240 - ingressPointsNew.add(SW3_ETH1); 257 + replay(intentSynchronizer);
241 258
242 - MultiPointToSinglePointIntent intentNew = 259 + // Send in the update events
243 - MultiPointToSinglePointIntent.builder() 260 + routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_UPDATED,
244 - .appId(APPID) 261 + routePrefixOne));
245 - .key(Key.of(PREFIX1.toString(), APPID)) 262 +
246 - .selector(selectorBuilderNew.build()) 263 + verify(intentSynchronizer);
247 - .treatment(treatmentBuilderNew.build()) 264 + }
248 - .ingressPoints(ingressPointsNew) 265 +
249 - .egressPoint(SW2_ETH1) 266 + /**
250 - .constraints(SdnIpFib.CONSTRAINTS) 267 + * Tests updating a route.
251 - .build(); 268 + *
269 + * We first add a route from a next-hop with a vlan. We then announce the
270 + * same route from another next-hop with no vlan.
271 + *
272 + * We verify that the synchronizer records the correct state and that the
273 + * correct intent is submitted to the IntentService.
274 + */
275 + @Test
276 + public void testRouteUpdatesToNoVlan() {
277 + // Add a route first to a destination with no VLAN
278 + testRouteAddToVlan();
279 +
280 + // Build the new route entries for prefix1 and prefix2
281 + ResolvedRoute routePrefix = new ResolvedRoute(PREFIX2, IP3, MAC3);
282 +
283 + // Create the new expected intents
284 + MultiPointToSinglePointIntent newPrefixIntent =
285 + createIntentToThreeSrcOneTwo(PREFIX2);
252 286
253 // Set up test expectation 287 // Set up test expectation
254 reset(intentSynchronizer); 288 reset(intentSynchronizer);
255 289
256 // Setup the expected intents 290 // Setup the expected intents
257 - intentSynchronizer.submit(eqExceptId(intentNew)); 291 + intentSynchronizer.submit(eqExceptId(newPrefixIntent));
258 replay(intentSynchronizer); 292 replay(intentSynchronizer);
259 293
260 - // Send in the update event 294 + // Send in the update events
261 - routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_UPDATED, route)); 295 + routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_UPDATED,
296 + routePrefix));
262 297
263 verify(intentSynchronizer); 298 verify(intentSynchronizer);
264 } 299 }
...@@ -272,39 +307,19 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest { ...@@ -272,39 +307,19 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest {
272 @Test 307 @Test
273 public void testRouteDelete() { 308 public void testRouteDelete() {
274 // Add a route first 309 // Add a route first
275 - testRouteAddNoVlans(); 310 + testRouteAddToNoVlan();
276 311
277 // Construct the existing route entry 312 // Construct the existing route entry
278 ResolvedRoute route = new ResolvedRoute(PREFIX1, null, null); 313 ResolvedRoute route = new ResolvedRoute(PREFIX1, null, null);
279 314
280 - // Construct the existing MultiPointToSinglePoint intent 315 + // Create existing intent
281 - TrafficSelector.Builder selectorBuilder = 316 + MultiPointToSinglePointIntent removedIntent =
282 - DefaultTrafficSelector.builder(); 317 + createIntentToThreeSrcOneTwo(PREFIX1);
283 - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1);
284 -
285 - TrafficTreatment.Builder treatmentBuilder =
286 - DefaultTrafficTreatment.builder();
287 - treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03"));
288 -
289 - Set<ConnectPoint> ingressPoints = new HashSet<>();
290 - ingressPoints.add(SW1_ETH1);
291 - ingressPoints.add(SW2_ETH1);
292 -
293 - MultiPointToSinglePointIntent addedIntent =
294 - MultiPointToSinglePointIntent.builder()
295 - .appId(APPID)
296 - .key(Key.of(PREFIX1.toString(), APPID))
297 - .selector(selectorBuilder.build())
298 - .treatment(treatmentBuilder.build())
299 - .ingressPoints(ingressPoints)
300 - .egressPoint(SW3_ETH1)
301 - .constraints(SdnIpFib.CONSTRAINTS)
302 - .build();
303 318
304 // Set up expectation 319 // Set up expectation
305 reset(intentSynchronizer); 320 reset(intentSynchronizer);
306 // Setup the expected intents 321 // Setup the expected intents
307 - intentSynchronizer.withdraw(eqExceptId(addedIntent)); 322 + intentSynchronizer.withdraw(eqExceptId(removedIntent));
308 replay(intentSynchronizer); 323 replay(intentSynchronizer);
309 324
310 // Send in the removed event 325 // Send in the removed event
...@@ -313,35 +328,20 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest { ...@@ -313,35 +328,20 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest {
313 verify(intentSynchronizer); 328 verify(intentSynchronizer);
314 } 329 }
315 330
331 + /**
332 + * Tests adding a new interface.
333 + *
334 + * We verify that the synchronizer records the correct state and that the
335 + * correct intent is withdrawn from the IntentService.
336 + */
316 @Test 337 @Test
317 public void testAddInterface() { 338 public void testAddInterface() {
318 // Add a route first 339 // Add a route first
319 - testRouteAddNoVlans(); 340 + testRouteAddToNoVlan();
320 -
321 - // Construct the existing MultiPointToSinglePoint intent
322 - TrafficSelector.Builder selectorBuilder =
323 - DefaultTrafficSelector.builder();
324 - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1);
325 -
326 - TrafficTreatment.Builder treatmentBuilder =
327 - DefaultTrafficTreatment.builder();
328 - treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03"));
329 -
330 - Set<ConnectPoint> ingressPoints = new HashSet<>();
331 - ingressPoints.add(SW1_ETH1);
332 - ingressPoints.add(SW2_ETH1);
333 - ingressPoints.add(SW4_ETH1);
334 341
342 + // Create the new expected intent
335 MultiPointToSinglePointIntent addedIntent = 343 MultiPointToSinglePointIntent addedIntent =
336 - MultiPointToSinglePointIntent.builder() 344 + createIntentToThreeSrcOneTwoFour(PREFIX1);
337 - .appId(APPID)
338 - .key(Key.of(PREFIX1.toString(), APPID))
339 - .selector(selectorBuilder.build())
340 - .treatment(treatmentBuilder.build())
341 - .ingressPoints(ingressPoints)
342 - .egressPoint(SW3_ETH1)
343 - .constraints(SdnIpFib.CONSTRAINTS)
344 - .build();
345 345
346 reset(intentSynchronizer); 346 reset(intentSynchronizer);
347 347
...@@ -350,57 +350,274 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest { ...@@ -350,57 +350,274 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest {
350 350
351 replay(intentSynchronizer); 351 replay(intentSynchronizer);
352 352
353 + // Create the new interface and add notify it
353 Interface intf = new Interface("sw4-eth1", SW4_ETH1, 354 Interface intf = new Interface("sw4-eth1", SW4_ETH1,
354 - Collections.singletonList(InterfaceIpAddress.valueOf("192.168.40.101/24")), 355 + Collections.singletonList(IIP4),
355 - MacAddress.valueOf("00:00:00:00:00:04"), VlanId.NONE); 356 + MAC4, NO_VLAN);
356 - InterfaceEvent intfEvent = new InterfaceEvent(InterfaceEvent.Type.INTERFACE_ADDED, intf); 357 + InterfaceEvent intfEvent =
358 + new InterfaceEvent(InterfaceEvent.Type.INTERFACE_ADDED, intf);
359 +
360 + interfaceListener.event(intfEvent);
361 +
362 + verify(intentSynchronizer);
363 + }
364 +
365 + /**
366 + * Tests removing an existing interface.
367 + *
368 + * We first push an intent with destination sw3 and source sw1 and sw2. We
369 + * then remove the ingress interface on sw1.
370 + *
371 + * We verify that the synchronizer records the correct state and that the
372 + * correct intent is withdrawn from the IntentService.
373 + */
374 + @Test
375 + public void testRemoveIngressInterface() {
376 + // Add a route first
377 + testRouteAddToNoVlan();
378 +
379 + // Create the new expected intent
380 + MultiPointToSinglePointIntent remainingIntent =
381 + createIntentToThreeSrcTwo(PREFIX1);
382 +
383 + reset(intentSynchronizer);
384 +
385 + intentSynchronizer.submit(eqExceptId(remainingIntent));
386 + expectLastCall().once();
387 +
388 + replay(intentSynchronizer);
389 +
390 + // Define the existing ingress interface and remove it
391 + Interface intf = new Interface("sw1-eth1", SW1_ETH1,
392 + Collections.singletonList(IIP1),
393 + MAC1, VLAN10);
394 + InterfaceEvent intfEvent =
395 + new InterfaceEvent(InterfaceEvent.Type.INTERFACE_REMOVED, intf);
357 interfaceListener.event(intfEvent); 396 interfaceListener.event(intfEvent);
358 397
359 verify(intentSynchronizer); 398 verify(intentSynchronizer);
360 } 399 }
361 400
401 + /**
402 + * Tests removing an existing egress interface.
403 + *
404 + * We first push an intent with destination sw3 and source sw1 and sw2. We
405 + * then remove the egress interface on sw3.
406 + *
407 + * We verify that the synchronizer records the correct state and that the
408 + * correct intent is withdrawn from the IntentService.
409 + */
362 @Test 410 @Test
363 - public void testRemoveInterface() { 411 + public void testRemoveEgressInterface() {
364 // Add a route first 412 // Add a route first
365 - testRouteAddNoVlans(); 413 + testRouteAddToNoVlan();
414 +
415 + // Create existing intent
416 + MultiPointToSinglePointIntent removedIntent =
417 + createIntentToThreeSrcOneTwo(PREFIX1);
366 418
367 - // Construct the existing MultiPointToSinglePoint intent 419 + // Set up expectation
368 - TrafficSelector.Builder selectorBuilder = 420 + reset(intentSynchronizer);
369 - DefaultTrafficSelector.builder(); 421 + // Setup the expected intents
370 - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1); 422 + intentSynchronizer.withdraw(eqExceptId(removedIntent));
423 + replay(intentSynchronizer);
424 +
425 + // Define the existing egress interface and remove it
426 + Interface intf = new Interface("sw3-eth1", SW3_ETH1,
427 + Collections.singletonList(IIP3),
428 + MAC3, VlanId.NONE);
429 + InterfaceEvent intfEvent =
430 + new InterfaceEvent(InterfaceEvent.Type.INTERFACE_REMOVED, intf);
431 + interfaceListener.event(intfEvent);
371 432
433 + verify(intentSynchronizer);
434 + }
435 +
436 + /*
437 + * Builds a MultiPointToSinglePointIntent with dest sw1 (VLAN Id) and src
438 + * sw2, sw3.
439 + */
440 + private MultiPointToSinglePointIntent createIntentToOne(IpPrefix ipPrefix) {
441 + // Build the expected treatment
372 TrafficTreatment.Builder treatmentBuilder = 442 TrafficTreatment.Builder treatmentBuilder =
373 DefaultTrafficTreatment.builder(); 443 DefaultTrafficTreatment.builder();
374 - treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03")); 444 + treatmentBuilder.setEthDst(MAC1);
445 +
446 + // Build the expected egress FilteredConnectPoint
447 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
448 + selector.matchVlanId(VLAN10);
449 + FilteredConnectPoint egressFilteredCP =
450 + new FilteredConnectPoint(SW1_ETH1, selector.build());
451 +
452 + // Build the expected selectors
453 + Set<FilteredConnectPoint> ingressFilteredCPs = Sets.newHashSet();
454 +
455 + // Build the expected ingress FilteredConnectPoint for sw2
456 + selector = DefaultTrafficSelector.builder();
457 + selector.matchVlanId(VLAN20);
458 + selector.matchEthType(Ethernet.TYPE_IPV4);
459 + selector.matchIPDst(ipPrefix);
460 + FilteredConnectPoint ingressFilteredCP =
461 + new FilteredConnectPoint(SW2_ETH1, selector.build());
462 + ingressFilteredCPs.add(ingressFilteredCP);
463 +
464 + // Build the expected ingress FilteredConnectPoint for sw3
465 + selector = DefaultTrafficSelector.builder();
466 + selector.matchEthType(Ethernet.TYPE_IPV4);
467 + selector.matchIPDst(ipPrefix);
468 + ingressFilteredCP = new FilteredConnectPoint(SW3_ETH1, selector.build());
469 + ingressFilteredCPs.add(ingressFilteredCP);
470 +
471 + // Build the expected intent
472 + MultiPointToSinglePointIntent intent =
473 + MultiPointToSinglePointIntent.builder()
474 + .appId(APPID)
475 + .key(Key.of(ipPrefix.toString(), APPID))
476 + .filteredIngressPoints(ingressFilteredCPs)
477 + .filteredEgressPoint(egressFilteredCP)
478 + .treatment(treatmentBuilder.build())
479 + .constraints(SdnIpFib.CONSTRAINTS)
480 + .build();
375 481
376 - Set<ConnectPoint> ingressPoints = new HashSet<>(); 482 + return intent;
377 - ingressPoints.add(SW2_ETH1); 483 + }
378 484
379 - MultiPointToSinglePointIntent addedIntent = 485 + /*
486 + * Builds a MultiPointToSinglePointIntent with dest sw3 (no VLAN Id) and src
487 + * sw1, sw2.
488 + */
489 + private MultiPointToSinglePointIntent createIntentToThreeSrcOneTwo(IpPrefix ipPrefix) {
490 + // Build the expected treatment
491 + TrafficTreatment.Builder treatmentBuilder =
492 + DefaultTrafficTreatment.builder();
493 + treatmentBuilder.setEthDst(MAC3);
494 +
495 + // Build the expected egress FilteredConnectPoint
496 + FilteredConnectPoint egressFilteredCP = new FilteredConnectPoint(SW3_ETH1);
497 +
498 + // Build the expected selectors
499 + Set<FilteredConnectPoint> ingressFilteredCPs = Sets.newHashSet();
500 +
501 + // Build the expected ingress FilteredConnectPoint for sw1
502 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
503 + selector.matchVlanId(VLAN10);
504 + selector.matchEthType(Ethernet.TYPE_IPV4);
505 + selector.matchIPDst(ipPrefix);
506 + FilteredConnectPoint ingressFilteredCP =
507 + new FilteredConnectPoint(SW1_ETH1, selector.build());
508 + ingressFilteredCPs.add(ingressFilteredCP);
509 +
510 + // Build the expected ingress FilteredConnectPoint for sw2
511 + selector = DefaultTrafficSelector.builder();
512 + selector.matchVlanId(VLAN20);
513 + selector.matchEthType(Ethernet.TYPE_IPV4);
514 + selector.matchIPDst(ipPrefix);
515 + ingressFilteredCP = new FilteredConnectPoint(SW2_ETH1, selector.build());
516 + ingressFilteredCPs.add(ingressFilteredCP);
517 +
518 + // Build the expected intent
519 + MultiPointToSinglePointIntent intent =
380 MultiPointToSinglePointIntent.builder() 520 MultiPointToSinglePointIntent.builder()
381 .appId(APPID) 521 .appId(APPID)
382 - .key(Key.of(PREFIX1.toString(), APPID)) 522 + .key(Key.of(ipPrefix.toString(), APPID))
383 - .selector(selectorBuilder.build()) 523 + .filteredIngressPoints(ingressFilteredCPs)
524 + .filteredEgressPoint(egressFilteredCP)
384 .treatment(treatmentBuilder.build()) 525 .treatment(treatmentBuilder.build())
385 - .ingressPoints(ingressPoints)
386 - .egressPoint(SW3_ETH1)
387 .constraints(SdnIpFib.CONSTRAINTS) 526 .constraints(SdnIpFib.CONSTRAINTS)
388 .build(); 527 .build();
389 528
390 - reset(intentSynchronizer); 529 + return intent;
530 + }
391 531
392 - intentSynchronizer.submit(eqExceptId(addedIntent)); 532 + /*
393 - expectLastCall().once(); 533 + * Builds a MultiPointToSinglePointIntent with dest sw3 (no VLAN Id) and src
534 + * sw2.
535 + */
536 + private MultiPointToSinglePointIntent createIntentToThreeSrcTwo(IpPrefix ipPrefix) {
537 + // Build the expected treatment
538 + TrafficTreatment.Builder treatmentBuilder =
539 + DefaultTrafficTreatment.builder();
540 + treatmentBuilder.setEthDst(MAC3);
541 +
542 + // Build the expected egress FilteredConnectPoint
543 + FilteredConnectPoint egressFilteredCP = new FilteredConnectPoint(SW3_ETH1);
544 +
545 + // Build the expected ingress FilteredConnectPoint for sw2
546 + Set<FilteredConnectPoint> ingressFilteredCPs = Sets.newHashSet();
547 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
548 + selector.matchVlanId(VLAN20);
549 + selector.matchEthType(Ethernet.TYPE_IPV4);
550 + selector.matchIPDst(ipPrefix);
551 + FilteredConnectPoint ingressFilteredCP =
552 + new FilteredConnectPoint(SW2_ETH1, selector.build());
553 + ingressFilteredCPs.add(ingressFilteredCP);
554 +
555 + // Build the expected intent
556 + MultiPointToSinglePointIntent intent =
557 + MultiPointToSinglePointIntent.builder()
558 + .appId(APPID)
559 + .key(Key.of(ipPrefix.toString(), APPID))
560 + .filteredIngressPoints(ingressFilteredCPs)
561 + .filteredEgressPoint(egressFilteredCP)
562 + .treatment(treatmentBuilder.build())
563 + .constraints(SdnIpFib.CONSTRAINTS)
564 + .build();
394 565
395 - replay(intentSynchronizer); 566 + return intent;
567 + }
396 568
397 - Interface intf = new Interface("sw1-eth1", SW1_ETH1, 569 + /*
398 - Collections.singletonList(InterfaceIpAddress.valueOf("192.168.10.101/24")), 570 + * Builds a MultiPointToSinglePointIntent with dest sw3 (no VLAN Id) and src
399 - MacAddress.valueOf("00:00:00:00:00:01"), VlanId.NONE); 571 + * sw1, sw2, sw4.
400 - InterfaceEvent intfEvent = new InterfaceEvent(InterfaceEvent.Type.INTERFACE_REMOVED, intf); 572 + */
401 - interfaceListener.event(intfEvent); 573 + private MultiPointToSinglePointIntent createIntentToThreeSrcOneTwoFour(IpPrefix ipPrefix) {
574 + // Build the expected treatment
575 + TrafficTreatment.Builder treatmentBuilder =
576 + DefaultTrafficTreatment.builder();
577 + treatmentBuilder.setEthDst(MAC3);
578 +
579 + // Build the expected egress FilteredConnectPoint
580 + FilteredConnectPoint egressFilteredCP = new FilteredConnectPoint(SW3_ETH1);
581 +
582 + // Build the expected selectors
583 + Set<FilteredConnectPoint> ingressFilteredCPs = Sets.newHashSet();
584 +
585 + // Build the expected ingress FilteredConnectPoint for sw1
586 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
587 + selector.matchVlanId(VLAN10);
588 + selector.matchEthType(Ethernet.TYPE_IPV4);
589 + selector.matchIPDst(ipPrefix);
590 + FilteredConnectPoint ingressFilteredCP =
591 + new FilteredConnectPoint(SW1_ETH1, selector.build());
592 + ingressFilteredCPs.add(ingressFilteredCP);
593 +
594 + // Build the expected ingress FilteredConnectPoint for sw2
595 + selector = DefaultTrafficSelector.builder();
596 + selector.matchVlanId(VLAN20);
597 + selector.matchEthType(Ethernet.TYPE_IPV4);
598 + selector.matchIPDst(ipPrefix);
599 + ingressFilteredCP = new FilteredConnectPoint(SW2_ETH1, selector.build());
600 + ingressFilteredCPs.add(ingressFilteredCP);
601 +
602 + // Build the expected ingress FilteredConnectPoint for sw4
603 + selector = DefaultTrafficSelector.builder();
604 + selector.matchEthType(Ethernet.TYPE_IPV4);
605 + selector.matchIPDst(ipPrefix);
606 + ingressFilteredCP = new FilteredConnectPoint(SW4_ETH1, selector.build());
607 + ingressFilteredCPs.add(ingressFilteredCP);
608 +
609 + // Build the expected intent
610 + MultiPointToSinglePointIntent intent =
611 + MultiPointToSinglePointIntent.builder()
612 + .appId(APPID)
613 + .key(Key.of(ipPrefix.toString(), APPID))
614 + .filteredIngressPoints(ingressFilteredCPs)
615 + .filteredEgressPoint(egressFilteredCP)
616 + .treatment(treatmentBuilder.build())
617 + .constraints(SdnIpFib.CONSTRAINTS)
618 + .build();
402 619
403 - verify(intentSynchronizer); 620 + return intent;
404 } 621 }
405 622
406 private class TestCoreService extends CoreServiceAdapter { 623 private class TestCoreService extends CoreServiceAdapter {
...@@ -413,14 +630,14 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest { ...@@ -413,14 +630,14 @@ public class SdnIpFibNoVlansTest extends AbstractIntentTest {
413 private class TestRouteService extends RouteServiceAdapter { 630 private class TestRouteService extends RouteServiceAdapter {
414 @Override 631 @Override
415 public void addListener(RouteListener routeListener) { 632 public void addListener(RouteListener routeListener) {
416 - SdnIpFibNoVlansTest.this.routeListener = routeListener; 633 + SdnIpFibTest.this.routeListener = routeListener;
417 } 634 }
418 } 635 }
419 636
420 private class InterfaceServiceDelegate extends InterfaceServiceAdapter { 637 private class InterfaceServiceDelegate extends InterfaceServiceAdapter {
421 @Override 638 @Override
422 public void addListener(InterfaceListener listener) { 639 public void addListener(InterfaceListener listener) {
423 - SdnIpFibNoVlansTest.this.interfaceListener = listener; 640 + SdnIpFibTest.this.interfaceListener = listener;
424 } 641 }
425 } 642 }
426 } 643 }
......
1 -/*
2 - * Copyright 2016-present Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.sdnip;
18 -
19 -import com.google.common.collect.Lists;
20 -import com.google.common.collect.Sets;
21 -import org.junit.Before;
22 -import org.junit.Test;
23 -import org.onlab.packet.Ethernet;
24 -import org.onlab.packet.Ip4Address;
25 -import org.onlab.packet.Ip4Prefix;
26 -import org.onlab.packet.IpPrefix;
27 -import org.onlab.packet.MacAddress;
28 -import org.onlab.packet.VlanId;
29 -import org.onosproject.TestApplicationId;
30 -import org.onosproject.core.ApplicationId;
31 -import org.onosproject.core.CoreServiceAdapter;
32 -import org.onosproject.incubator.net.intf.Interface;
33 -import org.onosproject.incubator.net.intf.InterfaceListener;
34 -import org.onosproject.incubator.net.intf.InterfaceService;
35 -import org.onosproject.incubator.net.intf.InterfaceServiceAdapter;
36 -import org.onosproject.incubator.net.routing.ResolvedRoute;
37 -import org.onosproject.incubator.net.routing.RouteEvent;
38 -import org.onosproject.incubator.net.routing.RouteListener;
39 -import org.onosproject.incubator.net.routing.RouteServiceAdapter;
40 -import org.onosproject.net.ConnectPoint;
41 -import org.onosproject.net.DeviceId;
42 -import org.onosproject.net.PortNumber;
43 -import org.onosproject.net.flow.DefaultTrafficSelector;
44 -import org.onosproject.net.flow.DefaultTrafficTreatment;
45 -import org.onosproject.net.flow.TrafficSelector;
46 -import org.onosproject.net.flow.TrafficTreatment;
47 -import org.onosproject.net.host.InterfaceIpAddress;
48 -import org.onosproject.net.intent.AbstractIntentTest;
49 -import org.onosproject.net.intent.Key;
50 -import org.onosproject.net.intent.MultiPointToSinglePointIntent;
51 -import org.onosproject.routing.IntentSynchronizationService;
52 -
53 -import java.util.Collections;
54 -import java.util.HashSet;
55 -import java.util.List;
56 -import java.util.Set;
57 -
58 -import static org.easymock.EasyMock.*;
59 -import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
60 -
61 -/**
62 - * Unit tests for SdnIpFib.
63 - */
64 -public class SdnIpFibVlansToVlanDifferentTest extends AbstractIntentTest {
65 -
66 - private InterfaceService interfaceService;
67 -
68 - private static final ConnectPoint SW1_ETH1 = new ConnectPoint(
69 - DeviceId.deviceId("of:0000000000000001"),
70 - PortNumber.portNumber(1));
71 -
72 - private static final ConnectPoint SW2_ETH1 = new ConnectPoint(
73 - DeviceId.deviceId("of:0000000000000002"),
74 - PortNumber.portNumber(1));
75 -
76 - private static final ConnectPoint SW3_ETH1 = new ConnectPoint(
77 - DeviceId.deviceId("of:0000000000000003"),
78 - PortNumber.portNumber(1));
79 -
80 - private static final IpPrefix PREFIX1 = Ip4Prefix.valueOf("1.1.1.0/24");
81 -
82 - private SdnIpFib sdnipFib;
83 - private IntentSynchronizationService intentSynchronizer;
84 - private final Set<Interface> interfaces = Sets.newHashSet();
85 -
86 - private static final ApplicationId APPID = TestApplicationId.create("SDNIP");
87 -
88 - private RouteListener routeListener;
89 - private InterfaceListener interfaceListener;
90 -
91 - @Before
92 - public void setUp() throws Exception {
93 - super.setUp();
94 -
95 - interfaceService = createMock(InterfaceService.class);
96 -
97 - interfaceService.addListener(anyObject(InterfaceListener.class));
98 - expectLastCall().andDelegateTo(new InterfaceServiceDelegate());
99 -
100 - // These will set expectations on routingConfig and interfaceService
101 - setUpInterfaceService();
102 -
103 - replay(interfaceService);
104 -
105 - intentSynchronizer = createMock(IntentSynchronizationService.class);
106 -
107 - sdnipFib = new SdnIpFib();
108 - sdnipFib.routeService = new TestRouteService();
109 - sdnipFib.coreService = new TestCoreService();
110 - sdnipFib.interfaceService = interfaceService;
111 - sdnipFib.intentSynchronizer = intentSynchronizer;
112 -
113 - sdnipFib.activate();
114 - }
115 -
116 - /**
117 - * Sets up the interface service.
118 - */
119 - private void setUpInterfaceService() {
120 - List<InterfaceIpAddress> interfaceIpAddresses1 = Lists.newArrayList();
121 - interfaceIpAddresses1.add(InterfaceIpAddress.valueOf("192.168.10.101/24"));
122 - Interface sw1Eth1 = new Interface("sw1-eth1", SW1_ETH1,
123 - interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"),
124 - VlanId.vlanId((short) 1));
125 - interfaces.add(sw1Eth1);
126 -
127 - List<InterfaceIpAddress> interfaceIpAddresses2 = Lists.newArrayList();
128 - interfaceIpAddresses2.add(InterfaceIpAddress.valueOf("192.168.20.101/24"));
129 - Interface sw2Eth1 = new Interface("sw2-eth1", SW2_ETH1,
130 - interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"),
131 - VlanId.vlanId((short) 1));
132 - interfaces.add(sw2Eth1);
133 -
134 - InterfaceIpAddress interfaceIpAddress3 = InterfaceIpAddress.valueOf("192.168.30.101/24");
135 - Interface sw3Eth1 = new Interface("sw3-eth1", SW3_ETH1,
136 - Lists.newArrayList(interfaceIpAddress3),
137 - MacAddress.valueOf("00:00:00:00:00:03"),
138 - VlanId.vlanId((short) 2));
139 - interfaces.add(sw3Eth1);
140 -
141 - expect(interfaceService.getInterfacesByPort(SW1_ETH1)).andReturn(
142 - Collections.singleton(sw1Eth1)).anyTimes();
143 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.10.1")))
144 - .andReturn(sw1Eth1).anyTimes();
145 - expect(interfaceService.getInterfacesByPort(SW2_ETH1)).andReturn(
146 - Collections.singleton(sw2Eth1)).anyTimes();
147 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.20.1")))
148 - .andReturn(sw2Eth1).anyTimes();
149 - expect(interfaceService.getInterfacesByPort(SW3_ETH1)).andReturn(
150 - Collections.singleton(sw3Eth1)).anyTimes();
151 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.30.1")))
152 - .andReturn(sw3Eth1).anyTimes();
153 - expect(interfaceService.getInterfaces()).andReturn(interfaces).anyTimes();
154 - }
155 -
156 - /**
157 - * Tests adding a route. Ingresses with VLAN and next hop with no VLAN.
158 - *
159 - * We verify that the synchronizer records the correct state and that the
160 - * correct intent is submitted to the IntentService.
161 - */
162 - @Test
163 - public void testRouteAdd() {
164 - ResolvedRoute route = new ResolvedRoute(PREFIX1,
165 - Ip4Address.valueOf("192.168.30.1"),
166 - MacAddress.valueOf("00:00:00:00:00:03"));
167 -
168 - // Construct a MultiPointToSinglePointIntent intent
169 - TrafficSelector.Builder selectorBuilder =
170 - DefaultTrafficSelector.builder();
171 - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1)
172 - .matchVlanId(VlanId.ANY);
173 -
174 - TrafficTreatment.Builder treatmentBuilder =
175 - DefaultTrafficTreatment.builder();
176 - treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03"))
177 - .setVlanId(VlanId.vlanId((short) 2));
178 -
179 - Set<ConnectPoint> ingressPoints = new HashSet<>();
180 - ingressPoints.add(SW1_ETH1);
181 - ingressPoints.add(SW2_ETH1);
182 -
183 - MultiPointToSinglePointIntent intent =
184 - MultiPointToSinglePointIntent.builder()
185 - .appId(APPID)
186 - .key(Key.of(PREFIX1.toString(), APPID))
187 - .selector(selectorBuilder.build())
188 - .treatment(treatmentBuilder.build())
189 - .ingressPoints(ingressPoints)
190 - .egressPoint(SW3_ETH1)
191 - .constraints(SdnIpFib.CONSTRAINTS)
192 - .build();
193 -
194 - // Setup the expected intents
195 - intentSynchronizer.submit(eqExceptId(intent));
196 - replay(intentSynchronizer);
197 -
198 - // Send in the added event
199 - routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_ADDED, route));
200 -
201 - verify(intentSynchronizer);
202 - }
203 -
204 - private class TestCoreService extends CoreServiceAdapter {
205 - @Override
206 - public ApplicationId getAppId(String name) {
207 - return APPID;
208 - }
209 - }
210 -
211 - private class TestRouteService extends RouteServiceAdapter {
212 - @Override
213 - public void addListener(RouteListener routeListener) {
214 - SdnIpFibVlansToVlanDifferentTest.this.routeListener = routeListener;
215 - }
216 - }
217 -
218 - private class InterfaceServiceDelegate extends InterfaceServiceAdapter {
219 - @Override
220 - public void addListener(InterfaceListener listener) {
221 - SdnIpFibVlansToVlanDifferentTest.this.interfaceListener = listener;
222 - }
223 - }
224 -}
1 -/*
2 - * Copyright 2016-present Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.sdnip;
18 -
19 -import com.google.common.collect.Lists;
20 -import com.google.common.collect.Sets;
21 -import org.junit.Before;
22 -import org.junit.Test;
23 -import org.onlab.packet.Ethernet;
24 -import org.onlab.packet.Ip4Address;
25 -import org.onlab.packet.Ip4Prefix;
26 -import org.onlab.packet.IpPrefix;
27 -import org.onlab.packet.MacAddress;
28 -import org.onlab.packet.VlanId;
29 -import org.onosproject.TestApplicationId;
30 -import org.onosproject.core.ApplicationId;
31 -import org.onosproject.core.CoreServiceAdapter;
32 -import org.onosproject.incubator.net.intf.Interface;
33 -import org.onosproject.incubator.net.intf.InterfaceListener;
34 -import org.onosproject.incubator.net.intf.InterfaceService;
35 -import org.onosproject.incubator.net.intf.InterfaceServiceAdapter;
36 -import org.onosproject.incubator.net.routing.ResolvedRoute;
37 -import org.onosproject.incubator.net.routing.RouteEvent;
38 -import org.onosproject.incubator.net.routing.RouteListener;
39 -import org.onosproject.incubator.net.routing.RouteServiceAdapter;
40 -import org.onosproject.net.ConnectPoint;
41 -import org.onosproject.net.DeviceId;
42 -import org.onosproject.net.PortNumber;
43 -import org.onosproject.net.flow.DefaultTrafficSelector;
44 -import org.onosproject.net.flow.DefaultTrafficTreatment;
45 -import org.onosproject.net.flow.TrafficSelector;
46 -import org.onosproject.net.flow.TrafficTreatment;
47 -import org.onosproject.net.host.InterfaceIpAddress;
48 -import org.onosproject.net.intent.AbstractIntentTest;
49 -import org.onosproject.net.intent.Key;
50 -import org.onosproject.net.intent.MultiPointToSinglePointIntent;
51 -import org.onosproject.routing.IntentSynchronizationService;
52 -
53 -import java.util.Collections;
54 -import java.util.HashSet;
55 -import java.util.List;
56 -import java.util.Set;
57 -
58 -import static org.easymock.EasyMock.*;
59 -import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
60 -
61 -/**
62 - * Unit tests for SdnIpFib.
63 - */
64 -public class SdnIpFibVlansToVlanSameTest extends AbstractIntentTest {
65 -
66 - private InterfaceService interfaceService;
67 -
68 - private static final ConnectPoint SW1_ETH1 = new ConnectPoint(
69 - DeviceId.deviceId("of:0000000000000001"),
70 - PortNumber.portNumber(1));
71 -
72 - private static final ConnectPoint SW2_ETH1 = new ConnectPoint(
73 - DeviceId.deviceId("of:0000000000000002"),
74 - PortNumber.portNumber(1));
75 -
76 - private static final ConnectPoint SW3_ETH1 = new ConnectPoint(
77 - DeviceId.deviceId("of:0000000000000003"),
78 - PortNumber.portNumber(1));
79 -
80 - private static final IpPrefix PREFIX1 = Ip4Prefix.valueOf("1.1.1.0/24");
81 -
82 - private SdnIpFib sdnipFib;
83 - private IntentSynchronizationService intentSynchronizer;
84 - private final Set<Interface> interfaces = Sets.newHashSet();
85 -
86 - private static final ApplicationId APPID = TestApplicationId.create("SDNIP");
87 -
88 - private RouteListener routeListener;
89 - private InterfaceListener interfaceListener;
90 -
91 - @Before
92 - public void setUp() throws Exception {
93 - super.setUp();
94 -
95 - interfaceService = createMock(InterfaceService.class);
96 -
97 - interfaceService.addListener(anyObject(InterfaceListener.class));
98 - expectLastCall().andDelegateTo(new InterfaceServiceDelegate());
99 -
100 - // These will set expectations on routingConfig and interfaceService
101 - setUpInterfaceService();
102 -
103 - replay(interfaceService);
104 -
105 - intentSynchronizer = createMock(IntentSynchronizationService.class);
106 -
107 - sdnipFib = new SdnIpFib();
108 - sdnipFib.routeService = new TestRouteService();
109 - sdnipFib.coreService = new TestCoreService();
110 - sdnipFib.interfaceService = interfaceService;
111 - sdnipFib.intentSynchronizer = intentSynchronizer;
112 -
113 - sdnipFib.activate();
114 - }
115 -
116 - /**
117 - * Sets up the interface service.
118 - */
119 - private void setUpInterfaceService() {
120 - List<InterfaceIpAddress> interfaceIpAddresses1 = Lists.newArrayList();
121 - interfaceIpAddresses1.add(InterfaceIpAddress.valueOf("192.168.10.101/24"));
122 - Interface sw1Eth1 = new Interface("sw1-eth1", SW1_ETH1,
123 - interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"),
124 - VlanId.vlanId((short) 1));
125 - interfaces.add(sw1Eth1);
126 -
127 - List<InterfaceIpAddress> interfaceIpAddresses2 = Lists.newArrayList();
128 - interfaceIpAddresses2.add(InterfaceIpAddress.valueOf("192.168.20.101/24"));
129 - Interface sw2Eth1 = new Interface("sw2-eth1", SW2_ETH1,
130 - interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"),
131 - VlanId.vlanId((short) 1));
132 - interfaces.add(sw2Eth1);
133 -
134 - InterfaceIpAddress interfaceIpAddress3 = InterfaceIpAddress.valueOf("192.168.30.101/24");
135 - Interface sw3Eth1 = new Interface("sw3-eth1", SW3_ETH1,
136 - Lists.newArrayList(interfaceIpAddress3),
137 - MacAddress.valueOf("00:00:00:00:00:03"),
138 - VlanId.vlanId((short) 1));
139 - interfaces.add(sw3Eth1);
140 -
141 - expect(interfaceService.getInterfacesByPort(SW1_ETH1)).andReturn(
142 - Collections.singleton(sw1Eth1)).anyTimes();
143 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.10.1")))
144 - .andReturn(sw1Eth1).anyTimes();
145 - expect(interfaceService.getInterfacesByPort(SW2_ETH1)).andReturn(
146 - Collections.singleton(sw2Eth1)).anyTimes();
147 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.20.1")))
148 - .andReturn(sw2Eth1).anyTimes();
149 - expect(interfaceService.getInterfacesByPort(SW3_ETH1)).andReturn(
150 - Collections.singleton(sw3Eth1)).anyTimes();
151 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.30.1")))
152 - .andReturn(sw3Eth1).anyTimes();
153 - expect(interfaceService.getInterfaces()).andReturn(interfaces).anyTimes();
154 - }
155 -
156 - /**
157 - * Tests adding a route. Ingresses with VLAN and next hop with no VLAN.
158 - *
159 - * We verify that the synchronizer records the correct state and that the
160 - * correct intent is submitted to the IntentService.
161 - */
162 - @Test
163 - public void testRouteAdd() {
164 - ResolvedRoute route = new ResolvedRoute(PREFIX1,
165 - Ip4Address.valueOf("192.168.30.1"),
166 - MacAddress.valueOf("00:00:00:00:00:03"));
167 -
168 - // Construct a MultiPointToSinglePointIntent intent
169 - TrafficSelector.Builder selectorBuilder =
170 - DefaultTrafficSelector.builder();
171 - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1)
172 - .matchVlanId(VlanId.ANY);
173 -
174 - TrafficTreatment.Builder treatmentBuilder =
175 - DefaultTrafficTreatment.builder();
176 - treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03"));
177 -
178 - Set<ConnectPoint> ingressPoints = new HashSet<>();
179 - ingressPoints.add(SW1_ETH1);
180 - ingressPoints.add(SW2_ETH1);
181 -
182 - MultiPointToSinglePointIntent intent =
183 - MultiPointToSinglePointIntent.builder()
184 - .appId(APPID)
185 - .key(Key.of(PREFIX1.toString(), APPID))
186 - .selector(selectorBuilder.build())
187 - .treatment(treatmentBuilder.build())
188 - .ingressPoints(ingressPoints)
189 - .egressPoint(SW3_ETH1)
190 - .constraints(SdnIpFib.CONSTRAINTS)
191 - .build();
192 -
193 - // Setup the expected intents
194 - intentSynchronizer.submit(eqExceptId(intent));
195 - replay(intentSynchronizer);
196 -
197 - // Send in the added event
198 - routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_ADDED, route));
199 -
200 - verify(intentSynchronizer);
201 - }
202 -
203 - private class TestCoreService extends CoreServiceAdapter {
204 - @Override
205 - public ApplicationId getAppId(String name) {
206 - return APPID;
207 - }
208 - }
209 -
210 - private class TestRouteService extends RouteServiceAdapter {
211 - @Override
212 - public void addListener(RouteListener routeListener) {
213 - SdnIpFibVlansToVlanSameTest.this.routeListener = routeListener;
214 - }
215 - }
216 -
217 - private class InterfaceServiceDelegate extends InterfaceServiceAdapter {
218 - @Override
219 - public void addListener(InterfaceListener listener) {
220 - SdnIpFibVlansToVlanSameTest.this.interfaceListener = listener;
221 - }
222 - }
223 -}
1 -/*
2 - * Copyright 2016-present Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.sdnip;
18 -
19 -import com.google.common.collect.Lists;
20 -import com.google.common.collect.Sets;
21 -import org.junit.Before;
22 -import org.junit.Test;
23 -import org.onlab.packet.Ethernet;
24 -import org.onlab.packet.Ip4Address;
25 -import org.onlab.packet.Ip4Prefix;
26 -import org.onlab.packet.IpPrefix;
27 -import org.onlab.packet.MacAddress;
28 -import org.onlab.packet.VlanId;
29 -import org.onosproject.TestApplicationId;
30 -import org.onosproject.core.ApplicationId;
31 -import org.onosproject.core.CoreServiceAdapter;
32 -import org.onosproject.incubator.net.intf.Interface;
33 -import org.onosproject.incubator.net.intf.InterfaceListener;
34 -import org.onosproject.incubator.net.intf.InterfaceService;
35 -import org.onosproject.incubator.net.intf.InterfaceServiceAdapter;
36 -import org.onosproject.incubator.net.routing.ResolvedRoute;
37 -import org.onosproject.incubator.net.routing.RouteEvent;
38 -import org.onosproject.incubator.net.routing.RouteListener;
39 -import org.onosproject.incubator.net.routing.RouteServiceAdapter;
40 -import org.onosproject.net.ConnectPoint;
41 -import org.onosproject.net.DeviceId;
42 -import org.onosproject.net.PortNumber;
43 -import org.onosproject.net.flow.DefaultTrafficSelector;
44 -import org.onosproject.net.flow.DefaultTrafficTreatment;
45 -import org.onosproject.net.flow.TrafficSelector;
46 -import org.onosproject.net.flow.TrafficTreatment;
47 -import org.onosproject.net.host.InterfaceIpAddress;
48 -import org.onosproject.net.intent.AbstractIntentTest;
49 -import org.onosproject.net.intent.Key;
50 -import org.onosproject.net.intent.MultiPointToSinglePointIntent;
51 -import org.onosproject.routing.IntentSynchronizationService;
52 -
53 -import java.util.Collections;
54 -import java.util.HashSet;
55 -import java.util.List;
56 -import java.util.Set;
57 -
58 -import static org.easymock.EasyMock.*;
59 -import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
60 -
61 -/**
62 - * Unit tests for SdnIpFib.
63 - */
64 -public class SdnIpFibVlanstoNoVlanTest extends AbstractIntentTest {
65 -
66 - private InterfaceService interfaceService;
67 -
68 - private static final ConnectPoint SW1_ETH1 = new ConnectPoint(
69 - DeviceId.deviceId("of:0000000000000001"),
70 - PortNumber.portNumber(1));
71 -
72 - private static final ConnectPoint SW2_ETH1 = new ConnectPoint(
73 - DeviceId.deviceId("of:0000000000000002"),
74 - PortNumber.portNumber(1));
75 -
76 - private static final ConnectPoint SW3_ETH1 = new ConnectPoint(
77 - DeviceId.deviceId("of:0000000000000003"),
78 - PortNumber.portNumber(1));
79 -
80 - private static final IpPrefix PREFIX1 = Ip4Prefix.valueOf("1.1.1.0/24");
81 -
82 - private SdnIpFib sdnipFib;
83 - private IntentSynchronizationService intentSynchronizer;
84 - private final Set<Interface> interfaces = Sets.newHashSet();
85 -
86 - private static final ApplicationId APPID = TestApplicationId.create("SDNIP");
87 -
88 - private RouteListener routeListener;
89 - private InterfaceListener interfaceListener;
90 -
91 - @Before
92 - public void setUp() throws Exception {
93 - super.setUp();
94 -
95 - interfaceService = createMock(InterfaceService.class);
96 -
97 - interfaceService.addListener(anyObject(InterfaceListener.class));
98 - expectLastCall().andDelegateTo(new InterfaceServiceDelegate());
99 -
100 - // These will set expectations on routingConfig and interfaceService
101 - setUpInterfaceService();
102 -
103 - replay(interfaceService);
104 -
105 - intentSynchronizer = createMock(IntentSynchronizationService.class);
106 -
107 - sdnipFib = new SdnIpFib();
108 - sdnipFib.routeService = new TestRouteService();
109 - sdnipFib.coreService = new TestCoreService();
110 - sdnipFib.interfaceService = interfaceService;
111 - sdnipFib.intentSynchronizer = intentSynchronizer;
112 -
113 - sdnipFib.activate();
114 - }
115 -
116 - /**
117 - * Sets up the interface service.
118 - */
119 - private void setUpInterfaceService() {
120 - List<InterfaceIpAddress> interfaceIpAddresses1 = Lists.newArrayList();
121 - interfaceIpAddresses1.add(InterfaceIpAddress.valueOf("192.168.10.101/24"));
122 - Interface sw1Eth1 = new Interface("sw1-eth1", SW1_ETH1,
123 - interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"),
124 - VlanId.vlanId((short) 1));
125 - interfaces.add(sw1Eth1);
126 -
127 - List<InterfaceIpAddress> interfaceIpAddresses2 = Lists.newArrayList();
128 - interfaceIpAddresses2.add(InterfaceIpAddress.valueOf("192.168.20.101/24"));
129 - Interface sw2Eth1 = new Interface("sw2-eth1", SW2_ETH1,
130 - interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"),
131 - VlanId.vlanId((short) 1));
132 - interfaces.add(sw2Eth1);
133 -
134 - InterfaceIpAddress interfaceIpAddress3 = InterfaceIpAddress.valueOf("192.168.30.101/24");
135 - Interface sw3Eth1 = new Interface("sw3-eth1", SW3_ETH1,
136 - Lists.newArrayList(interfaceIpAddress3),
137 - MacAddress.valueOf("00:00:00:00:00:03"),
138 - VlanId.NONE);
139 - interfaces.add(sw3Eth1);
140 -
141 - expect(interfaceService.getInterfacesByPort(SW1_ETH1)).andReturn(
142 - Collections.singleton(sw1Eth1)).anyTimes();
143 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.10.1")))
144 - .andReturn(sw1Eth1).anyTimes();
145 - expect(interfaceService.getInterfacesByPort(SW2_ETH1)).andReturn(
146 - Collections.singleton(sw2Eth1)).anyTimes();
147 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.20.1")))
148 - .andReturn(sw2Eth1).anyTimes();
149 - expect(interfaceService.getInterfacesByPort(SW3_ETH1)).andReturn(
150 - Collections.singleton(sw3Eth1)).anyTimes();
151 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.30.1")))
152 - .andReturn(sw3Eth1).anyTimes();
153 - expect(interfaceService.getInterfaces()).andReturn(interfaces).anyTimes();
154 - }
155 -
156 - /**
157 - * Tests adding a route. Ingresses with VLAN and next hop with no VLAN.
158 - *
159 - * We verify that the synchronizer records the correct state and that the
160 - * correct intent is submitted to the IntentService.
161 - */
162 - @Test
163 - public void testRouteAdd() {
164 - ResolvedRoute route = new ResolvedRoute(PREFIX1,
165 - Ip4Address.valueOf("192.168.30.1"),
166 - MacAddress.valueOf("00:00:00:00:00:03"));
167 -
168 - // Construct a MultiPointToSinglePointIntent intent
169 - TrafficSelector.Builder selectorBuilder =
170 - DefaultTrafficSelector.builder();
171 - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1)
172 - .matchVlanId(VlanId.ANY);
173 -
174 - TrafficTreatment.Builder treatmentBuilder =
175 - DefaultTrafficTreatment.builder();
176 - treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03"))
177 - .popVlan();
178 -
179 - Set<ConnectPoint> ingressPoints = new HashSet<>();
180 - ingressPoints.add(SW1_ETH1);
181 - ingressPoints.add(SW2_ETH1);
182 -
183 - MultiPointToSinglePointIntent intent =
184 - MultiPointToSinglePointIntent.builder()
185 - .appId(APPID)
186 - .key(Key.of(PREFIX1.toString(), APPID))
187 - .selector(selectorBuilder.build())
188 - .treatment(treatmentBuilder.build())
189 - .ingressPoints(ingressPoints)
190 - .egressPoint(SW3_ETH1)
191 - .constraints(SdnIpFib.CONSTRAINTS)
192 - .build();
193 -
194 - // Setup the expected intents
195 - intentSynchronizer.submit(eqExceptId(intent));
196 - replay(intentSynchronizer);
197 -
198 - // Send in the added event
199 - routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_ADDED, route));
200 -
201 - verify(intentSynchronizer);
202 - }
203 -
204 - private class TestCoreService extends CoreServiceAdapter {
205 - @Override
206 - public ApplicationId getAppId(String name) {
207 - return APPID;
208 - }
209 - }
210 -
211 - private class TestRouteService extends RouteServiceAdapter {
212 - @Override
213 - public void addListener(RouteListener routeListener) {
214 - SdnIpFibVlanstoNoVlanTest.this.routeListener = routeListener;
215 - }
216 - }
217 -
218 - private class InterfaceServiceDelegate extends InterfaceServiceAdapter {
219 - @Override
220 - public void addListener(InterfaceListener listener) {
221 - SdnIpFibVlanstoNoVlanTest.this.interfaceListener = listener;
222 - }
223 - }
224 -}
...@@ -549,7 +549,16 @@ public class NeighbourResolutionManager implements NeighbourResolutionService { ...@@ -549,7 +549,16 @@ public class NeighbourResolutionManager implements NeighbourResolutionService {
549 549
550 @Override 550 @Override
551 public void forward(NeighbourMessageContext context, Interface outIntf) { 551 public void forward(NeighbourMessageContext context, Interface outIntf) {
552 - // TODO implement 552 + Ethernet packetOut = (Ethernet) context.packet().clone();
553 + if (outIntf.vlan().equals(VlanId.NONE)) {
554 + // The egress interface has no VLAN Id. Send out an untagged
555 + // packet
556 + packetOut.setVlanID(Ethernet.VLAN_UNTAGGED);
557 + } else {
558 + // The egress interface has a VLAN set. Send out a tagged packet
559 + packetOut.setVlanID(outIntf.vlan().toShort());
560 + }
561 + sendTo(packetOut, outIntf.connectPoint());
553 } 562 }
554 563
555 @Override 564 @Override
......