Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 314261
b: refs/heads/master
c: 716b31a
h: refs/heads/master
i:
  314259: 88028cf
v: v3
  • Loading branch information
Thomas Graf authored and David S. Miller committed Jun 13, 2012
1 parent 4dd1274 commit c636b1e
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 47 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3d1f486952b750f1cca53cf22d4f769db5aba4f0
refs/heads/master: 716b31abbd39baab307c0a7b38dce9a20c16c62d
81 changes: 35 additions & 46 deletions trunk/net/dcb/dcbnl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1716,6 +1716,22 @@ static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
return ret;
}

static struct dcb_app_type *dcb_app_lookup(const struct dcb_app *app,
int ifindex, int prio)
{
struct dcb_app_type *itr;

list_for_each_entry(itr, &dcb_app_list, list) {
if (itr->app.selector == app->selector &&
itr->app.protocol == app->protocol &&
itr->ifindex == ifindex &&
(!prio || itr->app.priority == prio))
return itr;
}

return NULL;
}

/**
* dcb_getapp - retrieve the DCBX application user priority
*
Expand All @@ -1729,14 +1745,8 @@ u8 dcb_getapp(struct net_device *dev, struct dcb_app *app)
u8 prio = 0;

spin_lock(&dcb_lock);
list_for_each_entry(itr, &dcb_app_list, list) {
if (itr->app.selector == app->selector &&
itr->app.protocol == app->protocol &&
itr->ifindex == dev->ifindex) {
prio = itr->app.priority;
break;
}
}
if ((itr = dcb_app_lookup(app, dev->ifindex, 0)))
prio = itr->app.priority;
spin_unlock(&dcb_lock);

return prio;
Expand All @@ -1762,18 +1772,14 @@ int dcb_setapp(struct net_device *dev, struct dcb_app *new)

spin_lock(&dcb_lock);
/* Search for existing match and replace */
list_for_each_entry(itr, &dcb_app_list, list) {
if (itr->app.selector == new->selector &&
itr->app.protocol == new->protocol &&
itr->ifindex == dev->ifindex) {
if (new->priority)
itr->app.priority = new->priority;
else {
list_del(&itr->list);
kfree(itr);
}
goto out;
if ((itr = dcb_app_lookup(new, dev->ifindex, 0))) {
if (new->priority)
itr->app.priority = new->priority;
else {
list_del(&itr->list);
kfree(itr);
}
goto out;
}
/* App type does not exist add new application type */
if (new->priority) {
Expand Down Expand Up @@ -1808,13 +1814,8 @@ u8 dcb_ieee_getapp_mask(struct net_device *dev, struct dcb_app *app)
u8 prio = 0;

spin_lock(&dcb_lock);
list_for_each_entry(itr, &dcb_app_list, list) {
if (itr->app.selector == app->selector &&
itr->app.protocol == app->protocol &&
itr->ifindex == dev->ifindex) {
prio |= 1 << itr->app.priority;
}
}
if ((itr = dcb_app_lookup(app, dev->ifindex, 0)))
prio |= 1 << itr->app.priority;
spin_unlock(&dcb_lock);

return prio;
Expand All @@ -1830,7 +1831,7 @@ EXPORT_SYMBOL(dcb_ieee_getapp_mask);
*/
int dcb_ieee_setapp(struct net_device *dev, struct dcb_app *new)
{
struct dcb_app_type *itr, *entry;
struct dcb_app_type *entry;
struct dcb_app_type event;
int err = 0;

Expand All @@ -1841,14 +1842,9 @@ int dcb_ieee_setapp(struct net_device *dev, struct dcb_app *new)

spin_lock(&dcb_lock);
/* Search for existing match and abort if found */
list_for_each_entry(itr, &dcb_app_list, list) {
if (itr->app.selector == new->selector &&
itr->app.protocol == new->protocol &&
itr->app.priority == new->priority &&
itr->ifindex == dev->ifindex) {
err = -EEXIST;
goto out;
}
if (dcb_app_lookup(new, dev->ifindex, new->priority)) {
err = -EEXIST;
goto out;
}

/* App entry does not exist add new entry */
Expand Down Expand Up @@ -1887,19 +1883,12 @@ int dcb_ieee_delapp(struct net_device *dev, struct dcb_app *del)

spin_lock(&dcb_lock);
/* Search for existing match and remove it. */
list_for_each_entry(itr, &dcb_app_list, list) {
if (itr->app.selector == del->selector &&
itr->app.protocol == del->protocol &&
itr->app.priority == del->priority &&
itr->ifindex == dev->ifindex) {
list_del(&itr->list);
kfree(itr);
err = 0;
goto out;
}
if ((itr = dcb_app_lookup(del, dev->ifindex, del->priority))) {
list_del(&itr->list);
kfree(itr);
err = 0;
}

out:
spin_unlock(&dcb_lock);
if (!err)
call_dcbevent_notifiers(DCB_APP_EVENT, &event);
Expand Down

0 comments on commit c636b1e

Please sign in to comment.