[ovs-dev] [patch v1 1/2] conntrack: Fix wasted work for ICMP NAT.
Darrell Ball
dlu998 at gmail.com
Tue Feb 26 00:01:31 UTC 2019
I sent a V2 for the series as I changed patch 1 slightly.
On Mon, Feb 25, 2019 at 3:36 PM Darrell Ball <dlu998 at gmail.com> wrote:
> ICMPv4 and ICMPv6 are not subject to port address translation (PAT),
> however, a loop increments a local variable unnecessarily for
> ephemeral ports, resulting in wasted work for ICMPv4 and ICMPv6 packets
> subject to NAT. Fix this by checking for PAT being enabled before
> incrementing the local port variable and bail out otherwise.
>
> Signed-off-by: Darrell Ball <dlu998 at gmail.com>
> ---
> lib/conntrack.c | 12 +++++-------
> 1 file changed, 5 insertions(+), 7 deletions(-)
>
> diff --git a/lib/conntrack.c b/lib/conntrack.c
> index 4028ba9..ecac584 100644
> --- a/lib/conntrack.c
> +++ b/lib/conntrack.c
> @@ -2179,6 +2179,8 @@ nat_select_range_tuple(struct conntrack *ct, const
> struct conn *conn,
> bool ephemeral_ports_tried = conn->nat_info->nat_action &
> NAT_ACTION_DST
> ? true : false;
> union ct_addr first_addr = ct_addr;
> + bool pat_enabled = conn->key.nw_proto != IPPROTO_ICMP &&
> + conn->key.nw_proto != IPPROTO_ICMPV6;
>
> while (true) {
> if (conn->nat_info->nat_action & NAT_ACTION_SRC) {
> @@ -2186,11 +2188,7 @@ nat_select_range_tuple(struct conntrack *ct, const
> struct conn *conn,
> } else {
> nat_conn->rev_key.src.addr = ct_addr;
> }
> -
> - if ((conn->key.nw_proto == IPPROTO_ICMP) ||
> - (conn->key.nw_proto == IPPROTO_ICMPV6)) {
> - all_ports_tried = true;
> - } else if (conn->nat_info->nat_action & NAT_ACTION_SRC) {
> + if (conn->nat_info->nat_action & NAT_ACTION_SRC) {
> nat_conn->rev_key.dst.port = htons(port);
> } else {
> nat_conn->rev_key.src.port = htons(port);
> @@ -2200,7 +2198,7 @@ nat_select_range_tuple(struct conntrack *ct, const
> struct conn *conn,
> ct->hash_basis);
> if (new_insert) {
> return true;
> - } else if (!all_ports_tried) {
> + } else if (pat_enabled && !all_ports_tried) {
> if (min_port == max_port) {
> all_ports_tried = true;
> } else if (port == max_port) {
> @@ -2222,7 +2220,7 @@ nat_select_range_tuple(struct conntrack *ct, const
> struct conn *conn,
> ct_addr = conn->nat_info->min_addr;
> }
> if (!memcmp(&ct_addr, &first_addr, sizeof ct_addr)) {
> - if (!ephemeral_ports_tried) {
> + if (pat_enabled && !ephemeral_ports_tried) {
> ephemeral_ports_tried = true;
> ct_addr = conn->nat_info->min_addr;
> first_addr = ct_addr;
> --
> 1.9.1
>
>
More information about the dev
mailing list