Fixes ARP-related flow rules in VLAN case.
Change-Id: I1103ab8984789e62136f0e4c079f6532875ce660
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
index a2d0013..06265bd 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
@@ -22,6 +22,7 @@
import org.onlab.packet.Ip4Address;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
import org.onlab.util.Tools;
import org.onosproject.cfg.ComponentConfigService;
import org.onosproject.cfg.ConfigProperty;
@@ -315,26 +316,32 @@
return;
}
- TrafficSelector selector = DefaultTrafficSelector.builder()
- .matchEthType(EthType.EtherType.ARP.ethType().toShort())
- .matchArpOp(ARP.OP_REQUEST)
- .matchArpTpa(Ip4Address.valueOf(gateway))
- .build();
+ TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+ TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
- TrafficTreatment treatment = DefaultTrafficTreatment.builder()
- .setArpOp(ARP.OP_REPLY)
+ NetworkType type = NetworkType.valueOf(osNetworkService.networkType(osSubnet.getNetworkId()));
+
+ if (type.equals(NetworkType.VLAN)) {
+ sBuilder.matchVlanId(VlanId.vlanId(osNetworkService.segmentId(osSubnet.getNetworkId())));
+ tBuilder.popVlan();
+ }
+
+ sBuilder.matchEthType(EthType.EtherType.ARP.ethType().toShort())
+ .matchArpOp(ARP.OP_REQUEST)
+ .matchArpTpa(Ip4Address.valueOf(gateway));
+
+ tBuilder.setArpOp(ARP.OP_REPLY)
.setArpSha(MacAddress.valueOf(gatewayMac))
.setArpSpa(Ip4Address.valueOf(gateway))
- .setOutput(PortNumber.IN_PORT)
- .build();
+ .setOutput(PortNumber.IN_PORT);
if (osNode == null) {
osNodeService.completeNodes(COMPUTE).forEach(n ->
osFlowRuleService.setRule(
appId,
n.intgBridge(),
- selector,
- treatment,
+ sBuilder.build(),
+ tBuilder.build(),
PRIORITY_ARP_GATEWAY_RULE,
ARP_TABLE,
install
@@ -344,8 +351,8 @@
osFlowRuleService.setRule(
appId,
osNode.intgBridge(),
- selector,
- treatment,
+ sBuilder.build(),
+ tBuilder.build(),
PRIORITY_ARP_GATEWAY_RULE,
ARP_TABLE,
install
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
index 14fd5da..196c07d 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
@@ -540,17 +540,21 @@
.matchInPort(instPort.portNumber())
.build();
- TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+ TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
.pushVlan()
- .setVlanId(getVlanId(instPort))
- .transition(ACL_TABLE)
- .build();
+ .setVlanId(getVlanId(instPort));
+
+ if (ethType == Ethernet.TYPE_ARP) {
+ tBuilder.transition(ARP_TABLE);
+ } else if (ethType == Ethernet.TYPE_IPV4) {
+ tBuilder.transition(ACL_TABLE);
+ }
osFlowRuleService.setRule(
appId,
instPort.deviceId(),
selector,
- treatment,
+ tBuilder.build(),
PRIORITY_TUNNEL_TAG_RULE,
VTAG_TABLE,
install);