| Message ID | 20250811101026.918019-1-numans@ovn.org |
|---|---|
| State | Changes Requested |
| Headers | show |
| Series | OVN Bridge Controller service. | expand |
| 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 |
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 --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