diff mbox series

[ovs-dev,v1,10/12] ovn-br-controller: Extend the symbol table to add new fields.

Message ID 20250811101026.918019-1-numans@ovn.org
State Changes Requested
Headers show
Series OVN Bridge Controller service. | expand

Checks

Context Check Description
ovsrobot/apply-robot warning apply and check: warning
ovsrobot/github-robot-_Build_and_Test fail github build: failed
ovsrobot/github-robot-_ovn-kubernetes fail github build: failed

Commit Message

Numan Siddique Aug. 11, 2025, 10:10 a.m. UTC
From: Numan Siddique <numans@ovn.org>

Signed-off-by: Numan Siddique <numans@ovn.org>
---
 br-controller/en-lflow.c   | 19 +++++++++++++++++++
 tests/ovn-br-controller.at | 28 ++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+)

Comments

Mark Michelson Aug. 21, 2025, 9:28 p.m. UTC | #1
Thanks Numan!

Acked-by: Mark Michelson <mmichels@redhat.com>

On 8/11/25 6:10 AM, numans@ovn.org wrote:
> From: Numan Siddique <numans@ovn.org>
> 
> Signed-off-by: Numan Siddique <numans@ovn.org>
> ---
>   br-controller/en-lflow.c   | 19 +++++++++++++++++++
>   tests/ovn-br-controller.at | 28 ++++++++++++++++++++++++++++
>   2 files changed, 47 insertions(+)
> 
> diff --git a/br-controller/en-lflow.c b/br-controller/en-lflow.c
> index 00e24de805..147554c3c6 100644
> --- a/br-controller/en-lflow.c
> +++ b/br-controller/en-lflow.c
> @@ -63,6 +63,7 @@ struct lookup_port_aux {
>       const struct ovn_bridge *br;
>   };
>   
> +static void br_controller_extend_symtab(struct shash *symtab);
>   static struct expr *convert_match_to_expr(
>       const struct ovnbrrec_logical_flow *lflow, struct expr **prereqs,
>       struct shash *symtab);
> @@ -92,6 +93,7 @@ void *en_lflow_output_init(struct engine_node *node OVS_UNUSED,
>       struct ed_type_lflow_output_data *lflow_data = xzalloc(sizeof *lflow_data);
>       ovn_init_symtab(&lflow_data->pd.symtab);
>       lflow_conj_ids_init(&lflow_data->conj_ids);
> +    br_controller_extend_symtab(&lflow_data->pd.symtab);
>   
>       return lflow_data;
>   }
> @@ -125,6 +127,23 @@ en_lflow_output_run(struct engine_node *node OVS_UNUSED, void *data_)
>   
>   /* Static functions. */
>   
> +static void
> +br_controller_extend_symtab(struct shash *symtab)
> +{
> +    expr_symtab_add_field(symtab, "ct_snat_zone", MFF_LOG_SNAT_ZONE,
> +                          NULL, false);
> +    expr_symtab_add_field(symtab, "ct_dnat_zone", MFF_LOG_DNAT_ZONE,
> +                          NULL, false);
> +    expr_symtab_add_field(symtab, "metadata", MFF_METADATA, NULL, false);
> +    expr_symtab_add_field(symtab, "tun.id", MFF_TUN_ID, NULL, false);
> +    expr_symtab_add_field(symtab, "tun_ip4.src", MFF_TUN_SRC, "ip4", false);
> +    expr_symtab_add_field(symtab, "tun_ip4.dst", MFF_TUN_DST, "ip4", false);
> +    expr_symtab_add_field(symtab, "tun_ip6.src", MFF_TUN_IPV6_SRC,
> +                          "ip6", false);
> +    expr_symtab_add_field(symtab, "tun_ip6.dst", MFF_TUN_IPV6_DST,
> +                          "ip6", false);
> +}
> +
>   static void
>   init_lflow_ctx(struct engine_node *node,
>                  struct ed_type_bridge_data *bridge_data,
> diff --git a/tests/ovn-br-controller.at b/tests/ovn-br-controller.at
> index bb10e5bd10..7a71b7c24b 100644
> --- a/tests/ovn-br-controller.at
> +++ b/tests/ovn-br-controller.at
> @@ -183,6 +183,34 @@ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br0 | ofctl_strip_all], [0], [dnl
>   NXST_FLOW reply:
>   ])
>   
> +check ovs-vsctl add-port br0 eth1 -- set interface eth1 ofport-request=4
> +check as ovn-br ovn-brctl add-flow br0 3 100 "ip4 && metadata == 1000" "ct_snat_zone = 100; ct_snat;"
> +check as ovn-br ovn-brctl add-flow br0 3 100 "ip4 && metadata == 1001" "ct_dnat_zone = 101; ct_dnat;"
> +check as ovn-br ovn-brctl add-flow br0 4 100 "ip4 && metadata == 1000 && ip4.dst == 52.92.128.0/17" "tun.id = 1000; tun_ip4.dst = 10.100.100.1; eth.dst = 4c:96:14:14:01:b0; outport = \"eth1\"; output;"
> +check as ovn-br ovn-brctl add-flow br0 4 101 "ip6 && metadata == 1000" "tun.id = 1000; tun_ip6.src = aef0::3; tun_ip6.dst = bef0::4; eth.dst = 4c:96:14:14:01:b0; outport = \"eth1\"; output;"
> +
> +OVS_WAIT_UNTIL([test `ovs-ofctl dump-flows br0 | grep -v NXST_FLOW | wc -l` -eq 15])
> +
> +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br0 | ofctl_strip_all], [0], [dnl
> + priority=0 actions=NORMAL
> + priority=100,in_port=2 actions=load:0x2->NXM_NX_REG14[[]],resubmit(,8)
> + priority=100,in_port=4 actions=load:0x4->NXM_NX_REG14[[]],resubmit(,8)
> + table=10, priority=1000 actions=resubmit(,64)
> + table=11, priority=100,ip,metadata=0x3e8 actions=load:0x64->NXM_NX_REG12[[]],ct(table=12,zone=NXM_NX_REG12[[0..15]],nat)
> + table=11, priority=100,ip,metadata=0x3e9 actions=load:0x65->NXM_NX_REG11[[]],ct(table=12,zone=NXM_NX_REG11[[0..15]],nat)
> + table=12, priority=100,ip,metadata=0x3e8,nw_dst=52.92.128.0/17 actions=load:0x3e8->NXM_NX_TUN_ID[[]],load:0xa646401->NXM_NX_TUN_IPV4_DST[[]],mod_dl_dst:4c:96:14:14:01:b0,load:0x4->NXM_NX_REG15[[]],resubmit(,64)
> + table=12, priority=101,ipv6,metadata=0x3e8 actions=load:0x3e8->NXM_NX_TUN_ID[[]],load:0x3->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0xaef0000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0x4->NXM_NX_TUN_IPV6_DST[[0..63]],load:0xbef0000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],mod_dl_dst:4c:96:14:14:01:b0,load:0x4->NXM_NX_REG15[[]],resubmit(,64)
> + table=64, priority=0 actions=resubmit(,65)
> + table=65, priority=0 actions=NORMAL
> + table=65, priority=100,reg15=0x2 actions=output:2
> + table=65, priority=100,reg15=0x4 actions=output:4
> + table=8, priority=1000,reg14=0x2 actions=resubmit(,9)
> + table=9, priority=1000,ip actions=resubmit(,10)
> + table=9, priority=1000,tcp actions=push:NXM_OF_IP_DST[[]],push:NXM_OF_IP_SRC[[]],pop:NXM_OF_IP_DST[[]],pop:NXM_OF_IP_SRC[[]],mod_tp_dst:8080,resubmit(,10)
> +NXST_FLOW reply:
> +])
> +
> +
>   check ovs-vsctl add-br br1
>   check ovs-vsctl add-port br1 br1-p1 -- set interface br1-p1 ofport-request=1
>   check ovs-vsctl add-port br1 br1-p2 -- set interface br1-p2 ofport-request=2
diff mbox series

Patch

diff --git a/br-controller/en-lflow.c b/br-controller/en-lflow.c
index 00e24de805..147554c3c6 100644
--- a/br-controller/en-lflow.c
+++ b/br-controller/en-lflow.c
@@ -63,6 +63,7 @@  struct lookup_port_aux {
     const struct ovn_bridge *br;
 };
 
+static void br_controller_extend_symtab(struct shash *symtab);
 static struct expr *convert_match_to_expr(
     const struct ovnbrrec_logical_flow *lflow, struct expr **prereqs,
     struct shash *symtab);
@@ -92,6 +93,7 @@  void *en_lflow_output_init(struct engine_node *node OVS_UNUSED,
     struct ed_type_lflow_output_data *lflow_data = xzalloc(sizeof *lflow_data);
     ovn_init_symtab(&lflow_data->pd.symtab);
     lflow_conj_ids_init(&lflow_data->conj_ids);
+    br_controller_extend_symtab(&lflow_data->pd.symtab);
 
     return lflow_data;
 }
@@ -125,6 +127,23 @@  en_lflow_output_run(struct engine_node *node OVS_UNUSED, void *data_)
 
 /* Static functions. */
 
+static void
+br_controller_extend_symtab(struct shash *symtab)
+{
+    expr_symtab_add_field(symtab, "ct_snat_zone", MFF_LOG_SNAT_ZONE,
+                          NULL, false);
+    expr_symtab_add_field(symtab, "ct_dnat_zone", MFF_LOG_DNAT_ZONE,
+                          NULL, false);
+    expr_symtab_add_field(symtab, "metadata", MFF_METADATA, NULL, false);
+    expr_symtab_add_field(symtab, "tun.id", MFF_TUN_ID, NULL, false);
+    expr_symtab_add_field(symtab, "tun_ip4.src", MFF_TUN_SRC, "ip4", false);
+    expr_symtab_add_field(symtab, "tun_ip4.dst", MFF_TUN_DST, "ip4", false);
+    expr_symtab_add_field(symtab, "tun_ip6.src", MFF_TUN_IPV6_SRC,
+                          "ip6", false);
+    expr_symtab_add_field(symtab, "tun_ip6.dst", MFF_TUN_IPV6_DST,
+                          "ip6", false);
+}
+
 static void
 init_lflow_ctx(struct engine_node *node,
                struct ed_type_bridge_data *bridge_data,
diff --git a/tests/ovn-br-controller.at b/tests/ovn-br-controller.at
index bb10e5bd10..7a71b7c24b 100644
--- a/tests/ovn-br-controller.at
+++ b/tests/ovn-br-controller.at
@@ -183,6 +183,34 @@  AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br0 | ofctl_strip_all], [0], [dnl
 NXST_FLOW reply:
 ])
 
+check ovs-vsctl add-port br0 eth1 -- set interface eth1 ofport-request=4
+check as ovn-br ovn-brctl add-flow br0 3 100 "ip4 && metadata == 1000" "ct_snat_zone = 100; ct_snat;"
+check as ovn-br ovn-brctl add-flow br0 3 100 "ip4 && metadata == 1001" "ct_dnat_zone = 101; ct_dnat;"
+check as ovn-br ovn-brctl add-flow br0 4 100 "ip4 && metadata == 1000 && ip4.dst == 52.92.128.0/17" "tun.id = 1000; tun_ip4.dst = 10.100.100.1; eth.dst = 4c:96:14:14:01:b0; outport = \"eth1\"; output;"
+check as ovn-br ovn-brctl add-flow br0 4 101 "ip6 && metadata == 1000" "tun.id = 1000; tun_ip6.src = aef0::3; tun_ip6.dst = bef0::4; eth.dst = 4c:96:14:14:01:b0; outport = \"eth1\"; output;"
+
+OVS_WAIT_UNTIL([test `ovs-ofctl dump-flows br0 | grep -v NXST_FLOW | wc -l` -eq 15])
+
+AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br0 | ofctl_strip_all], [0], [dnl
+ priority=0 actions=NORMAL
+ priority=100,in_port=2 actions=load:0x2->NXM_NX_REG14[[]],resubmit(,8)
+ priority=100,in_port=4 actions=load:0x4->NXM_NX_REG14[[]],resubmit(,8)
+ table=10, priority=1000 actions=resubmit(,64)
+ table=11, priority=100,ip,metadata=0x3e8 actions=load:0x64->NXM_NX_REG12[[]],ct(table=12,zone=NXM_NX_REG12[[0..15]],nat)
+ table=11, priority=100,ip,metadata=0x3e9 actions=load:0x65->NXM_NX_REG11[[]],ct(table=12,zone=NXM_NX_REG11[[0..15]],nat)
+ table=12, priority=100,ip,metadata=0x3e8,nw_dst=52.92.128.0/17 actions=load:0x3e8->NXM_NX_TUN_ID[[]],load:0xa646401->NXM_NX_TUN_IPV4_DST[[]],mod_dl_dst:4c:96:14:14:01:b0,load:0x4->NXM_NX_REG15[[]],resubmit(,64)
+ table=12, priority=101,ipv6,metadata=0x3e8 actions=load:0x3e8->NXM_NX_TUN_ID[[]],load:0x3->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0xaef0000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0x4->NXM_NX_TUN_IPV6_DST[[0..63]],load:0xbef0000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],mod_dl_dst:4c:96:14:14:01:b0,load:0x4->NXM_NX_REG15[[]],resubmit(,64)
+ table=64, priority=0 actions=resubmit(,65)
+ table=65, priority=0 actions=NORMAL
+ table=65, priority=100,reg15=0x2 actions=output:2
+ table=65, priority=100,reg15=0x4 actions=output:4
+ table=8, priority=1000,reg14=0x2 actions=resubmit(,9)
+ table=9, priority=1000,ip actions=resubmit(,10)
+ table=9, priority=1000,tcp actions=push:NXM_OF_IP_DST[[]],push:NXM_OF_IP_SRC[[]],pop:NXM_OF_IP_DST[[]],pop:NXM_OF_IP_SRC[[]],mod_tp_dst:8080,resubmit(,10)
+NXST_FLOW reply:
+])
+
+
 check ovs-vsctl add-br br1
 check ovs-vsctl add-port br1 br1-p1 -- set interface br1-p1 ofport-request=1
 check ovs-vsctl add-port br1 br1-p2 -- set interface br1-p2 ofport-request=2