Committed by
Gerrit Code Review
[2160]the implementation of vtn app and modify vtnrsc/pom.xml
Change-Id: I7ce14e3b83a6fa54a6cdb55f1f486aa51038ec01
Showing
6 changed files
with
550 additions
and
5 deletions
| ... | @@ -37,5 +37,10 @@ | ... | @@ -37,5 +37,10 @@ |
| 37 | <artifactId>onos-core-serializers</artifactId> | 37 | <artifactId>onos-core-serializers</artifactId> |
| 38 | <version>${project.version}</version> | 38 | <version>${project.version}</version> |
| 39 | </dependency> | 39 | </dependency> |
| 40 | + <dependency> | ||
| 41 | + <groupId>org.onosproject</groupId> | ||
| 42 | + <artifactId>onos-app-vtnrsc</artifactId> | ||
| 43 | + <version>${project.version}</version> | ||
| 44 | + </dependency> | ||
| 40 | </dependencies> | 45 | </dependencies> |
| 41 | </project> | 46 | </project> | ... | ... |
| ... | @@ -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.app.vtn; | 16 | +package org.onosproject.vtn; |
| 17 | 17 | ||
| 18 | import org.onosproject.net.Device; | 18 | import org.onosproject.net.Device; |
| 19 | import org.onosproject.net.Host; | 19 | import org.onosproject.net.Host; | ... | ... |
| 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.vtn.impl; | ||
| 17 | + | ||
| 18 | +import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; | ||
| 19 | +import static org.onlab.util.Tools.groupedThreads; | ||
| 20 | +import static org.slf4j.LoggerFactory.getLogger; | ||
| 21 | + | ||
| 22 | +import java.util.HashSet; | ||
| 23 | +import java.util.List; | ||
| 24 | +import java.util.Set; | ||
| 25 | +import java.util.concurrent.ScheduledExecutorService; | ||
| 26 | + | ||
| 27 | +import org.apache.felix.scr.annotations.Activate; | ||
| 28 | +import org.apache.felix.scr.annotations.Component; | ||
| 29 | +import org.apache.felix.scr.annotations.Deactivate; | ||
| 30 | +import org.apache.felix.scr.annotations.Reference; | ||
| 31 | +import org.apache.felix.scr.annotations.ReferenceCardinality; | ||
| 32 | +import org.apache.felix.scr.annotations.Service; | ||
| 33 | +import org.onlab.packet.IpAddress; | ||
| 34 | +import org.onlab.packet.MacAddress; | ||
| 35 | +import org.onlab.util.KryoNamespace; | ||
| 36 | +import org.onosproject.app.vtnrsc.SegmentationId; | ||
| 37 | +import org.onosproject.app.vtnrsc.TenantNetwork; | ||
| 38 | +import org.onosproject.app.vtnrsc.VirtualPort; | ||
| 39 | +import org.onosproject.app.vtnrsc.VirtualPortId; | ||
| 40 | +import org.onosproject.app.vtnrsc.tenantnetwork.TenantNetworkService; | ||
| 41 | +import org.onosproject.app.vtnrsc.virtualport.VirtualPortService; | ||
| 42 | +import org.onosproject.core.ApplicationId; | ||
| 43 | +import org.onosproject.core.CoreService; | ||
| 44 | +import org.onosproject.net.Device; | ||
| 45 | +import org.onosproject.net.DeviceId; | ||
| 46 | +import org.onosproject.net.Host; | ||
| 47 | +import org.onosproject.net.HostId; | ||
| 48 | +import org.onosproject.net.Port; | ||
| 49 | +import org.onosproject.net.PortNumber; | ||
| 50 | +import org.onosproject.net.behaviour.BridgeConfig; | ||
| 51 | +import org.onosproject.net.behaviour.BridgeName; | ||
| 52 | +import org.onosproject.net.behaviour.DefaultTunnelDescription; | ||
| 53 | +import org.onosproject.net.behaviour.IpTunnelEndPoint; | ||
| 54 | +import org.onosproject.net.behaviour.TunnelConfig; | ||
| 55 | +import org.onosproject.net.behaviour.TunnelDescription; | ||
| 56 | +import org.onosproject.net.behaviour.TunnelEndPoint; | ||
| 57 | +import org.onosproject.net.device.DeviceEvent; | ||
| 58 | +import org.onosproject.net.device.DeviceListener; | ||
| 59 | +import org.onosproject.net.device.DeviceService; | ||
| 60 | +import org.onosproject.net.driver.DriverHandler; | ||
| 61 | +import org.onosproject.net.driver.DriverService; | ||
| 62 | +import org.onosproject.net.flow.DefaultTrafficSelector; | ||
| 63 | +import org.onosproject.net.flow.DefaultTrafficTreatment; | ||
| 64 | +import org.onosproject.net.flow.FlowRuleService; | ||
| 65 | +import org.onosproject.net.flow.TrafficSelector; | ||
| 66 | +import org.onosproject.net.flow.TrafficTreatment; | ||
| 67 | +import org.onosproject.net.flow.criteria.Criteria; | ||
| 68 | +import org.onosproject.net.flow.instructions.Instructions; | ||
| 69 | +import org.onosproject.net.flowobjective.DefaultForwardingObjective; | ||
| 70 | +import org.onosproject.net.flowobjective.FlowObjectiveService; | ||
| 71 | +import org.onosproject.net.flowobjective.ForwardingObjective; | ||
| 72 | +import org.onosproject.net.flowobjective.ForwardingObjective.Flag; | ||
| 73 | +import org.onosproject.net.flowobjective.Objective; | ||
| 74 | +import org.onosproject.net.host.HostEvent; | ||
| 75 | +import org.onosproject.net.host.HostListener; | ||
| 76 | +import org.onosproject.net.host.HostService; | ||
| 77 | +import org.onosproject.store.serializers.KryoNamespaces; | ||
| 78 | +import org.onosproject.store.service.EventuallyConsistentMap; | ||
| 79 | +import org.onosproject.store.service.StorageService; | ||
| 80 | +import org.onosproject.store.service.WallClockTimestamp; | ||
| 81 | +import org.onosproject.vtn.VTNService; | ||
| 82 | +import org.slf4j.Logger; | ||
| 83 | + | ||
| 84 | +/** | ||
| 85 | + * Provides implementation of VTNService. | ||
| 86 | + */ | ||
| 87 | +@Component(immediate = true) | ||
| 88 | +@Service | ||
| 89 | +public class VTNManager implements VTNService { | ||
| 90 | + private final Logger log = getLogger(getClass()); | ||
| 91 | + | ||
| 92 | + private static final String APP_ID = "org.onosproject.app.vtn"; | ||
| 93 | + private ScheduledExecutorService backgroundService; | ||
| 94 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 95 | + protected DeviceService deviceService; | ||
| 96 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 97 | + protected HostService hostService; | ||
| 98 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 99 | + protected FlowRuleService flowRuleService; | ||
| 100 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 101 | + protected CoreService coreService; | ||
| 102 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 103 | + protected StorageService storageService; | ||
| 104 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 105 | + protected TenantNetworkService tenantNetworkService; | ||
| 106 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 107 | + protected VirtualPortService virtualPortService; | ||
| 108 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 109 | + protected DriverService driverService; | ||
| 110 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 111 | + protected FlowObjectiveService flowObjectiveService; | ||
| 112 | + private EventuallyConsistentMap<HostId, SegmentationId> binding; | ||
| 113 | + private ApplicationId appId; | ||
| 114 | + private HostListener hostListener = new InnerHostListener(); | ||
| 115 | + private DeviceListener deviceListener = new InnerDeviceListener(); | ||
| 116 | + private static final String IFACEID = "ifaceid"; | ||
| 117 | + private static final String PORT_HEAD = "vxlan"; | ||
| 118 | + private static final int MAC_TABLE = 40; | ||
| 119 | + private static final short ETH_TYPE_MAC = 40; | ||
| 120 | + private static final short ETH_TYPE_PORT = 0; | ||
| 121 | + private static final String DEFAULT_BRIDGE_NAME = "br-int"; | ||
| 122 | + private static final String CONTROLLER_IP_KEY = "ipaddress"; | ||
| 123 | + | ||
| 124 | + @Activate | ||
| 125 | + public void activate() { | ||
| 126 | + KryoNamespace.Builder serializer = KryoNamespace.newBuilder() | ||
| 127 | + .register(KryoNamespaces.API); | ||
| 128 | + appId = coreService.registerApplication(APP_ID); | ||
| 129 | + deviceService.addListener(deviceListener); | ||
| 130 | + hostService.addListener(hostListener); | ||
| 131 | + backgroundService = newSingleThreadScheduledExecutor(groupedThreads("onos-apps/vtn", | ||
| 132 | + "manager-background")); | ||
| 133 | + binding = storageService | ||
| 134 | + .<HostId, SegmentationId>eventuallyConsistentMapBuilder() | ||
| 135 | + .withName("all_tunnel").withSerializer(serializer) | ||
| 136 | + .withTimestampProvider((k, v) -> new WallClockTimestamp()) | ||
| 137 | + .build(); | ||
| 138 | + log.info("Started"); | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + @Deactivate | ||
| 142 | + public void deactivate() { | ||
| 143 | + backgroundService.shutdown(); | ||
| 144 | + binding.destroy(); | ||
| 145 | + log.info("Stopped"); | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + @Override | ||
| 149 | + public void onServerDetected(Device device) { | ||
| 150 | + Iterable<Device> devices = deviceService.getAvailableDevices(); | ||
| 151 | + DriverHandler handler = driverService.createHandler(device.id()); | ||
| 152 | + TunnelConfig config = handler.behaviour(TunnelConfig.class); | ||
| 153 | + BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class); | ||
| 154 | + bridgeConfig.addBridge(BridgeName.bridgeName(DEFAULT_BRIDGE_NAME)); | ||
| 155 | + String ipAddress = device.annotations().value(CONTROLLER_IP_KEY); | ||
| 156 | + IpAddress ip = IpAddress.valueOf(ipAddress); | ||
| 157 | + TunnelEndPoint tunnelAsSrcSrc = IpTunnelEndPoint.ipTunnelPoint(ip); | ||
| 158 | + TunnelEndPoint tunnelAsDstDst = IpTunnelEndPoint.ipTunnelPoint(ip); | ||
| 159 | + devices.forEach(d -> { | ||
| 160 | + if (!device.id().equals(d.id())) { | ||
| 161 | + String ipAddress1 = d.annotations().value(CONTROLLER_IP_KEY); | ||
| 162 | + IpAddress ip1 = IpAddress.valueOf(ipAddress1); | ||
| 163 | + TunnelEndPoint tunnelAsSrcDst = IpTunnelEndPoint | ||
| 164 | + .ipTunnelPoint(ip1); | ||
| 165 | + TunnelEndPoint tunnelAsDstSrc = IpTunnelEndPoint | ||
| 166 | + .ipTunnelPoint(ip1); | ||
| 167 | + TunnelDescription tunnelAsSrc = new DefaultTunnelDescription( | ||
| 168 | + tunnelAsSrcSrc, | ||
| 169 | + tunnelAsSrcDst, | ||
| 170 | + TunnelDescription.Type.VXLAN, | ||
| 171 | + null); | ||
| 172 | + TunnelDescription tunnelAsDst = new DefaultTunnelDescription( | ||
| 173 | + tunnelAsDstDst, | ||
| 174 | + tunnelAsDstSrc, | ||
| 175 | + TunnelDescription.Type.VXLAN, | ||
| 176 | + null); | ||
| 177 | + config.createTunnel(tunnelAsSrc); | ||
| 178 | + config.createTunnel(tunnelAsDst); | ||
| 179 | + } | ||
| 180 | + }); | ||
| 181 | + } | ||
| 182 | + | ||
| 183 | + @Override | ||
| 184 | + public void onServerVanished(Device device) { | ||
| 185 | + Iterable<Device> devices = deviceService.getAvailableDevices(); | ||
| 186 | + DriverHandler handler = driverService.createHandler(device.id()); | ||
| 187 | + TunnelConfig config = handler.behaviour(TunnelConfig.class); | ||
| 188 | + BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class); | ||
| 189 | + bridgeConfig.deleteBridge(BridgeName.bridgeName(DEFAULT_BRIDGE_NAME)); | ||
| 190 | + String ipAddress = device.annotations().value(CONTROLLER_IP_KEY); | ||
| 191 | + IpAddress ip = IpAddress.valueOf(ipAddress); | ||
| 192 | + TunnelEndPoint tunnelAsSrcSrc = IpTunnelEndPoint.ipTunnelPoint(ip); | ||
| 193 | + TunnelEndPoint tunnelAsDstDst = IpTunnelEndPoint.ipTunnelPoint(ip); | ||
| 194 | + devices.forEach(d -> { | ||
| 195 | + if (!device.id().equals(d.id())) { | ||
| 196 | + String ipAddress1 = d.annotations().value(CONTROLLER_IP_KEY); | ||
| 197 | + IpAddress ip1 = IpAddress.valueOf(ipAddress1); | ||
| 198 | + TunnelEndPoint tunnelAsSrcDst = IpTunnelEndPoint | ||
| 199 | + .ipTunnelPoint(ip1); | ||
| 200 | + TunnelEndPoint tunnelAsDstSrc = IpTunnelEndPoint | ||
| 201 | + .ipTunnelPoint(ip1); | ||
| 202 | + TunnelDescription tunnelAsSrc = new DefaultTunnelDescription( | ||
| 203 | + tunnelAsSrcSrc, | ||
| 204 | + tunnelAsSrcDst, | ||
| 205 | + TunnelDescription.Type.VXLAN, | ||
| 206 | + null); | ||
| 207 | + TunnelDescription tunnelAsDst = new DefaultTunnelDescription( | ||
| 208 | + tunnelAsDstDst, | ||
| 209 | + tunnelAsDstSrc, | ||
| 210 | + TunnelDescription.Type.VXLAN, | ||
| 211 | + null); | ||
| 212 | + config.removeTunnel(tunnelAsSrc); | ||
| 213 | + config.removeTunnel(tunnelAsDst); | ||
| 214 | + } | ||
| 215 | + }); | ||
| 216 | + } | ||
| 217 | + | ||
| 218 | + @Override | ||
| 219 | + public void onOvsDetected(Device device) { | ||
| 220 | + programMacDefaultRules(device.id(), appId, Objective.Operation.ADD); | ||
| 221 | + programPortDefaultRules(device.id(), appId, Objective.Operation.ADD); | ||
| 222 | + } | ||
| 223 | + | ||
| 224 | + @Override | ||
| 225 | + public void onOvsVanished(Device device) { | ||
| 226 | + programMacDefaultRules(device.id(), appId, Objective.Operation.REMOVE); | ||
| 227 | + programPortDefaultRules(device.id(), appId, Objective.Operation.REMOVE); | ||
| 228 | + } | ||
| 229 | + | ||
| 230 | + @Override | ||
| 231 | + public void onHostDetected(Host host) { | ||
| 232 | + String ifaceId = host.annotations().value(IFACEID); | ||
| 233 | + VirtualPortId portId = VirtualPortId.portId(ifaceId); | ||
| 234 | + VirtualPort port = virtualPortService.getPort(portId); | ||
| 235 | + TenantNetwork network = tenantNetworkService.getNetwork(port | ||
| 236 | + .networkId()); | ||
| 237 | + binding.put(host.id(), network.segmentationId()); | ||
| 238 | + DeviceId deviceId = host.location().deviceId(); | ||
| 239 | + List<Port> allPorts = deviceService.getPorts(deviceId); | ||
| 240 | + PortNumber inPort = host.location().port(); | ||
| 241 | + Set<Port> localPorts = new HashSet<>(); | ||
| 242 | + allPorts.forEach(p -> { | ||
| 243 | + if (!p.number().name().startsWith(PORT_HEAD)) { | ||
| 244 | + localPorts.add(p); | ||
| 245 | + } | ||
| 246 | + }); | ||
| 247 | + programLocalBcastRules(deviceId, network.segmentationId(), inPort, | ||
| 248 | + allPorts, appId, Objective.Operation.ADD); | ||
| 249 | + programLocalOut(deviceId, network.segmentationId(), inPort, host.mac(), | ||
| 250 | + appId, Objective.Operation.ADD); | ||
| 251 | + programTunnelFloodOut(deviceId, network.segmentationId(), inPort, | ||
| 252 | + localPorts, appId, Objective.Operation.ADD); | ||
| 253 | + programTunnelOut(deviceId, network.segmentationId(), inPort, | ||
| 254 | + host.mac(), appId, Objective.Operation.ADD); | ||
| 255 | + programLocalIn(deviceId, network.segmentationId(), inPort, host.mac(), | ||
| 256 | + appId, Objective.Operation.ADD); | ||
| 257 | + programTunnelIn(deviceId, network.segmentationId(), inPort, host.mac(), | ||
| 258 | + appId, Objective.Operation.ADD); | ||
| 259 | + } | ||
| 260 | + | ||
| 261 | + @Override | ||
| 262 | + public void onHostVanished(Host host) { | ||
| 263 | + SegmentationId segId = binding.remove(host.id()); | ||
| 264 | + DeviceId deviceId = host.location().deviceId(); | ||
| 265 | + List<Port> allPorts = deviceService.getPorts(deviceId); | ||
| 266 | + PortNumber inPort = host.location().port(); | ||
| 267 | + Set<Port> localPorts = new HashSet<>(); | ||
| 268 | + allPorts.forEach(p -> { | ||
| 269 | + if (!p.number().name().startsWith(PORT_HEAD)) { | ||
| 270 | + localPorts.add(p); | ||
| 271 | + } | ||
| 272 | + }); | ||
| 273 | + programLocalBcastRules(deviceId, segId, inPort, allPorts, appId, | ||
| 274 | + Objective.Operation.REMOVE); | ||
| 275 | + programLocalOut(deviceId, segId, inPort, host.mac(), appId, | ||
| 276 | + Objective.Operation.REMOVE); | ||
| 277 | + programTunnelFloodOut(deviceId, segId, inPort, localPorts, appId, | ||
| 278 | + Objective.Operation.REMOVE); | ||
| 279 | + programTunnelOut(deviceId, segId, inPort, host.mac(), appId, | ||
| 280 | + Objective.Operation.REMOVE); | ||
| 281 | + programLocalIn(deviceId, segId, inPort, host.mac(), appId, | ||
| 282 | + Objective.Operation.REMOVE); | ||
| 283 | + programTunnelIn(deviceId, segId, inPort, host.mac(), appId, | ||
| 284 | + Objective.Operation.REMOVE); | ||
| 285 | + } | ||
| 286 | + | ||
| 287 | + private class InnerDeviceListener implements DeviceListener { | ||
| 288 | + | ||
| 289 | + @Override | ||
| 290 | + public void event(DeviceEvent event) { | ||
| 291 | + Device device = event.subject(); | ||
| 292 | + if (Device.Type.CONTROLLER == device.type() | ||
| 293 | + && DeviceEvent.Type.DEVICE_ADDED == event.type()) { | ||
| 294 | + backgroundService.execute(() -> { | ||
| 295 | + onServerDetected(device); | ||
| 296 | + }); | ||
| 297 | + } else if (Device.Type.CONTROLLER == device.type() | ||
| 298 | + && DeviceEvent.Type.DEVICE_REMOVED == event.type()) { | ||
| 299 | + backgroundService.execute(() -> { | ||
| 300 | + onServerVanished(device); | ||
| 301 | + }); | ||
| 302 | + } else if (Device.Type.SWITCH == device.type() | ||
| 303 | + && DeviceEvent.Type.DEVICE_ADDED == event.type()) { | ||
| 304 | + backgroundService.execute(() -> { | ||
| 305 | + onOvsDetected(device); | ||
| 306 | + }); | ||
| 307 | + } else if (Device.Type.SWITCH == device.type() | ||
| 308 | + && DeviceEvent.Type.DEVICE_REMOVED == event.type()) { | ||
| 309 | + backgroundService.execute(() -> { | ||
| 310 | + onOvsVanished(device); | ||
| 311 | + }); | ||
| 312 | + } else { | ||
| 313 | + log.info("do nothing for this device type"); | ||
| 314 | + } | ||
| 315 | + } | ||
| 316 | + | ||
| 317 | + } | ||
| 318 | + | ||
| 319 | + private class InnerHostListener implements HostListener { | ||
| 320 | + | ||
| 321 | + @Override | ||
| 322 | + public void event(HostEvent event) { | ||
| 323 | + Host host = event.subject(); | ||
| 324 | + if (HostEvent.Type.HOST_ADDED == event.type()) { | ||
| 325 | + backgroundService.execute(() -> { | ||
| 326 | + onHostDetected(host); | ||
| 327 | + }); | ||
| 328 | + } else if (HostEvent.Type.HOST_REMOVED == event.type()) { | ||
| 329 | + backgroundService.execute(() -> { | ||
| 330 | + onHostVanished(host); | ||
| 331 | + }); | ||
| 332 | + } else { | ||
| 333 | + log.info("unknow host"); | ||
| 334 | + } | ||
| 335 | + } | ||
| 336 | + | ||
| 337 | + } | ||
| 338 | + | ||
| 339 | + //Used to forward the flows to the local VM. | ||
| 340 | + private void programLocalOut(DeviceId dpid, SegmentationId segmentationId, | ||
| 341 | + PortNumber outPort, MacAddress sourceMac, | ||
| 342 | + ApplicationId appid, Objective.Operation type) { | ||
| 343 | + TrafficSelector selector = DefaultTrafficSelector.builder() | ||
| 344 | + .matchEthDst(sourceMac).matchEthType(ETH_TYPE_MAC).build(); | ||
| 345 | + TrafficTreatment treatment = DefaultTrafficTreatment | ||
| 346 | + .builder() | ||
| 347 | + .add(Instructions.modTunnelId(Long.parseLong(segmentationId | ||
| 348 | + .toString()))).setOutput(outPort).build(); | ||
| 349 | + ForwardingObjective.Builder objective = DefaultForwardingObjective | ||
| 350 | + .builder().withTreatment(treatment).withSelector(selector) | ||
| 351 | + .fromApp(appId).withFlag(Flag.SPECIFIC); | ||
| 352 | + if (type.equals(Objective.Operation.ADD)) { | ||
| 353 | + flowObjectiveService.forward(dpid, objective.add()); | ||
| 354 | + } else { | ||
| 355 | + flowObjectiveService.forward(dpid, objective.remove()); | ||
| 356 | + } | ||
| 357 | + | ||
| 358 | + } | ||
| 359 | + | ||
| 360 | + //Used to forward the flows to the remote VM via VXLAN tunnel. | ||
| 361 | + private void programTunnelOut(DeviceId dpid, SegmentationId segmentationId, | ||
| 362 | + PortNumber outPort, MacAddress sourceMac, | ||
| 363 | + ApplicationId appid, Objective.Operation type) { | ||
| 364 | + TrafficSelector selector = DefaultTrafficSelector.builder() | ||
| 365 | + .matchEthDst(sourceMac).matchEthType(ETH_TYPE_MAC).build(); | ||
| 366 | + TrafficTreatment treatment = DefaultTrafficTreatment | ||
| 367 | + .builder() | ||
| 368 | + .add(Instructions.modTunnelId(Long.parseLong(segmentationId | ||
| 369 | + .toString()))).setOutput(outPort).build(); | ||
| 370 | + ForwardingObjective.Builder objective = DefaultForwardingObjective | ||
| 371 | + .builder().withTreatment(treatment).withSelector(selector) | ||
| 372 | + .fromApp(appId).makePermanent().withFlag(Flag.SPECIFIC); | ||
| 373 | + if (type.equals(Objective.Operation.ADD)) { | ||
| 374 | + flowObjectiveService.forward(dpid, objective.add()); | ||
| 375 | + } else { | ||
| 376 | + flowObjectiveService.forward(dpid, objective.remove()); | ||
| 377 | + } | ||
| 378 | + } | ||
| 379 | + | ||
| 380 | + //Used to forward multicast flows to remote VMs of the same tenant via VXLAN tunnel. | ||
| 381 | + private void programTunnelFloodOut(DeviceId dpid, | ||
| 382 | + SegmentationId segmentationId, | ||
| 383 | + PortNumber ofPortOut, | ||
| 384 | + Iterable<Port> localports, | ||
| 385 | + ApplicationId appid, | ||
| 386 | + Objective.Operation type) { | ||
| 387 | + TrafficSelector selector = DefaultTrafficSelector | ||
| 388 | + .builder() | ||
| 389 | + .matchInPort(ofPortOut) | ||
| 390 | + .matchEthType(ETH_TYPE_MAC) | ||
| 391 | + .add(Criteria.matchTunnelId(Long.parseLong(segmentationId | ||
| 392 | + .toString()))).matchEthDst(MacAddress.BROADCAST) | ||
| 393 | + .build(); | ||
| 394 | + TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); | ||
| 395 | + | ||
| 396 | + for (Port outport : localports) { | ||
| 397 | + treatment.setOutput(outport.number()); | ||
| 398 | + } | ||
| 399 | + | ||
| 400 | + ForwardingObjective.Builder objective = DefaultForwardingObjective | ||
| 401 | + .builder().withTreatment(treatment.build()) | ||
| 402 | + .withSelector(selector).fromApp(appId) | ||
| 403 | + | ||
| 404 | + .makePermanent().withFlag(Flag.SPECIFIC); | ||
| 405 | + if (type.equals(Objective.Operation.ADD)) { | ||
| 406 | + flowObjectiveService.forward(dpid, objective.add()); | ||
| 407 | + } else { | ||
| 408 | + flowObjectiveService.forward(dpid, objective.remove()); | ||
| 409 | + } | ||
| 410 | + } | ||
| 411 | + | ||
| 412 | + //Applies default flows to mac table. | ||
| 413 | + private void programMacDefaultRules(DeviceId dpid, ApplicationId appid, | ||
| 414 | + Objective.Operation type) { | ||
| 415 | + TrafficSelector selector = DefaultTrafficSelector.builder() | ||
| 416 | + .matchEthType(ETH_TYPE_MAC).build(); | ||
| 417 | + TrafficTreatment treatment = DefaultTrafficTreatment.builder().drop() | ||
| 418 | + .build(); | ||
| 419 | + | ||
| 420 | + ForwardingObjective.Builder objective = DefaultForwardingObjective | ||
| 421 | + .builder().withTreatment(treatment).withSelector(selector) | ||
| 422 | + .fromApp(appId).makePermanent().withFlag(Flag.SPECIFIC); | ||
| 423 | + if (type.equals(Objective.Operation.ADD)) { | ||
| 424 | + flowObjectiveService.forward(dpid, objective.add()); | ||
| 425 | + } else { | ||
| 426 | + flowObjectiveService.forward(dpid, objective.remove()); | ||
| 427 | + } | ||
| 428 | + } | ||
| 429 | + | ||
| 430 | + //Used to forward the flows to the local VMs with the same tenant. | ||
| 431 | + private void programLocalBcastRules(DeviceId dpid, | ||
| 432 | + SegmentationId segmentationId, | ||
| 433 | + PortNumber inPort, List<Port> allports, | ||
| 434 | + ApplicationId appid, | ||
| 435 | + Objective.Operation type) { | ||
| 436 | + TrafficSelector selector = DefaultTrafficSelector | ||
| 437 | + .builder() | ||
| 438 | + .matchInPort(inPort) | ||
| 439 | + .matchEthType(ETH_TYPE_MAC) | ||
| 440 | + .matchEthDst(MacAddress.BROADCAST) | ||
| 441 | + .add(Criteria.matchTunnelId(Long.parseLong(segmentationId | ||
| 442 | + .toString()))).build(); | ||
| 443 | + TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); | ||
| 444 | + | ||
| 445 | + for (Port outport : allports) { | ||
| 446 | + if (inPort != outport.number()) { | ||
| 447 | + treatment.setOutput(outport.number()); | ||
| 448 | + } | ||
| 449 | + } | ||
| 450 | + ForwardingObjective.Builder objective = DefaultForwardingObjective | ||
| 451 | + .builder().withTreatment(treatment.build()) | ||
| 452 | + .withSelector(selector).fromApp(appId).makePermanent() | ||
| 453 | + .withFlag(Flag.SPECIFIC); | ||
| 454 | + if (type.equals(Objective.Operation.ADD)) { | ||
| 455 | + flowObjectiveService.forward(dpid, objective.add()); | ||
| 456 | + } else { | ||
| 457 | + flowObjectiveService.forward(dpid, objective.remove()); | ||
| 458 | + } | ||
| 459 | + } | ||
| 460 | + | ||
| 461 | + //Used to apply local entry flow. | ||
| 462 | + private void programLocalIn(DeviceId dpid, SegmentationId segmentationId, | ||
| 463 | + PortNumber inPort, MacAddress srcMac, | ||
| 464 | + ApplicationId appid, Objective.Operation type) { | ||
| 465 | + TrafficSelector selector = DefaultTrafficSelector.builder() | ||
| 466 | + .matchInPort(inPort).matchEthSrc(srcMac) | ||
| 467 | + .matchEthType(ETH_TYPE_PORT).build(); | ||
| 468 | + TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); | ||
| 469 | + | ||
| 470 | + treatment.add(Instructions.modTunnelId(Long.parseLong(segmentationId | ||
| 471 | + .toString()))); | ||
| 472 | + treatment.transition(MAC_TABLE); | ||
| 473 | + ForwardingObjective.Builder objective = DefaultForwardingObjective | ||
| 474 | + .builder().withTreatment(treatment.build()) | ||
| 475 | + .withSelector(selector).fromApp(appId).makePermanent() | ||
| 476 | + .withFlag(Flag.SPECIFIC); | ||
| 477 | + if (type.equals(Objective.Operation.ADD)) { | ||
| 478 | + flowObjectiveService.forward(dpid, objective.add()); | ||
| 479 | + } else { | ||
| 480 | + flowObjectiveService.forward(dpid, objective.remove()); | ||
| 481 | + } | ||
| 482 | + } | ||
| 483 | + | ||
| 484 | + //Used to forward the flows from the egress tunnel to the VM. | ||
| 485 | + private void programTunnelIn(DeviceId dpid, SegmentationId segmentationId, | ||
| 486 | + PortNumber inPort, MacAddress sourceMac, | ||
| 487 | + ApplicationId appid, Objective.Operation type) { | ||
| 488 | + TrafficSelector selector = DefaultTrafficSelector | ||
| 489 | + .builder() | ||
| 490 | + .matchInPort(inPort) | ||
| 491 | + .matchEthType(ETH_TYPE_PORT) | ||
| 492 | + .add(Criteria.matchTunnelId(Long.parseLong(segmentationId | ||
| 493 | + .toString()))).build(); | ||
| 494 | + TrafficTreatment treatment = DefaultTrafficTreatment.builder() | ||
| 495 | + .transition(MAC_TABLE).build(); | ||
| 496 | + | ||
| 497 | + ForwardingObjective.Builder objective = DefaultForwardingObjective | ||
| 498 | + .builder().withTreatment(treatment).withSelector(selector) | ||
| 499 | + .fromApp(appId).makePermanent().withFlag(Flag.SPECIFIC); | ||
| 500 | + if (type.equals(Objective.Operation.ADD)) { | ||
| 501 | + flowObjectiveService.forward(dpid, objective.add()); | ||
| 502 | + } else { | ||
| 503 | + flowObjectiveService.forward(dpid, objective.remove()); | ||
| 504 | + } | ||
| 505 | + } | ||
| 506 | + | ||
| 507 | + //Applies the default flows to port table. | ||
| 508 | + private void programPortDefaultRules(DeviceId dpid, ApplicationId appid, | ||
| 509 | + Objective.Operation type) { | ||
| 510 | + TrafficSelector selector = DefaultTrafficSelector.builder() | ||
| 511 | + .matchEthType(ETH_TYPE_PORT).build(); | ||
| 512 | + TrafficTreatment treatment = DefaultTrafficTreatment.builder() | ||
| 513 | + .transition(MAC_TABLE).build(); | ||
| 514 | + ForwardingObjective.Builder objective = DefaultForwardingObjective | ||
| 515 | + .builder().withTreatment(treatment).withSelector(selector) | ||
| 516 | + .fromApp(appId).makePermanent().withFlag(Flag.SPECIFIC); | ||
| 517 | + if (type.equals(Objective.Operation.ADD)) { | ||
| 518 | + flowObjectiveService.forward(dpid, objective.add()); | ||
| 519 | + } else { | ||
| 520 | + flowObjectiveService.forward(dpid, objective.remove()); | ||
| 521 | + } | ||
| 522 | + } | ||
| 523 | +} |
| 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 | + | ||
| 17 | +/** | ||
| 18 | + * VTN application that applies configuration and flows to the device. | ||
| 19 | + */ | ||
| 20 | +package org.onosproject.vtn; |
| ... | @@ -17,7 +17,6 @@ | ... | @@ -17,7 +17,6 @@ |
| 17 | 17 | ||
| 18 | <properties> | 18 | <properties> |
| 19 | <onos.app.name>org.onosproject.vtnrsc</onos.app.name> | 19 | <onos.app.name>org.onosproject.vtnrsc</onos.app.name> |
| 20 | - <web.context>/onos/vtn</web.context> | ||
| 21 | </properties> | 20 | </properties> |
| 22 | <dependencies> | 21 | <dependencies> |
| 23 | <dependency> | 22 | <dependency> |
| ... | @@ -52,7 +51,6 @@ | ... | @@ -52,7 +51,6 @@ |
| 52 | <extensions>true</extensions> | 51 | <extensions>true</extensions> |
| 53 | <configuration> | 52 | <configuration> |
| 54 | <instructions> | 53 | <instructions> |
| 55 | - <_wab>src/main/webapp/</_wab> | ||
| 56 | <Bundle-SymbolicName> | 54 | <Bundle-SymbolicName> |
| 57 | ${project.groupId}.${project.artifactId} | 55 | ${project.groupId}.${project.artifactId} |
| 58 | </Bundle-SymbolicName> | 56 | </Bundle-SymbolicName> |
| ... | @@ -76,7 +74,6 @@ | ... | @@ -76,7 +74,6 @@ |
| 76 | org.onlab.util.*, | 74 | org.onlab.util.*, |
| 77 | org.jboss.netty.util.* | 75 | org.jboss.netty.util.* |
| 78 | </Import-Package> | 76 | </Import-Package> |
| 79 | - <Web-ContextPath>${web.context}</Web-ContextPath> | ||
| 80 | </instructions> | 77 | </instructions> |
| 81 | </configuration> | 78 | </configuration> |
| 82 | </plugin> | 79 | </plugin> | ... | ... |
-
Please register or login to post a comment