From: Petr Machata <petrm@nvidia.com>
To: Daniel Machon <daniel.machon@microchip.com>
Cc: <netdev@vger.kernel.org>, <dsahern@kernel.org>,
<stephen@networkplumber.org>, <petrm@nvidia.com>,
<UNGLinuxDriver@microchip.com>
Subject: Re: [PATCH iproute2-next 4/9] dcb: app: modify dcb_app_table_remove_replaced() for dcb-rewr reuse
Date: Tue, 23 May 2023 16:42:16 +0200 [thread overview]
Message-ID: <87cz2r5bx1.fsf@nvidia.com> (raw)
In-Reply-To: <20230510-dcb-rewr-v1-4-83adc1f93356@microchip.com>
Daniel Machon <daniel.machon@microchip.com> writes:
> When doing a replace command, entries are checked against selector and
> protocol. Rewrite requires the check to be against selector and
> priority.
>
> Modify the existing dcb_app_table_remove_replace function for dcb-rewr
> reuse, by using the newly introduced dcbnl attribute in the
> dcb_app_table struct.
>
> Signed-off-by: Daniel Machon <daniel.machon@microchip.com>
> ---
> dcb/dcb_app.c | 26 +++++++++++++++++++-------
> 1 file changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/dcb/dcb_app.c b/dcb/dcb_app.c
> index 9bb64f32e12e..23d6bb2a0013 100644
> --- a/dcb/dcb_app.c
> +++ b/dcb/dcb_app.c
> @@ -160,15 +160,27 @@ void dcb_app_table_remove_replaced(struct dcb_app_table *a,
> for (ib = 0; ib < b->n_apps; ib++) {
> const struct dcb_app *ab = &b->apps[ib];
>
> - if (aa->selector == ab->selector &&
> - aa->protocol == ab->protocol)
> - present = true;
> - else
> + if (aa->selector != ab->selector)
> continue;
>
> - if (aa->priority == ab->priority) {
> - found = true;
> - break;
> + if (a->attr == DCB_ATTR_IEEE_APP_TABLE) {
> + if (aa->protocol == ab->protocol)
> + present = true;
> + else
> + continue;
> + if (aa->priority == ab->priority) {
> + found = true;
> + break;
> + }
> + } else {
> + if (aa->priority == ab->priority)
> + present = true;
> + else
> + continue;
> + if (aa->protocol == ab->protocol) {
> + found = true;
> + break;
> + }
> }
> }
Same point about the attribute dispatch. How about this? (Not tested
though.)
static bool dcb_app_pid_eq(const struct dcb_app *aa, const struct dcb_app *ab)
{
return aa->selector == ab->selector &&
aa->protocol == ab->protocol;
}
static bool dcb_app_prio_eq(const struct dcb_app *aa, const struct dcb_app *ab)
{
return aa->selector == ab->selector &&
aa->priority == ab->priority;
}
static void __dcb_app_table_remove_replaced(struct dcb_app_table *a,
const struct dcb_app_table *b,
bool (*key_eq)(const struct dcb_app *aa,
const struct dcb_app *ab),
bool (*val_eq)(const struct dcb_app *aa,
const struct dcb_app *ab))
{
size_t ia, ja;
size_t ib;
for (ia = 0, ja = 0; ia < a->n_apps; ia++) {
struct dcb_app *aa = &a->apps[ia];
bool present = false;
bool found = false;
for (ib = 0; ib < b->n_apps; ib++) {
const struct dcb_app *ab = &b->apps[ib];
if (key_eq(aa, ab))
present = true;
else
continue;
if (val_eq(aa, ab)) {
found = true;
break;
}
}
/* Entries that remain in A will be removed, so keep in the
* table only APP entries whose sel/pid is mentioned in B,
* but that do not have the full sel/pid/prio match.
*/
if (present && !found)
a->apps[ja++] = *aa;
}
a->n_apps = ja;
}
void dcb_app_table_remove_replaced(struct dcb_app_table *a,
const struct dcb_app_table *b)
{
__dcb_app_table_remove_replaced(a, b, dcb_app_pid_eq, dcb_app_prio_eq);
}
void dcb_rwr_table_remove_replaced(struct dcb_app_table *a,
const struct dcb_app_table *b)
{
__dcb_app_table_remove_replaced(a, b, dcb_app_prio_eq, dcb_app_pid_eq);
}
Alternatively have key / value extractor callbacks and compare those
instead of directly priority and protocol.
And actually now that I think about it more, a key_eq / get_key callback
is all we need. Instead of val_eq / get_val, we can just compare the
full app. We know the key matches already, so whatever it actually is,
it will not prevent the second match.
Dunno. I just don't want the attribute field become a polymorphic type
tag of the structure. DCB is using these callbacks quite a bit all over
the place, so code like this will be right at home.
I was actually looking at dcb_app_table_remove_existing(), which is
tantalizingly close to being a special case of the above where key_eq
just always returns true and val_eq compares all fields. But alas for
empty tables it would do the wrong thing.
next prev parent reply other threads:[~2023-05-23 15:02 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-22 18:41 [PATCH iproute2-next 0/9] Introduce new dcb-rewr subcommand Daniel Machon
2023-05-22 18:41 ` [PATCH iproute2-next 1/9] dcb: app: expose dcb-app functions in new header Daniel Machon
2023-05-23 11:18 ` Petr Machata
2023-05-24 6:39 ` Daniel.Machon
2023-05-24 9:28 ` Petr Machata
2023-05-22 18:41 ` [PATCH iproute2-next 2/9] dcb: app: add new dcbnl attribute field Daniel Machon
2023-05-22 18:41 ` [PATCH iproute2-next 3/9] dcb: app: modify dcb-app print functions for dcb-rewr reuse Daniel Machon
2023-05-22 21:33 ` Stephen Hemminger
2023-05-25 7:20 ` Daniel Machon
2023-05-23 13:23 ` Petr Machata
2023-05-24 6:47 ` Daniel.Machon
2023-05-24 9:37 ` Petr Machata
2023-05-22 18:41 ` [PATCH iproute2-next 4/9] dcb: app: modify dcb_app_table_remove_replaced() " Daniel Machon
2023-05-23 14:42 ` Petr Machata [this message]
2023-05-22 18:41 ` [PATCH iproute2-next 5/9] dcb: app: modify dcb_app_parse_mapping_cb " Daniel Machon
2023-05-23 16:29 ` Petr Machata
2023-05-22 18:41 ` [PATCH iproute2-next 6/9] dcb: rewr: add new dcb-rewr subcommand Daniel Machon
2023-05-23 16:35 ` Petr Machata
2023-05-24 6:51 ` Daniel.Machon
2023-05-22 18:41 ` [PATCH iproute2-next 7/9] man: dcb-rewr: add new manpage for dcb-rewr Daniel Machon
2023-05-23 16:56 ` Petr Machata
2023-05-22 18:41 ` [PATCH iproute2-next 8/9] man: dcb: add additional references under 'SEE ALSO' Daniel Machon
2023-05-22 18:41 ` [PATCH iproute2-next 9/9] man: dcb-app: clean up a few mistakes Daniel Machon
2023-05-23 16:49 ` Petr Machata
2023-05-24 6:56 ` Daniel.Machon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87cz2r5bx1.fsf@nvidia.com \
--to=petrm@nvidia.com \
--cc=UNGLinuxDriver@microchip.com \
--cc=daniel.machon@microchip.com \
--cc=dsahern@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=stephen@networkplumber.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).