diff mbox

[ovs-dev,v3] ovn: support ARP response for known IPs

Message ID 1448400230-12719-1-git-send-email-zhouhan@gmail.com
State Superseded
Headers show

Commit Message

Han Zhou Nov. 24, 2015, 9:23 p.m. UTC
For lswitch ports with known IPs, ARP is responded directly from
local ovn-controller to avoid flooding.

Signed-off-by: Han Zhou <zhouhan@gmail.com>
---

Notes:
    v1->v2: remove the extra arg of xasprintf()
    v2->v3: update ovn-northd.8.xml to describe the new flows

 ovn/northd/ovn-northd.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

Comments

Han Zhou Nov. 24, 2015, 9:32 p.m. UTC | #1
Sorry, please ignore this one because the v3 change was missing by format-patch.

On Tue, Nov 24, 2015 at 1:23 PM, Han Zhou <zhouhan@gmail.com> wrote:
> For lswitch ports with known IPs, ARP is responded directly from
> local ovn-controller to avoid flooding.
>
> Signed-off-by: Han Zhou <zhouhan@gmail.com>
> ---
>
> Notes:
>     v1->v2: remove the extra arg of xasprintf()
>     v2->v3: update ovn-northd.8.xml to describe the new flows
>
>  ovn/northd/ovn-northd.c | 38 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 38 insertions(+)
>
> diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
> index 8fe0c2c..ec13171 100644
> --- a/ovn/northd/ovn-northd.c
> +++ b/ovn/northd/ovn-northd.c
> @@ -1151,6 +1151,44 @@ build_lswitch_flows(struct hmap *datapaths, struct hmap *ports,
>          ds_destroy(&match);
>      }
>
> +    /* Ingress table 3: Destination lookup, ARP reply for known IPs.
> +     * (priority 150). */
> +    HMAP_FOR_EACH (op, key_node, ports) {
> +        if (!op->nbs) {
> +            continue;
> +        }
> +
> +        for (size_t i = 0; i < op->nbs->n_addresses; i++) {
> +            struct eth_addr ea;
> +            ovs_be32 ip;
> +
> +            if (ovs_scan(op->nbs->addresses[i],
> +                         ETH_ADDR_SCAN_FMT" "IP_SCAN_FMT,
> +                         ETH_ADDR_SCAN_ARGS(ea), IP_SCAN_ARGS(&ip))) {
> +                char *match = xasprintf(
> +                    "arp.tpa == "IP_FMT" && arp.op == 1", IP_ARGS(ip));
> +                char *actions = xasprintf(
> +                    "eth.dst = eth.src; "
> +                    "eth.src = "ETH_ADDR_FMT"; "
> +                    "arp.op = 2; /* ARP reply */ "
> +                    "arp.tha = arp.sha; "
> +                    "arp.sha = "ETH_ADDR_FMT"; "
> +                    "arp.tpa = arp.spa; "
> +                    "arp.spa = "IP_FMT"; "
> +                    "outport = inport; "
> +                    "inport = \"\"; /* Allow sending out inport. */ "
> +                    "output;",
> +                    ETH_ADDR_ARGS(ea),
> +                    ETH_ADDR_ARGS(ea),
> +                    IP_ARGS(ip));
> +                ovn_lflow_add(lflows, op->od, S_SWITCH_IN_L2_LKUP, 150,
> +                              match, actions);
> +                free(match);
> +                free(actions);
> +            }
> +        }
> +    }
> +
>      /* Ingress table 3: Destination lookup, broadcast and multicast handling
>       * (priority 100). */
>      HMAP_FOR_EACH (op, key_node, ports) {
> --
> 2.1.0
>
diff mbox

Patch

diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
index 8fe0c2c..ec13171 100644
--- a/ovn/northd/ovn-northd.c
+++ b/ovn/northd/ovn-northd.c
@@ -1151,6 +1151,44 @@  build_lswitch_flows(struct hmap *datapaths, struct hmap *ports,
         ds_destroy(&match);
     }
 
+    /* Ingress table 3: Destination lookup, ARP reply for known IPs.
+     * (priority 150). */
+    HMAP_FOR_EACH (op, key_node, ports) {
+        if (!op->nbs) {
+            continue;
+        }
+
+        for (size_t i = 0; i < op->nbs->n_addresses; i++) {
+            struct eth_addr ea;
+            ovs_be32 ip;
+
+            if (ovs_scan(op->nbs->addresses[i],
+                         ETH_ADDR_SCAN_FMT" "IP_SCAN_FMT,
+                         ETH_ADDR_SCAN_ARGS(ea), IP_SCAN_ARGS(&ip))) {
+                char *match = xasprintf(
+                    "arp.tpa == "IP_FMT" && arp.op == 1", IP_ARGS(ip));
+                char *actions = xasprintf(
+                    "eth.dst = eth.src; "
+                    "eth.src = "ETH_ADDR_FMT"; "
+                    "arp.op = 2; /* ARP reply */ "
+                    "arp.tha = arp.sha; "
+                    "arp.sha = "ETH_ADDR_FMT"; "
+                    "arp.tpa = arp.spa; "
+                    "arp.spa = "IP_FMT"; "
+                    "outport = inport; "
+                    "inport = \"\"; /* Allow sending out inport. */ "
+                    "output;",
+                    ETH_ADDR_ARGS(ea),
+                    ETH_ADDR_ARGS(ea),
+                    IP_ARGS(ip));
+                ovn_lflow_add(lflows, op->od, S_SWITCH_IN_L2_LKUP, 150,
+                              match, actions);
+                free(match);
+                free(actions);
+            }
+        }
+    }
+
     /* Ingress table 3: Destination lookup, broadcast and multicast handling
      * (priority 100). */
     HMAP_FOR_EACH (op, key_node, ports) {