Do not add match field, if the src/dst IP Prefix is 0.0.0.0/0
Change-Id: I22345c24111178d07f19a05946b30013ed81ab49
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
index 5d116da..8d9955f 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
@@ -92,7 +92,7 @@
vTapCriterionBuilder.srcIpPrefix(IpPrefix.valueOf(srcIp));
vTapCriterionBuilder.dstIpPrefix(IpPrefix.valueOf(dstIp));
} catch (Exception e) {
- print("Inputted valid source IP & destination IP in CIDR (e.g., \"10.1.0.0/16\")");
+ print("Inputted valid source IP & destination IP in CIDR (e.g., \"10.1.0.4/32\")");
return false;
}
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
index a789e43..1e9d7c9 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
@@ -177,6 +177,10 @@
private static final int FLAT_OUTBOUND_NEXT_TABLE = FLAT_TABLE;
private static final int OUTBOUND_NEXT_TABLE = FORWARDING_TABLE;
+ private static final IpPrefix ARBITRARY_IP_PREFIX =
+ IpPrefix.valueOf(IpAddress.valueOf("0.0.0.0"), 0);
+ private static final String TABLE_PROPERTY_KEY = "table";
+
private final DeviceListener deviceListener = new InternalDeviceListener();
private final HostListener hostListener = new InternalHostListener();
private final OpenstackNodeListener osNodeListener = new InternalOpenstackNodeListener();
@@ -250,20 +254,19 @@
}
@Override
- public OpenstackVtap createVtap(Type type,
- OpenstackVtapCriterion vTapCriterionOpenstack) {
- checkNotNull(vTapCriterionOpenstack, VTAP_DESC_NULL);
+ public OpenstackVtap createVtap(Type type, OpenstackVtapCriterion vTapCriterion) {
+ checkNotNull(vTapCriterion, VTAP_DESC_NULL);
Set<DeviceId> txDevices = type.isValid(Type.VTAP_TX) ?
- getEdgeDevice(type, vTapCriterionOpenstack) : ImmutableSet.of();
+ getEdgeDevice(type, vTapCriterion) : ImmutableSet.of();
Set<DeviceId> rxDevices = type.isValid(Type.VTAP_RX) ?
- getEdgeDevice(type, vTapCriterionOpenstack) : ImmutableSet.of();
+ getEdgeDevice(type, vTapCriterion) : ImmutableSet.of();
OpenstackVtap description =
DefaultOpenstackVtap.builder()
.id(OpenstackVtapId.vTapId())
.type(type)
- .vTapCriterion(vTapCriterionOpenstack)
+ .vTapCriterion(vTapCriterion)
.txDeviceIds(txDevices)
.rxDeviceIds(rxDevices)
.build();
@@ -540,40 +543,47 @@
}
private void connectTables(DeviceId deviceId, int fromTable, int toTable, int toGroup,
- OpenstackVtapCriterion vTapCriterionOpenstack, int rulePriority,
+ OpenstackVtapCriterion vTapCriterion, int rulePriority,
boolean install) {
log.trace("Table Transition: table[{}] -> table[{}] or group[{}]", fromTable, toTable, toGroup);
TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder()
- .matchEthType(TYPE_IPV4)
- .matchIPSrc(vTapCriterionOpenstack.srcIpPrefix())
- .matchIPDst(vTapCriterionOpenstack.dstIpPrefix());
+ .matchEthType(TYPE_IPV4);
- switch (vTapCriterionOpenstack.ipProtocol()) {
+ // if the IpPrefix is "0.0.0.0/0", we do not include such a match into the flow rule
+ if (!vTapCriterion.srcIpPrefix().equals(ARBITRARY_IP_PREFIX)) {
+ selectorBuilder.matchIPSrc(vTapCriterion.srcIpPrefix());
+ }
+
+ if (!vTapCriterion.dstIpPrefix().equals(ARBITRARY_IP_PREFIX)) {
+ selectorBuilder.matchIPDst(vTapCriterion.dstIpPrefix());
+ }
+
+ switch (vTapCriterion.ipProtocol()) {
case PROTOCOL_TCP:
- selectorBuilder.matchIPProtocol(vTapCriterionOpenstack.ipProtocol());
+ selectorBuilder.matchIPProtocol(vTapCriterion.ipProtocol());
// Add port match only if the port number is greater than zero
- if (vTapCriterionOpenstack.srcTpPort().toInt() > 0) {
- selectorBuilder.matchTcpSrc(vTapCriterionOpenstack.srcTpPort());
+ if (vTapCriterion.srcTpPort().toInt() > 0) {
+ selectorBuilder.matchTcpSrc(vTapCriterion.srcTpPort());
}
- if (vTapCriterionOpenstack.dstTpPort().toInt() > 0) {
- selectorBuilder.matchTcpDst(vTapCriterionOpenstack.dstTpPort());
+ if (vTapCriterion.dstTpPort().toInt() > 0) {
+ selectorBuilder.matchTcpDst(vTapCriterion.dstTpPort());
}
break;
case PROTOCOL_UDP:
- selectorBuilder.matchIPProtocol(vTapCriterionOpenstack.ipProtocol());
+ selectorBuilder.matchIPProtocol(vTapCriterion.ipProtocol());
// Add port match only if the port number is greater than zero
- if (vTapCriterionOpenstack.srcTpPort().toInt() > 0) {
- selectorBuilder.matchUdpSrc(vTapCriterionOpenstack.srcTpPort());
+ if (vTapCriterion.srcTpPort().toInt() > 0) {
+ selectorBuilder.matchUdpSrc(vTapCriterion.srcTpPort());
}
- if (vTapCriterionOpenstack.dstTpPort().toInt() > 0) {
- selectorBuilder.matchUdpDst(vTapCriterionOpenstack.dstTpPort());
+ if (vTapCriterion.dstTpPort().toInt() > 0) {
+ selectorBuilder.matchUdpDst(vTapCriterion.dstTpPort());
}
break;
case PROTOCOL_ICMP:
- selectorBuilder.matchIPProtocol(vTapCriterionOpenstack.ipProtocol());
+ selectorBuilder.matchIPProtocol(vTapCriterion.ipProtocol());
break;
default:
break;
@@ -640,7 +650,7 @@
resolver.getExtensionInstruction(NICIRA_RESUBMIT_TABLE.type());
try {
- extensionInstruction.setPropertyValue("table", ((short) tableId));
+ extensionInstruction.setPropertyValue(TABLE_PROPERTY_KEY, ((short) tableId));
} catch (Exception e) {
log.error("Failed to set extension treatment for resubmit table {}", id);
}
@@ -683,12 +693,12 @@
flowRuleService.apply(flowOpsBuilder.build(new FlowRuleOperationsContext() {
@Override
public void onSuccess(FlowRuleOperations ops) {
- log.trace("Installed flow rules for tapping");
+ log.debug("Installed flow rules for tapping");
}
@Override
public void onError(FlowRuleOperations ops) {
- log.error("Failed to install flow rules for tapping");
+ log.debug("Failed to install flow rules for tapping");
}
}));
}