Committed by
Mahesh Poojary Huawei
[ONOS-3119] Flow-classifier installer changes
Change-Id: I7437a4dc0611409788d6d5cbfaeb6b69253ceb77
Showing
1 changed file
with
48 additions
and
20 deletions
... | @@ -20,20 +20,28 @@ import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.Exten | ... | @@ -20,20 +20,28 @@ import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.Exten |
20 | import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_SPI; | 20 | import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_SPI; |
21 | import static org.slf4j.LoggerFactory.getLogger; | 21 | import static org.slf4j.LoggerFactory.getLogger; |
22 | 22 | ||
23 | +import org.apache.felix.scr.annotations.Reference; | ||
24 | +import org.apache.felix.scr.annotations.ReferenceCardinality; | ||
25 | +import org.apache.felix.scr.annotations.Service; | ||
26 | + | ||
23 | import java.util.LinkedList; | 27 | import java.util.LinkedList; |
24 | import java.util.List; | 28 | import java.util.List; |
25 | import java.util.ListIterator; | 29 | import java.util.ListIterator; |
26 | 30 | ||
27 | -import org.apache.felix.scr.annotations.Reference; | 31 | +import org.apache.felix.scr.annotations.Component; |
28 | -import org.apache.felix.scr.annotations.ReferenceCardinality; | ||
29 | import org.onlab.osgi.DefaultServiceDirectory; | 32 | import org.onlab.osgi.DefaultServiceDirectory; |
30 | import org.onlab.osgi.ServiceDirectory; | 33 | import org.onlab.osgi.ServiceDirectory; |
34 | +import org.onlab.packet.Ethernet; | ||
31 | import org.onlab.packet.MacAddress; | 35 | import org.onlab.packet.MacAddress; |
32 | import org.onlab.packet.TpPort; | 36 | import org.onlab.packet.TpPort; |
33 | import org.onlab.packet.VlanId; | 37 | import org.onlab.packet.VlanId; |
34 | import org.onosproject.core.ApplicationId; | 38 | import org.onosproject.core.ApplicationId; |
35 | import org.onosproject.net.DeviceId; | 39 | import org.onosproject.net.DeviceId; |
40 | +import org.onosproject.net.Host; | ||
41 | +import org.onosproject.net.HostId; | ||
36 | import org.onosproject.net.NshServicePathId; | 42 | import org.onosproject.net.NshServicePathId; |
43 | +import org.onosproject.net.PortNumber; | ||
44 | +import org.onosproject.net.device.DeviceService; | ||
37 | import org.onosproject.net.behaviour.ExtensionTreatmentResolver; | 45 | import org.onosproject.net.behaviour.ExtensionTreatmentResolver; |
38 | import org.onosproject.net.driver.DriverHandler; | 46 | import org.onosproject.net.driver.DriverHandler; |
39 | import org.onosproject.net.driver.DriverService; | 47 | import org.onosproject.net.driver.DriverService; |
... | @@ -49,6 +57,7 @@ import org.onosproject.net.flowobjective.ForwardingObjective; | ... | @@ -49,6 +57,7 @@ import org.onosproject.net.flowobjective.ForwardingObjective; |
49 | import org.onosproject.net.flowobjective.ForwardingObjective.Flag; | 57 | import org.onosproject.net.flowobjective.ForwardingObjective.Flag; |
50 | import org.onosproject.net.flowobjective.Objective; | 58 | import org.onosproject.net.flowobjective.Objective; |
51 | import org.onosproject.net.flowobjective.Objective.Operation; | 59 | import org.onosproject.net.flowobjective.Objective.Operation; |
60 | +import org.onosproject.net.host.HostService; | ||
52 | import org.onosproject.sfc.installer.FlowClassifierInstallerService; | 61 | import org.onosproject.sfc.installer.FlowClassifierInstallerService; |
53 | import org.onosproject.vtnrsc.FlowClassifier; | 62 | import org.onosproject.vtnrsc.FlowClassifier; |
54 | import org.onosproject.vtnrsc.FlowClassifierId; | 63 | import org.onosproject.vtnrsc.FlowClassifierId; |
... | @@ -63,11 +72,14 @@ import org.onosproject.vtnrsc.portpair.PortPairService; | ... | @@ -63,11 +72,14 @@ import org.onosproject.vtnrsc.portpair.PortPairService; |
63 | import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService; | 72 | import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService; |
64 | import org.onosproject.vtnrsc.service.VtnRscService; | 73 | import org.onosproject.vtnrsc.service.VtnRscService; |
65 | import org.onosproject.vtnrsc.virtualport.VirtualPortService; | 74 | import org.onosproject.vtnrsc.virtualport.VirtualPortService; |
75 | + | ||
66 | import org.slf4j.Logger; | 76 | import org.slf4j.Logger; |
67 | 77 | ||
68 | /** | 78 | /** |
69 | * Provides flow classifier installer implementation. | 79 | * Provides flow classifier installer implementation. |
70 | */ | 80 | */ |
81 | +@Component(immediate = true) | ||
82 | +@Service | ||
71 | public class FlowClassifierInstallerImpl implements FlowClassifierInstallerService { | 83 | public class FlowClassifierInstallerImpl implements FlowClassifierInstallerService { |
72 | 84 | ||
73 | private final Logger log = getLogger(getClass()); | 85 | private final Logger log = getLogger(getClass()); |
... | @@ -90,6 +102,12 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi | ... | @@ -90,6 +102,12 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi |
90 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 102 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
91 | protected DriverService driverService; | 103 | protected DriverService driverService; |
92 | 104 | ||
105 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
106 | + protected DeviceService deviceService; | ||
107 | + | ||
108 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
109 | + protected HostService hostService; | ||
110 | + | ||
93 | protected FlowObjectiveService flowObjectiveService; | 111 | protected FlowObjectiveService flowObjectiveService; |
94 | protected ApplicationId appId; | 112 | protected ApplicationId appId; |
95 | 113 | ||
... | @@ -168,7 +186,7 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi | ... | @@ -168,7 +186,7 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi |
168 | // Vxlan tunnel port for NSH header(Vxlan + NSH). | 186 | // Vxlan tunnel port for NSH header(Vxlan + NSH). |
169 | TpPort nshDstPort = TpPort.tpPort(6633); | 187 | TpPort nshDstPort = TpPort.tpPort(6633); |
170 | 188 | ||
171 | - if (flowClassifier.srcPort() != null) { | 189 | + if ((flowClassifier.srcPort() != null) && (!flowClassifier.srcPort().portId().isEmpty())) { |
172 | deviceIdfromFc = vtnRscService.getSFToSFFMaping(flowClassifier.srcPort()); | 190 | deviceIdfromFc = vtnRscService.getSFToSFFMaping(flowClassifier.srcPort()); |
173 | deviceId = deviceIdfromFc; | 191 | deviceId = deviceIdfromFc; |
174 | } else { | 192 | } else { |
... | @@ -197,25 +215,31 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi | ... | @@ -197,25 +215,31 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi |
197 | public TrafficSelector.Builder packTrafficSelector(FlowClassifier flowClassifier) { | 215 | public TrafficSelector.Builder packTrafficSelector(FlowClassifier flowClassifier) { |
198 | TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); | 216 | TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); |
199 | 217 | ||
200 | - if (flowClassifier.srcIpPrefix() != null) { | 218 | + if ((flowClassifier.srcIpPrefix() != null) && (flowClassifier.srcIpPrefix().prefixLength() != 0)) { |
201 | selector.matchIPSrc(flowClassifier.srcIpPrefix()); | 219 | selector.matchIPSrc(flowClassifier.srcIpPrefix()); |
202 | } | 220 | } |
203 | - if (flowClassifier.dstIpPrefix() != null) { | 221 | + |
222 | + if ((flowClassifier.dstIpPrefix() != null) && (flowClassifier.dstIpPrefix().prefixLength() != 0)) { | ||
204 | selector.matchIPDst(flowClassifier.dstIpPrefix()); | 223 | selector.matchIPDst(flowClassifier.dstIpPrefix()); |
205 | } | 224 | } |
206 | 225 | ||
207 | - if (flowClassifier.protocol() != null) { | 226 | + if ((flowClassifier.protocol() != null) && (!flowClassifier.protocol().isEmpty())) { |
208 | selector.add(Criteria.matchIPProtocol(Short.parseShort(flowClassifier.protocol()))); | 227 | selector.add(Criteria.matchIPProtocol(Short.parseShort(flowClassifier.protocol()))); |
209 | } | 228 | } |
210 | - if ((flowClassifier.etherType() != null) | 229 | + |
211 | - && (flowClassifier.etherType() == "IPv4" || flowClassifier.etherType() == "IPv6")) { | 230 | + if (((flowClassifier.etherType() != null) && (!flowClassifier.etherType().isEmpty())) |
212 | - selector.matchEthType(Short.parseShort((flowClassifier.etherType()))); | 231 | + && (flowClassifier.etherType().equals("IPv4") || flowClassifier.etherType().equals("IPv6"))) { |
232 | + if (flowClassifier.etherType().equals("IPv4")) { | ||
233 | + selector.matchEthType(Ethernet.TYPE_IPV4); | ||
234 | + } else { | ||
235 | + selector.matchEthType(Ethernet.TYPE_IPV6); | ||
236 | + } | ||
213 | } | 237 | } |
214 | 238 | ||
215 | List<TpPort> srcPortRange = new LinkedList<>(); | 239 | List<TpPort> srcPortRange = new LinkedList<>(); |
216 | List<TpPort> dstPortRange = new LinkedList<>(); | 240 | List<TpPort> dstPortRange = new LinkedList<>(); |
217 | - if ((flowClassifier.minSrcPortRange() != NULL) && flowClassifier.maxSrcPortRange() != NULL | 241 | + if ((flowClassifier.minSrcPortRange() != 0) && flowClassifier.maxSrcPortRange() != 0 |
218 | - && flowClassifier.minDstPortRange() != NULL && flowClassifier.maxDstPortRange() != NULL) { | 242 | + && flowClassifier.minDstPortRange() != 0 && flowClassifier.maxDstPortRange() != 0) { |
219 | 243 | ||
220 | for (int port = flowClassifier.minSrcPortRange(); port <= flowClassifier.maxSrcPortRange(); port++) { | 244 | for (int port = flowClassifier.minSrcPortRange(); port <= flowClassifier.maxSrcPortRange(); port++) { |
221 | srcPortRange.add(TpPort.tpPort(port)); | 245 | srcPortRange.add(TpPort.tpPort(port)); |
... | @@ -250,6 +274,17 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi | ... | @@ -250,6 +274,17 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi |
250 | TpPort nshDstPort, DeviceId deviceIdfromFc, DeviceId deviceIdfromPp, | 274 | TpPort nshDstPort, DeviceId deviceIdfromFc, DeviceId deviceIdfromPp, |
251 | NshServicePathId nshSPI, FlowClassifier flowClassifier) { | 275 | NshServicePathId nshSPI, FlowClassifier flowClassifier) { |
252 | TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder(); | 276 | TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder(); |
277 | + | ||
278 | + Host host = hostService.getHost(HostId.hostId(srcMacAddress)); | ||
279 | + PortNumber port = host.location().port(); | ||
280 | + if (deviceIdfromPp != null) { | ||
281 | + treatmentBuilder.setOutput(port); | ||
282 | + } else if (deviceIdfromFc != null) { | ||
283 | + treatmentBuilder.setVlanId((VlanId.vlanId(Short.parseShort((vtnRscService.getL3vni(flowClassifier | ||
284 | + .tenantId()).toString()))))); | ||
285 | + } | ||
286 | + | ||
287 | + // Set NSH | ||
253 | DriverHandler handler = driverService.createHandler(deviceId); | 288 | DriverHandler handler = driverService.createHandler(deviceId); |
254 | ExtensionTreatmentResolver resolver = handler.behaviour(ExtensionTreatmentResolver.class); | 289 | ExtensionTreatmentResolver resolver = handler.behaviour(ExtensionTreatmentResolver.class); |
255 | ExtensionTreatment nspIdTreatment = resolver.getExtensionInstruction(NICIRA_SET_NSH_SPI.type()); | 290 | ExtensionTreatment nspIdTreatment = resolver.getExtensionInstruction(NICIRA_SET_NSH_SPI.type()); |
... | @@ -269,13 +304,6 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi | ... | @@ -269,13 +304,6 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi |
269 | } catch (Exception e) { | 304 | } catch (Exception e) { |
270 | log.error("Failed to get extension instruction to set Nsh Si Id {}", deviceId); | 305 | log.error("Failed to get extension instruction to set Nsh Si Id {}", deviceId); |
271 | } | 306 | } |
272 | - | ||
273 | - if (deviceIdfromPp != null) { | ||
274 | - treatmentBuilder.setEthSrc(srcMacAddress); | ||
275 | - } else if (deviceIdfromFc != null) { | ||
276 | - treatmentBuilder.setVlanId((VlanId.vlanId(Short.parseShort((vtnRscService.getL3vni(flowClassifier | ||
277 | - .tenantId()).toString()))))); | ||
278 | - } | ||
279 | return treatmentBuilder; | 307 | return treatmentBuilder; |
280 | } | 308 | } |
281 | 309 | ||
... | @@ -290,8 +318,8 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi | ... | @@ -290,8 +318,8 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi |
290 | public void sendServiceFunctionForwarder(TrafficSelector.Builder selector, TrafficTreatment.Builder treatment, | 318 | public void sendServiceFunctionForwarder(TrafficSelector.Builder selector, TrafficTreatment.Builder treatment, |
291 | DeviceId deviceId, Objective.Operation type) { | 319 | DeviceId deviceId, Objective.Operation type) { |
292 | ForwardingObjective.Builder objective = DefaultForwardingObjective.builder().withTreatment(treatment.build()) | 320 | ForwardingObjective.Builder objective = DefaultForwardingObjective.builder().withTreatment(treatment.build()) |
293 | - .withSelector(selector.build()).fromApp(appId).makePermanent().withFlag(Flag.SPECIFIC).withPriority( | 321 | + .withSelector(selector.build()).fromApp(appId).makePermanent().withFlag(Flag.VERSATILE) |
294 | - L3FWD_PRIORITY); | 322 | + .withPriority(L3FWD_PRIORITY); |
295 | 323 | ||
296 | if (type.equals(Objective.Operation.ADD)) { | 324 | if (type.equals(Objective.Operation.ADD)) { |
297 | log.debug("flowClassifierRules-->ADD"); | 325 | log.debug("flowClassifierRules-->ADD"); | ... | ... |
-
Please register or login to post a comment