Sends GARP packet when floating ip is associated and the gateway node is changed.
Change-Id: I1bd9deb2574d97473ef9709321944116904aec8d
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
index a6ac229..14bc79c 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
@@ -28,6 +28,8 @@
import org.json.JSONException;
import org.json.JSONObject;
import org.onlab.osgi.DefaultServiceDirectory;
+import org.onlab.packet.ARP;
+import org.onlab.packet.Ethernet;
import org.onlab.packet.Ip4Address;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
@@ -561,6 +563,13 @@
return port != null ? port.number() : null;
}
+ /**
+ * Returns the kubevirt external network with specified router.
+ *
+ * @param networkService kubevirt network service
+ * @param router kubevirt router
+ * @return external network
+ */
public static KubevirtNetwork getExternalNetworkByRouter(KubevirtNetworkService networkService,
KubevirtRouter router) {
String networkId = router.external().values().stream().findAny().orElse(null);
@@ -570,4 +579,33 @@
return networkService.network(networkId);
}
+
+ public static Ethernet buildGarpPacket(MacAddress srcMac, IpAddress srcIp) {
+ if (srcMac == null || srcIp == null) {
+ return null;
+ }
+
+ Ethernet ethernet = new Ethernet();
+ ethernet.setDestinationMACAddress(MacAddress.BROADCAST);
+ ethernet.setSourceMACAddress(srcMac);
+ ethernet.setEtherType(Ethernet.TYPE_ARP);
+
+ ARP arp = new ARP();
+ arp.setOpCode(ARP.OP_REPLY);
+ arp.setProtocolType(ARP.PROTO_TYPE_IP);
+ arp.setHardwareType(ARP.HW_TYPE_ETHERNET);
+
+ arp.setProtocolAddressLength((byte) Ip4Address.BYTE_LENGTH);
+ arp.setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH);
+
+ arp.setSenderHardwareAddress(srcMac.toBytes());
+ arp.setTargetHardwareAddress(MacAddress.BROADCAST.toBytes());
+
+ arp.setSenderProtocolAddress(srcIp.toOctets());
+ arp.setTargetProtocolAddress(srcIp.toOctets());
+
+ ethernet.setPayload(arp);
+
+ return ethernet;
+ }
}