Fix: resolve failure of E-W communication at ARP broadcast mode
Change-Id: I96b03a75f11a6904acd677fdf223f69e8a12b901
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 4e6054f..03700cf 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
@@ -618,17 +618,31 @@
switch (event.type()) {
case OPENSTACK_NODE_COMPLETE:
setDefaultArpRule(osNode, true);
- setAllArpRules(true);
+ setAllArpRules(osNode, true);
+ addAllSubnetGateways();
break;
case OPENSTACK_NODE_INCOMPLETE:
setDefaultArpRule(osNode, false);
- setAllArpRules(false);
+ setAllArpRules(osNode, false);
break;
default:
break;
}
}
+ private void addAllSubnetGateways() {
+ osNetworkService.networks().forEach(n -> {
+ if (n.getNetworkType() != NetworkType.FLAT) {
+ osNetworkService.subnets()
+ .stream()
+ .filter(s -> s.getNetworkId().equals(n.getId()))
+ .filter(s -> !Strings.isNullOrEmpty(s.getGateway()))
+ .filter(s -> !gateways.contains(s.getGateway()))
+ .forEach(OpenstackSwitchingArpHandler.this::addSubnetGateway);
+ }
+ });
+ }
+
private void setDefaultArpRule(OpenstackNode osNode, boolean install) {
switch (getArpMode()) {
case ARP_PROXY_MODE:
@@ -695,11 +709,13 @@
);
}
- private void setAllArpRules(boolean install) {
+ private void setAllArpRules(OpenstackNode osNode, boolean install) {
if (ARP_BROADCAST_MODE.equals(getArpMode())) {
- instancePortService.instancePorts().forEach(p -> {
- setArpRequestRule(p, install);
- setArpReplyRule(p, install);
+ instancePortService.instancePorts().stream()
+ .filter(p -> p.deviceId().equals(osNode.intgBridge()))
+ .forEach(p -> {
+ setArpRequestRule(p, install);
+ setArpReplyRule(p, install);
});
}
}