Phaneendra Manda
Committed by Gerrit Code Review

[ONOS-4228]Parase and set priority for sfc classification

Change-Id: I0e25465d47ad1bd6c6035ff309ef631b8ef7c75e
......@@ -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");
......
......@@ -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;
......@@ -117,6 +122,11 @@ public final class DefaultFlowClassifier implements FlowClassifier {
}
@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
......@@ -279,6 +295,13 @@ public final class DefaultFlowClassifier implements FlowClassifier {
}
@Override
public Builder setPriority(int priority) {
this.priority = priority;
this.isPrioritySet = true;
return this;
}
@Override
public Builder setMinSrcPortRange(int minSrcPortRange) {
this.minSrcPortRange = minSrcPortRange;
this.isMinSrcPortRangeSet = true;
......@@ -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)
......
......@@ -68,6 +68,13 @@ public interface FlowClassifier {
String protocol();
/**
* Returns priority.
*
* @return priority
*/
int priority();
/**
* Returns minimum source port range.
*
* @return minimum source port range
......@@ -193,6 +200,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.
*
* @param minRange minimum source port range
......
......@@ -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()));
......
......@@ -40,6 +40,7 @@ public final class FlowClassifierCodec extends JsonCodec<FlowClassifier> {
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<FlowClassifier> {
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<FlowClassifier> {
.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())
......
......@@ -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;
......@@ -142,6 +146,11 @@ public class FlowClassifierResourceTest extends VtnResourceTest {
}
@Override
public int priority() {
return priority;
}
@Override
public int minSrcPortRange() {
return minSrcPortRange;
}
......
......@@ -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));
......
......@@ -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",
......
......@@ -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"
......