private Map<String, String> networkIdToRouterMacCache;
private Map<String, NeutronRouter_Interface> subnetIdToRouterInterfaceCache;
private Boolean enabled = false;
+ private Boolean flgDistributedARPEnabled = true;
private Southbound southbound;
public NeutronL3Adapter() {
this.defaultRouteCache = new HashSet<>();
this.networkIdToRouterMacCache = new HashMap<>();
this.subnetIdToRouterInterfaceCache = new HashMap<>();
-
this.enabled = true;
logger.info("OVSDB L3 forwarding is enabled");
+ if (configurationService.isDistributedArpDisabled()) {
+ this.flgDistributedARPEnabled = false;
+ logger.info("Distributed ARP responder is disabled");
+ } else {
+ logger.debug("Distributed ARP responder is enabled");
+ }
} else {
logger.debug("OVSDB L3 forwarding is disabled");
}
programL3ForwardingStage1(node, dpid, providerSegmentationId, tenantMac, tenantIpStr, action);
// Configure distributed ARP responder. Only needed if tenant network exists in node.
- programStaticArpStage1(node, dpid, providerSegmentationId, tenantMac, tenantIpStr,
+ if (true == flgDistributedARPEnabled) {
+ programStaticArpStage1(node, dpid, providerSegmentationId, tenantMac, tenantIpStr,
tenantNetworkPresentInNode ? action : Action.DELETE);
+ }
}
}
}
true /*isReflexsive*/);
}
- programStaticArpStage1(node, dpid, destinationSegmentationId, macAddress, ipStr, actionForNode);
+ // Enable ARP responder by default, because router interface needs to be responded always.
+ programStaticArpStage1(node, dpid, destinationSegmentationId, macAddress, ipStr, actionForNode);
}
// Compute action to be programmed. In the case of rewrite exclusions, we must never program rules
programIpRewriteStage1(node, dpid, providerSegmentationId, false /* isInboubd */,
fixedIPAddress, floatingIpAddress, actionForNode);
- // Respond to arps for the floating ip address
- //
+ // Respond to ARPs for the floating ip address by default
programStaticArpStage1(node, dpid, providerSegmentationId, routerMacAddress, floatingIpAddress,
actionForNode);
}