diff options
Diffstat (limited to 'net/dcb/dcbnl.c')
| -rw-r--r-- | net/dcb/dcbnl.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c index d900ab99814..d5074a56728 100644 --- a/net/dcb/dcbnl.c +++ b/net/dcb/dcbnl.c | |||
| @@ -583,7 +583,7 @@ static int dcbnl_getapp(struct net_device *netdev, struct nlattr **tb, | |||
| 583 | u8 up, idtype; | 583 | u8 up, idtype; |
| 584 | int ret = -EINVAL; | 584 | int ret = -EINVAL; |
| 585 | 585 | ||
| 586 | if (!tb[DCB_ATTR_APP] || !netdev->dcbnl_ops->getapp) | 586 | if (!tb[DCB_ATTR_APP]) |
| 587 | goto out; | 587 | goto out; |
| 588 | 588 | ||
| 589 | ret = nla_parse_nested(app_tb, DCB_APP_ATTR_MAX, tb[DCB_ATTR_APP], | 589 | ret = nla_parse_nested(app_tb, DCB_APP_ATTR_MAX, tb[DCB_ATTR_APP], |
| @@ -604,7 +604,16 @@ static int dcbnl_getapp(struct net_device *netdev, struct nlattr **tb, | |||
| 604 | goto out; | 604 | goto out; |
| 605 | 605 | ||
| 606 | id = nla_get_u16(app_tb[DCB_APP_ATTR_ID]); | 606 | id = nla_get_u16(app_tb[DCB_APP_ATTR_ID]); |
| 607 | up = netdev->dcbnl_ops->getapp(netdev, idtype, id); | 607 | |
| 608 | if (netdev->dcbnl_ops->getapp) { | ||
| 609 | up = netdev->dcbnl_ops->getapp(netdev, idtype, id); | ||
| 610 | } else { | ||
| 611 | struct dcb_app app = { | ||
| 612 | .selector = idtype, | ||
| 613 | .protocol = id, | ||
| 614 | }; | ||
| 615 | up = dcb_getapp(netdev, &app); | ||
| 616 | } | ||
| 608 | 617 | ||
| 609 | /* send this back */ | 618 | /* send this back */ |
| 610 | dcbnl_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | 619 | dcbnl_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
| @@ -617,6 +626,9 @@ static int dcbnl_getapp(struct net_device *netdev, struct nlattr **tb, | |||
| 617 | dcb->cmd = DCB_CMD_GAPP; | 626 | dcb->cmd = DCB_CMD_GAPP; |
| 618 | 627 | ||
| 619 | app_nest = nla_nest_start(dcbnl_skb, DCB_ATTR_APP); | 628 | app_nest = nla_nest_start(dcbnl_skb, DCB_ATTR_APP); |
| 629 | if (!app_nest) | ||
| 630 | goto out_cancel; | ||
| 631 | |||
| 620 | ret = nla_put_u8(dcbnl_skb, DCB_APP_ATTR_IDTYPE, idtype); | 632 | ret = nla_put_u8(dcbnl_skb, DCB_APP_ATTR_IDTYPE, idtype); |
| 621 | if (ret) | 633 | if (ret) |
| 622 | goto out_cancel; | 634 | goto out_cancel; |
| @@ -1604,6 +1616,10 @@ EXPORT_SYMBOL(dcb_getapp); | |||
| 1604 | u8 dcb_setapp(struct net_device *dev, struct dcb_app *new) | 1616 | u8 dcb_setapp(struct net_device *dev, struct dcb_app *new) |
| 1605 | { | 1617 | { |
| 1606 | struct dcb_app_type *itr; | 1618 | struct dcb_app_type *itr; |
| 1619 | struct dcb_app_type event; | ||
| 1620 | |||
| 1621 | memcpy(&event.name, dev->name, sizeof(event.name)); | ||
| 1622 | memcpy(&event.app, new, sizeof(event.app)); | ||
| 1607 | 1623 | ||
| 1608 | spin_lock(&dcb_lock); | 1624 | spin_lock(&dcb_lock); |
| 1609 | /* Search for existing match and replace */ | 1625 | /* Search for existing match and replace */ |
| @@ -1635,7 +1651,7 @@ u8 dcb_setapp(struct net_device *dev, struct dcb_app *new) | |||
| 1635 | } | 1651 | } |
| 1636 | out: | 1652 | out: |
| 1637 | spin_unlock(&dcb_lock); | 1653 | spin_unlock(&dcb_lock); |
| 1638 | call_dcbevent_notifiers(DCB_APP_EVENT, new); | 1654 | call_dcbevent_notifiers(DCB_APP_EVENT, &event); |
| 1639 | return 0; | 1655 | return 0; |
| 1640 | } | 1656 | } |
| 1641 | EXPORT_SYMBOL(dcb_setapp); | 1657 | EXPORT_SYMBOL(dcb_setapp); |
