| From foo@baz Mon Sep 17 12:33:31 CEST 2018 |
| From: Petr Machata <petrm@mellanox.com> |
| Date: Fri, 27 Jul 2018 15:26:55 +0300 |
| Subject: net: dcb: For wild-card lookups, use priority -1, not 0 |
| |
| From: Petr Machata <petrm@mellanox.com> |
| |
| [ Upstream commit 08193d1a893c802c4b807e4d522865061f4e9f4f ] |
| |
| The function dcb_app_lookup walks the list of specified DCB APP entries, |
| looking for one that matches a given criteria: ifindex, selector, |
| protocol ID and optionally also priority. The "don't care" value for |
| priority is set to 0, because that priority has not been allowed under |
| CEE regime, which predates the IEEE standardization. |
| |
| Under IEEE, 0 is a valid priority number. But because dcb_app_lookup |
| considers zero a wild card, attempts to add an APP entry with priority 0 |
| fail when other entries exist for a given ifindex / selector / PID |
| triplet. |
| |
| Fix by changing the wild-card value to -1. |
| |
| Signed-off-by: Petr Machata <petrm@mellanox.com> |
| Signed-off-by: Ido Schimmel <idosch@mellanox.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/dcb/dcbnl.c | 11 +++++++---- |
| 1 file changed, 7 insertions(+), 4 deletions(-) |
| |
| --- a/net/dcb/dcbnl.c |
| +++ b/net/dcb/dcbnl.c |
| @@ -1765,7 +1765,7 @@ static struct dcb_app_type *dcb_app_look |
| if (itr->app.selector == app->selector && |
| itr->app.protocol == app->protocol && |
| itr->ifindex == ifindex && |
| - (!prio || itr->app.priority == prio)) |
| + ((prio == -1) || itr->app.priority == prio)) |
| return itr; |
| } |
| |
| @@ -1800,7 +1800,8 @@ u8 dcb_getapp(struct net_device *dev, st |
| u8 prio = 0; |
| |
| spin_lock_bh(&dcb_lock); |
| - if ((itr = dcb_app_lookup(app, dev->ifindex, 0))) |
| + itr = dcb_app_lookup(app, dev->ifindex, -1); |
| + if (itr) |
| prio = itr->app.priority; |
| spin_unlock_bh(&dcb_lock); |
| |
| @@ -1828,7 +1829,8 @@ int dcb_setapp(struct net_device *dev, s |
| |
| spin_lock_bh(&dcb_lock); |
| /* Search for existing match and replace */ |
| - if ((itr = dcb_app_lookup(new, dev->ifindex, 0))) { |
| + itr = dcb_app_lookup(new, dev->ifindex, -1); |
| + if (itr) { |
| if (new->priority) |
| itr->app.priority = new->priority; |
| else { |
| @@ -1861,7 +1863,8 @@ u8 dcb_ieee_getapp_mask(struct net_devic |
| u8 prio = 0; |
| |
| spin_lock_bh(&dcb_lock); |
| - if ((itr = dcb_app_lookup(app, dev->ifindex, 0))) |
| + itr = dcb_app_lookup(app, dev->ifindex, -1); |
| + if (itr) |
| prio |= 1 << itr->app.priority; |
| spin_unlock_bh(&dcb_lock); |
| |