Hi, Guru.

> +        /* 'REGBIT_CONNTRACK_DEFRAG' is set to let the pre-stateful table
> send
> +         * packet to conntrack for defragmentation. */

+        const char *ip_address;
> +        SSET_FOR_EACH(ip_address, &all_ips) {
> +            char *match = xasprintf("ip && ip4.dst == %s", ip_address);
> +            ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_LB,
> +                          100, match, REGBIT_CONNTRACK_DEFRAG" = 1;
> next;");
> +            free(match);
> +        }
>

For ls_in_pre_lb table, you add a same action from ls_in_pre_acl table.
Indeed, there will be lflows, such as:
table=3(   ls_in_pre_acl), priority=  100, match=(ip), action=(reg0[0] = 1;
next;) [1]
table=4(    ls_in_pre_lb), priority=  100, match=(ip && ip4.dst ==
30.0.0.1), action=(reg0[0] = 1; next;) [2]

I know it will be flexible to have different tables for different purpose,
but they are too close enough.
And for me, the only different is "&& ip4.dst == ENDPOINT_IP".

What's more, it's easily to have a allow-related ACL rules for traffic
whose initiater is VM/container. By that, in the most common case, we will
have rule [1] in table ls_in_pre_acl. If so, rule [2] in table ls_in_pre_lb
seems duplicated, and rules in table ls_out_pre_lb are duplicated to ones
in table ls_out_pre_acl.

So the only case to make pre_lb tables are necessary is, logical switch
doesn't contain an "allow-related" action ACL rule. It seems possible, but
I cannot figure out why people choose to not using "allow-related" action,
that will make ACL table hard to maintain.

+
> +        sset_destroy(&all_ips);
> +
> +        if (vip_configured) {
> +            ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_LB,
> +                          100, "ip", REGBIT_CONNTRACK_DEFRAG" = 1;
> next;");
> +        }
> +    }
> +}





> +    if (od->nbs->load_balancer) {
> +        struct nbrec_load_balancer *lb = od->nbs->load_balancer;
> +        struct smap *vips = &lb->vips;
> +        struct smap_node *node;
> +
> +        SMAP_FOR_EACH (node, vips) {
> +            uint16_t port = 0;
> +
> +            /* node->key contains IP:port or just IP. */
> +            char *ip_address = NULL;
> +            ip_address_and_port_from_lb_key(node->key, &ip_address,
> &port);
> +            if (!ip_address) {
> +                continue;
> +            }
> +
> +            /* New connections in Ingress table. */
> +            char *action = xasprintf("ct_lb(\"%s\");", node->value);
> +            struct ds match = DS_EMPTY_INITIALIZER;
> +            ds_put_format(&match, "ct.new && ip && ip4.dst == %s",
> ip_address);
> +            if (port) {
> +                if (lb->protocol && !strcmp(lb->protocol, "udp")) {
> +                    ds_put_format(&match, "&& udp && udp.dst == %d",
> port);
> +                } else {
> +                    ds_put_format(&match, "&& tcp && tcp.dst == %d",
> port);
> +                }
> +                ovn_lflow_add(lflows, od, S_SWITCH_IN_LB,
> +                              120, ds_cstr(&match), action);
> +            } else {
> +                ovn_lflow_add(lflows, od, S_SWITCH_IN_LB,
> +                              110, ds_cstr(&match), action);
> +            }
>

S_SWITCH_IN_LB, I think you missed to put them into method build_lb.


> +
> +            ds_destroy(&match);
> +            free(action);
> +       }
> +    }
>  }
>
>
Thanks.
Zong Kai, LI
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to