Committed by
Gerrit Code Review
ONOS-1521 : Supports Leaf-Spine topology (tested with 4 x 4 )
- Supports ECMPNotSupportedInTransitRouter option - Adds Leaf-Spine config file - Removes the temporary NetworkConfigHanlder class - Removes the grouphandler dependency - Removes the grouphandler app Change-Id: I8c70e81bfb4062e251b25c0fa23ef2c92419a75c
Showing
8 changed files
with
82 additions
and
207 deletions
| ... | @@ -43,7 +43,7 @@ public class ArpHandler { | ... | @@ -43,7 +43,7 @@ public class ArpHandler { |
| 43 | private static Logger log = LoggerFactory.getLogger(ArpHandler.class); | 43 | private static Logger log = LoggerFactory.getLogger(ArpHandler.class); |
| 44 | 44 | ||
| 45 | private SegmentRoutingManager srManager; | 45 | private SegmentRoutingManager srManager; |
| 46 | - private NetworkConfigHandler config; | 46 | + private DeviceConfiguration config; |
| 47 | 47 | ||
| 48 | /** | 48 | /** |
| 49 | * Creates an ArpHandler object. | 49 | * Creates an ArpHandler object. |
| ... | @@ -52,7 +52,7 @@ public class ArpHandler { | ... | @@ -52,7 +52,7 @@ public class ArpHandler { |
| 52 | */ | 52 | */ |
| 53 | public ArpHandler(SegmentRoutingManager srManager) { | 53 | public ArpHandler(SegmentRoutingManager srManager) { |
| 54 | this.srManager = srManager; | 54 | this.srManager = srManager; |
| 55 | - this.config = checkNotNull(srManager.networkConfigHandler); | 55 | + this.config = checkNotNull(srManager.deviceConfiguration); |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | /** | 58 | /** |
| ... | @@ -96,8 +96,8 @@ public class ArpHandler { | ... | @@ -96,8 +96,8 @@ public class ArpHandler { |
| 96 | // ARP request for router | 96 | // ARP request for router |
| 97 | if (isArpReqForRouter(deviceId, arpRequest)) { | 97 | if (isArpReqForRouter(deviceId, arpRequest)) { |
| 98 | Ip4Address targetAddress = Ip4Address.valueOf(arpRequest.getTargetProtocolAddress()); | 98 | Ip4Address targetAddress = Ip4Address.valueOf(arpRequest.getTargetProtocolAddress()); |
| 99 | - sendArpResponse(arpRequest, config.getRouterMac(targetAddress)); | ||
| 100 | 99 | ||
| 100 | + sendArpResponse(arpRequest, config.getRouterMacForAGatewayIp(targetAddress)); | ||
| 101 | // ARP request for known hosts | 101 | // ARP request for known hosts |
| 102 | } else if (srManager.hostService.getHost(targetHostId) != null) { | 102 | } else if (srManager.hostService.getHost(targetHostId) != null) { |
| 103 | MacAddress targetMac = srManager.hostService.getHost(targetHostId).mac(); | 103 | MacAddress targetMac = srManager.hostService.getHost(targetHostId).mac(); |
| ... | @@ -111,7 +111,7 @@ public class ArpHandler { | ... | @@ -111,7 +111,7 @@ public class ArpHandler { |
| 111 | 111 | ||
| 112 | 112 | ||
| 113 | private boolean isArpReqForRouter(DeviceId deviceId, ARP arpRequest) { | 113 | private boolean isArpReqForRouter(DeviceId deviceId, ARP arpRequest) { |
| 114 | - List<Ip4Address> gatewayIpAddresses = config.getGatewayIpAddress(deviceId); | 114 | + List<Ip4Address> gatewayIpAddresses = config.getSubnetGatewayIps(deviceId); |
| 115 | if (gatewayIpAddresses != null) { | 115 | if (gatewayIpAddresses != null) { |
| 116 | Ip4Address targetProtocolAddress = Ip4Address.valueOf(arpRequest | 116 | Ip4Address targetProtocolAddress = Ip4Address.valueOf(arpRequest |
| 117 | .getTargetProtocolAddress()); | 117 | .getTargetProtocolAddress()); |
| ... | @@ -123,7 +123,7 @@ public class ArpHandler { | ... | @@ -123,7 +123,7 @@ public class ArpHandler { |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | private boolean isArpReqForSubnet(DeviceId deviceId, ARP arpRequest) { | 125 | private boolean isArpReqForSubnet(DeviceId deviceId, ARP arpRequest) { |
| 126 | - return config.getSubnetInfo(deviceId).stream() | 126 | + return config.getSubnets(deviceId).stream() |
| 127 | .anyMatch((prefix)-> | 127 | .anyMatch((prefix)-> |
| 128 | prefix.contains(Ip4Address. | 128 | prefix.contains(Ip4Address. |
| 129 | valueOf(arpRequest. | 129 | valueOf(arpRequest. |
| ... | @@ -139,9 +139,8 @@ public class ArpHandler { | ... | @@ -139,9 +139,8 @@ public class ArpHandler { |
| 139 | */ | 139 | */ |
| 140 | public void sendArpRequest(DeviceId deviceId, IpAddress targetAddress, ConnectPoint inPort) { | 140 | public void sendArpRequest(DeviceId deviceId, IpAddress targetAddress, ConnectPoint inPort) { |
| 141 | 141 | ||
| 142 | - byte[] senderMacAddress = config.getRouterMacAddress(deviceId).toBytes(); | 142 | + byte[] senderMacAddress = config.getDeviceMac(deviceId).toBytes(); |
| 143 | - byte[] senderIpAddress = config.getRouterIpAddress(deviceId) | 143 | + byte[] senderIpAddress = config.getRouterIp(deviceId).toOctets(); |
| 144 | - .getIp4Prefix().address().toOctets(); | ||
| 145 | 144 | ||
| 146 | ARP arpRequest = new ARP(); | 145 | ARP arpRequest = new ARP(); |
| 147 | arpRequest.setHardwareType(ARP.HW_TYPE_ETHERNET) | 146 | arpRequest.setHardwareType(ARP.HW_TYPE_ETHERNET) | ... | ... |
| ... | @@ -17,6 +17,7 @@ package org.onosproject.segmentrouting; | ... | @@ -17,6 +17,7 @@ package org.onosproject.segmentrouting; |
| 17 | 17 | ||
| 18 | import com.google.common.collect.Maps; | 18 | import com.google.common.collect.Maps; |
| 19 | import com.google.common.collect.Sets; | 19 | import com.google.common.collect.Sets; |
| 20 | +import org.onlab.packet.Ip4Address; | ||
| 20 | import org.onlab.packet.Ip4Prefix; | 21 | import org.onlab.packet.Ip4Prefix; |
| 21 | import org.onlab.packet.IpPrefix; | 22 | import org.onlab.packet.IpPrefix; |
| 22 | import org.onosproject.net.Device; | 23 | import org.onosproject.net.Device; |
| ... | @@ -41,8 +42,8 @@ public class DefaultRoutingHandler { | ... | @@ -41,8 +42,8 @@ public class DefaultRoutingHandler { |
| 41 | 42 | ||
| 42 | private SegmentRoutingManager srManager; | 43 | private SegmentRoutingManager srManager; |
| 43 | private RoutingRulePopulator rulePopulator; | 44 | private RoutingRulePopulator rulePopulator; |
| 44 | - private NetworkConfigHandler config; | ||
| 45 | private HashMap<DeviceId, ECMPShortestPathGraph> currentEcmpSpgMap; | 45 | private HashMap<DeviceId, ECMPShortestPathGraph> currentEcmpSpgMap; |
| 46 | + private DeviceConfiguration config; | ||
| 46 | private Status populationStatus; | 47 | private Status populationStatus; |
| 47 | 48 | ||
| 48 | /** | 49 | /** |
| ... | @@ -70,7 +71,7 @@ public class DefaultRoutingHandler { | ... | @@ -70,7 +71,7 @@ public class DefaultRoutingHandler { |
| 70 | public DefaultRoutingHandler(SegmentRoutingManager srManager) { | 71 | public DefaultRoutingHandler(SegmentRoutingManager srManager) { |
| 71 | this.srManager = srManager; | 72 | this.srManager = srManager; |
| 72 | this.rulePopulator = checkNotNull(srManager.routingRulePopulator); | 73 | this.rulePopulator = checkNotNull(srManager.routingRulePopulator); |
| 73 | - this.config = checkNotNull(srManager.networkConfigHandler); | 74 | + this.config = checkNotNull(srManager.deviceConfiguration); |
| 74 | this.populationStatus = Status.IDLE; | 75 | this.populationStatus = Status.IDLE; |
| 75 | this.currentEcmpSpgMap = Maps.newHashMap(); | 76 | this.currentEcmpSpgMap = Maps.newHashMap(); |
| 76 | } | 77 | } |
| ... | @@ -356,8 +357,8 @@ public class DefaultRoutingHandler { | ... | @@ -356,8 +357,8 @@ public class DefaultRoutingHandler { |
| 356 | 357 | ||
| 357 | // If both target switch and dest switch are edge routers, then set IP rule | 358 | // If both target switch and dest switch are edge routers, then set IP rule |
| 358 | // for both subnet and router IP. | 359 | // for both subnet and router IP. |
| 359 | - if (config.isEdgeRouter(targetSw) && config.isEdgeRouter(destSw)) { | 360 | + if (config.isEdgeDevice(targetSw) && config.isEdgeDevice(destSw)) { |
| 360 | - List<Ip4Prefix> subnets = config.getSubnetInfo(destSw); | 361 | + List<Ip4Prefix> subnets = config.getSubnets(destSw); |
| 361 | result = rulePopulator.populateIpRuleForSubnet(targetSw, | 362 | result = rulePopulator.populateIpRuleForSubnet(targetSw, |
| 362 | subnets, | 363 | subnets, |
| 363 | destSw, | 364 | destSw, |
| ... | @@ -366,29 +367,28 @@ public class DefaultRoutingHandler { | ... | @@ -366,29 +367,28 @@ public class DefaultRoutingHandler { |
| 366 | return false; | 367 | return false; |
| 367 | } | 368 | } |
| 368 | 369 | ||
| 369 | - IpPrefix routerIp = config.getRouterIpAddress(destSw); | 370 | + Ip4Address routerIp = config.getRouterIp(destSw); |
| 370 | - result = rulePopulator.populateIpRuleForRouter(targetSw, routerIp, destSw, nextHops); | 371 | + IpPrefix routerIpPrefix = IpPrefix.valueOf(routerIp, IpPrefix.MAX_INET_MASK_LENGTH); |
| 372 | + result = rulePopulator.populateIpRuleForRouter(targetSw, routerIpPrefix, destSw, nextHops); | ||
| 371 | if (!result) { | 373 | if (!result) { |
| 372 | return false; | 374 | return false; |
| 373 | } | 375 | } |
| 374 | 376 | ||
| 375 | // If the target switch is an edge router, then set IP rules for the router IP. | 377 | // If the target switch is an edge router, then set IP rules for the router IP. |
| 376 | - } else if (config.isEdgeRouter(targetSw)) { | 378 | + } else if (config.isEdgeDevice(targetSw)) { |
| 377 | - IpPrefix routerIp = config.getRouterIpAddress(destSw); | 379 | + Ip4Address routerIp = config.getRouterIp(destSw); |
| 378 | - result = rulePopulator.populateIpRuleForRouter(targetSw, routerIp, destSw, nextHops); | 380 | + IpPrefix routerIpPrefix = IpPrefix.valueOf(routerIp, IpPrefix.MAX_INET_MASK_LENGTH); |
| 381 | + result = rulePopulator.populateIpRuleForRouter(targetSw, routerIpPrefix, destSw, nextHops); | ||
| 379 | if (!result) { | 382 | if (!result) { |
| 380 | return false; | 383 | return false; |
| 381 | } | 384 | } |
| 382 | 385 | ||
| 383 | // If the target switch is an transit router, then set MPLS rules only. | 386 | // If the target switch is an transit router, then set MPLS rules only. |
| 384 | - } else if (config.isTransitRouter(targetSw)) { | 387 | + } else if (!config.isEdgeDevice(targetSw)) { |
| 385 | result = rulePopulator.populateMplsRule(targetSw, destSw, nextHops); | 388 | result = rulePopulator.populateMplsRule(targetSw, destSw, nextHops); |
| 386 | if (!result) { | 389 | if (!result) { |
| 387 | return false; | 390 | return false; |
| 388 | } | 391 | } |
| 389 | - } else { | ||
| 390 | - log.warn("The switch {} is neither an edge router nor a transit router.", targetSw); | ||
| 391 | - return false; | ||
| 392 | } | 392 | } |
| 393 | 393 | ||
| 394 | return true; | 394 | return true; | ... | ... |
| ... | @@ -313,4 +313,31 @@ public class DeviceConfiguration implements DeviceProperties { | ... | @@ -313,4 +313,31 @@ public class DeviceConfiguration implements DeviceProperties { |
| 313 | log.debug("Cannot find a router for {}", gatewayIpAddress); | 313 | log.debug("Cannot find a router for {}", gatewayIpAddress); |
| 314 | return null; | 314 | return null; |
| 315 | } | 315 | } |
| 316 | + | ||
| 317 | + | ||
| 318 | + /** | ||
| 319 | + * Checks if the host is in the subnet defined in the router with the | ||
| 320 | + * device ID given. | ||
| 321 | + * | ||
| 322 | + * @param deviceId device identification of the router | ||
| 323 | + * @param hostIp host IP address to check | ||
| 324 | + * @return true if the host is within the subnet of the router, | ||
| 325 | + * false if no subnet is defined under the router or if the host is not | ||
| 326 | + * within the subnet defined in the router | ||
| 327 | + */ | ||
| 328 | + public boolean inSameSubnet(DeviceId deviceId, Ip4Address hostIp) { | ||
| 329 | + | ||
| 330 | + List<Ip4Prefix> subnets = getSubnets(deviceId); | ||
| 331 | + if (subnets == null) { | ||
| 332 | + return false; | ||
| 333 | + } | ||
| 334 | + | ||
| 335 | + for (Ip4Prefix subnet: subnets) { | ||
| 336 | + if (subnet.contains(hostIp)) { | ||
| 337 | + return true; | ||
| 338 | + } | ||
| 339 | + } | ||
| 340 | + | ||
| 341 | + return false; | ||
| 342 | + } | ||
| 316 | } | 343 | } | ... | ... |
| ... | @@ -39,7 +39,7 @@ public class IcmpHandler { | ... | @@ -39,7 +39,7 @@ public class IcmpHandler { |
| 39 | 39 | ||
| 40 | private static Logger log = LoggerFactory.getLogger(IcmpHandler.class); | 40 | private static Logger log = LoggerFactory.getLogger(IcmpHandler.class); |
| 41 | private SegmentRoutingManager srManager; | 41 | private SegmentRoutingManager srManager; |
| 42 | - private NetworkConfigHandler config; | 42 | + private DeviceConfiguration config; |
| 43 | 43 | ||
| 44 | /** | 44 | /** |
| 45 | * Creates an IcmpHandler object. | 45 | * Creates an IcmpHandler object. |
| ... | @@ -48,7 +48,7 @@ public class IcmpHandler { | ... | @@ -48,7 +48,7 @@ public class IcmpHandler { |
| 48 | */ | 48 | */ |
| 49 | public IcmpHandler(SegmentRoutingManager srManager) { | 49 | public IcmpHandler(SegmentRoutingManager srManager) { |
| 50 | this.srManager = srManager; | 50 | this.srManager = srManager; |
| 51 | - this.config = checkNotNull(srManager.networkConfigHandler); | 51 | + this.config = checkNotNull(srManager.deviceConfiguration); |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | /** | 54 | /** |
| ... | @@ -69,8 +69,9 @@ public class IcmpHandler { | ... | @@ -69,8 +69,9 @@ public class IcmpHandler { |
| 69 | DeviceId deviceId = connectPoint.deviceId(); | 69 | DeviceId deviceId = connectPoint.deviceId(); |
| 70 | Ip4Address destinationAddress = | 70 | Ip4Address destinationAddress = |
| 71 | Ip4Address.valueOf(ipv4.getDestinationAddress()); | 71 | Ip4Address.valueOf(ipv4.getDestinationAddress()); |
| 72 | - List<Ip4Address> gatewayIpAddresses = config.getGatewayIpAddress(deviceId); | 72 | + List<Ip4Address> gatewayIpAddresses = config.getSubnetGatewayIps(deviceId); |
| 73 | - IpPrefix routerIpPrefix = config.getRouterIpAddress(deviceId); | 73 | + Ip4Address routerIp = config.getRouterIp(deviceId); |
| 74 | + IpPrefix routerIpPrefix = IpPrefix.valueOf(routerIp, IpPrefix.MAX_INET_MASK_LENGTH); | ||
| 74 | Ip4Address routerIpAddress = routerIpPrefix.getIp4Prefix().address(); | 75 | Ip4Address routerIpAddress = routerIpPrefix.getIp4Prefix().address(); |
| 75 | 76 | ||
| 76 | // ICMP to the router IP or gateway IP | 77 | // ICMP to the router IP or gateway IP |
| ... | @@ -122,8 +123,8 @@ public class IcmpHandler { | ... | @@ -122,8 +123,8 @@ public class IcmpHandler { |
| 122 | icmpReplyEth.setVlanID(icmpRequest.getVlanID()); | 123 | icmpReplyEth.setVlanID(icmpRequest.getVlanID()); |
| 123 | 124 | ||
| 124 | Ip4Address destIpAddress = Ip4Address.valueOf(icmpReplyIpv4.getDestinationAddress()); | 125 | Ip4Address destIpAddress = Ip4Address.valueOf(icmpReplyIpv4.getDestinationAddress()); |
| 125 | - Ip4Address destRouterAddress = config.getDestinationRouterAddress(destIpAddress); | 126 | + Ip4Address destRouterAddress = config.getRouterIpAddressForASubnetHost(destIpAddress); |
| 126 | - int sid = config.getMplsId(destRouterAddress); | 127 | + int sid = config.getSegmentId(destRouterAddress); |
| 127 | if (sid < 0) { | 128 | if (sid < 0) { |
| 128 | log.warn("Cannot find the Segment ID for {}", destAddress); | 129 | log.warn("Cannot find the Segment ID for {}", destAddress); |
| 129 | return; | 130 | return; |
| ... | @@ -138,7 +139,7 @@ public class IcmpHandler { | ... | @@ -138,7 +139,7 @@ public class IcmpHandler { |
| 138 | IPv4 ipPacket = (IPv4) payload.getPayload(); | 139 | IPv4 ipPacket = (IPv4) payload.getPayload(); |
| 139 | Ip4Address destIpAddress = Ip4Address.valueOf(ipPacket.getDestinationAddress()); | 140 | Ip4Address destIpAddress = Ip4Address.valueOf(ipPacket.getDestinationAddress()); |
| 140 | 141 | ||
| 141 | - if (sid == -1 || config.getMplsId(payload.getDestinationMAC()) == sid || | 142 | + if (sid == -1 || config.getSegmentId(payload.getDestinationMAC()) == sid || |
| 142 | config.inSameSubnet(outport.deviceId(), destIpAddress)) { | 143 | config.inSameSubnet(outport.deviceId(), destIpAddress)) { |
| 143 | TrafficTreatment treatment = DefaultTrafficTreatment.builder(). | 144 | TrafficTreatment treatment = DefaultTrafficTreatment.builder(). |
| 144 | setOutput(outport.port()).build(); | 145 | setOutput(outport.port()).build(); |
| ... | @@ -164,4 +165,6 @@ public class IcmpHandler { | ... | @@ -164,4 +165,6 @@ public class IcmpHandler { |
| 164 | srManager.packetService.emit(packet); | 165 | srManager.packetService.emit(packet); |
| 165 | } | 166 | } |
| 166 | } | 167 | } |
| 168 | + | ||
| 169 | + | ||
| 167 | } | 170 | } | ... | ... |
| ... | @@ -39,7 +39,7 @@ public class IpHandler { | ... | @@ -39,7 +39,7 @@ public class IpHandler { |
| 39 | 39 | ||
| 40 | private static Logger log = LoggerFactory.getLogger(IpHandler.class); | 40 | private static Logger log = LoggerFactory.getLogger(IpHandler.class); |
| 41 | private SegmentRoutingManager srManager; | 41 | private SegmentRoutingManager srManager; |
| 42 | - private NetworkConfigHandler config; | 42 | + private DeviceConfiguration config; |
| 43 | private ConcurrentHashMap<Ip4Address, ConcurrentLinkedQueue<IPv4>> ipPacketQueue; | 43 | private ConcurrentHashMap<Ip4Address, ConcurrentLinkedQueue<IPv4>> ipPacketQueue; |
| 44 | 44 | ||
| 45 | /** | 45 | /** |
| ... | @@ -49,7 +49,7 @@ public class IpHandler { | ... | @@ -49,7 +49,7 @@ public class IpHandler { |
| 49 | */ | 49 | */ |
| 50 | public IpHandler(SegmentRoutingManager srManager) { | 50 | public IpHandler(SegmentRoutingManager srManager) { |
| 51 | this.srManager = srManager; | 51 | this.srManager = srManager; |
| 52 | - this.config = checkNotNull(srManager.networkConfigHandler); | 52 | + this.config = checkNotNull(srManager.deviceConfiguration); |
| 53 | ipPacketQueue = new ConcurrentHashMap<Ip4Address, ConcurrentLinkedQueue<IPv4>>(); | 53 | ipPacketQueue = new ConcurrentHashMap<Ip4Address, ConcurrentLinkedQueue<IPv4>>(); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| ... | @@ -129,8 +129,7 @@ public class IpHandler { | ... | @@ -129,8 +129,7 @@ public class IpHandler { |
| 129 | for (Host dest: srManager.hostService.getHostsByIp(destIpAddress)) { | 129 | for (Host dest: srManager.hostService.getHostsByIp(destIpAddress)) { |
| 130 | Ethernet eth = new Ethernet(); | 130 | Ethernet eth = new Ethernet(); |
| 131 | eth.setDestinationMACAddress(dest.mac()); | 131 | eth.setDestinationMACAddress(dest.mac()); |
| 132 | - eth.setSourceMACAddress(config.getRouterMacAddress( | 132 | + eth.setSourceMACAddress(config.getDeviceMac(deviceId)); |
| 133 | - deviceId)); | ||
| 134 | eth.setEtherType(Ethernet.TYPE_IPV4); | 133 | eth.setEtherType(Ethernet.TYPE_IPV4); |
| 135 | eth.setPayload(ipPacket); | 134 | eth.setPayload(ipPacket); |
| 136 | 135 | ||
| ... | @@ -141,7 +140,9 @@ public class IpHandler { | ... | @@ -141,7 +140,9 @@ public class IpHandler { |
| 141 | srManager.packetService.emit(packet); | 140 | srManager.packetService.emit(packet); |
| 142 | ipPacketQueue.get(destIpAddress).remove(ipPacket); | 141 | ipPacketQueue.get(destIpAddress).remove(ipPacket); |
| 143 | } | 142 | } |
| 143 | + ipPacketQueue.get(destIpAddress).remove(ipPacket); | ||
| 144 | } | 144 | } |
| 145 | } | 145 | } |
| 146 | } | 146 | } |
| 147 | + | ||
| 147 | } | 148 | } | ... | ... |
apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/NetworkConfigHandler.java
deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright 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 | -package org.onosproject.segmentrouting; | ||
| 17 | - | ||
| 18 | -import com.google.common.collect.Lists; | ||
| 19 | - | ||
| 20 | -import org.onlab.packet.Ip4Address; | ||
| 21 | -import org.onlab.packet.Ip4Prefix; | ||
| 22 | -import org.onlab.packet.IpPrefix; | ||
| 23 | -import org.onlab.packet.MacAddress; | ||
| 24 | -import org.onosproject.net.DeviceId; | ||
| 25 | -import org.onosproject.net.Link; | ||
| 26 | -import org.onosproject.net.PortNumber; | ||
| 27 | -import org.slf4j.Logger; | ||
| 28 | -import org.slf4j.LoggerFactory; | ||
| 29 | - | ||
| 30 | -import java.util.List; | ||
| 31 | -import java.util.Set; | ||
| 32 | - | ||
| 33 | -/** | ||
| 34 | - * This class is temporary class and used only for test. | ||
| 35 | - * It will be replaced with "real" Network Config Manager. | ||
| 36 | - * | ||
| 37 | - * TODO: Knock off this wrapper and directly use DeviceConfiguration class | ||
| 38 | - */ | ||
| 39 | - | ||
| 40 | -public class NetworkConfigHandler { | ||
| 41 | - | ||
| 42 | - private static Logger log = LoggerFactory.getLogger(NetworkConfigHandler.class); | ||
| 43 | - private SegmentRoutingManager srManager; | ||
| 44 | - private DeviceConfiguration deviceConfig; | ||
| 45 | - | ||
| 46 | - public NetworkConfigHandler(SegmentRoutingManager srManager, | ||
| 47 | - DeviceConfiguration deviceConfig) { | ||
| 48 | - this.srManager = srManager; | ||
| 49 | - this.deviceConfig = deviceConfig; | ||
| 50 | - } | ||
| 51 | - | ||
| 52 | - public List<Ip4Address> getGatewayIpAddress(DeviceId deviceId) { | ||
| 53 | - return this.deviceConfig.getSubnetGatewayIps(deviceId); | ||
| 54 | - } | ||
| 55 | - | ||
| 56 | - public IpPrefix getRouterIpAddress(DeviceId deviceId) { | ||
| 57 | - return IpPrefix.valueOf(deviceConfig.getRouterIp(deviceId), 32); | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - public MacAddress getRouterMacAddress(DeviceId deviceId) { | ||
| 61 | - return deviceConfig.getDeviceMac(deviceId); | ||
| 62 | - } | ||
| 63 | - | ||
| 64 | - public boolean inSameSubnet(DeviceId deviceId, Ip4Address destIp) { | ||
| 65 | - | ||
| 66 | - List<Ip4Prefix> subnets = getSubnetInfo(deviceId); | ||
| 67 | - if (subnets == null) { | ||
| 68 | - return false; | ||
| 69 | - } | ||
| 70 | - | ||
| 71 | - return subnets.stream() | ||
| 72 | - .anyMatch((subnet) -> subnet.contains(destIp)); | ||
| 73 | - } | ||
| 74 | - | ||
| 75 | - public boolean inSameSubnet(Ip4Address address, int sid) { | ||
| 76 | - DeviceId deviceId = deviceConfig.getDeviceId(sid); | ||
| 77 | - if (deviceId == null) { | ||
| 78 | - log.warn("Cannot find a device for SID {}", sid); | ||
| 79 | - return false; | ||
| 80 | - } | ||
| 81 | - | ||
| 82 | - return inSameSubnet(deviceId, address); | ||
| 83 | - } | ||
| 84 | - | ||
| 85 | - public List<Ip4Prefix> getSubnetInfo(DeviceId deviceId) { | ||
| 86 | - return deviceConfig.getSubnets(deviceId); | ||
| 87 | - } | ||
| 88 | - | ||
| 89 | - public int getMplsId(DeviceId deviceId) { | ||
| 90 | - return deviceConfig.getSegmentId(deviceId); | ||
| 91 | - } | ||
| 92 | - | ||
| 93 | - public int getMplsId(MacAddress routerMac) { | ||
| 94 | - return deviceConfig.getSegmentId(routerMac); | ||
| 95 | - } | ||
| 96 | - | ||
| 97 | - public int getMplsId(Ip4Address routerIpAddress) { | ||
| 98 | - return deviceConfig.getSegmentId(routerIpAddress); | ||
| 99 | - } | ||
| 100 | - | ||
| 101 | - public boolean isEcmpNotSupportedInTransit(DeviceId deviceId) { | ||
| 102 | - return false; | ||
| 103 | - } | ||
| 104 | - | ||
| 105 | - public boolean isTransitRouter(DeviceId deviceId) { | ||
| 106 | - return !(deviceConfig.isEdgeDevice(deviceId)); | ||
| 107 | - } | ||
| 108 | - | ||
| 109 | - | ||
| 110 | - public boolean isEdgeRouter(DeviceId deviceId) { | ||
| 111 | - return deviceConfig.isEdgeDevice(deviceId); | ||
| 112 | - } | ||
| 113 | - | ||
| 114 | - private List<PortNumber> getPortsToNeighbors(DeviceId deviceId, List<DeviceId> fwdSws) { | ||
| 115 | - | ||
| 116 | - List<PortNumber> portNumbers = Lists.newArrayList(); | ||
| 117 | - | ||
| 118 | - Set<Link> links = srManager.linkService.getDeviceEgressLinks(deviceId); | ||
| 119 | - for (Link link: links) { | ||
| 120 | - for (DeviceId swId: fwdSws) { | ||
| 121 | - if (link.dst().deviceId().equals(swId)) { | ||
| 122 | - portNumbers.add(link.src().port()); | ||
| 123 | - break; | ||
| 124 | - } | ||
| 125 | - } | ||
| 126 | - } | ||
| 127 | - | ||
| 128 | - return portNumbers; | ||
| 129 | - } | ||
| 130 | - | ||
| 131 | - public List<PortNumber> getPortsToDevice(DeviceId deviceId) { | ||
| 132 | - List<PortNumber> portNumbers = Lists.newArrayList(); | ||
| 133 | - | ||
| 134 | - Set<Link> links = srManager.linkService.getDeviceEgressLinks(deviceId); | ||
| 135 | - for (Link link: links) { | ||
| 136 | - if (link.dst().deviceId().equals(deviceId)) { | ||
| 137 | - portNumbers.add(link.src().port()); | ||
| 138 | - } | ||
| 139 | - } | ||
| 140 | - | ||
| 141 | - return portNumbers; | ||
| 142 | - } | ||
| 143 | - | ||
| 144 | - | ||
| 145 | - public Ip4Address getDestinationRouterAddress(Ip4Address destIpAddress) { | ||
| 146 | - return deviceConfig.getRouterIpAddressForASubnetHost(destIpAddress); | ||
| 147 | - } | ||
| 148 | - | ||
| 149 | - public DeviceId getDeviceId(Ip4Address ip4Address) { | ||
| 150 | - return deviceConfig.getDeviceId(ip4Address); | ||
| 151 | - } | ||
| 152 | - | ||
| 153 | - public MacAddress getRouterMac(Ip4Address targetAddress) { | ||
| 154 | - return deviceConfig.getRouterMacForAGatewayIp(targetAddress); | ||
| 155 | - } | ||
| 156 | -} |
| ... | @@ -48,10 +48,9 @@ public class RoutingRulePopulator { | ... | @@ -48,10 +48,9 @@ public class RoutingRulePopulator { |
| 48 | 48 | ||
| 49 | private static final Logger log = LoggerFactory.getLogger(RoutingRulePopulator.class); | 49 | private static final Logger log = LoggerFactory.getLogger(RoutingRulePopulator.class); |
| 50 | 50 | ||
| 51 | - private final SegmentRoutingManager srManager; | ||
| 52 | - private final NetworkConfigHandler config; | ||
| 53 | private AtomicLong rulePopulationCounter; | 51 | private AtomicLong rulePopulationCounter; |
| 54 | - | 52 | + private SegmentRoutingManager srManager; |
| 53 | + private DeviceConfiguration config; | ||
| 55 | /** | 54 | /** |
| 56 | * Creates a RoutingRulePopulator object. | 55 | * Creates a RoutingRulePopulator object. |
| 57 | * | 56 | * |
| ... | @@ -59,7 +58,7 @@ public class RoutingRulePopulator { | ... | @@ -59,7 +58,7 @@ public class RoutingRulePopulator { |
| 59 | */ | 58 | */ |
| 60 | public RoutingRulePopulator(SegmentRoutingManager srManager) { | 59 | public RoutingRulePopulator(SegmentRoutingManager srManager) { |
| 61 | this.srManager = srManager; | 60 | this.srManager = srManager; |
| 62 | - this.config = checkNotNull(srManager.networkConfigHandler); | 61 | + this.config = checkNotNull(srManager.deviceConfiguration); |
| 63 | this.rulePopulationCounter = new AtomicLong(0); | 62 | this.rulePopulationCounter = new AtomicLong(0); |
| 64 | } | 63 | } |
| 65 | 64 | ||
| ... | @@ -94,7 +93,7 @@ public class RoutingRulePopulator { | ... | @@ -94,7 +93,7 @@ public class RoutingRulePopulator { |
| 94 | sbuilder.matchEthType(Ethernet.TYPE_IPV4); | 93 | sbuilder.matchEthType(Ethernet.TYPE_IPV4); |
| 95 | 94 | ||
| 96 | tbuilder.setEthDst(hostMac) | 95 | tbuilder.setEthDst(hostMac) |
| 97 | - .setEthSrc(config.getRouterMacAddress(deviceId)) | 96 | + .setEthSrc(config.getDeviceMac(deviceId)) |
| 98 | .setOutput(outPort); | 97 | .setOutput(outPort); |
| 99 | 98 | ||
| 100 | TrafficTreatment treatment = tbuilder.build(); | 99 | TrafficTreatment treatment = tbuilder.build(); |
| ... | @@ -156,7 +155,7 @@ public class RoutingRulePopulator { | ... | @@ -156,7 +155,7 @@ public class RoutingRulePopulator { |
| 156 | ns = new NeighborSet(nextHops); | 155 | ns = new NeighborSet(nextHops); |
| 157 | } else { | 156 | } else { |
| 158 | tbuilder.copyTtlOut(); | 157 | tbuilder.copyTtlOut(); |
| 159 | - ns = new NeighborSet(nextHops, config.getMplsId(destSw)); | 158 | + ns = new NeighborSet(nextHops, config.getSegmentId(destSw)); |
| 160 | } | 159 | } |
| 161 | 160 | ||
| 162 | DefaultGroupKey groupKey = (DefaultGroupKey) srManager.getGroupKey(ns); | 161 | DefaultGroupKey groupKey = (DefaultGroupKey) srManager.getGroupKey(ns); |
| ... | @@ -201,7 +200,7 @@ public class RoutingRulePopulator { | ... | @@ -201,7 +200,7 @@ public class RoutingRulePopulator { |
| 201 | Collection<TrafficTreatment> treatments = new ArrayList<>(); | 200 | Collection<TrafficTreatment> treatments = new ArrayList<>(); |
| 202 | 201 | ||
| 203 | // TODO Handle the case of Bos == false | 202 | // TODO Handle the case of Bos == false |
| 204 | - sbuilder.matchMplsLabel(MplsLabel.mplsLabel(config.getMplsId(destSwId))); | 203 | + sbuilder.matchMplsLabel(MplsLabel.mplsLabel(config.getSegmentId(destSwId))); |
| 205 | sbuilder.matchEthType(Ethernet.MPLS_UNICAST); | 204 | sbuilder.matchEthType(Ethernet.MPLS_UNICAST); |
| 206 | 205 | ||
| 207 | //If the next hop is the destination router, do PHP | 206 | //If the next hop is the destination router, do PHP |
| ... | @@ -262,15 +261,15 @@ public class RoutingRulePopulator { | ... | @@ -262,15 +261,15 @@ public class RoutingRulePopulator { |
| 262 | tbuilder.decMplsTtl(); | 261 | tbuilder.decMplsTtl(); |
| 263 | } | 262 | } |
| 264 | 263 | ||
| 265 | - if (config.isEcmpNotSupportedInTransit(deviceId) | 264 | + if (!isECMPSupportedInTransitRouter() && !config.isEdgeDevice(deviceId)) { |
| 266 | - && config.isTransitRouter(deviceId)) { | ||
| 267 | Link link = selectOneLink(deviceId, nextHops); | 265 | Link link = selectOneLink(deviceId, nextHops); |
| 266 | + DeviceId nextHop = (DeviceId) nextHops.toArray()[0]; | ||
| 268 | if (link == null) { | 267 | if (link == null) { |
| 269 | log.warn("No link from {} to {}", deviceId, nextHops); | 268 | log.warn("No link from {} to {}", deviceId, nextHops); |
| 270 | return null; | 269 | return null; |
| 271 | } | 270 | } |
| 272 | - tbuilder.setEthSrc(config.getRouterMacAddress(deviceId)) | 271 | + tbuilder.setEthSrc(config.getDeviceMac(deviceId)) |
| 273 | - .setEthDst(config.getRouterMacAddress(link.dst().deviceId())) | 272 | + .setEthDst(config.getDeviceMac(nextHop)) |
| 274 | .setOutput(link.src().port()); | 273 | .setOutput(link.src().port()); |
| 275 | } else { | 274 | } else { |
| 276 | NeighborSet ns = new NeighborSet(nextHops); | 275 | NeighborSet ns = new NeighborSet(nextHops); |
| ... | @@ -292,6 +291,12 @@ public class RoutingRulePopulator { | ... | @@ -292,6 +291,12 @@ public class RoutingRulePopulator { |
| 292 | return tbuilder.build(); | 291 | return tbuilder.build(); |
| 293 | } | 292 | } |
| 294 | 293 | ||
| 294 | + private boolean isECMPSupportedInTransitRouter() { | ||
| 295 | + | ||
| 296 | + // TODO: remove this function when objectives subsystem is supported. | ||
| 297 | + return false; | ||
| 298 | + } | ||
| 299 | + | ||
| 295 | /** | 300 | /** |
| 296 | * Populates VLAN flows rules. | 301 | * Populates VLAN flows rules. |
| 297 | * All packets are forwarded to TMAC table. | 302 | * All packets are forwarded to TMAC table. |
| ... | @@ -327,7 +332,7 @@ public class RoutingRulePopulator { | ... | @@ -327,7 +332,7 @@ public class RoutingRulePopulator { |
| 327 | // flow rule for IP packets | 332 | // flow rule for IP packets |
| 328 | TrafficSelector selectorIp = DefaultTrafficSelector.builder() | 333 | TrafficSelector selectorIp = DefaultTrafficSelector.builder() |
| 329 | .matchEthType(Ethernet.TYPE_IPV4) | 334 | .matchEthType(Ethernet.TYPE_IPV4) |
| 330 | - .matchEthDst(config.getRouterMacAddress(deviceId)) | 335 | + .matchEthDst(config.getDeviceMac(deviceId)) |
| 331 | .build(); | 336 | .build(); |
| 332 | TrafficTreatment treatmentIp = DefaultTrafficTreatment.builder() | 337 | TrafficTreatment treatmentIp = DefaultTrafficTreatment.builder() |
| 333 | .transition(FlowRule.Type.IP) | 338 | .transition(FlowRule.Type.IP) |
| ... | @@ -341,7 +346,7 @@ public class RoutingRulePopulator { | ... | @@ -341,7 +346,7 @@ public class RoutingRulePopulator { |
| 341 | // flow rule for MPLS packets | 346 | // flow rule for MPLS packets |
| 342 | TrafficSelector selectorMpls = DefaultTrafficSelector.builder() | 347 | TrafficSelector selectorMpls = DefaultTrafficSelector.builder() |
| 343 | .matchEthType(Ethernet.MPLS_UNICAST) | 348 | .matchEthType(Ethernet.MPLS_UNICAST) |
| 344 | - .matchEthDst(config.getRouterMacAddress(deviceId)) | 349 | + .matchEthDst(config.getDeviceMac(deviceId)) |
| 345 | .build(); | 350 | .build(); |
| 346 | TrafficTreatment treatmentMpls = DefaultTrafficTreatment.builder() | 351 | TrafficTreatment treatmentMpls = DefaultTrafficTreatment.builder() |
| 347 | .transition(FlowRule.Type.MPLS) | 352 | .transition(FlowRule.Type.MPLS) | ... | ... |
| ... | @@ -99,15 +99,14 @@ public class SegmentRoutingManager { | ... | @@ -99,15 +99,14 @@ public class SegmentRoutingManager { |
| 99 | 99 | ||
| 100 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 100 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 101 | protected MastershipService mastershipService; | 101 | protected MastershipService mastershipService; |
| 102 | - protected NetworkConfigHandler networkConfigHandler = null; | ||
| 103 | protected ArpHandler arpHandler = null; | 102 | protected ArpHandler arpHandler = null; |
| 104 | protected IcmpHandler icmpHandler = null; | 103 | protected IcmpHandler icmpHandler = null; |
| 105 | protected IpHandler ipHandler = null; | 104 | protected IpHandler ipHandler = null; |
| 106 | protected RoutingRulePopulator routingRulePopulator = null; | 105 | protected RoutingRulePopulator routingRulePopulator = null; |
| 107 | protected ApplicationId appId; | 106 | protected ApplicationId appId; |
| 107 | + protected DeviceConfiguration deviceConfiguration = null; | ||
| 108 | 108 | ||
| 109 | private DefaultRoutingHandler defaultRoutingHandler = null; | 109 | private DefaultRoutingHandler defaultRoutingHandler = null; |
| 110 | - private DeviceConfiguration deviceConfiguration = null; | ||
| 111 | private InternalPacketProcessor processor = new InternalPacketProcessor(); | 110 | private InternalPacketProcessor processor = new InternalPacketProcessor(); |
| 112 | private InternalEventHandler eventHandler = new InternalEventHandler(); | 111 | private InternalEventHandler eventHandler = new InternalEventHandler(); |
| 113 | 112 | ||
| ... | @@ -129,8 +128,6 @@ public class SegmentRoutingManager { | ... | @@ -129,8 +128,6 @@ public class SegmentRoutingManager { |
| 129 | appId = coreService.registerApplication("org.onosproject.segmentrouting"); | 128 | appId = coreService.registerApplication("org.onosproject.segmentrouting"); |
| 130 | networkConfigService.init(); | 129 | networkConfigService.init(); |
| 131 | deviceConfiguration = new DeviceConfiguration(networkConfigService); | 130 | deviceConfiguration = new DeviceConfiguration(networkConfigService); |
| 132 | - networkConfigHandler = new NetworkConfigHandler(this, | ||
| 133 | - deviceConfiguration); | ||
| 134 | arpHandler = new ArpHandler(this); | 131 | arpHandler = new ArpHandler(this); |
| 135 | icmpHandler = new IcmpHandler(this); | 132 | icmpHandler = new IcmpHandler(this); |
| 136 | ipHandler = new IpHandler(this); | 133 | ipHandler = new IpHandler(this); |
| ... | @@ -150,8 +147,8 @@ public class SegmentRoutingManager { | ... | @@ -150,8 +147,8 @@ public class SegmentRoutingManager { |
| 150 | appId, deviceConfiguration, linkService, groupService); | 147 | appId, deviceConfiguration, linkService, groupService); |
| 151 | groupHandler.createGroups(); | 148 | groupHandler.createGroups(); |
| 152 | groupHandlerMap.put(device.id(), groupHandler); | 149 | groupHandlerMap.put(device.id(), groupHandler); |
| 153 | - log.debug("Initiating default group handling for {}", device.id()); | ||
| 154 | defaultRoutingHandler.populateTtpRules(device.id()); | 150 | defaultRoutingHandler.populateTtpRules(device.id()); |
| 151 | + log.debug("Initiating default group handling for {}", device.id()); | ||
| 155 | } else { | 152 | } else { |
| 156 | log.debug("Activate: Local role {} " | 153 | log.debug("Activate: Local role {} " |
| 157 | + "is not MASTER for device {}", | 154 | + "is not MASTER for device {}", |
| ... | @@ -162,7 +159,6 @@ public class SegmentRoutingManager { | ... | @@ -162,7 +159,6 @@ public class SegmentRoutingManager { |
| 162 | } | 159 | } |
| 163 | 160 | ||
| 164 | defaultRoutingHandler.startPopulationProcess(); | 161 | defaultRoutingHandler.startPopulationProcess(); |
| 165 | - | ||
| 166 | log.info("Started"); | 162 | log.info("Started"); |
| 167 | } | 163 | } |
| 168 | 164 | ... | ... |
-
Please register or login to post a comment