[ovs-dev] [PATCH v4] ovn: Support for GARP for NAT IPs via localnet
Guru Shetty
guru at ovn.org
Sun Aug 14 00:46:13 UTC 2016
On 12 August 2016 at 12:28, Chandra S Vejendla <csvejend at us.ibm.com> wrote:
> In cases where a DNAT IP is moved to a new router or the SNAT IP is reused
> with a new mac address, the NAT IPs become unreachable because the external
> switches/routers have stale ARP entries. This commit
> aims to fix the problem by sending GARPs for NAT IPs via locanet
>
> A new options key "nat-addresses" is added to the logical switch port of
> type router. The value for the key "nat-addresses" is the MAC address of
> the
> port followed by a list of SNAT & DNAT IPs.
>
> Signed-off-by: Chandra Sekhar Vejendla <csvejend at us.ibm.com>
> Acked-by: Ryan Moats <rmoats at us.ibm.com>
>
Thanks, it took me a while to wrap my head around the design, so thanks for
the help over the IRC.
This patch actually does 2 things.
1. Adds localnet support for l3gateway
2. Adds support for GARP for NAT addresses.
You should ideally have split this into 2 patches.
For the first part (localnet support), please expand on the commit message
to make it easy to understand. That way, when someone 'git annotate's a few
months down the line and finds this commit, they understand why whats being
done.
In the larger picture, why are we doing this on a switch's port? Can you
explain the rationale behind it (in the commit message)? We could have done
the same thing as you are doing on the router's port itself, isn't it?
.......snip......
-bool extract_lsp_addresses(char *address, struct lport_addresses *);
>
+bool extract_lsp_addresses(const char *address, struct lport_addresses *);
> bool extract_lrp_networks(const struct nbrec_logical_router_port *,
> struct lport_addresses *);
> void destroy_lport_addresses(struct lport_addresses *);
> diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
> index 861f872..61a9705 100644
> --- a/ovn/northd/ovn-northd.c
> +++ b/ovn/northd/ovn-northd.c
> @@ -1186,6 +1186,20 @@ ovn_port_update_sbrec(const struct ovn_port *op)
> if (chassis) {
> smap_add(&new, "l3gateway-chassis", chassis);
> }
> +
> + const char *nat_addresses = smap_get(&op->nbsp->options,
> + "nat-addresses");
> + if (nat_addresses) {
> + struct lport_addresses laddrs;
> + if (!extract_lsp_addresses(nat_addresses, &laddrs)) {
>
The above creates a memory leak. I do not see a corresponding destroy_lport_
addresses()
> + static struct vlog_rate_limit rl =
> + VLOG_RATE_LIMIT_INIT(1, 1);
> + VLOG_WARN_RL(&rl, "Error extracting nat-addresses.");
> + }
> + else {
>
The else condition needs to move up one line (CodingStyle violation).
> + smap_add(&new, "nat-addresses", nat_addresses);
> + }
> + }
> sbrec_port_binding_set_options(op->sb, &new);
> smap_destroy(&new);
> }
> diff --git a/ovn/ovn-nb.xml b/ovn/ovn-nb.xml
> index 4ce295a..3fd8690 100644
> --- a/ovn/ovn-nb.xml
> +++ b/ovn/ovn-nb.xml
> @@ -225,6 +225,16 @@
> table="Logical_Router_Port"/> to which this logical switch port
> is
> connected.
> </column>
> +
> + <column name="options" key="nat-addresses">
> + MAC address of the <code>router-port</code> followed by a list
> of
> + SNAT and DNAT IP adddresses. This is used to send gratuitous
> ARPs for
>
s/adddresses/addresses
> + SNAT and DNAT IP addresses via <code>localnet</code> and is
> valid for
> + only L3 gateway ports. Example: <code>80:fa:5b:06:72:b7
> 158.36.44.22
> + 158.36.44.24</code>. This would result in generation of
> gratuitous
> + ARPs for IP addresses 158.36.44.22 and 158.36.44.24 with a MAC
> + address of 80:fa:5b:06:72:b7.
> + </column>
> </group>
>
> <group title="Options for localnet ports">
> diff --git a/ovn/ovn-sb.xml b/ovn/ovn-sb.xml
> index 13c9526..a65abbe 100644
> --- a/ovn/ovn-sb.xml
> +++ b/ovn/ovn-sb.xml
> @@ -1650,6 +1650,16 @@ tcp.flags = RST;
> <column name="options" key="l3gateway-chassis">
> The <code>chassis</code> in which the port resides.
> </column>
> +
> + <column name="options" key="nat-addresses">
> + MAC address of the <code>l3gateway</code> port followed by a
> list of
> + SNAT and DNAT IP adddresses. This is used to send gratuitous
> ARPs for
>
s/adddresses/addresses
> + SNAT and DNAT IP addresses via <code>localnet</code> and is
> valid for
> + only L3 gateway ports. Example: <code>80:fa:5b:06:72:b7
> 158.36.44.22
> + 158.36.44.24</code>. This would result in generation of
> gratuitous
> + ARPs for IP addresses 158.36.44.22 and 158.36.44.24 with a MAC
> + address of 80:fa:5b:06:72:b7.
> + </column>
> </group>
>
>
More information about the dev
mailing list