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