On 2/25/26 9:39 AM, Ales Musil via dev wrote:
> The LSP port security was parsed just to be used as check if there
> is any valid port security. The full parsing isn't necessary we can
> stop the parsing when we find at least one valid entry as a
> indication for the rest of the processing. This also ensure that we
> don't produce log when there is "VRRPv3" specified as it was just
> noise and didn't really affect the functionality.
>
> Fixes: d9e2393e9840 ("controller: Add option to make port security compliant
> with RFC 9568.")
> Reported-at: https://issues.redhat.com/browse/FDP-3245
> Signed-off-by: Ales Musil <[email protected]>
> ---
Hi Ales,
Thanks for the patch!
> northd/northd.c | 28 ++++++++--------------------
> northd/northd.h | 4 ++--
> tests/ovn.at | 2 ++
> 3 files changed, 12 insertions(+), 22 deletions(-)
>
> diff --git a/northd/northd.c b/northd/northd.c
> index 983975dac..9401f41ab 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -1116,13 +1116,6 @@ ovn_port_cleanup(struct ovn_port *port)
> port->peer->peer = NULL;
> }
>
> - for (int i = 0; i < port->n_ps_addrs; i++) {
> - destroy_lport_addresses(&port->ps_addrs[i]);
> - }
> - free(port->ps_addrs);
> - port->ps_addrs = NULL;
> - port->n_ps_addrs = 0;
> -
Now you use port->lsp_has_port_sec but it's not cleared here. There are
cases when ovn_port_cleanup(port) is called and then 'port' is
reinitialized, e.g., in ls_port_reinit(). There we call
ls_port_init(port) after cleanup. That calls parse_lsp_addrs() where we
only at most set port->lsp_has_port_sec = true.
But if it used to be "true" and now it should be "false", we'd have an
issue. In theory. In practice that can't happen because if addresses
change lsp_can_be_inc_processed(port) returns false.
> destroy_lport_addresses(&port->lrp_networks);
> destroy_lport_addresses(&port->proxy_arp_addrs);
> }
> @@ -1512,19 +1505,14 @@ parse_lsp_addrs(struct ovn_port *op)
So, I think I'd set port->lsp_has_port_sec = false in the beginning of
parse_lsp_addrs(), somewhere above this point.
What do you think?
> op->has_unknown = true;
> }
>
> - op->ps_addrs
> - = xmalloc(sizeof *op->ps_addrs * nbsp->n_port_security);
> + struct eth_addr mac;
> for (size_t j = 0; j < nbsp->n_port_security; j++) {
> - if (!extract_lsp_addresses(nbsp->port_security[j],
> - &op->ps_addrs[op->n_ps_addrs])) {
> - static struct vlog_rate_limit rl
> - = VLOG_RATE_LIMIT_INIT(1, 1);
> - VLOG_INFO_RL(&rl, "invalid syntax '%s' in port "
> - "security. No MAC address found",
> - op->nbsp->port_security[j]);
> - continue;
> + int n = !strncmp(nbsp->port_security[j], "VRRPv3", 6) ? 7 : 0;
> + if (ovs_scan_len(nbsp->port_security[j], &n, ETH_ADDR_SCAN_FMT,
> + ETH_ADDR_SCAN_ARGS(mac))) {
> + op->lsp_has_port_sec = true;
> + break;
> }
> - op->n_ps_addrs++;
> }
> }
>
> @@ -1622,7 +1610,7 @@ join_logical_ports_lsp(struct hmap *ports,
>
> /* This port exists due to a SB binding, but should
> * not have been initialized fully. */
> - ovs_assert(!op->n_lsp_addrs && !op->n_ps_addrs);
> + ovs_assert(!op->n_lsp_addrs && !op->lsp_has_port_sec);
> }
> } else {
> op = ovn_port_create(ports, name, nbsp, NULL, NULL);
> @@ -6178,7 +6166,7 @@ build_lswitch_learn_fdb_op(
> {
> ovs_assert(op->nbsp);
>
> - if (op->n_ps_addrs || !op->has_unknown) {
> + if (op->lsp_has_port_sec || !op->has_unknown) {
> return;
> }
>
> diff --git a/northd/northd.h b/northd/northd.h
> index 4dcd128cc..97bd59779 100644
> --- a/northd/northd.h
> +++ b/northd/northd.h
> @@ -723,8 +723,8 @@ struct ovn_port {
> * beginning of 'lsp_addrs'
> extracted
> * directly from LSP 'addresses'. */
>
> - struct lport_addresses *ps_addrs; /* Port security addresses. */
> - unsigned int n_ps_addrs;
> + /* LSP has at least one valid MAC address in the port security column. */
> + bool lsp_has_port_sec;
>
> bool lsp_can_be_inc_processed; /* If it can be incrementally processed
> when
> the port changes. */
> diff --git a/tests/ovn.at b/tests/ovn.at
> index 9082bba82..4e3a345d1 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -45493,6 +45493,8 @@ AT_CHECK([ovs-ofctl dump-flows br-int
> table=OFTABLE_CHK_OUT_PORT_SEC | ofctl_str
> table=OFTABLE_CHK_OUT_PORT_SEC,
> priority=95,ipv6,reg15=0x1,metadata=0x1,dl_dst=00:00:5e:00:02:05,ipv6_dst=ff00::/8
> actions=load:0->NXM_NX_REG10[[12]]
> ])
>
> +AT_CHECK([grep -q "invalid syntax 'VRRPv3 .*' in port security. No MAC
> address found" northd/ovn-northd.log], [1])
> +
> OVN_CLEANUP([hv1
> /Invalid VRRPv3 MAC/d])
> AT_CLEANUP
Regards,
Dumitru
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev