Automated Rpd bug fix for Src ip and mac not being populated
Change-Id: Ia5d55eb270b78e1d0a31095b2fac5c0317594600
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
index 7f935dc..ea230a4 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
@@ -50,6 +50,7 @@
import org.onlab.packet.IpPrefix;
import org.onlab.packet.UDP;
import org.onlab.packet.VlanId;
+
import org.onlab.packet.ndp.NeighborSolicitation;
import org.onlab.util.Tools;
import org.onosproject.cfg.ComponentConfigService;
@@ -67,6 +68,7 @@
import org.onosproject.dhcprelay.store.DhcpRecord;
import org.onosproject.dhcprelay.store.DhcpRelayStore;
import org.onosproject.dhcprelay.store.DhcpFpmPrefixStore;
+import org.onosproject.mastership.MastershipService;
import org.onosproject.routing.fpm.api.FpmRecord;
import org.onosproject.net.Device;
import org.onosproject.net.Host;
@@ -179,6 +181,9 @@
protected NetworkConfigRegistry cfgService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected MastershipService mastershipService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected CoreService coreService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -691,6 +696,10 @@
}
private void portUpdatedEventHandler(Device device, Port port) {
+ if (!mastershipService.isLocalMaster(device.id())) {
+ log.warn("This instance is not the master for the device {}", device.id());
+ return;
+ }
if (hostAutoRelearnEnabledDevices.contains(device.id()) && port.isEnabled()) {
ConnectPoint cp = new ConnectPoint(device.id(), port.number());
HostLocation hostLocation = new HostLocation(cp, 0);
@@ -702,8 +711,8 @@
for (DhcpRecord i : records) {
//found a dhcprecord matching the connect point of the port event
- log.debug("portUpdatedEventHandler : DHCP record {}, sending message on CP {} Mac {} Vlan{}",
- i, cp, i.macAddress(), i.vlanId());
+ log.debug("portUpdatedEventHandler:DHCP record {}, sending msg on CP {} Mac {} Vlan{} DeviceId {}",
+ i, cp, i.macAddress(), i.vlanId(), device.id());
if (i.ip4Address().isPresent()) {
log.warn("Sending host relearn probe for v4 not supported for Mac {} Vlan{} ip {}",
i.macAddress(), i.vlanId(), i.ip4Address());
@@ -750,7 +759,6 @@
VlanId vlanId;
Ip6Address ipv6Address;
ConnectPoint connectPoint;
-
PktTransmitter(MacAddress mac, VlanId vlanId, Ip6Address ipv6Address, ConnectPoint connectPoint) {
this.mac = mac;
this.vlanId = vlanId;
@@ -766,16 +774,23 @@
return;
}
- byte[] senderMacAddress = new byte[MacAddress.MAC_ADDRESS_LENGTH];
- byte[] senderIpAddress = new byte[Ip6Address.BYTE_LENGTH];
+ Interface senderInterface = interfaceService.getInterfacesByPort(connectPoint)
+ .stream().filter(iface -> Dhcp6HandlerUtil.interfaceContainsVlan(iface, vlanId))
+ .findFirst().orElse(null);
+ if (senderInterface == null) {
+ log.warn("Cannot get sender interface for from packet, abort... vlan {}", vlanId.toString());
+ }
+ MacAddress senderMacAddress = senderInterface.mac();
+ byte[] senderIpAddress = IPv6.getLinkLocalAddress(senderMacAddress.toBytes());
+ byte[] destIp = IPv6.getSolicitNodeAddress(ipv6Address.toOctets());
+
Ethernet ethernet = NeighborSolicitation.buildNdpSolicit(
this.ipv6Address,
Ip6Address.valueOf(senderIpAddress),
- this.ipv6Address, //destip
- MacAddress.valueOf(senderMacAddress),
+ Ip6Address.valueOf(destIp), //destip
+ senderMacAddress,
this.mac,
this.vlanId);
-
sendHostRelearnProbeToConnectPoint(ethernet, connectPoint);
log.debug("Host Relearn Probe transmission completed.");