[ovs-dev] [PATCH V1 1/1] Support for Flooding ARP Probes in Provider Network

Gangadhar Vegesana grvegesa at us.ibm.com
Thu Apr 7 18:43:11 UTC 2016


Clients that supports RFC 5227, probes the the newly received IP address
from DHCP server. These probes should be received by all the VM's on
the provider network(localnet). I added any entry in ARP response table
to do that broadcast with higher priority value than that of ARP response
entries. The ARP probe packets with src=0.0.0.0 should not be dropped.
As of now there is check in ARP spoofing table to drop these packets.
Added another check to allow these packets

Signed-off-by:  Gangadhar Vegesana <grvegesa at us.ibm.com>

---
 ovn/northd/ovn-northd.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
index 4b1d611..5805f8b 100644
--- a/ovn/northd/ovn-northd.c
+++ b/ovn/northd/ovn-northd.c
@@ -1179,7 +1179,7 @@ build_port_security_nd(struct ovn_port *op, struct hmap *lflows)
             if (ps.n_ipv4_addrs) {
                 ds_put_cstr(&match, " && (");
                 for (size_t i = 0; i < ps.n_ipv4_addrs; i++) {
-                    ds_put_format(&match, "arp.spa == "IP_FMT" || ",
+                    ds_put_format(&match, "arp.spa == {"IP_FMT",0.0.0.0}",
                                   IP_ARGS(ps.ipv4_addrs[i].addr));
                 }
                 ds_chomp(&match, ' ');
@@ -1471,6 +1471,17 @@ build_acls(struct ovn_datapath *od, struct hmap *lflows, struct hmap *ports)
         }
     }
 }
+static bool
+is_port_on_localnet(struct ovn_datapath *od)
+{
+    for (size_t i = 0; i < od->nbs->n_ports; i++) {
+        struct nbrec_logical_port *port = od->nbs->ports[i];
+        if (!strcmp(port->type, "localnet")) {
+            return true;
+        }
+    }
+    return false;
+}
 
 static void
 build_lswitch_flows(struct hmap *datapaths, struct hmap *ports,
@@ -1583,6 +1594,14 @@ build_lswitch_flows(struct hmap *datapaths, struct hmap *ports,
             continue;
         }
 
+        if (op->od && is_port_on_localnet(op->od)) {
+            /* This entry is for ARP Probe, where SRC IP = 0.0.0.0
+             * (priority 60) */
+            char* match = xasprintf( "arp.op == 1 && arp.spa == 0");
+            ovn_lflow_add(lflows, op->od, S_SWITCH_IN_ARP_RSP, 60,
+                    match, "next;");
+            free(match);
+        }
         for (size_t i = 0; i < op->nbs->n_addresses; i++) {
             struct lport_addresses laddrs;
             if (!extract_lport_addresses(op->nbs->addresses[i], &laddrs,
-- 
2.6.3




More information about the dev mailing list