Jonathan Hart

Implemented control plane redirect for control traffic.

Modified SoftRouterPipeline to support new flow objectives.

Change-Id: Ia93bc927832444ba1f7cf20b276e4866789c9d30
...@@ -17,6 +17,7 @@ package org.onosproject.routing; ...@@ -17,6 +17,7 @@ package org.onosproject.routing;
17 17
18 import org.onlab.packet.IpAddress; 18 import org.onlab.packet.IpAddress;
19 import org.onosproject.routing.config.BgpConfig; 19 import org.onosproject.routing.config.BgpConfig;
20 +import org.onosproject.routing.config.RouterConfig;
20 21
21 import java.util.Collection; 22 import java.util.Collection;
22 23
...@@ -28,6 +29,7 @@ public interface RoutingService { ...@@ -28,6 +29,7 @@ public interface RoutingService {
28 String ROUTER_APP_ID = "org.onosproject.router"; 29 String ROUTER_APP_ID = "org.onosproject.router";
29 30
30 Class<BgpConfig> CONFIG_CLASS = BgpConfig.class; 31 Class<BgpConfig> CONFIG_CLASS = BgpConfig.class;
32 + Class<RouterConfig> ROUTER_CONFIG_CLASS = RouterConfig.class;
31 33
32 /** 34 /**
33 * Starts the routing service. 35 * Starts the routing service.
......
...@@ -42,8 +42,6 @@ public class BgpConfig extends Config<ApplicationId> { ...@@ -42,8 +42,6 @@ public class BgpConfig extends Config<ApplicationId> {
42 public static final String NAME = "name"; 42 public static final String NAME = "name";
43 public static final String PEERS = "peers"; 43 public static final String PEERS = "peers";
44 44
45 - // TODO add methods for updating config
46 -
47 /** 45 /**
48 * Gets the set of configured BGP speakers. 46 * Gets the set of configured BGP speakers.
49 * 47 *
......
1 +/*
2 + * Copyright 2016 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.routing.config;
18 +
19 +import org.onosproject.core.ApplicationId;
20 +import org.onosproject.net.ConnectPoint;
21 +import org.onosproject.net.config.Config;
22 +
23 +/**
24 + * Routing configuration.
25 + */
26 +public class RouterConfig extends Config<ApplicationId> {
27 +
28 + public static final String CP_CONNECT_POINT = "controlPlaneConnectPoint";
29 +
30 + /**
31 + * Returns the routing control plane connect point.
32 + *
33 + * @return control plane connect point
34 + */
35 + public ConnectPoint getControlPlaneConnectPoint() {
36 + return ConnectPoint.deviceConnectPoint(object.path(CP_CONNECT_POINT).asText());
37 + }
38 +}
...@@ -41,6 +41,7 @@ import org.onosproject.net.config.basics.SubjectFactories; ...@@ -41,6 +41,7 @@ import org.onosproject.net.config.basics.SubjectFactories;
41 import org.onosproject.routing.config.BgpConfig; 41 import org.onosproject.routing.config.BgpConfig;
42 import org.onosproject.routing.config.BgpPeer; 42 import org.onosproject.routing.config.BgpPeer;
43 import org.onosproject.routing.config.BgpSpeaker; 43 import org.onosproject.routing.config.BgpSpeaker;
44 +import org.onosproject.routing.config.RouterConfig;
44 import org.onosproject.routing.config.Interface; 45 import org.onosproject.routing.config.Interface;
45 import org.onosproject.routing.config.LocalIpPrefixEntry; 46 import org.onosproject.routing.config.LocalIpPrefixEntry;
46 import org.onosproject.routing.config.RoutingConfigurationService; 47 import org.onosproject.routing.config.RoutingConfigurationService;
...@@ -100,24 +101,36 @@ public class RoutingConfigurationImpl implements RoutingConfigurationService { ...@@ -100,24 +101,36 @@ public class RoutingConfigurationImpl implements RoutingConfigurationService {
100 101
101 private MacAddress virtualGatewayMacAddress; 102 private MacAddress virtualGatewayMacAddress;
102 103
103 - private ConfigFactory configFactory = 104 + private ConfigFactory<ApplicationId, BgpConfig> bgpConfigFactory =
104 - new ConfigFactory(SubjectFactories.APP_SUBJECT_FACTORY, BgpConfig.class, "bgp") { 105 + new ConfigFactory<ApplicationId, BgpConfig>(
106 + SubjectFactories.APP_SUBJECT_FACTORY, BgpConfig.class, "bgp") {
105 @Override 107 @Override
106 public BgpConfig createConfig() { 108 public BgpConfig createConfig() {
107 return new BgpConfig(); 109 return new BgpConfig();
108 } 110 }
109 }; 111 };
110 112
113 + private ConfigFactory<ApplicationId, RouterConfig> routerConfigFactory =
114 + new ConfigFactory<ApplicationId, RouterConfig>(
115 + SubjectFactories.APP_SUBJECT_FACTORY, RouterConfig.class, "router") {
116 + @Override
117 + public RouterConfig createConfig() {
118 + return new RouterConfig();
119 + }
120 + };
121 +
111 @Activate 122 @Activate
112 public void activate() { 123 public void activate() {
113 - registry.registerConfigFactory(configFactory); 124 + registry.registerConfigFactory(bgpConfigFactory);
125 + registry.registerConfigFactory(routerConfigFactory);
114 readConfiguration(); 126 readConfiguration();
115 log.info("Routing configuration service started"); 127 log.info("Routing configuration service started");
116 } 128 }
117 129
118 @Deactivate 130 @Deactivate
119 public void deactivate() { 131 public void deactivate() {
120 - registry.unregisterConfigFactory(configFactory); 132 + registry.unregisterConfigFactory(bgpConfigFactory);
133 + registry.registerConfigFactory(routerConfigFactory);
121 log.info("Routing configuration service stopped"); 134 log.info("Routing configuration service stopped");
122 } 135 }
123 136
......
1 +/*
2 + * Copyright 2016 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.routing.impl;
18 +
19 +import org.apache.felix.scr.annotations.Activate;
20 +import org.apache.felix.scr.annotations.Component;
21 +import org.apache.felix.scr.annotations.Deactivate;
22 +import org.apache.felix.scr.annotations.Reference;
23 +import org.apache.felix.scr.annotations.ReferenceCardinality;
24 +import org.onlab.packet.EthType;
25 +import org.onosproject.core.ApplicationId;
26 +import org.onosproject.core.CoreService;
27 +import org.onosproject.incubator.net.intf.Interface;
28 +import org.onosproject.incubator.net.intf.InterfaceService;
29 +import org.onosproject.net.ConnectPoint;
30 +import org.onosproject.net.DeviceId;
31 +import org.onosproject.net.PortNumber;
32 +import org.onosproject.net.config.NetworkConfigEvent;
33 +import org.onosproject.net.config.NetworkConfigListener;
34 +import org.onosproject.net.config.NetworkConfigService;
35 +import org.onosproject.net.device.DeviceEvent;
36 +import org.onosproject.net.device.DeviceListener;
37 +import org.onosproject.net.device.DeviceService;
38 +import org.onosproject.net.flow.DefaultTrafficSelector;
39 +import org.onosproject.net.flow.DefaultTrafficTreatment;
40 +import org.onosproject.net.flow.TrafficSelector;
41 +import org.onosproject.net.flow.TrafficTreatment;
42 +import org.onosproject.net.flowobjective.DefaultForwardingObjective;
43 +import org.onosproject.net.flowobjective.FlowObjectiveService;
44 +import org.onosproject.net.flowobjective.ForwardingObjective;
45 +import org.onosproject.net.host.InterfaceIpAddress;
46 +import org.onosproject.routing.RoutingService;
47 +import org.onosproject.routing.config.RouterConfig;
48 +import org.slf4j.Logger;
49 +
50 +import static org.slf4j.LoggerFactory.getLogger;
51 +
52 +/**
53 + * Manages connectivity between peers redirecting control traffic to a routing
54 + * control plane available on the dataplane.
55 + */
56 +@Component(immediate = true, enabled = false)
57 +public class ControlPlaneRedirectManager {
58 +
59 + private final Logger log = getLogger(getClass());
60 +
61 + private static final int PRIORITY = 40001;
62 +
63 + private static final String APP_NAME = "org.onosproject.cpredirect";
64 + private ApplicationId appId;
65 +
66 + private ConnectPoint controlPlaneConnectPoint;
67 +
68 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
69 + protected CoreService coreService;
70 +
71 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
72 + protected DeviceService deviceService;
73 +
74 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
75 + protected InterfaceService interfaceService;
76 +
77 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
78 + protected FlowObjectiveService flowObjectiveService;
79 +
80 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
81 + protected NetworkConfigService networkConfigService;
82 +
83 + private final InternalDeviceListener deviceListener = new InternalDeviceListener();
84 + private final InternalNetworkConfigListener networkConfigListener =
85 + new InternalNetworkConfigListener();
86 +
87 + @Activate
88 + public void activate() {
89 + this.appId = coreService.registerApplication(APP_NAME);
90 +
91 + deviceService.addListener(deviceListener);
92 + networkConfigService.addListener(networkConfigListener);
93 +
94 + updateConfig();
95 + }
96 +
97 + @Deactivate
98 + public void deactivate() {
99 + deviceService.removeListener(deviceListener);
100 + networkConfigService.removeListener(networkConfigListener);
101 + }
102 +
103 + private void updateConfig() {
104 + ApplicationId routingAppId =
105 + coreService.registerApplication(RoutingService.ROUTER_APP_ID);
106 +
107 + RouterConfig config = networkConfigService.getConfig(
108 + routingAppId, RoutingService.ROUTER_CONFIG_CLASS);
109 +
110 + if (config == null) {
111 + log.info("Router config not available");
112 + return;
113 + }
114 +
115 + if (!config.getControlPlaneConnectPoint().equals(controlPlaneConnectPoint)) {
116 + this.controlPlaneConnectPoint = config.getControlPlaneConnectPoint();
117 + }
118 +
119 + if (controlPlaneConnectPoint != null &&
120 + deviceService.isAvailable(controlPlaneConnectPoint.deviceId())) {
121 + notifySwitchAvailable();
122 + }
123 + }
124 +
125 + private void notifySwitchAvailable() {
126 + DeviceId deviceId = controlPlaneConnectPoint.deviceId();
127 +
128 + interfaceService.getInterfaces().stream()
129 + .filter(intf -> intf.connectPoint().deviceId().equals(deviceId))
130 + .forEach(this::addInterfaceForwarding);
131 +
132 + log.info("Sent interface objectives to {}", controlPlaneConnectPoint.deviceId());
133 + }
134 +
135 + private void addInterfaceForwarding(Interface intf) {
136 + log.debug("Adding interface objectives for {}", intf);
137 +
138 + DeviceId deviceId = controlPlaneConnectPoint.deviceId();
139 + PortNumber controlPlanePort = controlPlaneConnectPoint.port();
140 +
141 + for (InterfaceIpAddress ip : intf.ipAddresses()) {
142 + // IPv4 to router
143 + TrafficSelector toSelector = DefaultTrafficSelector.builder()
144 + .matchInPort(intf.connectPoint().port())
145 + .matchEthDst(intf.mac())
146 + .matchEthType(EthType.EtherType.IPV4.ethType().toShort())
147 + .matchVlanId(intf.vlan())
148 + .matchIPDst(ip.ipAddress().toIpPrefix())
149 + .build();
150 +
151 + TrafficTreatment toTreatment = DefaultTrafficTreatment.builder()
152 + .setOutput(controlPlanePort)
153 + .build();
154 +
155 + flowObjectiveService.forward(deviceId,
156 + buildForwardingObjective(toSelector, toTreatment));
157 +
158 + // IPv4 from router
159 + TrafficSelector fromSelector = DefaultTrafficSelector.builder()
160 + .matchInPort(controlPlanePort)
161 + .matchEthSrc(intf.mac())
162 + .matchVlanId(intf.vlan())
163 + .matchEthType(EthType.EtherType.IPV4.ethType().toShort())
164 + .matchIPSrc(ip.ipAddress().toIpPrefix())
165 + .build();
166 +
167 + TrafficTreatment intfTreatment = DefaultTrafficTreatment.builder()
168 + .setOutput(intf.connectPoint().port())
169 + .build();
170 +
171 + flowObjectiveService.forward(deviceId,
172 + buildForwardingObjective(fromSelector, intfTreatment));
173 +
174 +
175 + // ARP to router
176 + toSelector = DefaultTrafficSelector.builder()
177 + .matchInPort(intf.connectPoint().port())
178 + .matchEthType(EthType.EtherType.ARP.ethType().toShort())
179 + .matchVlanId(intf.vlan())
180 + .build();
181 +
182 + toTreatment = DefaultTrafficTreatment.builder()
183 + .setOutput(controlPlanePort)
184 + .punt()
185 + .build();
186 +
187 + flowObjectiveService.forward(deviceId,
188 + buildForwardingObjective(toSelector, toTreatment));
189 +
190 + // ARP from router
191 + fromSelector = DefaultTrafficSelector.builder()
192 + .matchInPort(controlPlanePort)
193 + .matchEthSrc(intf.mac())
194 + .matchVlanId(intf.vlan())
195 + .matchEthType(EthType.EtherType.ARP.ethType().toShort())
196 + .build();
197 +
198 + intfTreatment = DefaultTrafficTreatment.builder()
199 + .setOutput(intf.connectPoint().port())
200 + .punt()
201 + .build();
202 +
203 + flowObjectiveService.forward(deviceId,
204 + buildForwardingObjective(fromSelector, intfTreatment));
205 + }
206 + }
207 +
208 + private ForwardingObjective buildForwardingObjective(TrafficSelector selector,
209 + TrafficTreatment treatment) {
210 +
211 + return DefaultForwardingObjective.builder()
212 + .withSelector(selector)
213 + .withTreatment(treatment)
214 + .fromApp(appId)
215 + .withPriority(PRIORITY)
216 + .withFlag(ForwardingObjective.Flag.VERSATILE)
217 + .add();
218 + }
219 +
220 + private class InternalDeviceListener implements DeviceListener {
221 + @Override
222 + public void event(DeviceEvent event) {
223 + if (controlPlaneConnectPoint != null &&
224 + event.subject().id().equals(controlPlaneConnectPoint.deviceId())) {
225 + switch (event.type()) {
226 + case DEVICE_ADDED:
227 + case DEVICE_AVAILABILITY_CHANGED:
228 + if (deviceService.isAvailable(event.subject().id())) {
229 + log.info("Device connected {}", event.subject().id());
230 + notifySwitchAvailable();
231 + }
232 +
233 + break;
234 + case DEVICE_UPDATED:
235 + case DEVICE_REMOVED:
236 + case DEVICE_SUSPENDED:
237 + case PORT_ADDED:
238 + case PORT_UPDATED:
239 + case PORT_REMOVED:
240 + default:
241 + break;
242 + }
243 + }
244 + }
245 + }
246 +
247 + private class InternalNetworkConfigListener implements NetworkConfigListener {
248 + @Override
249 + public void event(NetworkConfigEvent event) {
250 + if (event.subject().equals(RoutingService.ROUTER_CONFIG_CLASS)) {
251 + switch (event.type()) {
252 + case CONFIG_ADDED:
253 + case CONFIG_UPDATED:
254 + updateConfig();
255 + break;
256 + case CONFIG_REGISTERED:
257 + case CONFIG_UNREGISTERED:
258 + case CONFIG_REMOVED:
259 + default:
260 + break;
261 + }
262 + }
263 + }
264 + }
265 +}
...@@ -350,10 +350,9 @@ public class SingleSwitchFibInstaller { ...@@ -350,10 +350,9 @@ public class SingleSwitchFibInstaller {
350 fob.withKey(Criteria.matchInPort(intf.connectPoint().port())) 350 fob.withKey(Criteria.matchInPort(intf.connectPoint().port()))
351 .addCondition(Criteria.matchEthDst(intf.mac())) 351 .addCondition(Criteria.matchEthDst(intf.mac()))
352 .addCondition(Criteria.matchVlanId(intf.vlan())); 352 .addCondition(Criteria.matchVlanId(intf.vlan()));
353 - intf.ipAddresses().stream() 353 +
354 - .forEach(ipaddr -> fob.addCondition( 354 + fob.withPriority(PRIORITY_OFFSET);
355 - Criteria.matchIPDst( 355 +
356 - IpPrefix.valueOf(ipaddr.ipAddress(), 32))));
357 fob.permit().fromApp(appId); 356 fob.permit().fromApp(appId);
358 flowObjectiveService.filter( 357 flowObjectiveService.filter(
359 deviceId, 358 deviceId,
......
...@@ -51,6 +51,7 @@ public class Vrouter { ...@@ -51,6 +51,7 @@ public class Vrouter {
51 .add("org.onosproject.routing.fpm.FpmManager") 51 .add("org.onosproject.routing.fpm.FpmManager")
52 .add("org.onosproject.routing.impl.Router") 52 .add("org.onosproject.routing.impl.Router")
53 .add("org.onosproject.routing.impl.SingleSwitchFibInstaller") 53 .add("org.onosproject.routing.impl.SingleSwitchFibInstaller")
54 + .add("org.onosproject.routing.impl.ControlPlaneRedirectManager")
54 .build(); 55 .build();
55 56
56 @Activate 57 @Activate
......
...@@ -17,13 +17,11 @@ package org.onosproject.driver.pipeline; ...@@ -17,13 +17,11 @@ package org.onosproject.driver.pipeline;
17 17
18 import org.onlab.osgi.ServiceDirectory; 18 import org.onlab.osgi.ServiceDirectory;
19 import org.onlab.packet.Ethernet; 19 import org.onlab.packet.Ethernet;
20 -import org.onlab.packet.MacAddress;
21 import org.onlab.packet.VlanId; 20 import org.onlab.packet.VlanId;
22 import org.onlab.util.KryoNamespace; 21 import org.onlab.util.KryoNamespace;
23 import org.onosproject.core.ApplicationId; 22 import org.onosproject.core.ApplicationId;
24 import org.onosproject.core.CoreService; 23 import org.onosproject.core.CoreService;
25 import org.onosproject.net.DeviceId; 24 import org.onosproject.net.DeviceId;
26 -import org.onosproject.net.PortNumber;
27 import org.onosproject.net.behaviour.NextGroup; 25 import org.onosproject.net.behaviour.NextGroup;
28 import org.onosproject.net.behaviour.Pipeliner; 26 import org.onosproject.net.behaviour.Pipeliner;
29 import org.onosproject.net.behaviour.PipelinerContext; 27 import org.onosproject.net.behaviour.PipelinerContext;
...@@ -56,7 +54,6 @@ import org.slf4j.Logger; ...@@ -56,7 +54,6 @@ import org.slf4j.Logger;
56 import java.util.ArrayList; 54 import java.util.ArrayList;
57 import java.util.Collection; 55 import java.util.Collection;
58 import java.util.Collections; 56 import java.util.Collections;
59 -import java.util.concurrent.ConcurrentHashMap;
60 57
61 import static org.slf4j.LoggerFactory.getLogger; 58 import static org.slf4j.LoggerFactory.getLogger;
62 59
...@@ -81,8 +78,6 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe ...@@ -81,8 +78,6 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
81 protected DeviceId deviceId; 78 protected DeviceId deviceId;
82 protected ApplicationId appId; 79 protected ApplicationId appId;
83 private ApplicationId driverId; 80 private ApplicationId driverId;
84 - private Collection<Filter> filters;
85 - private Collection<ForwardingObjective> pendingVersatiles;
86 81
87 private KryoNamespace appKryo = new KryoNamespace.Builder() 82 private KryoNamespace appKryo = new KryoNamespace.Builder()
88 .register(DummyGroup.class) 83 .register(DummyGroup.class)
...@@ -101,9 +96,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe ...@@ -101,9 +96,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
101 flowObjectiveStore = context.store(); 96 flowObjectiveStore = context.store();
102 driverId = coreService.registerApplication( 97 driverId = coreService.registerApplication(
103 "org.onosproject.driver.SoftRouterPipeline"); 98 "org.onosproject.driver.SoftRouterPipeline");
104 - filters = Collections.newSetFromMap(new ConcurrentHashMap<Filter, Boolean>()); 99 +
105 - pendingVersatiles = Collections.newSetFromMap(
106 - new ConcurrentHashMap<ForwardingObjective, Boolean>());
107 initializePipeline(); 100 initializePipeline();
108 } 101 }
109 102
...@@ -192,7 +185,6 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe ...@@ -192,7 +185,6 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
192 } 185 }
193 } 186 }
194 187
195 -
196 private void initializePipeline() { 188 private void initializePipeline() {
197 //Drop rules for both tables 189 //Drop rules for both tables
198 TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); 190 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
...@@ -239,8 +231,10 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe ...@@ -239,8 +231,10 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
239 ApplicationId applicationId) { 231 ApplicationId applicationId) {
240 // This driver only processes filtering criteria defined with switch 232 // This driver only processes filtering criteria defined with switch
241 // ports as the key 233 // ports as the key
242 - PortCriterion p; EthCriterion e = null; VlanIdCriterion v = null; 234 + PortCriterion p;
243 - Collection<IPCriterion> ips = new ArrayList<IPCriterion>(); 235 + EthCriterion e = null;
236 + VlanIdCriterion v = null;
237 +
244 if (!filt.key().equals(Criteria.dummy()) && 238 if (!filt.key().equals(Criteria.dummy()) &&
245 filt.key().type() == Criterion.Type.IN_PORT) { 239 filt.key().type() == Criterion.Type.IN_PORT) {
246 p = (PortCriterion) filt.key(); 240 p = (PortCriterion) filt.key();
...@@ -258,8 +252,6 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe ...@@ -258,8 +252,6 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
258 e = (EthCriterion) c; 252 e = (EthCriterion) c;
259 } else if (c.type() == Criterion.Type.VLAN_VID) { 253 } else if (c.type() == Criterion.Type.VLAN_VID) {
260 v = (VlanIdCriterion) c; 254 v = (VlanIdCriterion) c;
261 - } else if (c.type() == Criterion.Type.IPV4_DST) {
262 - ips.add((IPCriterion) c);
263 } else { 255 } else {
264 log.error("Unsupported filter {}", c); 256 log.error("Unsupported filter {}", c);
265 fail(filt, ObjectiveError.UNSUPPORTED); 257 fail(filt, ObjectiveError.UNSUPPORTED);
...@@ -272,13 +264,14 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe ...@@ -272,13 +264,14 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
272 TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); 264 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
273 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); 265 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
274 selector.matchInPort(p.port()); 266 selector.matchInPort(p.port());
275 - selector.matchVlanId(v.vlanId()); 267 +
276 selector.matchEthDst(e.mac()); 268 selector.matchEthDst(e.mac());
269 + selector.matchVlanId(v.vlanId());
277 selector.matchEthType(Ethernet.TYPE_IPV4); 270 selector.matchEthType(Ethernet.TYPE_IPV4);
278 if (!v.vlanId().equals(VlanId.NONE)) { 271 if (!v.vlanId().equals(VlanId.NONE)) {
279 treatment.popVlan(); 272 treatment.popVlan();
280 } 273 }
281 - treatment.transition(FIB_TABLE); // all other IPs to the FIB table 274 + treatment.transition(FIB_TABLE);
282 FlowRule rule = DefaultFlowRule.builder() 275 FlowRule rule = DefaultFlowRule.builder()
283 .forDevice(deviceId) 276 .forDevice(deviceId)
284 .withSelector(selector.build()) 277 .withSelector(selector.build())
...@@ -289,38 +282,6 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe ...@@ -289,38 +282,6 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
289 .forTable(FILTER_TABLE).build(); 282 .forTable(FILTER_TABLE).build();
290 ops = ops.add(rule); 283 ops = ops.add(rule);
291 284
292 - for (IPCriterion ipaddr : ips) {
293 - log.debug("adding IP filtering rules in FILTER table: {}", ipaddr.ip());
294 - selector = DefaultTrafficSelector.builder();
295 - treatment = DefaultTrafficTreatment.builder();
296 - selector.matchInPort(p.port());
297 - selector.matchVlanId(v.vlanId());
298 - selector.matchEthDst(e.mac());
299 - selector.matchEthType(Ethernet.TYPE_IPV4);
300 - selector.matchIPDst(ipaddr.ip()); // router IPs to the controller
301 - treatment.setOutput(PortNumber.CONTROLLER);
302 - rule = DefaultFlowRule.builder()
303 - .forDevice(deviceId)
304 - .withSelector(selector.build())
305 - .withTreatment(treatment.build())
306 - .withPriority(HIGHEST_PRIORITY)
307 - .fromApp(applicationId)
308 - .makePermanent()
309 - .forTable(FILTER_TABLE).build();
310 - ops = ops.add(rule);
311 - }
312 -
313 - // cache for later use
314 - Filter filter = new Filter(p, e, v, ips);
315 - filters.add(filter);
316 - // apply any pending versatile forwarding objectives
317 - for (ForwardingObjective fwd : pendingVersatiles) {
318 - Collection<FlowRule> ret = processVersatilesWithFilters(filter, fwd);
319 - for (FlowRule fr : ret) {
320 - ops.add(fr);
321 - }
322 - }
323 -
324 ops = install ? ops.add(rule) : ops.remove(rule); 285 ops = install ? ops.add(rule) : ops.remove(rule);
325 // apply filtering flow rules 286 // apply filtering flow rules
326 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() { 287 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
...@@ -360,69 +321,20 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe ...@@ -360,69 +321,20 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
360 * subsystem. May return empty collection in case of failures. 321 * subsystem. May return empty collection in case of failures.
361 */ 322 */
362 private Collection<FlowRule> processVersatile(ForwardingObjective fwd) { 323 private Collection<FlowRule> processVersatile(ForwardingObjective fwd) {
363 - if (filters.isEmpty()) { 324 + Collection<FlowRule> flowrules = new ArrayList<>();
364 - pendingVersatiles.add(fwd);
365 - return Collections.emptySet();
366 - }
367 - Collection<FlowRule> flowrules = new ArrayList<FlowRule>();
368 - for (Filter filter : filters) {
369 - flowrules.addAll(processVersatilesWithFilters(filter, fwd));
370 - }
371 - return flowrules;
372 - }
373 325
374 - private Collection<FlowRule> processVersatilesWithFilters( 326 + FlowRule rule = DefaultFlowRule.builder()
375 - Filter filt, ForwardingObjective fwd) { 327 + .withSelector(fwd.selector())
376 - log.info("Processing versatile forwarding objective");
377 - Collection<FlowRule> flows = new ArrayList<FlowRule>();
378 - TrafficSelector match = fwd.selector();
379 - EthTypeCriterion ethType =
380 - (EthTypeCriterion) match.getCriterion(Criterion.Type.ETH_TYPE);
381 - if (ethType == null) {
382 - log.error("Versatile forwarding objective must include ethType");
383 - fail(fwd, ObjectiveError.UNKNOWN);
384 - return Collections.emptySet();
385 - }
386 -
387 - if (ethType.ethType().toShort() == Ethernet.TYPE_ARP) {
388 - // need to install ARP request & reply flow rules for each interface filter
389 -
390 - // rule for ARP replies
391 - TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
392 - selector.matchInPort(filt.port());
393 - selector.matchVlanId(filt.vlanId());
394 - selector.matchEthDst(filt.mac());
395 - selector.matchEthType(Ethernet.TYPE_ARP);
396 - FlowRule.Builder ruleBuilder = DefaultFlowRule.builder()
397 - .fromApp(fwd.appId())
398 - .withPriority(fwd.priority())
399 - .forDevice(deviceId)
400 - .withSelector(selector.build())
401 .withTreatment(fwd.treatment()) 328 .withTreatment(fwd.treatment())
402 .makePermanent() 329 .makePermanent()
403 - .forTable(FILTER_TABLE); 330 + .forDevice(deviceId)
404 - flows.add(ruleBuilder.build());
405 -
406 - //rule for ARP requests
407 - selector = DefaultTrafficSelector.builder();
408 - selector.matchInPort(filt.port());
409 - selector.matchVlanId(filt.vlanId());
410 - selector.matchEthDst(MacAddress.BROADCAST);
411 - selector.matchEthType(Ethernet.TYPE_ARP);
412 - ruleBuilder = DefaultFlowRule.builder()
413 .fromApp(fwd.appId()) 331 .fromApp(fwd.appId())
414 .withPriority(fwd.priority()) 332 .withPriority(fwd.priority())
415 - .forDevice(deviceId) 333 + .build();
416 - .withSelector(selector.build())
417 - .withTreatment(fwd.treatment())
418 - .makePermanent()
419 - .forTable(FILTER_TABLE);
420 - flows.add(ruleBuilder.build());
421 334
422 - return flows; 335 + flowrules.add(rule);
423 - } 336 +
424 - // not handling other versatile flows 337 + return flowrules;
425 - return Collections.emptySet();
426 } 338 }
427 339
428 /** 340 /**
...@@ -500,35 +412,6 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe ...@@ -500,35 +412,6 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
500 new DummyGroup(treatment)); 412 new DummyGroup(treatment));
501 } 413 }
502 414
503 - private class Filter {
504 - private PortCriterion port;
505 - private VlanIdCriterion vlan;
506 - private EthCriterion eth;
507 -
508 - @SuppressWarnings("unused")
509 - private Collection<IPCriterion> ips;
510 -
511 - public Filter(PortCriterion p, EthCriterion e, VlanIdCriterion v,
512 - Collection<IPCriterion> ips) {
513 - this.eth = e;
514 - this.port = p;
515 - this.vlan = v;
516 - this.ips = ips;
517 - }
518 -
519 - public PortNumber port() {
520 - return port.port();
521 - }
522 -
523 - public VlanId vlanId() {
524 - return vlan.vlanId();
525 - }
526 -
527 - public MacAddress mac() {
528 - return eth.mac();
529 - }
530 - }
531 -
532 private class DummyGroup implements NextGroup { 415 private class DummyGroup implements NextGroup {
533 TrafficTreatment nextActions; 416 TrafficTreatment nextActions;
534 417
......
...@@ -98,7 +98,7 @@ public class ComponentManager implements ComponentService { ...@@ -98,7 +98,7 @@ public class ComponentManager implements ComponentService {
98 98
99 org.apache.felix.scr.Component component = components[0]; 99 org.apache.felix.scr.Component component = components[0];
100 100
101 - if (component.getState() != org.apache.felix.scr.Component.STATE_ACTIVE) { 101 + if (component.getState() == org.apache.felix.scr.Component.STATE_DISABLED) {
102 log.info("Enabling component {}", name); 102 log.info("Enabling component {}", name);
103 component.enable(); 103 component.enable();
104 } 104 }
......