Charles Chan
Committed by Ray Milkey

[CORD-313] Handles uncaught exceptions when device is not configured

Includes following minor changes
    - Move DeviceConfiguration and DeviceProperties to config package
    - Create DeviceConfigNotFoundException

Change-Id: I32455d88c712bb65cd7f71dab9472ae003303de2
Showing 15 changed files with 323 additions and 115 deletions
...@@ -31,6 +31,8 @@ import org.onosproject.net.packet.DefaultOutboundPacket; ...@@ -31,6 +31,8 @@ import org.onosproject.net.packet.DefaultOutboundPacket;
31 import org.onosproject.net.packet.InboundPacket; 31 import org.onosproject.net.packet.InboundPacket;
32 import org.onosproject.net.HostId; 32 import org.onosproject.net.HostId;
33 import org.onosproject.net.packet.OutboundPacket; 33 import org.onosproject.net.packet.OutboundPacket;
34 +import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
35 +import org.onosproject.segmentrouting.config.DeviceConfiguration;
34 import org.slf4j.Logger; 36 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory; 37 import org.slf4j.LoggerFactory;
36 38
...@@ -140,9 +142,16 @@ public class ArpHandler { ...@@ -140,9 +142,16 @@ public class ArpHandler {
140 * @param inPort in-port 142 * @param inPort in-port
141 */ 143 */
142 public void sendArpRequest(DeviceId deviceId, IpAddress targetAddress, ConnectPoint inPort) { 144 public void sendArpRequest(DeviceId deviceId, IpAddress targetAddress, ConnectPoint inPort) {
143 - 145 + byte[] senderMacAddress;
144 - byte[] senderMacAddress = config.getDeviceMac(deviceId).toBytes(); 146 + byte[] senderIpAddress;
145 - byte[] senderIpAddress = config.getRouterIp(deviceId).toOctets(); 147 +
148 + try {
149 + senderMacAddress = config.getDeviceMac(deviceId).toBytes();
150 + senderIpAddress = config.getRouterIp(deviceId).toOctets();
151 + } catch (DeviceConfigNotFoundException e) {
152 + log.warn(e.getMessage() + " Aborting sendArpRequest.");
153 + return;
154 + }
146 155
147 ARP arpRequest = new ARP(); 156 ARP arpRequest = new ARP();
148 arpRequest.setHardwareType(ARP.HW_TYPE_ETHERNET) 157 arpRequest.setHardwareType(ARP.HW_TYPE_ETHERNET)
......
...@@ -23,6 +23,8 @@ import org.onlab.packet.IpPrefix; ...@@ -23,6 +23,8 @@ import org.onlab.packet.IpPrefix;
23 import org.onosproject.net.Device; 23 import org.onosproject.net.Device;
24 import org.onosproject.net.DeviceId; 24 import org.onosproject.net.DeviceId;
25 import org.onosproject.net.Link; 25 import org.onosproject.net.Link;
26 +import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
27 +import org.onosproject.segmentrouting.config.DeviceConfiguration;
26 import org.slf4j.Logger; 28 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory; 29 import org.slf4j.LoggerFactory;
28 30
...@@ -449,7 +451,20 @@ public class DefaultRoutingHandler { ...@@ -449,7 +451,20 @@ public class DefaultRoutingHandler {
449 451
450 // If both target switch and dest switch are edge routers, then set IP 452 // If both target switch and dest switch are edge routers, then set IP
451 // rule for both subnet and router IP. 453 // rule for both subnet and router IP.
452 - if (config.isEdgeDevice(targetSw) && config.isEdgeDevice(destSw)) { 454 + boolean targetIsEdge;
455 + boolean destIsEdge;
456 + Ip4Address destRouterIp;
457 +
458 + try {
459 + targetIsEdge = config.isEdgeDevice(targetSw);
460 + destIsEdge = config.isEdgeDevice(destSw);
461 + destRouterIp = config.getRouterIp(destSw);
462 + } catch (DeviceConfigNotFoundException e) {
463 + log.warn(e.getMessage() + " Aborting populateEcmpRoutingRulePartial.");
464 + return false;
465 + }
466 +
467 + if (targetIsEdge && destIsEdge) {
453 Set<Ip4Prefix> subnets = config.getSubnets(destSw); 468 Set<Ip4Prefix> subnets = config.getSubnets(destSw);
454 log.debug("* populateEcmpRoutingRulePartial in device {} towards {} for subnets {}", 469 log.debug("* populateEcmpRoutingRulePartial in device {} towards {} for subnets {}",
455 targetSw, destSw, subnets); 470 targetSw, destSw, subnets);
...@@ -461,7 +476,7 @@ public class DefaultRoutingHandler { ...@@ -461,7 +476,7 @@ public class DefaultRoutingHandler {
461 return false; 476 return false;
462 } 477 }
463 478
464 - Ip4Address routerIp = config.getRouterIp(destSw); 479 + Ip4Address routerIp = destRouterIp;
465 IpPrefix routerIpPrefix = IpPrefix.valueOf(routerIp, IpPrefix.MAX_INET_MASK_LENGTH); 480 IpPrefix routerIpPrefix = IpPrefix.valueOf(routerIp, IpPrefix.MAX_INET_MASK_LENGTH);
466 log.debug("* populateEcmpRoutingRulePartial in device {} towards {} for router IP {}", 481 log.debug("* populateEcmpRoutingRulePartial in device {} towards {} for router IP {}",
467 targetSw, destSw, routerIpPrefix); 482 targetSw, destSw, routerIpPrefix);
...@@ -471,8 +486,8 @@ public class DefaultRoutingHandler { ...@@ -471,8 +486,8 @@ public class DefaultRoutingHandler {
471 } 486 }
472 487
473 // If the target switch is an edge router, then set IP rules for the router IP. 488 // If the target switch is an edge router, then set IP rules for the router IP.
474 - } else if (config.isEdgeDevice(targetSw)) { 489 + } else if (targetIsEdge) {
475 - Ip4Address routerIp = config.getRouterIp(destSw); 490 + Ip4Address routerIp = destRouterIp;
476 IpPrefix routerIpPrefix = IpPrefix.valueOf(routerIp, IpPrefix.MAX_INET_MASK_LENGTH); 491 IpPrefix routerIpPrefix = IpPrefix.valueOf(routerIp, IpPrefix.MAX_INET_MASK_LENGTH);
477 log.debug("* populateEcmpRoutingRulePartial in device {} towards {} for router IP {}", 492 log.debug("* populateEcmpRoutingRulePartial in device {} towards {} for router IP {}",
478 targetSw, destSw, routerIpPrefix); 493 targetSw, destSw, routerIpPrefix);
......
...@@ -28,6 +28,8 @@ import org.onosproject.net.flow.TrafficTreatment; ...@@ -28,6 +28,8 @@ import org.onosproject.net.flow.TrafficTreatment;
28 import org.onosproject.net.packet.DefaultOutboundPacket; 28 import org.onosproject.net.packet.DefaultOutboundPacket;
29 import org.onosproject.net.packet.InboundPacket; 29 import org.onosproject.net.packet.InboundPacket;
30 import org.onosproject.net.packet.OutboundPacket; 30 import org.onosproject.net.packet.OutboundPacket;
31 +import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
32 +import org.onosproject.segmentrouting.config.DeviceConfiguration;
31 import org.slf4j.Logger; 33 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory; 34 import org.slf4j.LoggerFactory;
33 35
...@@ -71,7 +73,13 @@ public class IcmpHandler { ...@@ -71,7 +73,13 @@ public class IcmpHandler {
71 Ip4Address destinationAddress = 73 Ip4Address destinationAddress =
72 Ip4Address.valueOf(ipv4.getDestinationAddress()); 74 Ip4Address.valueOf(ipv4.getDestinationAddress());
73 Set<Ip4Address> gatewayIpAddresses = config.getPortIPs(deviceId); 75 Set<Ip4Address> gatewayIpAddresses = config.getPortIPs(deviceId);
74 - Ip4Address routerIp = config.getRouterIp(deviceId); 76 + Ip4Address routerIp;
77 + try {
78 + routerIp = config.getRouterIp(deviceId);
79 + } catch (DeviceConfigNotFoundException e) {
80 + log.warn(e.getMessage() + " Aborting processPacketIn.");
81 + return;
82 + }
75 IpPrefix routerIpPrefix = IpPrefix.valueOf(routerIp, IpPrefix.MAX_INET_MASK_LENGTH); 83 IpPrefix routerIpPrefix = IpPrefix.valueOf(routerIp, IpPrefix.MAX_INET_MASK_LENGTH);
76 Ip4Address routerIpAddress = routerIpPrefix.getIp4Prefix().address(); 84 Ip4Address routerIpAddress = routerIpPrefix.getIp4Prefix().address();
77 85
......
...@@ -26,6 +26,8 @@ import org.onosproject.net.flow.TrafficTreatment; ...@@ -26,6 +26,8 @@ import org.onosproject.net.flow.TrafficTreatment;
26 import org.onosproject.net.packet.DefaultOutboundPacket; 26 import org.onosproject.net.packet.DefaultOutboundPacket;
27 import org.onosproject.net.packet.InboundPacket; 27 import org.onosproject.net.packet.InboundPacket;
28 import org.onosproject.net.packet.OutboundPacket; 28 import org.onosproject.net.packet.OutboundPacket;
29 +import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
30 +import org.onosproject.segmentrouting.config.DeviceConfiguration;
29 import org.slf4j.Logger; 31 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory; 32 import org.slf4j.LoggerFactory;
31 33
...@@ -127,13 +129,19 @@ public class IpHandler { ...@@ -127,13 +129,19 @@ public class IpHandler {
127 129
128 for (IPv4 ipPacket : ipPacketQueue.get(destIpAddress)) { 130 for (IPv4 ipPacket : ipPacketQueue.get(destIpAddress)) {
129 Ip4Address destAddress = Ip4Address.valueOf(ipPacket.getDestinationAddress()); 131 Ip4Address destAddress = Ip4Address.valueOf(ipPacket.getDestinationAddress());
130 - if (ipPacket != null && config.inSameSubnet(deviceId, destAddress)) { 132 + if (config.inSameSubnet(deviceId, destAddress)) {
131 ipPacket.setTtl((byte) (ipPacket.getTtl() - 1)); 133 ipPacket.setTtl((byte) (ipPacket.getTtl() - 1));
132 ipPacket.setChecksum((short) 0); 134 ipPacket.setChecksum((short) 0);
133 for (Host dest: srManager.hostService.getHostsByIp(destIpAddress)) { 135 for (Host dest: srManager.hostService.getHostsByIp(destIpAddress)) {
134 Ethernet eth = new Ethernet(); 136 Ethernet eth = new Ethernet();
135 eth.setDestinationMACAddress(dest.mac()); 137 eth.setDestinationMACAddress(dest.mac());
136 - eth.setSourceMACAddress(config.getDeviceMac(deviceId)); 138 + try {
139 + eth.setSourceMACAddress(config.getDeviceMac(deviceId));
140 + } catch (DeviceConfigNotFoundException e) {
141 + log.warn(e.getMessage()
142 + + " Skipping forwardPackets for this destination.");
143 + continue;
144 + }
137 eth.setEtherType(Ethernet.TYPE_IPV4); 145 eth.setEtherType(Ethernet.TYPE_IPV4);
138 eth.setPayload(ipPacket); 146 eth.setPayload(ipPacket);
139 147
......
...@@ -27,6 +27,7 @@ import org.onosproject.net.flow.TrafficSelector; ...@@ -27,6 +27,7 @@ import org.onosproject.net.flow.TrafficSelector;
27 import org.onosproject.net.flowobjective.DefaultForwardingObjective; 27 import org.onosproject.net.flowobjective.DefaultForwardingObjective;
28 import org.onosproject.net.flowobjective.FlowObjectiveService; 28 import org.onosproject.net.flowobjective.FlowObjectiveService;
29 import org.onosproject.net.flowobjective.ForwardingObjective; 29 import org.onosproject.net.flowobjective.ForwardingObjective;
30 +import org.onosproject.segmentrouting.config.DeviceConfiguration;
30 import org.onosproject.store.service.EventuallyConsistentMap; 31 import org.onosproject.store.service.EventuallyConsistentMap;
31 import org.slf4j.Logger; 32 import org.slf4j.Logger;
32 33
......
...@@ -22,6 +22,8 @@ import org.onlab.packet.IpPrefix; ...@@ -22,6 +22,8 @@ import org.onlab.packet.IpPrefix;
22 import org.onlab.packet.MacAddress; 22 import org.onlab.packet.MacAddress;
23 import org.onlab.packet.MplsLabel; 23 import org.onlab.packet.MplsLabel;
24 import org.onlab.packet.VlanId; 24 import org.onlab.packet.VlanId;
25 +import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
26 +import org.onosproject.segmentrouting.config.DeviceConfiguration;
25 import org.onosproject.segmentrouting.grouphandler.NeighborSet; 27 import org.onosproject.segmentrouting.grouphandler.NeighborSet;
26 import org.onosproject.net.DeviceId; 28 import org.onosproject.net.DeviceId;
27 import org.onosproject.net.Link; 29 import org.onosproject.net.Link;
...@@ -103,6 +105,14 @@ public class RoutingRulePopulator { ...@@ -103,6 +105,14 @@ public class RoutingRulePopulator {
103 */ 105 */
104 public void populateIpRuleForHost(DeviceId deviceId, Ip4Address hostIp, 106 public void populateIpRuleForHost(DeviceId deviceId, Ip4Address hostIp,
105 MacAddress hostMac, PortNumber outPort) { 107 MacAddress hostMac, PortNumber outPort) {
108 + MacAddress deviceMac;
109 + try {
110 + deviceMac = config.getDeviceMac(deviceId);
111 + } catch (DeviceConfigNotFoundException e) {
112 + log.warn(e.getMessage() + " Aborting populateIpRuleForHost.");
113 + return;
114 + }
115 +
106 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder(); 116 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
107 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder(); 117 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
108 118
...@@ -111,7 +121,7 @@ public class RoutingRulePopulator { ...@@ -111,7 +121,7 @@ public class RoutingRulePopulator {
111 121
112 tbuilder.deferred() 122 tbuilder.deferred()
113 .setEthDst(hostMac) 123 .setEthDst(hostMac)
114 - .setEthSrc(config.getDeviceMac(deviceId)) 124 + .setEthSrc(deviceMac)
115 .setOutput(outPort); 125 .setOutput(outPort);
116 126
117 TrafficTreatment treatment = tbuilder.build(); 127 TrafficTreatment treatment = tbuilder.build();
...@@ -167,6 +177,13 @@ public class RoutingRulePopulator { ...@@ -167,6 +177,13 @@ public class RoutingRulePopulator {
167 public boolean populateIpRuleForRouter(DeviceId deviceId, 177 public boolean populateIpRuleForRouter(DeviceId deviceId,
168 IpPrefix ipPrefix, DeviceId destSw, 178 IpPrefix ipPrefix, DeviceId destSw,
169 Set<DeviceId> nextHops) { 179 Set<DeviceId> nextHops) {
180 + int segmentId;
181 + try {
182 + segmentId = config.getSegmentId(destSw);
183 + } catch (DeviceConfigNotFoundException e) {
184 + log.warn(e.getMessage() + " Aborting populateIpRuleForRouter.");
185 + return false;
186 + }
170 187
171 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder(); 188 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
172 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder(); 189 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
...@@ -183,7 +200,7 @@ public class RoutingRulePopulator { ...@@ -183,7 +200,7 @@ public class RoutingRulePopulator {
183 ns = new NeighborSet(nextHops); 200 ns = new NeighborSet(nextHops);
184 } else { 201 } else {
185 tbuilder.deferred().copyTtlOut(); 202 tbuilder.deferred().copyTtlOut();
186 - ns = new NeighborSet(nextHops, config.getSegmentId(destSw)); 203 + ns = new NeighborSet(nextHops, segmentId);
187 } 204 }
188 205
189 TrafficTreatment treatment = tbuilder.build(); 206 TrafficTreatment treatment = tbuilder.build();
...@@ -227,19 +244,26 @@ public class RoutingRulePopulator { ...@@ -227,19 +244,26 @@ public class RoutingRulePopulator {
227 */ 244 */
228 public boolean populateMplsRule(DeviceId deviceId, DeviceId destSwId, 245 public boolean populateMplsRule(DeviceId deviceId, DeviceId destSwId,
229 Set<DeviceId> nextHops) { 246 Set<DeviceId> nextHops) {
247 + int segmentId;
248 + try {
249 + segmentId = config.getSegmentId(destSwId);
250 + } catch (DeviceConfigNotFoundException e) {
251 + log.warn(e.getMessage() + " Aborting populateMplsRule.");
252 + return false;
253 + }
230 254
231 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder(); 255 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
232 List<ForwardingObjective.Builder> fwdObjBuilders = new ArrayList<>(); 256 List<ForwardingObjective.Builder> fwdObjBuilders = new ArrayList<>();
233 257
234 // TODO Handle the case of Bos == false 258 // TODO Handle the case of Bos == false
235 - sbuilder.matchMplsLabel(MplsLabel.mplsLabel(config.getSegmentId(destSwId))); 259 + sbuilder.matchMplsLabel(MplsLabel.mplsLabel(segmentId));
236 sbuilder.matchEthType(Ethernet.MPLS_UNICAST); 260 sbuilder.matchEthType(Ethernet.MPLS_UNICAST);
237 261
238 // If the next hop is the destination router, do PHP 262 // If the next hop is the destination router, do PHP
239 if (nextHops.size() == 1 && destSwId.equals(nextHops.toArray()[0])) { 263 if (nextHops.size() == 1 && destSwId.equals(nextHops.toArray()[0])) {
240 log.debug("populateMplsRule: Installing MPLS forwarding objective for " 264 log.debug("populateMplsRule: Installing MPLS forwarding objective for "
241 + "label {} in switch {} with PHP", 265 + "label {} in switch {} with PHP",
242 - config.getSegmentId(destSwId), 266 + segmentId,
243 deviceId); 267 deviceId);
244 268
245 ForwardingObjective.Builder fwdObjBosBuilder = 269 ForwardingObjective.Builder fwdObjBosBuilder =
...@@ -264,7 +288,7 @@ public class RoutingRulePopulator { ...@@ -264,7 +288,7 @@ public class RoutingRulePopulator {
264 } else { 288 } else {
265 log.debug("Installing MPLS forwarding objective for " 289 log.debug("Installing MPLS forwarding objective for "
266 + "label {} in switch {} without PHP", 290 + "label {} in switch {} without PHP",
267 - config.getSegmentId(destSwId), 291 + segmentId,
268 deviceId); 292 deviceId);
269 293
270 ForwardingObjective.Builder fwdObjBosBuilder = 294 ForwardingObjective.Builder fwdObjBosBuilder =
...@@ -310,9 +334,21 @@ public class RoutingRulePopulator { ...@@ -310,9 +334,21 @@ public class RoutingRulePopulator {
310 Set<DeviceId> nextHops, 334 Set<DeviceId> nextHops,
311 boolean phpRequired, 335 boolean phpRequired,
312 boolean isBos) { 336 boolean isBos) {
313 -
314 ForwardingObjective.Builder fwdBuilder = DefaultForwardingObjective 337 ForwardingObjective.Builder fwdBuilder = DefaultForwardingObjective
315 .builder().withFlag(ForwardingObjective.Flag.SPECIFIC); 338 .builder().withFlag(ForwardingObjective.Flag.SPECIFIC);
339 + DeviceId nextHop = (DeviceId) nextHops.toArray()[0];
340 +
341 + boolean isEdge;
342 + MacAddress srcMac;
343 + MacAddress dstMac;
344 + try {
345 + isEdge = config.isEdgeDevice(deviceId);
346 + srcMac = config.getDeviceMac(deviceId);
347 + dstMac = config.getDeviceMac(nextHop);
348 + } catch (DeviceConfigNotFoundException e) {
349 + log.warn(e.getMessage() + " Aborting getMplsForwardingObjective");
350 + return null;
351 + }
316 352
317 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder(); 353 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
318 354
...@@ -329,16 +365,15 @@ public class RoutingRulePopulator { ...@@ -329,16 +365,15 @@ public class RoutingRulePopulator {
329 tbuilder.deferred().decMplsTtl(); 365 tbuilder.deferred().decMplsTtl();
330 } 366 }
331 367
332 - if (!isECMPSupportedInTransitRouter() && !config.isEdgeDevice(deviceId)) { 368 + if (!isECMPSupportedInTransitRouter() && !isEdge) {
333 PortNumber port = selectOnePort(deviceId, nextHops); 369 PortNumber port = selectOnePort(deviceId, nextHops);
334 - DeviceId nextHop = (DeviceId) nextHops.toArray()[0];
335 if (port == null) { 370 if (port == null) {
336 log.warn("No link from {} to {}", deviceId, nextHops); 371 log.warn("No link from {} to {}", deviceId, nextHops);
337 return null; 372 return null;
338 } 373 }
339 tbuilder.deferred() 374 tbuilder.deferred()
340 - .setEthSrc(config.getDeviceMac(deviceId)) 375 + .setEthSrc(srcMac)
341 - .setEthDst(config.getDeviceMac(nextHop)) 376 + .setEthDst(dstMac)
342 .setOutput(port); 377 .setOutput(port);
343 fwdBuilder.withTreatment(tbuilder.build()); 378 fwdBuilder.withTreatment(tbuilder.build());
344 } else { 379 } else {
...@@ -372,15 +407,27 @@ public class RoutingRulePopulator { ...@@ -372,15 +407,27 @@ public class RoutingRulePopulator {
372 public void populateRouterMacVlanFilters(DeviceId deviceId) { 407 public void populateRouterMacVlanFilters(DeviceId deviceId) {
373 log.debug("Installing per-port filtering objective for untagged " 408 log.debug("Installing per-port filtering objective for untagged "
374 + "packets in device {}", deviceId); 409 + "packets in device {}", deviceId);
410 +
411 + MacAddress deviceMac;
412 + try {
413 + deviceMac = config.getDeviceMac(deviceId);
414 + } catch (DeviceConfigNotFoundException e) {
415 + log.warn(e.getMessage() + " Aborting populateRouterMacVlanFilters.");
416 + return;
417 + }
418 +
375 for (Port port : srManager.deviceService.getPorts(deviceId)) { 419 for (Port port : srManager.deviceService.getPorts(deviceId)) {
376 if (port.number().toLong() > 0 && port.number().toLong() < OFPP_MAX) { 420 if (port.number().toLong() > 0 && port.number().toLong() < OFPP_MAX) {
377 Ip4Prefix portSubnet = config.getPortSubnet(deviceId, port.number()); 421 Ip4Prefix portSubnet = config.getPortSubnet(deviceId, port.number());
378 VlanId assignedVlan = (portSubnet == null) 422 VlanId assignedVlan = (portSubnet == null)
379 ? VlanId.vlanId(SegmentRoutingManager.ASSIGNED_VLAN_NO_SUBNET) 423 ? VlanId.vlanId(SegmentRoutingManager.ASSIGNED_VLAN_NO_SUBNET)
380 : srManager.getSubnetAssignedVlanId(deviceId, portSubnet); 424 : srManager.getSubnetAssignedVlanId(deviceId, portSubnet);
425 +
426 +
427 +
381 FilteringObjective.Builder fob = DefaultFilteringObjective.builder(); 428 FilteringObjective.Builder fob = DefaultFilteringObjective.builder();
382 fob.withKey(Criteria.matchInPort(port.number())) 429 fob.withKey(Criteria.matchInPort(port.number()))
383 - .addCondition(Criteria.matchEthDst(config.getDeviceMac(deviceId))) 430 + .addCondition(Criteria.matchEthDst(deviceMac))
384 .addCondition(Criteria.matchVlanId(VlanId.NONE)); 431 .addCondition(Criteria.matchVlanId(VlanId.NONE));
385 // vlan assignment is valid only if this instance is master 432 // vlan assignment is valid only if this instance is master
386 if (srManager.mastershipService.isLocalMaster(deviceId)) { 433 if (srManager.mastershipService.isLocalMaster(deviceId)) {
...@@ -405,6 +452,14 @@ public class RoutingRulePopulator { ...@@ -405,6 +452,14 @@ public class RoutingRulePopulator {
405 * @param deviceId the switch dpid for the router 452 * @param deviceId the switch dpid for the router
406 */ 453 */
407 public void populateRouterIpPunts(DeviceId deviceId) { 454 public void populateRouterIpPunts(DeviceId deviceId) {
455 + Ip4Address routerIp;
456 + try {
457 + routerIp = config.getRouterIp(deviceId);
458 + } catch (DeviceConfigNotFoundException e) {
459 + log.warn(e.getMessage() + " Aborting populateRouterIpPunts.");
460 + return;
461 + }
462 +
408 if (!srManager.mastershipService.isLocalMaster(deviceId)) { 463 if (!srManager.mastershipService.isLocalMaster(deviceId)) {
409 log.debug("Not installing port-IP punts - not the master for dev:{} ", 464 log.debug("Not installing port-IP punts - not the master for dev:{} ",
410 deviceId); 465 deviceId);
...@@ -412,7 +467,7 @@ public class RoutingRulePopulator { ...@@ -412,7 +467,7 @@ public class RoutingRulePopulator {
412 } 467 }
413 ForwardingObjective.Builder puntIp = DefaultForwardingObjective.builder(); 468 ForwardingObjective.Builder puntIp = DefaultForwardingObjective.builder();
414 Set<Ip4Address> allIps = new HashSet<Ip4Address>(config.getPortIPs(deviceId)); 469 Set<Ip4Address> allIps = new HashSet<Ip4Address>(config.getPortIPs(deviceId));
415 - allIps.add(config.getRouterIp(deviceId)); 470 + allIps.add(routerIp);
416 for (Ip4Address ipaddr : allIps) { 471 for (Ip4Address ipaddr : allIps) {
417 TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); 472 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
418 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); 473 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
......
...@@ -38,6 +38,8 @@ import org.onosproject.net.config.NetworkConfigEvent; ...@@ -38,6 +38,8 @@ import org.onosproject.net.config.NetworkConfigEvent;
38 import org.onosproject.net.config.NetworkConfigRegistry; 38 import org.onosproject.net.config.NetworkConfigRegistry;
39 import org.onosproject.net.config.NetworkConfigListener; 39 import org.onosproject.net.config.NetworkConfigListener;
40 import org.onosproject.net.config.basics.SubjectFactories; 40 import org.onosproject.net.config.basics.SubjectFactories;
41 +import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
42 +import org.onosproject.segmentrouting.config.DeviceConfiguration;
41 import org.onosproject.segmentrouting.config.SegmentRoutingConfig; 43 import org.onosproject.segmentrouting.config.SegmentRoutingConfig;
42 import org.onosproject.segmentrouting.grouphandler.DefaultGroupHandler; 44 import org.onosproject.segmentrouting.grouphandler.DefaultGroupHandler;
43 import org.onosproject.segmentrouting.grouphandler.NeighborSet; 45 import org.onosproject.segmentrouting.grouphandler.NeighborSet;
...@@ -553,7 +555,10 @@ public class SegmentRoutingManager implements SegmentRoutingService { ...@@ -553,7 +555,10 @@ public class SegmentRoutingManager implements SegmentRoutingService {
553 555
554 private void processLinkAdded(Link link) { 556 private void processLinkAdded(Link link) {
555 log.debug("A new link {} was added", link.toString()); 557 log.debug("A new link {} was added", link.toString());
556 - 558 + if (!deviceConfiguration.isConfigured(link.src().deviceId())) {
559 + log.warn("Source device of this link is not configured.");
560 + return;
561 + }
557 //Irrespective whether the local is a MASTER or not for this device, 562 //Irrespective whether the local is a MASTER or not for this device,
558 //create group handler instance and push default TTP flow rules. 563 //create group handler instance and push default TTP flow rules.
559 //Because in a multi-instance setup, instances can initiate 564 //Because in a multi-instance setup, instances can initiate
...@@ -596,7 +601,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { ...@@ -596,7 +601,7 @@ public class SegmentRoutingManager implements SegmentRoutingService {
596 601
597 private void processDeviceAdded(Device device) { 602 private void processDeviceAdded(Device device) {
598 log.debug("A new device with ID {} was added", device.id()); 603 log.debug("A new device with ID {} was added", device.id());
599 - if (deviceConfiguration == null) { 604 + if (deviceConfiguration == null || !deviceConfiguration.isConfigured(device.id())) {
600 log.warn("Device configuration uploading. Device {} will be " 605 log.warn("Device configuration uploading. Device {} will be "
601 + "processed after config completes.", device.id()); 606 + "processed after config completes.", device.id());
602 return; 607 return;
...@@ -608,14 +613,20 @@ public class SegmentRoutingManager implements SegmentRoutingService { ...@@ -608,14 +613,20 @@ public class SegmentRoutingManager implements SegmentRoutingService {
608 // to the switch). To handle this, a default-group-handler instance is necessary 613 // to the switch). To handle this, a default-group-handler instance is necessary
609 // per switch. 614 // per switch.
610 if (groupHandlerMap.get(device.id()) == null) { 615 if (groupHandlerMap.get(device.id()) == null) {
611 - DefaultGroupHandler groupHandler = DefaultGroupHandler. 616 + DefaultGroupHandler groupHandler;
612 - createGroupHandler(device.id(), 617 + try {
613 - appId, 618 + groupHandler = DefaultGroupHandler.
614 - deviceConfiguration, 619 + createGroupHandler(device.id(),
615 - linkService, 620 + appId,
616 - flowObjectiveService, 621 + deviceConfiguration,
617 - nsNextObjStore, 622 + linkService,
618 - subnetNextObjStore); 623 + flowObjectiveService,
624 + nsNextObjStore,
625 + subnetNextObjStore);
626 + } catch (DeviceConfigNotFoundException e) {
627 + log.warn(e.getMessage() + " Aborting processDeviceAdded.");
628 + return;
629 + }
619 groupHandlerMap.put(device.id(), groupHandler); 630 groupHandlerMap.put(device.id(), groupHandler);
620 // Also, in some cases, drivers may need extra 631 // Also, in some cases, drivers may need extra
621 // information to process rules (eg. Router IP/MAC); and so, we send 632 // information to process rules (eg. Router IP/MAC); and so, we send
...@@ -667,12 +678,20 @@ public class SegmentRoutingManager implements SegmentRoutingService { ...@@ -667,12 +678,20 @@ public class SegmentRoutingManager implements SegmentRoutingService {
667 // to the switch). To handle this, a default-group-handler instance is necessary 678 // to the switch). To handle this, a default-group-handler instance is necessary
668 // per switch. 679 // per switch.
669 if (groupHandlerMap.get(device.id()) == null) { 680 if (groupHandlerMap.get(device.id()) == null) {
670 - DefaultGroupHandler groupHandler = DefaultGroupHandler 681 + DefaultGroupHandler groupHandler;
671 - .createGroupHandler(device.id(), appId, 682 + try {
672 - deviceConfiguration, linkService, 683 + groupHandler = DefaultGroupHandler.
673 - flowObjectiveService, 684 + createGroupHandler(device.id(),
674 - nsNextObjStore, 685 + appId,
675 - subnetNextObjStore); 686 + deviceConfiguration,
687 + linkService,
688 + flowObjectiveService,
689 + nsNextObjStore,
690 + subnetNextObjStore);
691 + } catch (DeviceConfigNotFoundException e) {
692 + log.warn(e.getMessage() + " Aborting configureNetwork.");
693 + return;
694 + }
676 groupHandlerMap.put(device.id(), groupHandler); 695 groupHandlerMap.put(device.id(), groupHandler);
677 696
678 // Also, in some cases, drivers may need extra 697 // Also, in some cases, drivers may need extra
......
...@@ -18,6 +18,7 @@ package org.onosproject.segmentrouting; ...@@ -18,6 +18,7 @@ package org.onosproject.segmentrouting;
18 import org.onosproject.net.DeviceId; 18 import org.onosproject.net.DeviceId;
19 import org.onosproject.net.Link; 19 import org.onosproject.net.Link;
20 import org.onosproject.net.link.LinkService; 20 import org.onosproject.net.link.LinkService;
21 +import org.onosproject.segmentrouting.config.DeviceConfiguration;
21 import org.onosproject.segmentrouting.grouphandler.DefaultGroupHandler; 22 import org.onosproject.segmentrouting.grouphandler.DefaultGroupHandler;
22 import org.onosproject.segmentrouting.grouphandler.NeighborSet; 23 import org.onosproject.segmentrouting.grouphandler.NeighborSet;
23 import org.onosproject.store.service.EventuallyConsistentMap; 24 import org.onosproject.store.service.EventuallyConsistentMap;
......
1 +/*
2 + * Copyright 2014-2015 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.segmentrouting.config;
18 +
19 +/**
20 + * Signals that an error occurred during reading device configuration.
21 + */
22 +public class DeviceConfigNotFoundException extends Exception {
23 +
24 + /**
25 + * Creates a new ConfigNotFoundException with the given message.
26 + *
27 + * @param message exception message
28 + */
29 + public DeviceConfigNotFoundException(String message) {
30 + super(message);
31 + }
32 +}
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
13 * See the License for the specific language governing permissions and 13 * See the License for the specific language governing permissions and
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 -package org.onosproject.segmentrouting; 16 +package org.onosproject.segmentrouting.config;
17 17
18 import com.google.common.collect.ImmutableSet; 18 import com.google.common.collect.ImmutableSet;
19 import com.google.common.collect.Lists; 19 import com.google.common.collect.Lists;
...@@ -26,9 +26,7 @@ import org.onosproject.incubator.net.intf.Interface; ...@@ -26,9 +26,7 @@ import org.onosproject.incubator.net.intf.Interface;
26 import org.onosproject.net.ConnectPoint; 26 import org.onosproject.net.ConnectPoint;
27 import org.onosproject.net.config.NetworkConfigRegistry; 27 import org.onosproject.net.config.NetworkConfigRegistry;
28 import org.onosproject.net.host.InterfaceIpAddress; 28 import org.onosproject.net.host.InterfaceIpAddress;
29 -import org.onosproject.segmentrouting.config.SegmentRoutingConfig;
30 import org.onosproject.segmentrouting.config.SegmentRoutingConfig.AdjacencySid; 29 import org.onosproject.segmentrouting.config.SegmentRoutingConfig.AdjacencySid;
31 -import org.onosproject.segmentrouting.grouphandler.DeviceProperties;
32 import org.onosproject.net.DeviceId; 30 import org.onosproject.net.DeviceId;
33 import org.onosproject.net.PortNumber; 31 import org.onosproject.net.PortNumber;
34 import org.slf4j.Logger; 32 import org.slf4j.Logger;
...@@ -126,23 +124,20 @@ public class DeviceConfiguration implements DeviceProperties { ...@@ -126,23 +124,20 @@ public class DeviceConfiguration implements DeviceProperties {
126 }); 124 });
127 } 125 }
128 126
129 - /**
130 - * Returns the Node segment id of a segment router.
131 - *
132 - * @param deviceId device identifier
133 - * @return segment id
134 - */
135 @Override 127 @Override
136 - public int getSegmentId(DeviceId deviceId) { 128 + public boolean isConfigured(DeviceId deviceId) {
129 + return deviceConfigMap.get(deviceId) != null;
130 + }
131 +
132 + @Override
133 + public int getSegmentId(DeviceId deviceId) throws DeviceConfigNotFoundException {
137 SegmentRouterInfo srinfo = deviceConfigMap.get(deviceId); 134 SegmentRouterInfo srinfo = deviceConfigMap.get(deviceId);
138 if (srinfo != null) { 135 if (srinfo != null) {
139 log.trace("getSegmentId for device{} is {}", deviceId, srinfo.nodeSid); 136 log.trace("getSegmentId for device{} is {}", deviceId, srinfo.nodeSid);
140 return srinfo.nodeSid; 137 return srinfo.nodeSid;
141 } else { 138 } else {
142 - log.warn("getSegmentId for device {} " 139 + String message = "getSegmentId fails for device: " + deviceId + ".";
143 - + "throwing IllegalStateException " 140 + throw new DeviceConfigNotFoundException(message);
144 - + "because device does not exist in config", deviceId);
145 - throw new IllegalStateException();
146 } 141 }
147 } 142 }
148 143
...@@ -180,71 +175,42 @@ public class DeviceConfiguration implements DeviceProperties { ...@@ -180,71 +175,42 @@ public class DeviceConfiguration implements DeviceProperties {
180 return -1; 175 return -1;
181 } 176 }
182 177
183 - /**
184 - * Returns the router mac of a segment router.
185 - *
186 - * @param deviceId device identifier
187 - * @return router mac address
188 - */
189 @Override 178 @Override
190 - public MacAddress getDeviceMac(DeviceId deviceId) { 179 + public MacAddress getDeviceMac(DeviceId deviceId) throws DeviceConfigNotFoundException {
191 SegmentRouterInfo srinfo = deviceConfigMap.get(deviceId); 180 SegmentRouterInfo srinfo = deviceConfigMap.get(deviceId);
192 if (srinfo != null) { 181 if (srinfo != null) {
193 log.trace("getDeviceMac for device{} is {}", deviceId, srinfo.mac); 182 log.trace("getDeviceMac for device{} is {}", deviceId, srinfo.mac);
194 return srinfo.mac; 183 return srinfo.mac;
195 } else { 184 } else {
196 - log.warn("getDeviceMac for device {} " 185 + String message = "getDeviceMac fails for device: " + deviceId + ".";
197 - + "throwing IllegalStateException " 186 + throw new DeviceConfigNotFoundException(message);
198 - + "because device does not exist in config", deviceId);
199 - throw new IllegalStateException();
200 } 187 }
201 } 188 }
202 189
203 - /** 190 + @Override
204 - * Returns the router ip address of a segment router. 191 + public Ip4Address getRouterIp(DeviceId deviceId) throws DeviceConfigNotFoundException {
205 - *
206 - * @param deviceId device identifier
207 - * @return router ip address
208 - */
209 - public Ip4Address getRouterIp(DeviceId deviceId) {
210 SegmentRouterInfo srinfo = deviceConfigMap.get(deviceId); 192 SegmentRouterInfo srinfo = deviceConfigMap.get(deviceId);
211 if (srinfo != null) { 193 if (srinfo != null) {
212 log.trace("getDeviceIp for device{} is {}", deviceId, srinfo.ip); 194 log.trace("getDeviceIp for device{} is {}", deviceId, srinfo.ip);
213 return srinfo.ip; 195 return srinfo.ip;
214 } else { 196 } else {
215 - log.warn("getRouterIp for device {} " 197 + String message = "getRouterIp fails for device: " + deviceId + ".";
216 - + "throwing IllegalStateException " 198 + throw new DeviceConfigNotFoundException(message);
217 - + "because device does not exist in config", deviceId);
218 - throw new IllegalStateException();
219 } 199 }
220 } 200 }
221 201
222 - /**
223 - * Indicates if the segment router is a edge router or
224 - * a core/backbone router.
225 - *
226 - * @param deviceId device identifier
227 - * @return boolean
228 - */
229 @Override 202 @Override
230 - public boolean isEdgeDevice(DeviceId deviceId) { 203 + public boolean isEdgeDevice(DeviceId deviceId) throws DeviceConfigNotFoundException {
231 SegmentRouterInfo srinfo = deviceConfigMap.get(deviceId); 204 SegmentRouterInfo srinfo = deviceConfigMap.get(deviceId);
232 if (srinfo != null) { 205 if (srinfo != null) {
233 log.trace("isEdgeDevice for device{} is {}", deviceId, srinfo.isEdge); 206 log.trace("isEdgeDevice for device{} is {}", deviceId, srinfo.isEdge);
234 return srinfo.isEdge; 207 return srinfo.isEdge;
235 } else { 208 } else {
236 - log.warn("isEdgeDevice for device {} " 209 + String message = "isEdgeDevice fails for device: " + deviceId + ".";
237 - + "throwing IllegalStateException " 210 + throw new DeviceConfigNotFoundException(message);
238 - + "because device does not exist in config", deviceId);
239 - throw new IllegalStateException();
240 } 211 }
241 } 212 }
242 213
243 - /**
244 - * Returns the node segment ids of all configured segment routers.
245 - *
246 - * @return list of node segment ids
247 - */
248 @Override 214 @Override
249 public List<Integer> getAllDeviceSegmentIds() { 215 public List<Integer> getAllDeviceSegmentIds() {
250 return allSegmentIds; 216 return allSegmentIds;
......
...@@ -13,11 +13,12 @@ ...@@ -13,11 +13,12 @@
13 * See the License for the specific language governing permissions and 13 * See the License for the specific language governing permissions and
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 -package org.onosproject.segmentrouting.grouphandler; 16 +package org.onosproject.segmentrouting.config;
17 17
18 import java.util.List; 18 import java.util.List;
19 import java.util.Map; 19 import java.util.Map;
20 20
21 +import org.onlab.packet.Ip4Address;
21 import org.onlab.packet.Ip4Prefix; 22 import org.onlab.packet.Ip4Prefix;
22 import org.onlab.packet.MacAddress; 23 import org.onlab.packet.MacAddress;
23 import org.onosproject.net.DeviceId; 24 import org.onosproject.net.DeviceId;
...@@ -30,28 +31,48 @@ import org.onosproject.net.PortNumber; ...@@ -30,28 +31,48 @@ import org.onosproject.net.PortNumber;
30 */ 31 */
31 public interface DeviceProperties { 32 public interface DeviceProperties {
32 /** 33 /**
34 + * Checks if the device is configured.
35 + *
36 + * @param deviceId device identifier
37 + * @return true if the device is configured
38 + */
39 + boolean isConfigured(DeviceId deviceId);
40 +
41 + /**
33 * Returns the segment id of a device to be used in group creation. 42 * Returns the segment id of a device to be used in group creation.
34 * 43 *
35 * @param deviceId device identifier 44 * @param deviceId device identifier
45 + * @throws DeviceConfigNotFoundException if the device configuration is not found
36 * @return segment id of a device 46 * @return segment id of a device
37 */ 47 */
38 - int getSegmentId(DeviceId deviceId); 48 + int getSegmentId(DeviceId deviceId) throws DeviceConfigNotFoundException;
39 49
40 /** 50 /**
41 * Returns the Mac address of a device to be used in group creation. 51 * Returns the Mac address of a device to be used in group creation.
42 * 52 *
43 * @param deviceId device identifier 53 * @param deviceId device identifier
54 + * @throws DeviceConfigNotFoundException if the device configuration is not found
44 * @return mac address of a device 55 * @return mac address of a device
45 */ 56 */
46 - MacAddress getDeviceMac(DeviceId deviceId); 57 + MacAddress getDeviceMac(DeviceId deviceId) throws DeviceConfigNotFoundException;
58 +
59 + /**
60 + * Returns the router ip address of a segment router.
61 + *
62 + * @param deviceId device identifier
63 + * @throws DeviceConfigNotFoundException if the device configuration is not found
64 + * @return router ip address
65 + */
66 + Ip4Address getRouterIp(DeviceId deviceId) throws DeviceConfigNotFoundException;
47 67
48 /** 68 /**
49 * Indicates whether a device is edge device or transit/core device. 69 * Indicates whether a device is edge device or transit/core device.
50 * 70 *
51 * @param deviceId device identifier 71 * @param deviceId device identifier
72 + * @throws DeviceConfigNotFoundException if the device configuration is not found
52 * @return boolean 73 * @return boolean
53 */ 74 */
54 - boolean isEdgeDevice(DeviceId deviceId); 75 + boolean isEdgeDevice(DeviceId deviceId) throws DeviceConfigNotFoundException;
55 76
56 /** 77 /**
57 * Returns all segment IDs to be considered in building auto 78 * Returns all segment IDs to be considered in building auto
......
...@@ -24,6 +24,7 @@ import org.onosproject.net.DeviceId; ...@@ -24,6 +24,7 @@ import org.onosproject.net.DeviceId;
24 import org.onosproject.net.Link; 24 import org.onosproject.net.Link;
25 import org.onosproject.net.flowobjective.FlowObjectiveService; 25 import org.onosproject.net.flowobjective.FlowObjectiveService;
26 import org.onosproject.net.link.LinkService; 26 import org.onosproject.net.link.LinkService;
27 +import org.onosproject.segmentrouting.config.DeviceProperties;
27 import org.onosproject.store.service.EventuallyConsistentMap; 28 import org.onosproject.store.service.EventuallyConsistentMap;
28 29
29 /** 30 /**
......
...@@ -48,6 +48,8 @@ import org.onosproject.net.flowobjective.ObjectiveError; ...@@ -48,6 +48,8 @@ import org.onosproject.net.flowobjective.ObjectiveError;
48 import org.onosproject.net.group.DefaultGroupKey; 48 import org.onosproject.net.group.DefaultGroupKey;
49 import org.onosproject.net.group.GroupKey; 49 import org.onosproject.net.group.GroupKey;
50 import org.onosproject.net.link.LinkService; 50 import org.onosproject.net.link.LinkService;
51 +import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
52 +import org.onosproject.segmentrouting.config.DeviceProperties;
51 import org.onosproject.store.service.EventuallyConsistentMap; 53 import org.onosproject.store.service.EventuallyConsistentMap;
52 import org.slf4j.Logger; 54 import org.slf4j.Logger;
53 55
...@@ -63,9 +65,9 @@ public class DefaultGroupHandler { ...@@ -63,9 +65,9 @@ public class DefaultGroupHandler {
63 protected final ApplicationId appId; 65 protected final ApplicationId appId;
64 protected final DeviceProperties deviceConfig; 66 protected final DeviceProperties deviceConfig;
65 protected final List<Integer> allSegmentIds; 67 protected final List<Integer> allSegmentIds;
66 - protected final int nodeSegmentId; 68 + protected int nodeSegmentId = -1;
67 - protected final boolean isEdgeRouter; 69 + protected boolean isEdgeRouter = false;
68 - protected final MacAddress nodeMacAddr; 70 + protected MacAddress nodeMacAddr = null;
69 protected LinkService linkService; 71 protected LinkService linkService;
70 protected FlowObjectiveService flowObjectiveService; 72 protected FlowObjectiveService flowObjectiveService;
71 73
...@@ -99,10 +101,15 @@ public class DefaultGroupHandler { ...@@ -99,10 +101,15 @@ public class DefaultGroupHandler {
99 this.appId = checkNotNull(appId); 101 this.appId = checkNotNull(appId);
100 this.deviceConfig = checkNotNull(config); 102 this.deviceConfig = checkNotNull(config);
101 this.linkService = checkNotNull(linkService); 103 this.linkService = checkNotNull(linkService);
102 - allSegmentIds = checkNotNull(config.getAllDeviceSegmentIds()); 104 + this.allSegmentIds = checkNotNull(config.getAllDeviceSegmentIds());
103 - nodeSegmentId = config.getSegmentId(deviceId); 105 + try {
104 - isEdgeRouter = config.isEdgeDevice(deviceId); 106 + this.nodeSegmentId = config.getSegmentId(deviceId);
105 - nodeMacAddr = checkNotNull(config.getDeviceMac(deviceId)); 107 + this.isEdgeRouter = config.isEdgeDevice(deviceId);
108 + this.nodeMacAddr = checkNotNull(config.getDeviceMac(deviceId));
109 + } catch (DeviceConfigNotFoundException e) {
110 + log.warn(e.getMessage()
111 + + " Skipping value assignment in DefaultGroupHandler");
112 + }
106 this.flowObjectiveService = flowObjService; 113 this.flowObjectiveService = flowObjService;
107 this.nsNextObjStore = nsNextObjStore; 114 this.nsNextObjStore = nsNextObjStore;
108 this.subnetNextObjStore = subnetNextObjStore; 115 this.subnetNextObjStore = subnetNextObjStore;
...@@ -122,6 +129,7 @@ public class DefaultGroupHandler { ...@@ -122,6 +129,7 @@ public class DefaultGroupHandler {
122 * @param flowObjService flow objective service object 129 * @param flowObjService flow objective service object
123 * @param nsNextObjStore NeighborSet next objective store map 130 * @param nsNextObjStore NeighborSet next objective store map
124 * @param subnetNextObjStore subnet next objective store map 131 * @param subnetNextObjStore subnet next objective store map
132 + * @throws DeviceConfigNotFoundException if the device configuration is not found
125 * @return default group handler type 133 * @return default group handler type
126 */ 134 */
127 public static DefaultGroupHandler createGroupHandler(DeviceId deviceId, 135 public static DefaultGroupHandler createGroupHandler(DeviceId deviceId,
...@@ -133,7 +141,9 @@ public class DefaultGroupHandler { ...@@ -133,7 +141,9 @@ public class DefaultGroupHandler {
133 NeighborSetNextObjectiveStoreKey, 141 NeighborSetNextObjectiveStoreKey,
134 Integer> nsNextObjStore, 142 Integer> nsNextObjStore,
135 EventuallyConsistentMap<SubnetNextObjectiveStoreKey, 143 EventuallyConsistentMap<SubnetNextObjectiveStoreKey,
136 - Integer> subnetNextObjStore) { 144 + Integer> subnetNextObjStore)
145 + throws DeviceConfigNotFoundException {
146 + // handle possible exception in the caller
137 if (config.isEdgeDevice(deviceId)) { 147 if (config.isEdgeDevice(deviceId)) {
138 return new DefaultEdgeGroupHandler(deviceId, appId, config, 148 return new DefaultEdgeGroupHandler(deviceId, appId, config,
139 linkService, 149 linkService,
...@@ -176,6 +186,14 @@ public class DefaultGroupHandler { ...@@ -176,6 +186,14 @@ public class DefaultGroupHandler {
176 return; 186 return;
177 } 187 }
178 188
189 + MacAddress dstMac;
190 + try {
191 + dstMac = deviceConfig.getDeviceMac(newLink.dst().deviceId());
192 + } catch (DeviceConfigNotFoundException e) {
193 + log.warn(e.getMessage() + " Aborting linkUp.");
194 + return;
195 + }
196 +
179 log.debug("Device {} linkUp at local port {} to neighbor {}", deviceId, 197 log.debug("Device {} linkUp at local port {} to neighbor {}", deviceId,
180 newLink.src().port(), newLink.dst().deviceId()); 198 newLink.src().port(), newLink.dst().deviceId());
181 addNeighborAtPort(newLink.dst().deviceId(), 199 addNeighborAtPort(newLink.dst().deviceId(),
...@@ -202,8 +220,7 @@ public class DefaultGroupHandler { ...@@ -202,8 +220,7 @@ public class DefaultGroupHandler {
202 TrafficTreatment.Builder tBuilder = 220 TrafficTreatment.Builder tBuilder =
203 DefaultTrafficTreatment.builder(); 221 DefaultTrafficTreatment.builder();
204 tBuilder.setOutput(newLink.src().port()) 222 tBuilder.setOutput(newLink.src().port())
205 - .setEthDst(deviceConfig.getDeviceMac( 223 + .setEthDst(dstMac)
206 - newLink.dst().deviceId()))
207 .setEthSrc(nodeMacAddr); 224 .setEthSrc(nodeMacAddr);
208 if (ns.getEdgeLabel() != NeighborSet.NO_EDGE_LABEL) { 225 if (ns.getEdgeLabel() != NeighborSet.NO_EDGE_LABEL) {
209 tBuilder.pushMpls() 226 tBuilder.pushMpls()
...@@ -242,6 +259,15 @@ public class DefaultGroupHandler { ...@@ -242,6 +259,15 @@ public class DefaultGroupHandler {
242 log.warn("portDown: unknown port"); 259 log.warn("portDown: unknown port");
243 return; 260 return;
244 } 261 }
262 +
263 + MacAddress dstMac;
264 + try {
265 + dstMac = deviceConfig.getDeviceMac(portDeviceMap.get(port));
266 + } catch (DeviceConfigNotFoundException e) {
267 + log.warn(e.getMessage() + " Aborting portDown.");
268 + return;
269 + }
270 +
245 log.debug("Device {} portDown {} to neighbor {}", deviceId, port, 271 log.debug("Device {} portDown {} to neighbor {}", deviceId, port,
246 portDeviceMap.get(port)); 272 portDeviceMap.get(port));
247 /*Set<NeighborSet> nsSet = computeImpactedNeighborsetForPortEvent(portDeviceMap 273 /*Set<NeighborSet> nsSet = computeImpactedNeighborsetForPortEvent(portDeviceMap
...@@ -263,8 +289,8 @@ public class DefaultGroupHandler { ...@@ -263,8 +289,8 @@ public class DefaultGroupHandler {
263 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment 289 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment
264 .builder(); 290 .builder();
265 tBuilder.setOutput(port) 291 tBuilder.setOutput(port)
266 - .setEthDst(deviceConfig.getDeviceMac(portDeviceMap 292 + .setEthDst(dstMac)
267 - .get(port))).setEthSrc(nodeMacAddr); 293 + .setEthSrc(nodeMacAddr);
268 if (ns.getEdgeLabel() != NeighborSet.NO_EDGE_LABEL) { 294 if (ns.getEdgeLabel() != NeighborSet.NO_EDGE_LABEL) {
269 tBuilder.pushMpls().setMpls(MplsLabel.mplsLabel(ns 295 tBuilder.pushMpls().setMpls(MplsLabel.mplsLabel(ns
270 .getEdgeLabel())); 296 .getEdgeLabel()));
...@@ -432,7 +458,15 @@ public class DefaultGroupHandler { ...@@ -432,7 +458,15 @@ public class DefaultGroupHandler {
432 } 458 }
433 459
434 private boolean isSegmentIdSameAsNodeSegmentId(DeviceId deviceId, int sId) { 460 private boolean isSegmentIdSameAsNodeSegmentId(DeviceId deviceId, int sId) {
435 - return (deviceConfig.getSegmentId(deviceId) == sId); 461 + int segmentId;
462 + try {
463 + segmentId = deviceConfig.getSegmentId(deviceId);
464 + } catch (DeviceConfigNotFoundException e) {
465 + log.warn(e.getMessage() + " Aborting isSegmentIdSameAsNodeSegmentId.");
466 + return false;
467 + }
468 +
469 + return segmentId == sId;
436 } 470 }
437 471
438 protected List<Integer> getSegmentIdsTobePairedWithNeighborSet(Set<DeviceId> neighbors) { 472 protected List<Integer> getSegmentIdsTobePairedWithNeighborSet(Set<DeviceId> neighbors) {
...@@ -487,11 +521,19 @@ public class DefaultGroupHandler { ...@@ -487,11 +521,19 @@ public class DefaultGroupHandler {
487 return; 521 return;
488 } 522 }
489 523
524 + MacAddress deviceMac;
525 + try {
526 + deviceMac = deviceConfig.getDeviceMac(d);
527 + } catch (DeviceConfigNotFoundException e) {
528 + log.warn(e.getMessage() + " Aborting createGroupsFromNeighborsets.");
529 + return;
530 + }
531 +
490 for (PortNumber sp : devicePortMap.get(d)) { 532 for (PortNumber sp : devicePortMap.get(d)) {
491 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment 533 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment
492 .builder(); 534 .builder();
493 tBuilder.setOutput(sp) 535 tBuilder.setOutput(sp)
494 - .setEthDst(deviceConfig.getDeviceMac(d)) 536 + .setEthDst(deviceMac)
495 .setEthSrc(nodeMacAddr); 537 .setEthSrc(nodeMacAddr);
496 if (ns.getEdgeLabel() != NeighborSet.NO_EDGE_LABEL) { 538 if (ns.getEdgeLabel() != NeighborSet.NO_EDGE_LABEL) {
497 tBuilder.pushMpls().setMpls(MplsLabel.mplsLabel(ns 539 tBuilder.pushMpls().setMpls(MplsLabel.mplsLabel(ns
......
...@@ -23,6 +23,8 @@ import org.onosproject.net.DeviceId; ...@@ -23,6 +23,8 @@ import org.onosproject.net.DeviceId;
23 import org.onosproject.net.Link; 23 import org.onosproject.net.Link;
24 import org.onosproject.net.flowobjective.FlowObjectiveService; 24 import org.onosproject.net.flowobjective.FlowObjectiveService;
25 import org.onosproject.net.link.LinkService; 25 import org.onosproject.net.link.LinkService;
26 +import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
27 +import org.onosproject.segmentrouting.config.DeviceProperties;
26 import org.onosproject.store.service.EventuallyConsistentMap; 28 import org.onosproject.store.service.EventuallyConsistentMap;
27 29
28 /** 30 /**
...@@ -171,7 +173,15 @@ public class DefaultTransitGroupHandler extends DefaultGroupHandler { ...@@ -171,7 +173,15 @@ public class DefaultTransitGroupHandler extends DefaultGroupHandler {
171 if (deviceSubSet.size() > 1) { 173 if (deviceSubSet.size() > 1) {
172 boolean avoidEdgeRouterPairing = true; 174 boolean avoidEdgeRouterPairing = true;
173 for (DeviceId device : deviceSubSet) { 175 for (DeviceId device : deviceSubSet) {
174 - if (!deviceConfig.isEdgeDevice(device)) { 176 + boolean isEdge;
177 + try {
178 + isEdge = deviceConfig.isEdgeDevice(device);
179 + } catch (DeviceConfigNotFoundException e) {
180 + log.warn(e.getMessage() + " Skipping filterEdgeRouterOnlyPairings on this device.");
181 + continue;
182 + }
183 +
184 + if (!isEdge) {
175 avoidEdgeRouterPairing = false; 185 avoidEdgeRouterPairing = false;
176 break; 186 break;
177 } 187 }
......
...@@ -24,8 +24,11 @@ import java.util.HashMap; ...@@ -24,8 +24,11 @@ import java.util.HashMap;
24 import java.util.Iterator; 24 import java.util.Iterator;
25 import java.util.List; 25 import java.util.List;
26 26
27 +import org.onlab.packet.MacAddress;
27 import org.onlab.packet.MplsLabel; 28 import org.onlab.packet.MplsLabel;
28 import org.onosproject.core.ApplicationId; 29 import org.onosproject.core.ApplicationId;
30 +import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
31 +import org.onosproject.segmentrouting.config.DeviceProperties;
29 import org.onosproject.segmentrouting.grouphandler.GroupBucketIdentifier.BucketOutputType; 32 import org.onosproject.segmentrouting.grouphandler.GroupBucketIdentifier.BucketOutputType;
30 import org.onosproject.store.service.EventuallyConsistentMap; 33 import org.onosproject.store.service.EventuallyConsistentMap;
31 import org.onosproject.net.DeviceId; 34 import org.onosproject.net.DeviceId;
...@@ -105,11 +108,19 @@ public class PolicyGroupHandler extends DefaultGroupHandler { ...@@ -105,11 +108,19 @@ public class PolicyGroupHandler extends DefaultGroupHandler {
105 PolicyGroupIdentifier(id, 108 PolicyGroupIdentifier(id,
106 Collections.singletonList(param), 109 Collections.singletonList(param),
107 Collections.singletonList(bucketId)); 110 Collections.singletonList(bucketId));
111 + MacAddress neighborEthDst;
112 + try {
113 + neighborEthDst = deviceConfig.getDeviceMac(neighbor);
114 + } catch (DeviceConfigNotFoundException e) {
115 + log.warn(e.getMessage()
116 + + " Skipping createPolicyGroupChain for this label.");
117 + continue;
118 + }
119 +
108 TrafficTreatment.Builder tBuilder = 120 TrafficTreatment.Builder tBuilder =
109 DefaultTrafficTreatment.builder(); 121 DefaultTrafficTreatment.builder();
110 tBuilder.setOutput(sp) 122 tBuilder.setOutput(sp)
111 - .setEthDst(deviceConfig. 123 + .setEthDst(neighborEthDst)
112 - getDeviceMac(neighbor))
113 .setEthSrc(nodeMacAddr) 124 .setEthSrc(nodeMacAddr)
114 .pushMpls() 125 .pushMpls()
115 .setMpls(MplsLabel.mplsLabel(label)); 126 .setMpls(MplsLabel.mplsLabel(label));
...@@ -168,14 +179,23 @@ public class PolicyGroupHandler extends DefaultGroupHandler { ...@@ -168,14 +179,23 @@ public class PolicyGroupHandler extends DefaultGroupHandler {
168 179
169 if (fullyResolved) { 180 if (fullyResolved) {
170 List<GroupBucket> outBuckets = new ArrayList<>(); 181 List<GroupBucket> outBuckets = new ArrayList<>();
171 - for (GroupBucketIdentifier bucketId:bucketIds) { 182 + for (GroupBucketIdentifier bucketId : bucketIds) {
172 DeviceId neighbor = portDeviceMap. 183 DeviceId neighbor = portDeviceMap.
173 get(bucketId.outPort()); 184 get(bucketId.outPort());
185 +
186 + MacAddress neighborEthDst;
187 + try {
188 + neighborEthDst = deviceConfig.getDeviceMac(neighbor);
189 + } catch (DeviceConfigNotFoundException e) {
190 + log.warn(e.getMessage()
191 + + " Skipping createPolicyGroupChain for this bucketId.");
192 + continue;
193 + }
194 +
174 TrafficTreatment.Builder tBuilder = 195 TrafficTreatment.Builder tBuilder =
175 DefaultTrafficTreatment.builder(); 196 DefaultTrafficTreatment.builder();
176 tBuilder.setOutput(bucketId.outPort()) 197 tBuilder.setOutput(bucketId.outPort())
177 - .setEthDst(deviceConfig. 198 + .setEthDst(neighborEthDst)
178 - getDeviceMac(neighbor))
179 .setEthSrc(nodeMacAddr); 199 .setEthSrc(nodeMacAddr);
180 if (bucketId.label() != NeighborSet.NO_EDGE_LABEL) { 200 if (bucketId.label() != NeighborSet.NO_EDGE_LABEL) {
181 tBuilder.pushMpls() 201 tBuilder.pushMpls()
......