On Mon, Jul 19, 2021 at 1:14 PM Ihar Hrachyshka <[email protected]> wrote:
>
> This allows L3+ ACLs to match against double tagged vlan traffic on
> vlan-passthru switches.
>
> The default in OVS is vlan-limit=1 for backwards compatibility. This
> means packets are not "parsed" deeper than one tag level.
>
> This patch sets it to 0, which means "parse as deep as OVS supports".
> Right now it's effectively the same as setting it to "2", which is the
> maximum number of tag levels that OVS supports right now.
>
> It is already set to 2 in puppet-vswitch that is used in some OpenStack
> distributions:
>
> https://opendev.org/openstack/puppet-vswitch/commit/14011d69c18e628a3466fa71db25cefb7adff425
>
> Signed-off-by: Ihar Hrachyshka <[email protected]>
>
> ---
>
> v1: initial version
> v2: set vlan-limit=0 only if it's not no-op
> ---
>  controller/ovn-controller.c | 13 ++++++
>  tests/ovn.at                | 91 +++++++++++++++++++++++++++++++++++++
>  2 files changed, 104 insertions(+)
>
> diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
> index 2418c301b..845c183a6 100644
> --- a/controller/ovn-controller.c
> +++ b/controller/ovn-controller.c
> @@ -915,6 +915,7 @@ ctrl_register_ovs_idl(struct ovsdb_idl *ovs_idl)
>       * their interest explicitly. */
>      ovsdb_idl_add_table(ovs_idl, &ovsrec_table_open_vswitch);
>      ovsdb_idl_add_column(ovs_idl, &ovsrec_open_vswitch_col_external_ids);
> +    ovsdb_idl_add_column(ovs_idl, &ovsrec_open_vswitch_col_other_config);
>      ovsdb_idl_add_column(ovs_idl, &ovsrec_open_vswitch_col_bridges);
>      ovsdb_idl_add_column(ovs_idl, &ovsrec_open_vswitch_col_datapaths);
>      ovsdb_idl_add_table(ovs_idl, &ovsrec_table_interface);
> @@ -3190,6 +3191,18 @@ main(int argc, char *argv[])
>          process_br_int(ovs_idl_txn, bridge_table, ovs_table,
>                         &br_int, &br_int_dp);
>
> +        /* Enable ACL matching for double tagged traffic. */
> +        if (ovs_idl_txn) {
> +            const struct ovsrec_open_vswitch *cfg =
> +                ovsrec_open_vswitch_table_first(ovs_table);
> +            const char *vlan_limit = smap_get_def(
> +                &cfg->other_config, "vlan-limit", "-1");
> +            if (strcmp(vlan_limit, "0")) {
> +                ovsrec_open_vswitch_update_other_config_setkey(
> +                    cfg, "vlan-limit", "0");
> +            }
> +        }

Thanks for the patch.  I think using smap_get_int() would be better here.

So I modified your patch with the below changes and applied to the main branch.

Also added a couple of test checks to make sure that ovn-controller
resets the vlan-limit
to 0.


-------------------------------------------------------------
diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index ba6b519d78..3a9bdbc974 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -3209,9 +3209,9 @@ main(int argc, char *argv[])
         if (ovs_idl_txn) {
             const struct ovsrec_open_vswitch *cfg =
                 ovsrec_open_vswitch_table_first(ovs_table);
-            const char *vlan_limit = smap_get_def(
-                &cfg->other_config, "vlan-limit", "-1");
-            if (strcmp(vlan_limit, "0")) {
+            int vlan_limit = smap_get_int(
+                &cfg->other_config, "vlan-limit", -1);
+            if (vlan_limit != 0) {
                 ovsrec_open_vswitch_update_other_config_setkey(
                     cfg, "vlan-limit", "0");
             }
diff --git a/tests/ovn.at b/tests/ovn.at
index b72ed29319..09802aecd8 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -1917,6 +1917,12 @@ ovn_attach n br-phys 192.168.0.1

 OVS_WAIT_UNTIL([test x`ovs-vsctl get Open_vSwitch .
other_config:vlan-limit | tr -d '""'` = x0])

+check ovs-vsctl set Open_vSwitch . other_config:vlan-limit=100
+OVS_WAIT_UNTIL([test x`ovs-vsctl get Open_vSwitch .
other_config:vlan-limit | tr -d '""'` = x0])
+
+check ovs-vsctl set Open_vSwitch . other_config:vlan-limit=foo
+OVS_WAIT_UNTIL([test x`ovs-vsctl get Open_vSwitch .
other_config:vlan-limit | tr -d '""'` = x0])
+
 AT_CLEANUP
 ])

--------------------------------------------


Thanks
Numan

> +
>          if (ovsdb_idl_has_ever_connected(ovnsb_idl_loop.idl) &&
>              northd_version_match) {
>
> diff --git a/tests/ovn.at b/tests/ovn.at
> index 93e1a0267..5f2738b58 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -1907,6 +1907,97 @@ AT_CLEANUP
>
>  AT_BANNER([OVN end-to-end tests])
>
> +OVN_FOR_EACH_NORTHD([
> +AT_SETUP([ovn -- enables vlan-limit=0])
> +ovn_start
> +
> +net_add n
> +check ovs-vsctl add-br br-phys
> +ovn_attach n br-phys 192.168.0.1
> +
> +OVS_WAIT_UNTIL([test x`ovs-vsctl get Open_vSwitch . other_config:vlan-limit 
> | tr -d '""'` = x0])
> +
> +AT_CLEANUP
> +])
> +
> +OVN_FOR_EACH_NORTHD([
> +AT_SETUP([ovn -- allows ACLs to match against vlan-transparent double tagged 
> traffic L3 fields])
> +ovn_start
> +
> +for i in 1 2; do
> +    check ovn-nbctl ls-add lsw$i
> +    check ovn-nbctl --wait=sb add Logical-Switch lsw$i other_config 
> vlan-passthru=true
> +
> +    ln_port_name=ln-$i
> +    check ovn-nbctl lsp-add lsw$i $ln_port_name
> +    check ovn-nbctl lsp-set-addresses $ln_port_name unknown
> +    check ovn-nbctl lsp-set-type $ln_port_name localnet
> +    check ovn-nbctl lsp-set-options $ln_port_name network_name=phys
> +    net_add n
> +done
> +
> +# two hypervisors, each connected to the same network
> +for i in 1 2; do
> +    sim_add hv-$i
> +    as hv-$i
> +    ovs-vsctl add-br br-phys
> +    ovs-vsctl set open . external-ids:ovn-bridge-mappings=phys:br-phys
> +    ovn_attach n br-phys 192.168.0.$i
> +done
> +
> +check ovs-vsctl add-port br-phys tap
> +for i in 1 2; do
> +    as hv-$i
> +    check ovs-vsctl add-port br-int vif$i -- set Interface vif$i \
> +        external-ids:iface-id=lp$i options:tx_pcap=vif$i-tx.pcap 
> options:rxq_pcap=vif$i-rx.pcap
> +    check ovn-nbctl lsp-add lsw$i lp$i
> +    check ovn-nbctl lsp-set-addresses lp$i "f0:00:00:00:00:0$i 10.0.0.$i"
> +done
> +for i in 1 2; do
> +    OVS_WAIT_UNTIL([test x`ovn-nbctl lsp-get-up lp$i` = xup])
> +    > $i.expected
> +done
> +
> +test_tcp_packet() {
> +    local inport=$1 eth_dst=$2 eth_src=$3 ip_dst=$4 ip_src=$5 eout=$6 
> lout=$7 fail=$8
> +    tag=810000ff
> +    local 
> packet=${eth_dst}${eth_src}${tag}${tag}08004500002800004000ff060000${ip_src}${ip_dst}0001000100000001000000005000ffff00000000
> +    as hv-$inport ovs-appctl netdev-dummy/receive vif$inport $packet
> +    if [[ $fail -eq 0 ]]; then
> +        echo $packet >> ${eout#lp}.expected
> +    fi
> +}
> +
> +# first check that acl drop rule works for tagged traffic
> +for i in 1 2; do
> +    check ovn-nbctl acl-add lsw$i to-lport 1000 'tcp' drop
> +done
> +check ovn-nbctl --wait=hv sync
> +
> +test_tcp_packet 1 f00000000002 f00000000001 0a000002 0a000001 lp2 lp2 1
> +test_tcp_packet 2 f00000000001 f00000000002 0a000001 0a000002 lp1 lp1 1
> +
> +for i in 1 2; do
> +    OVN_CHECK_PACKETS_REMOVE_BROADCAST([vif$i-tx.pcap], [$i.expected])
> +done
> +
> +# now check that with no rule traffic passes through
> +for i in 1 2; do
> +    check ovn-nbctl acl-del lsw$i to-lport 1000 'tcp'
> +    check ovn-nbctl acl-add lsw$i to-lport 1000 'tcp' allow-stateless
> +done
> +check ovn-nbctl --wait=hv sync
> +
> +test_tcp_packet 2 f00000000001 f00000000002 0a000001 0a000002 lp1 lp1 0
> +test_tcp_packet 1 f00000000002 f00000000001 0a000002 0a000001 lp2 lp2 0
> +
> +for i in 1 2; do
> +    OVN_CHECK_PACKETS_REMOVE_BROADCAST([vif$i-tx.pcap], [$i.expected])
> +done
> +
> +AT_CLEANUP
> +])
> +
>  # 3 hypervisors, one logical switch, 3 logical ports per hypervisor
>  OVN_FOR_EACH_NORTHD([
>  AT_SETUP([3 HVs, 1 LS, 3 lports/HV])
> --
> 2.31.1
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to