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 dbae14c75a..ec125537a0 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 @@ -223,19 +223,19 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi // Send the packet to controller TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); treatment.setOutput(PortNumber.CONTROLLER); - sendServiceFunctionClassifier(selector, treatment, deviceId, type); + sendServiceFunctionClassifier(selector, treatment, deviceId, type, flowClassifier.priority()); } 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); + sendServiceFunctionClassifier(selector, treatment, deviceId, type, flowClassifier.priority()); } 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); + sendServiceFunctionClassifier(selector, treatment, deviceId, type, flowClassifier.priority()); // At the other device get the packet from vlan and send to first port pair TrafficSelector.Builder selectorDst = DefaultTrafficSelector.builder(); @@ -244,7 +244,8 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi TrafficTreatment.Builder treatmentDst = DefaultTrafficTreatment.builder(); Host hostDst = hostService.getHost(HostId.hostId(srcMacAddress)); treatmentDst.setOutput(hostDst.location().port()); - sendServiceFunctionClassifier(selectorDst, treatmentDst, deviceIdfromPortPair, type); + sendServiceFunctionClassifier(selectorDst, treatmentDst, deviceIdfromPortPair, type, + flowClassifier.priority()); } } return host.location(); @@ -383,14 +384,15 @@ public class FlowClassifierInstallerImpl implements FlowClassifierInstallerServi * @param treatment traffic treatment * @param deviceId device id * @param type operation type + * @param priority priority of classifier */ public void sendServiceFunctionClassifier(TrafficSelector.Builder selector, TrafficTreatment.Builder treatment, - DeviceId deviceId, Objective.Operation type) { + DeviceId deviceId, Objective.Operation type, int priority) { 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(FLOW_CLASSIFIER_PRIORITY); + .withPriority(priority); if (type.equals(Objective.Operation.ADD)) { log.debug("flowClassifierRules-->ADD"); diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFlowClassifier.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFlowClassifier.java index fc360d8412..4f3a5a0d0f 100644 --- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFlowClassifier.java +++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFlowClassifier.java @@ -34,6 +34,7 @@ public final class DefaultFlowClassifier implements FlowClassifier { private final String description; private final String etherType; private final String protocol; + private final int priority; private final int minSrcPortRange; private final int maxSrcPortRange; private final int minDstPortRange; @@ -47,6 +48,7 @@ public final class DefaultFlowClassifier implements FlowClassifier { private static final String TENANT_ID_NOT_NULL = "Tenant id can not be null."; private static final String NAME_NOT_NULL = "Name can not be null."; private static final String ETHER_TYPE_NOT_NULL = "Ether Type can not be null."; + private static final int DEFAULT_CLASSIFIER_PRIORITY = 0xFFFF; /** * Constructor to create default flow classifier. @@ -57,6 +59,7 @@ public final class DefaultFlowClassifier implements FlowClassifier { * @param description flow classifier description * @param etherType etherType * @param protocol IP protocol + * @param priority priority for classification * @param minSrcPortRange Minimum Source port range * @param maxSrcPortRange Maximum Source port range * @param minDstPortRange Minimum destination port range @@ -67,15 +70,17 @@ public final class DefaultFlowClassifier implements FlowClassifier { * @param dstPort destination VirtualPort */ private DefaultFlowClassifier(FlowClassifierId flowClassifierId, TenantId tenantId, String name, - String description, String etherType, String protocol, int minSrcPortRange, int maxSrcPortRange, - int minDstPortRange, int maxDstPortRange, IpPrefix srcIpPrefix, IpPrefix dstIpPrefix, - VirtualPortId srcPort, VirtualPortId dstPort) { + String description, String etherType, String protocol, int priority, + int minSrcPortRange, int maxSrcPortRange, int minDstPortRange, int maxDstPortRange, + IpPrefix srcIpPrefix, IpPrefix dstIpPrefix, VirtualPortId srcPort, + VirtualPortId dstPort) { this.flowClassifierId = flowClassifierId; this.tenantId = tenantId; this.name = name; this.description = description; this.etherType = etherType; this.protocol = protocol; + this.priority = priority; this.minSrcPortRange = minSrcPortRange; this.maxSrcPortRange = maxSrcPortRange; this.minDstPortRange = minDstPortRange; @@ -116,6 +121,11 @@ public final class DefaultFlowClassifier implements FlowClassifier { return protocol; } + @Override + public int priority() { + return priority; + } + @Override public int minSrcPortRange() { return minSrcPortRange; @@ -169,6 +179,8 @@ public final class DefaultFlowClassifier implements FlowClassifier { private String etherType; private String protocol; private boolean isProtocolSet = false; + private int priority; + private boolean isPrioritySet = false; private int minSrcPortRange; private boolean isMinSrcPortRangeSet = false; private int maxSrcPortRange; @@ -195,6 +207,7 @@ public final class DefaultFlowClassifier implements FlowClassifier { checkNotNull(etherType, ETHER_TYPE_NOT_NULL); String description = null; String protocol = null; + int priority = DEFAULT_CLASSIFIER_PRIORITY; int minSrcPortRange = NULL_PORT; int maxSrcPortRange = NULL_PORT; int minDstPortRange = NULL_PORT; @@ -210,6 +223,9 @@ public final class DefaultFlowClassifier implements FlowClassifier { if (isProtocolSet) { protocol = this.protocol; } + if (isPrioritySet) { + priority = this.priority; + } if (isMinSrcPortRangeSet) { minSrcPortRange = this.minSrcPortRange; } @@ -236,8 +252,8 @@ public final class DefaultFlowClassifier implements FlowClassifier { } return new DefaultFlowClassifier(flowClassifierId, tenantId, name, description, etherType, protocol, - minSrcPortRange, maxSrcPortRange, minDstPortRange, maxDstPortRange, srcIpPrefix, dstIpPrefix, - srcPort, dstPort); + priority, minSrcPortRange, maxSrcPortRange, minDstPortRange, + maxDstPortRange, srcIpPrefix, dstIpPrefix, srcPort, dstPort); } @Override @@ -278,6 +294,13 @@ public final class DefaultFlowClassifier implements FlowClassifier { return this; } + @Override + public Builder setPriority(int priority) { + this.priority = priority; + this.isPrioritySet = true; + return this; + } + @Override public Builder setMinSrcPortRange(int minSrcPortRange) { this.minSrcPortRange = minSrcPortRange; @@ -354,6 +377,7 @@ public final class DefaultFlowClassifier implements FlowClassifier { && Objects.equals(this.description, other.description) && Objects.equals(this.etherType, other.etherType) && Objects.equals(this.protocol, other.protocol) + && Objects.equals(this.priority, other.priority) && Objects.equals(this.minSrcPortRange, other.minSrcPortRange) && Objects.equals(this.maxSrcPortRange, other.maxSrcPortRange) && Objects.equals(this.minDstPortRange, other.minDstPortRange) @@ -375,6 +399,7 @@ public final class DefaultFlowClassifier implements FlowClassifier { && Objects.equals(this.description, flowClassifier.description()) && Objects.equals(this.etherType, flowClassifier.etherType()) && Objects.equals(this.protocol, flowClassifier.protocol()) + && Objects.equals(this.priority, flowClassifier.priority()) && Objects.equals(this.minSrcPortRange, flowClassifier.minSrcPortRange()) && Objects.equals(this.maxSrcPortRange, flowClassifier.maxSrcPortRange()) && Objects.equals(this.minDstPortRange, flowClassifier.minDstPortRange()) @@ -394,6 +419,7 @@ public final class DefaultFlowClassifier implements FlowClassifier { .add("Description", description) .add("String", etherType) .add("Protocol", protocol) + .add("Priority", priority) .add("MinSrcPortRange", minSrcPortRange) .add("MaxSrcPortRange", maxSrcPortRange) .add("MinDstPortRange", minDstPortRange) diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FlowClassifier.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FlowClassifier.java index 26bf718369..890325337c 100644 --- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FlowClassifier.java +++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FlowClassifier.java @@ -67,6 +67,13 @@ public interface FlowClassifier { */ String protocol(); + /** + * Returns priority. + * + * @return priority + */ + int priority(); + /** * Returns minimum source port range. * @@ -192,6 +199,14 @@ public interface FlowClassifier { */ Builder setProtocol(String protocol); + /** + * Sets priority. + * + * @param priority priority + * @return builder object by setting priority + */ + Builder setPriority(int priority); + /** * Set minimum source port range. * diff --git a/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/DefaultFlowClassifierTest.java b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/DefaultFlowClassifierTest.java index d312e80937..fea2326124 100644 --- a/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/DefaultFlowClassifierTest.java +++ b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/DefaultFlowClassifierTest.java @@ -46,6 +46,7 @@ public class DefaultFlowClassifierTest { final String description = "FlowClassifier1"; final String ethType = "IPv4"; final String protocol = "tcp"; + final int priority = 65535; final int minSrcPortRange = 5; final int maxSrcPortRange = 10; final int minDstPortRange = 5; @@ -60,22 +61,25 @@ public class DefaultFlowClassifierTest { DefaultFlowClassifier.Builder flowClassifierBuilder = new DefaultFlowClassifier.Builder(); final FlowClassifier flowClassifier1 = flowClassifierBuilder.setFlowClassifierId(flowClassifierId) .setTenantId(tenantId).setName(name).setDescription(description).setEtherType(ethType) - .setProtocol(protocol).setMinSrcPortRange(minSrcPortRange).setMaxSrcPortRange(maxSrcPortRange) - .setMinDstPortRange(minDstPortRange).setMaxDstPortRange(maxDstPortRange).setSrcIpPrefix(srcIpPrefix) - .setDstIpPrefix(dstIpPrefix).setSrcPort(virtualSrcPort).setDstPort(virtualDstPort).build(); + .setProtocol(protocol).setPriority(priority).setMinSrcPortRange(minSrcPortRange) + .setMaxSrcPortRange(maxSrcPortRange).setMinDstPortRange(minDstPortRange) + .setMaxDstPortRange(maxDstPortRange).setSrcIpPrefix(srcIpPrefix).setDstIpPrefix(dstIpPrefix) + .setSrcPort(virtualSrcPort).setDstPort(virtualDstPort).build(); flowClassifierBuilder = new DefaultFlowClassifier.Builder(); final FlowClassifier sameAsFlowClassifier1 = flowClassifierBuilder.setFlowClassifierId(flowClassifierId) .setTenantId(tenantId).setName(name).setDescription(description).setEtherType(ethType) - .setProtocol(protocol).setMinSrcPortRange(minSrcPortRange).setMaxSrcPortRange(maxSrcPortRange) - .setMinDstPortRange(minDstPortRange).setMaxDstPortRange(maxDstPortRange).setSrcIpPrefix(srcIpPrefix) - .setDstIpPrefix(dstIpPrefix).setSrcPort(virtualSrcPort).setDstPort(virtualDstPort).build(); + .setProtocol(protocol).setPriority(priority).setMinSrcPortRange(minSrcPortRange) + .setMaxSrcPortRange(maxSrcPortRange).setMinDstPortRange(minDstPortRange) + .setMaxDstPortRange(maxDstPortRange).setSrcIpPrefix(srcIpPrefix).setDstIpPrefix(dstIpPrefix) + .setSrcPort(virtualSrcPort).setDstPort(virtualDstPort).build(); // Create different classifier object. final String name2 = "FlowClassifier2"; final String description2 = "FlowClassifier2"; final String ethType2 = "IPv6"; final String protocol2 = "udp"; + final int priority2 = 50000; final int minSrcPortRange2 = 5; final int maxSrcPortRange2 = 10; final int minDstPortRange2 = 5; @@ -92,7 +96,8 @@ public class DefaultFlowClassifierTest { .setTenantId(tenantId2).setName(name2).setDescription(description2).setEtherType(ethType2) .setProtocol(protocol2).setMinSrcPortRange(minSrcPortRange2).setMaxSrcPortRange(maxSrcPortRange2) .setMinDstPortRange(minDstPortRange2).setMaxDstPortRange(maxDstPortRange2).setSrcIpPrefix(srcIpPrefix2) - .setDstIpPrefix(dstIpPrefix2).setSrcPort(virtualSrcPort2).setDstPort(virtualDstPort2).build(); + .setDstIpPrefix(dstIpPrefix2).setSrcPort(virtualSrcPort2).setDstPort(virtualDstPort2) + .setPriority(priority2).build(); new EqualsTester().addEqualityGroup(flowClassifier1, sameAsFlowClassifier1).addEqualityGroup(flowClassifier2) .testEquals(); @@ -107,6 +112,7 @@ public class DefaultFlowClassifierTest { final String description = "FlowClassifier"; final String ethType = "IPv4"; final String protocol = "tcp"; + final int priority = 30000; final int minSrcPortRange = 5; final int maxSrcPortRange = 10; final int minDstPortRange = 5; @@ -123,7 +129,8 @@ public class DefaultFlowClassifierTest { .setTenantId(tenantId).setName(name).setDescription(description).setEtherType(ethType) .setProtocol(protocol).setMinSrcPortRange(minSrcPortRange).setMaxSrcPortRange(maxSrcPortRange) .setMinDstPortRange(minDstPortRange).setMaxDstPortRange(maxDstPortRange).setSrcIpPrefix(srcIpPrefix) - .setDstIpPrefix(dstIpPrefix).setSrcPort(virtualSrcPort).setDstPort(virtualDstPort).build(); + .setDstIpPrefix(dstIpPrefix).setSrcPort(virtualSrcPort).setDstPort(virtualDstPort) + .setPriority(priority).build(); assertThat(flowClassifierId, is(flowClassifier.flowClassifierId())); assertThat(tenantId, is(flowClassifier.tenantId())); @@ -131,6 +138,7 @@ public class DefaultFlowClassifierTest { assertThat(description, is(flowClassifier.description())); assertThat(ethType, is(flowClassifier.etherType())); assertThat(protocol, is(flowClassifier.protocol())); + assertThat(priority, is(flowClassifier.priority())); assertThat(minSrcPortRange, is(flowClassifier.minSrcPortRange())); assertThat(maxSrcPortRange, is(flowClassifier.maxSrcPortRange())); assertThat(minDstPortRange, is(flowClassifier.minDstPortRange())); diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java index 412cefe65c..94e02dbe93 100644 --- a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java +++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java @@ -40,6 +40,7 @@ public final class FlowClassifierCodec extends JsonCodec { private static final String DESCRIPTION = "description"; private static final String ETHER_TYPE = "ethertype"; private static final String PROTOCOL = "protocol"; + private static final String PRIORITY = "priority"; private static final String MIN_SRC_PORT_RANGE = "source_port_range_min"; private static final String MAX_SRC_PORT_RANGE = "source_port_range_max"; private static final String MIN_DST_PORT_RANGE = "destination_port_range_min"; @@ -79,6 +80,9 @@ public final class FlowClassifierCodec extends JsonCodec { resultBuilder.setProtocol(protocol); } + int priority = (json.get(PRIORITY)).asInt(); + resultBuilder.setPriority(priority); + int minSrcPortRange = (json.get(MIN_SRC_PORT_RANGE)).asInt(); resultBuilder.setMinSrcPortRange(minSrcPortRange); @@ -123,6 +127,7 @@ public final class FlowClassifierCodec extends JsonCodec { .put(DESCRIPTION, flowClassifier.description()) .put(ETHER_TYPE, flowClassifier.etherType()) .put(PROTOCOL, flowClassifier.protocol()) + .put(PRIORITY, flowClassifier.priority()) .put(MIN_SRC_PORT_RANGE, flowClassifier.minSrcPortRange()) .put(MAX_SRC_PORT_RANGE, flowClassifier.maxSrcPortRange()) .put(MIN_DST_PORT_RANGE, flowClassifier.minDstPortRange()) diff --git a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/FlowClassifierResourceTest.java b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/FlowClassifierResourceTest.java index 673e088eb8..b21a80f104 100644 --- a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/FlowClassifierResourceTest.java +++ b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/FlowClassifierResourceTest.java @@ -65,8 +65,9 @@ public class FlowClassifierResourceTest extends VtnResourceTest { VirtualPortId dstPortId1 = VirtualPortId.portId("aef3478a-4a56-2a6e-cd3a-9dee4e2ec345"); final MockFlowClassifier flowClassifier1 = new MockFlowClassifier(flowClassifierId1, tenantId1, "flowClassifier1", - "Mock flow classifier", "IPv4", "IP", 1001, 1500, - 5001, 6000, IpPrefix.valueOf("1.1.1.1/16"), + "Mock flow classifier", "IPv4", "IP", 10000, + 1001, 1500, 5001, 6000, + IpPrefix.valueOf("1.1.1.1/16"), IpPrefix.valueOf("22.12.34.45/16"), srcPortId1, dstPortId1); @@ -81,6 +82,7 @@ public class FlowClassifierResourceTest extends VtnResourceTest { private final String description; private final String etherType; private final String protocol; + private final int priority; private final int minSrcPortRange; private final int maxSrcPortRange; private final int minDstPortRange; @@ -91,15 +93,17 @@ public class FlowClassifierResourceTest extends VtnResourceTest { private final VirtualPortId dstPort; public MockFlowClassifier(FlowClassifierId flowClassifierId, TenantId tenantId, String name, - String description, String etherType, String protocol, int minSrcPortRange, - int maxSrcPortRange, int minDstPortRange, int maxDstPortRange, IpPrefix srcIpPrefix, - IpPrefix dstIpPrefix, VirtualPortId srcPort, VirtualPortId dstPort) { + String description, String etherType, String protocol, int priority, + int minSrcPortRange, int maxSrcPortRange, int minDstPortRange, int maxDstPortRange, + IpPrefix srcIpPrefix, IpPrefix dstIpPrefix, VirtualPortId srcPort, + VirtualPortId dstPort) { this.flowClassifierId = flowClassifierId; this.tenantId = tenantId; this.name = name; this.description = description; this.etherType = etherType; this.protocol = protocol; + this.priority = priority; this.minSrcPortRange = minSrcPortRange; this.maxSrcPortRange = maxSrcPortRange; this.minDstPortRange = minDstPortRange; @@ -141,6 +145,11 @@ public class FlowClassifierResourceTest extends VtnResourceTest { return protocol; } + @Override + public int priority() { + return priority; + } + @Override public int minSrcPortRange() { return minSrcPortRange; diff --git a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/web/FlowClassifierCodecTest.java b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/web/FlowClassifierCodecTest.java index 6daec8aa60..ea2861355f 100644 --- a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/web/FlowClassifierCodecTest.java +++ b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/web/FlowClassifierCodecTest.java @@ -89,6 +89,7 @@ public class FlowClassifierCodecTest { assertThat(flowClassifier.tenantId().toString(), is(tenantId.toString())); assertThat(flowClassifier.description(), is("flow classifier")); assertThat(flowClassifier.protocol(), is("tcp")); + assertThat(flowClassifier.priority(), is(65535)); assertThat(flowClassifier.minSrcPortRange(), is(22)); assertThat(flowClassifier.maxSrcPortRange(), is(4000)); assertThat(flowClassifier.minDstPortRange(), is(80)); diff --git a/apps/vtn/vtnweb/src/test/resources/org/onosproject/vtnweb/resources/post-FlowClassifier.json b/apps/vtn/vtnweb/src/test/resources/org/onosproject/vtnweb/resources/post-FlowClassifier.json index 6e72e8fd0e..5ed095defe 100644 --- a/apps/vtn/vtnweb/src/test/resources/org/onosproject/vtnweb/resources/post-FlowClassifier.json +++ b/apps/vtn/vtnweb/src/test/resources/org/onosproject/vtnweb/resources/post-FlowClassifier.json @@ -5,6 +5,7 @@ "description": "flow classifier", "ethertype": "IPv4", "protocol": "tcp", + "priority": 10000, "source_port_range_min": 22, "source_port_range_max": 4000, "destination_port_range_min": 80, "destination_port_range_max": 80, "source_ip_prefix": "1.1.1.1/16" , "destination_ip_prefix": "22.12.34.45/16", diff --git a/apps/vtn/vtnweb/src/test/resources/org/onosproject/vtnweb/web/flowClassifier.json b/apps/vtn/vtnweb/src/test/resources/org/onosproject/vtnweb/web/flowClassifier.json index 0fc0b74eed..3fd5ac9545 100644 --- a/apps/vtn/vtnweb/src/test/resources/org/onosproject/vtnweb/web/flowClassifier.json +++ b/apps/vtn/vtnweb/src/test/resources/org/onosproject/vtnweb/web/flowClassifier.json @@ -5,6 +5,7 @@ "description": "flow classifier", "ethertype": "IPv4", "protocol": "tcp", + "priority": 65535, "source_port_range_min": 22, "source_port_range_max": 4000, "destination_port_range_min": 80, "destination_port_range_max": 80, "source_ip_prefix": "1.1.1.1/16" , "destination_ip_prefix": "22.12.34.45/16"