[ONOS-3835] Install load balanced classifier rules
Change-Id: I585a83021dbf2aff6a65dd43944a1f6979b33ead
diff --git a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/FlowClassifierInstallerService.java b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/FlowClassifierInstallerService.java
index fddcf4d..9a66ffa 100644
--- a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/FlowClassifierInstallerService.java
+++ b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/FlowClassifierInstallerService.java
@@ -1,10 +1,24 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package org.onosproject.sfc.installer;
+import org.onosproject.net.ConnectPoint;
import org.onosproject.net.NshServicePathId;
-import org.onosproject.net.flowobjective.Objective.Operation;
-import org.onosproject.vtnrsc.FlowClassifier;
+import org.onosproject.vtnrsc.FiveTuple;
import org.onosproject.vtnrsc.PortChain;
-import org.onosproject.vtnrsc.PortPair;
/**
* Abstraction of an entity which installs flow classification rules in ovs.
@@ -12,29 +26,38 @@
public interface FlowClassifierInstallerService {
/**
- * Install Flow-Classifier.
+ * Install flow classifier.
*
* @param portChain port-chain
- * @param nshSpiId nsh spi-id
+ * @param nshSpiId service path index identifier
*/
- void installFlowClassifier(PortChain portChain, NshServicePathId nshSpiId);
+ ConnectPoint installFlowClassifier(PortChain portChain, NshServicePathId nshSpiId);
/**
- * Uninstall Flow-Classifier.
+ * Uninstall flow classifier.
*
* @param portChain port-chain
- * @param nshSpiId nsh spi-id
+ * @param nshSpiId service path index identifier
*/
- void unInstallFlowClassifier(PortChain portChain, NshServicePathId nshSpiId);
+ ConnectPoint unInstallFlowClassifier(PortChain portChain, NshServicePathId nshSpiId);
/**
- * Prepare forwarding object for flow classifier.
+ * Install load balanced flow classifier.
*
- * @param flowClassifier flow classifier
- * @param portPair port pair
- * @param nshSpiId nsh spi id
- * @param type forwarding objective operation type
+ * @param portChain port-chain
+ * @param fiveTuple five tuple packet information
+ * @param nshSpiId service path index identifier
*/
- void prepareFlowClassification(FlowClassifier flowClassifier, PortPair portPair, NshServicePathId nshSpiId,
- Operation type);
+ ConnectPoint installLoadBalancedFlowClassifier(PortChain portChain, FiveTuple fiveTuple,
+ NshServicePathId nshSpiId);
+
+ /**
+ * Uninstall load balanced flow classifier.
+ *
+ * @param portChain port-chain
+ * @param fiveTuple five tuple packet information
+ * @param nshSpiId service path index identifier
+ */
+ ConnectPoint unInstallLoadBalancedFlowClassifier(PortChain portChain, FiveTuple fiveTuple,
+ NshServicePathId nshSpiId);
}
diff --git a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/impl/FlowClassifierInstallerImpl.java b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/impl/FlowClassifierInstallerImpl.java
index caebbd9..70d1d21 100644
--- a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/impl/FlowClassifierInstallerImpl.java
+++ b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/impl/FlowClassifierInstallerImpl.java
@@ -15,20 +15,29 @@
*/
package org.onosproject.sfc.installer.impl;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_SI;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_SPI;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+
import org.onlab.osgi.DefaultServiceDirectory;
import org.onlab.osgi.ServiceDirectory;
import org.onlab.packet.Ethernet;
+import org.onlab.packet.IPv4;
+import org.onlab.packet.IpPrefix;
import org.onlab.packet.MacAddress;
import org.onlab.packet.TpPort;
import org.onlab.packet.VlanId;
import org.onosproject.core.ApplicationId;
+import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Host;
import org.onosproject.net.HostId;
+import org.onosproject.net.NshServiceIndex;
import org.onosproject.net.NshServicePathId;
import org.onosproject.net.PortNumber;
import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
@@ -46,9 +55,9 @@
import org.onosproject.net.flowobjective.ForwardingObjective;
import org.onosproject.net.flowobjective.ForwardingObjective.Flag;
import org.onosproject.net.flowobjective.Objective;
-import org.onosproject.net.flowobjective.Objective.Operation;
import org.onosproject.net.host.HostService;
import org.onosproject.sfc.installer.FlowClassifierInstallerService;
+import org.onosproject.vtnrsc.FiveTuple;
import org.onosproject.vtnrsc.FlowClassifier;
import org.onosproject.vtnrsc.FlowClassifierId;
import org.onosproject.vtnrsc.PortChain;
@@ -64,48 +73,20 @@
import org.onosproject.vtnrsc.virtualport.VirtualPortService;
import org.slf4j.Logger;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_SI;
-import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_SPI;
-import static org.slf4j.LoggerFactory.getLogger;
-
/**
* Provides flow classifier installer implementation.
*/
-@Component(immediate = true)
-@Service
public class FlowClassifierInstallerImpl implements FlowClassifierInstallerService {
-
private final Logger log = getLogger(getClass());
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected VirtualPortService virtualPortService;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected VtnRscService vtnRscService;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected PortPairService portPairService;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected PortPairGroupService portPairGroupService;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected FlowClassifierService flowClassifierService;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected DriverService driverService;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected DeviceService deviceService;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected HostService hostService;
-
protected FlowObjectiveService flowObjectiveService;
protected ApplicationId appId;
@@ -114,8 +95,8 @@
private static final String FLOW_CLASSIFIER_ID_NOT_NULL = "Flow-Classifier-Id cannot be null";
private static final String PORT_CHAIN_NOT_NULL = "Port-Chain cannot be null";
private static final int NULL = 0;
- private static final int L3FWD_PRIORITY = 0xffff;
- private static final int NSH_SI_ID = 0xff;
+ private static final int FLOW_CLASSIFIER_PRIORITY = 0x7fff;
+ private static final short NSH_SI_ID = 0xff;
/**
* Default constructor.
@@ -126,40 +107,102 @@
/**
* Explicit constructor.
*
- * @param appId Application ID.
+ * @param appId application id.
*/
public FlowClassifierInstallerImpl(ApplicationId appId) {
this.appId = checkNotNull(appId, "ApplicationId can not be null");
ServiceDirectory serviceDirectory = new DefaultServiceDirectory();
this.flowObjectiveService = serviceDirectory.get(FlowObjectiveService.class);
+ this.driverService = serviceDirectory.get(DriverService.class);
+ this.deviceService = serviceDirectory.get(DeviceService.class);
+ this.hostService = serviceDirectory.get(HostService.class);
+ this.virtualPortService = serviceDirectory.get(VirtualPortService.class);
+ this.vtnRscService = serviceDirectory.get(VtnRscService.class);
+ this.portPairService = serviceDirectory.get(PortPairService.class);
+ this.portPairGroupService = serviceDirectory.get(PortPairGroupService.class);
+ this.flowClassifierService = serviceDirectory.get(FlowClassifierService.class);
}
@Override
- public void installFlowClassifier(PortChain portChain, NshServicePathId nshSpiId) {
+ public ConnectPoint installFlowClassifier(PortChain portChain, NshServicePathId nshSpiId) {
checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
- processFlowClassifier(portChain, nshSpiId, Objective.Operation.ADD);
- }
-
- @Override
- public void unInstallFlowClassifier(PortChain portChain, NshServicePathId nshSpiId) {
- checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
- processFlowClassifier(portChain, nshSpiId, Objective.Operation.REMOVE);
- }
-
- public void processFlowClassifier(PortChain portChain, NshServicePathId nshSpiId, Objective.Operation type) {
-
- // get the portPairGroup
+ // Get the portPairGroup
List<PortPairGroupId> llPortPairGroupIdList = portChain.portPairGroups();
ListIterator<PortPairGroupId> portPairGroupIdListIterator = llPortPairGroupIdList.listIterator();
PortPairGroupId portPairGroupId = portPairGroupIdListIterator.next();
PortPairGroup portPairGroup = portPairGroupService.getPortPairGroup(portPairGroupId);
List<PortPairId> llPortPairIdList = portPairGroup.portPairs();
- // get port pair
+ // Get port pair
ListIterator<PortPairId> portPairListIterator = llPortPairIdList.listIterator();
PortPairId portPairId = portPairListIterator.next();
PortPair portPair = portPairService.getPortPair(portPairId);
+ return processFlowClassifier(portChain, portPair, nshSpiId, null, Objective.Operation.ADD);
+ }
+
+ @Override
+ public ConnectPoint unInstallFlowClassifier(PortChain portChain, NshServicePathId nshSpiId) {
+ checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
+ // Get the portPairGroup
+ List<PortPairGroupId> llPortPairGroupIdList = portChain.portPairGroups();
+ ListIterator<PortPairGroupId> portPairGroupIdListIterator = llPortPairGroupIdList.listIterator();
+ PortPairGroupId portPairGroupId = portPairGroupIdListIterator.next();
+ PortPairGroup portPairGroup = portPairGroupService.getPortPairGroup(portPairGroupId);
+ List<PortPairId> llPortPairIdList = portPairGroup.portPairs();
+
+ // Get port pair
+ ListIterator<PortPairId> portPairListIterator = llPortPairIdList.listIterator();
+ PortPairId portPairId = portPairListIterator.next();
+ PortPair portPair = portPairService.getPortPair(portPairId);
+
+ return processFlowClassifier(portChain, portPair, nshSpiId, null, Objective.Operation.REMOVE);
+ }
+
+ @Override
+ public ConnectPoint installLoadBalancedFlowClassifier(PortChain portChain, FiveTuple fiveTuple,
+ NshServicePathId nshSpiId) {
+ checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
+
+ // Get the load balanced path
+ List<PortPairId> portPairs = portChain.getLoadBalancePath(fiveTuple);
+
+ // Get the first port pair
+ ListIterator<PortPairId> portPairListIterator = portPairs.listIterator();
+ PortPairId portPairId = portPairListIterator.next();
+ PortPair portPair = portPairService.getPortPair(portPairId);
+
+ return processFlowClassifier(portChain, portPair, nshSpiId, fiveTuple, Objective.Operation.ADD);
+ }
+
+ @Override
+ public ConnectPoint unInstallLoadBalancedFlowClassifier(PortChain portChain, FiveTuple fiveTuple,
+ NshServicePathId nshSpiId) {
+ checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
+ // Get the load balanced path
+ List<PortPairId> portPairs = portChain.getLoadBalancePath(fiveTuple);
+
+ // Get the first port pair
+ ListIterator<PortPairId> portPairListIterator = portPairs.listIterator();
+ PortPairId portPairId = portPairListIterator.next();
+ PortPair portPair = portPairService.getPortPair(portPairId);
+
+ return processFlowClassifier(portChain, portPair, nshSpiId, fiveTuple, Objective.Operation.REMOVE);
+ }
+
+ public ConnectPoint processFlowClassifier(PortChain portChain, PortPair portPair, NshServicePathId nshSpiId,
+ FiveTuple fiveTuple, Objective.Operation type) {
+
+ DeviceId deviceIdfromPortPair = vtnRscService.getSfToSffMaping(VirtualPortId.portId(portPair.ingress()));
+ MacAddress srcMacAddress = virtualPortService.getPort(VirtualPortId.portId(portPair.ingress())).macAddress();
+ Host host = hostService.getHost(HostId.hostId(srcMacAddress));
+ PortNumber port = host.location().port();
+
+ DeviceId deviceId = deviceIdfromPortPair;
+
+ // Vxlan tunnel port for NSH header(Vxlan + NSH).
+ TpPort nshDstPort = TpPort.tpPort(6633);
+
FlowClassifierInstallerService flowclassifierinstallerService;
// get flow classifiers
List<FlowClassifierId> llFlowClassifierList = portChain.flowClassifiers();
@@ -168,61 +211,76 @@
while (flowClassifierListIterator.hasNext()) {
FlowClassifierId flowclassifierId = flowClassifierListIterator.next();
FlowClassifier flowClassifier = flowClassifierService.getFlowClassifier(flowclassifierId);
- prepareFlowClassification(flowClassifier, portPair, nshSpiId, type);
+
+ if ((flowClassifier.srcPort() != null) && (!flowClassifier.srcPort().portId().isEmpty())) {
+ deviceId = vtnRscService.getSfToSffMaping(flowClassifier.srcPort());
+ }
+
+ // Build Traffic selector.
+ TrafficSelector.Builder selector = packTrafficSelector(flowClassifier, fiveTuple);
+
+ if (fiveTuple == null) {
+ // Send the packet to controller
+ TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+ treatment.setOutput(PortNumber.CONTROLLER);
+ sendServiceFunctionClassifier(selector, treatment, deviceId, type);
+ } else if (deviceId.equals(deviceIdfromPortPair)) {
+ // classifier and source device are in the same OVS. So directly send packet to first port pair
+ TrafficTreatment.Builder treatment = packTrafficTreatment(deviceId, port, nshDstPort,
+ nshSpiId, flowClassifier, true);
+ // Build forwarding objective and send to OVS.
+ sendServiceFunctionClassifier(selector, treatment, deviceId, type);
+ } else {
+ // classifier and source device are not in the same OVS. Send packet on vlan Tunnel
+ TrafficTreatment.Builder treatment = packTrafficTreatment(deviceId, port, nshDstPort,
+ nshSpiId, flowClassifier, false);
+ // Build forwarding objective and send to OVS.
+ sendServiceFunctionClassifier(selector, treatment, deviceId, type);
+
+ // At the other device get the packet from vlan and send to first port pair
+ TrafficSelector.Builder selectorDst = DefaultTrafficSelector.builder();
+ selectorDst.matchVlanId((VlanId.vlanId(Short.parseShort((vtnRscService
+ .getL3vni(flowClassifier.tenantId()).toString())))));
+ TrafficTreatment.Builder treatmentDst = DefaultTrafficTreatment.builder();
+ Host hostDst = hostService.getHost(HostId.hostId(srcMacAddress));
+ treatmentDst.setOutput(hostDst.location().port());
+ sendServiceFunctionClassifier(selectorDst, treatmentDst, deviceIdfromPortPair, type);
+ }
}
- }
-
- @Override
- public void prepareFlowClassification(FlowClassifier flowClassifier, PortPair portPair, NshServicePathId nshSpi,
- Operation type) {
- DeviceId deviceId = null;
- // device id if virtual ports are set in flow classifier.
- DeviceId deviceIdfromFc = null;
- // device id if port pair is used to fetch device id.
- DeviceId deviceIdfromPp = null;
- MacAddress srcMacAddress = null;
- // Vxlan tunnel port for NSH header(Vxlan + NSH).
- TpPort nshDstPort = TpPort.tpPort(6633);
-
- if ((flowClassifier.srcPort() != null) && (!flowClassifier.srcPort().portId().isEmpty())) {
- deviceIdfromFc = vtnRscService.getSfToSffMaping(flowClassifier.srcPort());
- deviceId = deviceIdfromFc;
- } else {
- deviceIdfromPp = vtnRscService.getSfToSffMaping(VirtualPortId.portId(portPair.ingress()));
- srcMacAddress = virtualPortService.getPort(VirtualPortId.portId(portPair.egress())).macAddress();
- deviceId = deviceIdfromPp;
- }
-
- // Build Traffic selector.
- TrafficSelector.Builder selector = packTrafficSelector(flowClassifier);
-
- // Build traffic treatment.
- TrafficTreatment.Builder treatment = packTrafficTreatment(deviceId, srcMacAddress, nshDstPort, deviceIdfromFc,
- deviceIdfromPp, nshSpi, flowClassifier);
-
- // Build forwarding objective and send to OVS.
- sendServiceFunctionForwarder(selector, treatment, deviceId, type);
+ return host.location();
}
/**
* Pack Traffic selector.
*
* @param flowClassifier flow-classifier
+ * @param fiveTuple five tuple info for the packet
* @return traffic selector
*/
- public TrafficSelector.Builder packTrafficSelector(FlowClassifier flowClassifier) {
+ public TrafficSelector.Builder packTrafficSelector(FlowClassifier flowClassifier, FiveTuple fiveTuple) {
+
TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
if ((flowClassifier.srcIpPrefix() != null) && (flowClassifier.srcIpPrefix().prefixLength() != 0)) {
selector.matchIPSrc(flowClassifier.srcIpPrefix());
+ } else if (fiveTuple != null && fiveTuple.ipSrc() != null) {
+ selector.matchIPSrc(IpPrefix.valueOf(fiveTuple.ipSrc(), 24));
}
if ((flowClassifier.dstIpPrefix() != null) && (flowClassifier.dstIpPrefix().prefixLength() != 0)) {
selector.matchIPDst(flowClassifier.dstIpPrefix());
+ } else if (fiveTuple != null && fiveTuple.ipDst() != null) {
+ selector.matchIPDst(IpPrefix.valueOf(fiveTuple.ipDst(), 24));
}
if ((flowClassifier.protocol() != null) && (!flowClassifier.protocol().isEmpty())) {
- selector.add(Criteria.matchIPProtocol(Short.parseShort(flowClassifier.protocol())));
+ if (flowClassifier.protocol().equalsIgnoreCase("TCP")) {
+ selector.add(Criteria.matchIPProtocol(IPv4.PROTOCOL_TCP));
+ } else if (flowClassifier.protocol().equalsIgnoreCase("UDP")) {
+ selector.add(Criteria.matchIPProtocol(IPv4.PROTOCOL_UDP));
+ }
+ } else if (fiveTuple != null && fiveTuple.protocol() != 0) {
+ selector.add(Criteria.matchIPProtocol(fiveTuple.protocol()));
}
if (((flowClassifier.etherType() != null) && (!flowClassifier.etherType().isEmpty()))
@@ -234,24 +292,38 @@
}
}
- List<TpPort> srcPortRange = new LinkedList<>();
- List<TpPort> dstPortRange = new LinkedList<>();
- if ((flowClassifier.minSrcPortRange() != 0) && flowClassifier.maxSrcPortRange() != 0
- && flowClassifier.minDstPortRange() != 0 && flowClassifier.maxDstPortRange() != 0) {
-
- for (int port = flowClassifier.minSrcPortRange(); port <= flowClassifier.maxSrcPortRange(); port++) {
- srcPortRange.add(TpPort.tpPort(port));
- }
- for (int port = flowClassifier.minDstPortRange(); port <= flowClassifier.maxDstPortRange(); port++) {
- dstPortRange.add(TpPort.tpPort(port));
- }
+ if ((flowClassifier.srcPort() != null) && (!flowClassifier.srcPort().portId().isEmpty())) {
+ VirtualPortId vPortId = VirtualPortId.portId(flowClassifier.srcPort().portId());
+ MacAddress macAddress = virtualPortService.getPort(vPortId).macAddress();
+ Host host = hostService.getHost(HostId.hostId(macAddress));
+ selector.matchInPort(host.location().port());
}
- for (TpPort inPort : srcPortRange) {
- selector.matchUdpSrc(inPort);
- }
- for (TpPort outPort : dstPortRange) {
- selector.matchUdpDst(outPort);
+ // Take the port information from five tuple only when the protocol is TCP.
+ if (fiveTuple != null && fiveTuple.protocol() == IPv4.PROTOCOL_TCP) {
+ selector.matchTcpSrc(TpPort.tpPort((int) fiveTuple.portSrc().toLong()));
+ selector.matchTcpDst(TpPort.tpPort((int) fiveTuple.portDst().toLong()));
+ } else {
+ // For udp packets take the port information from flow classifier
+ List<TpPort> srcPortRange = new LinkedList<>();
+ List<TpPort> dstPortRange = new LinkedList<>();
+ if ((flowClassifier.minSrcPortRange() != 0) && flowClassifier.maxSrcPortRange() != 0
+ && flowClassifier.minDstPortRange() != 0 && flowClassifier.maxDstPortRange() != 0) {
+
+ for (int port = flowClassifier.minSrcPortRange(); port <= flowClassifier.maxSrcPortRange(); port++) {
+ srcPortRange.add(TpPort.tpPort(port));
+ }
+ for (int port = flowClassifier.minDstPortRange(); port <= flowClassifier.maxDstPortRange(); port++) {
+ dstPortRange.add(TpPort.tpPort(port));
+ }
+ }
+
+ for (TpPort inPort : srcPortRange) {
+ selector.matchUdpSrc(inPort);
+ }
+ for (TpPort outPort : dstPortRange) {
+ selector.matchUdpDst(outPort);
+ }
}
return selector;
}
@@ -260,26 +332,23 @@
* Pack traffic treatment.
*
* @param deviceId device id
- * @param srcMacAddress source mac-address
* @param nshDstPort vxlan tunnel port for nsh header
- * @param deviceIdfromFc device id if virtual ports are set in flow classifier.
- * @param deviceIdfromPp device id if port pair is used to fetch device id.
* @param nshSpi nsh spi
* @param flowClassifier flow-classifier
* @return traffic treatment
*/
- public TrafficTreatment.Builder packTrafficTreatment(DeviceId deviceId, MacAddress srcMacAddress,
- TpPort nshDstPort, DeviceId deviceIdfromFc, DeviceId deviceIdfromPp,
- NshServicePathId nshSpi, FlowClassifier flowClassifier) {
+ public TrafficTreatment.Builder packTrafficTreatment(DeviceId deviceId, PortNumber port,
+ TpPort nshDstPort, NshServicePathId nshSpi,
+ FlowClassifier flowClassifier, boolean isSameOvs) {
+
TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
- Host host = hostService.getHost(HostId.hostId(srcMacAddress));
- PortNumber port = host.location().port();
- if (deviceIdfromPp != null) {
+ if (isSameOvs) {
treatmentBuilder.setOutput(port);
- } else if (deviceIdfromFc != null) {
- treatmentBuilder.setVlanId((VlanId.vlanId(Short.parseShort((vtnRscService.getL3vni(flowClassifier
- .tenantId()).toString())))));
+ } else {
+ treatmentBuilder.setVlanId((VlanId.vlanId(Short.parseShort((vtnRscService
+ .getL3vni(flowClassifier.tenantId()).toString())))));
+ treatmentBuilder.setUdpDst(nshDstPort);
}
// Set NSH
@@ -290,7 +359,6 @@
treatmentBuilder.extension(nspIdTreatment, deviceId);
treatmentBuilder.extension(nsiIdTreatment, deviceId);
- treatmentBuilder.setUdpDst(nshDstPort);
try {
nspIdTreatment.setPropertyValue("nshSpi", nshSpi);
@@ -298,10 +366,11 @@
log.error("Failed to get extension instruction to set Nsh Spi Id {}", deviceId);
}
try {
- nsiIdTreatment.setPropertyValue("nshSi", NSH_SI_ID);
+ nsiIdTreatment.setPropertyValue("nshSi", NshServiceIndex.of(NSH_SI_ID));
} catch (Exception e) {
log.error("Failed to get extension instruction to set Nsh Si Id {}", deviceId);
}
+
return treatmentBuilder;
}
@@ -313,11 +382,13 @@
* @param deviceId device id
* @param type operation type
*/
- public void sendServiceFunctionForwarder(TrafficSelector.Builder selector, TrafficTreatment.Builder treatment,
- DeviceId deviceId, Objective.Operation type) {
+ public void sendServiceFunctionClassifier(TrafficSelector.Builder selector, TrafficTreatment.Builder treatment,
+ DeviceId deviceId, Objective.Operation type) {
+ log.info("Sending flow to service function classifier. Selector {}, Treatment {}",
+ selector.toString(), treatment.toString());
ForwardingObjective.Builder objective = DefaultForwardingObjective.builder().withTreatment(treatment.build())
.withSelector(selector.build()).fromApp(appId).makePermanent().withFlag(Flag.VERSATILE)
- .withPriority(L3FWD_PRIORITY);
+ .withPriority(FLOW_CLASSIFIER_PRIORITY);
if (type.equals(Objective.Operation.ADD)) {
log.debug("flowClassifierRules-->ADD");