diff options
author | Shmulik Ravid <shmulikr@broadcom.com> | 2010-12-30 01:26:48 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-12-31 13:50:54 -0500 |
commit | 6241b6259b16aa390ff4bf50f520685b3801200b (patch) | |
tree | e80fbdd538b1edd1220b93103b66271194a0653d /net/dcb/dcbnl.c | |
parent | 96b99684e365f28d49bdb1221ca022b75cb91a98 (diff) |
dcbnl: adding DCBX engine capability
Adding an optional DCBX capability and a pair for get-set routines for
setting the device DCBX mode. The DCBX capability is a bit field of
supported attributes. The user is expected to set the DCBX mode with a
subset of the advertised attributes.
This patch is dependent on the following patches:
[net-next-2.6 PATCH 1/3] dcbnl: add support for ieee8021Qaz attributes
[net-next-2.6 PATCH 2/3] dcbnl: add appliction tlv handlers
[net-next-2.6 PATCH 3/3] net_dcb: add application notifiers
Signed-off-by: Shmulik Ravid <shmulikr@broadcom.com>
Acked-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dcb/dcbnl.c')
-rw-r--r-- | net/dcb/dcbnl.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c index 69144125fc4f..8f83ad859d9b 100644 --- a/net/dcb/dcbnl.c +++ b/net/dcb/dcbnl.c | |||
@@ -68,6 +68,7 @@ static const struct nla_policy dcbnl_rtnl_policy[DCB_ATTR_MAX + 1] = { | |||
68 | [DCB_ATTR_BCN] = {.type = NLA_NESTED}, | 68 | [DCB_ATTR_BCN] = {.type = NLA_NESTED}, |
69 | [DCB_ATTR_APP] = {.type = NLA_NESTED}, | 69 | [DCB_ATTR_APP] = {.type = NLA_NESTED}, |
70 | [DCB_ATTR_IEEE] = {.type = NLA_NESTED}, | 70 | [DCB_ATTR_IEEE] = {.type = NLA_NESTED}, |
71 | [DCB_ATTR_DCBX] = {.type = NLA_U8}, | ||
71 | }; | 72 | }; |
72 | 73 | ||
73 | /* DCB priority flow control to User Priority nested attributes */ | 74 | /* DCB priority flow control to User Priority nested attributes */ |
@@ -124,6 +125,7 @@ static const struct nla_policy dcbnl_cap_nest[DCB_CAP_ATTR_MAX + 1] = { | |||
124 | [DCB_CAP_ATTR_PFC_TCS] = {.type = NLA_U8}, | 125 | [DCB_CAP_ATTR_PFC_TCS] = {.type = NLA_U8}, |
125 | [DCB_CAP_ATTR_GSP] = {.type = NLA_U8}, | 126 | [DCB_CAP_ATTR_GSP] = {.type = NLA_U8}, |
126 | [DCB_CAP_ATTR_BCN] = {.type = NLA_U8}, | 127 | [DCB_CAP_ATTR_BCN] = {.type = NLA_U8}, |
128 | [DCB_CAP_ATTR_DCBX] = {.type = NLA_U8}, | ||
127 | }; | 129 | }; |
128 | 130 | ||
129 | /* DCB capabilities nested attributes. */ | 131 | /* DCB capabilities nested attributes. */ |
@@ -1271,6 +1273,39 @@ nlmsg_failure: | |||
1271 | return -1; | 1273 | return -1; |
1272 | } | 1274 | } |
1273 | 1275 | ||
1276 | /* DCBX configuration */ | ||
1277 | static int dcbnl_getdcbx(struct net_device *netdev, struct nlattr **tb, | ||
1278 | u32 pid, u32 seq, u16 flags) | ||
1279 | { | ||
1280 | int ret = -EINVAL; | ||
1281 | |||
1282 | if (!netdev->dcbnl_ops->getdcbx) | ||
1283 | return ret; | ||
1284 | |||
1285 | ret = dcbnl_reply(netdev->dcbnl_ops->getdcbx(netdev), RTM_GETDCB, | ||
1286 | DCB_CMD_GDCBX, DCB_ATTR_DCBX, pid, seq, flags); | ||
1287 | |||
1288 | return ret; | ||
1289 | } | ||
1290 | |||
1291 | static int dcbnl_setdcbx(struct net_device *netdev, struct nlattr **tb, | ||
1292 | u32 pid, u32 seq, u16 flags) | ||
1293 | { | ||
1294 | int ret = -EINVAL; | ||
1295 | u8 value; | ||
1296 | |||
1297 | if (!tb[DCB_ATTR_DCBX] || !netdev->dcbnl_ops->setdcbx) | ||
1298 | return ret; | ||
1299 | |||
1300 | value = nla_get_u8(tb[DCB_ATTR_DCBX]); | ||
1301 | |||
1302 | ret = dcbnl_reply(netdev->dcbnl_ops->setdcbx(netdev, value), | ||
1303 | RTM_SETDCB, DCB_CMD_SDCBX, DCB_ATTR_DCBX, | ||
1304 | pid, seq, flags); | ||
1305 | |||
1306 | return ret; | ||
1307 | } | ||
1308 | |||
1274 | static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | 1309 | static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) |
1275 | { | 1310 | { |
1276 | struct net *net = sock_net(skb->sk); | 1311 | struct net *net = sock_net(skb->sk); |
@@ -1384,6 +1419,14 @@ static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
1384 | ret = dcbnl_ieee_get(netdev, tb, pid, nlh->nlmsg_seq, | 1419 | ret = dcbnl_ieee_get(netdev, tb, pid, nlh->nlmsg_seq, |
1385 | nlh->nlmsg_flags); | 1420 | nlh->nlmsg_flags); |
1386 | goto out; | 1421 | goto out; |
1422 | case DCB_CMD_GDCBX: | ||
1423 | ret = dcbnl_getdcbx(netdev, tb, pid, nlh->nlmsg_seq, | ||
1424 | nlh->nlmsg_flags); | ||
1425 | goto out; | ||
1426 | case DCB_CMD_SDCBX: | ||
1427 | ret = dcbnl_setdcbx(netdev, tb, pid, nlh->nlmsg_seq, | ||
1428 | nlh->nlmsg_flags); | ||
1429 | goto out; | ||
1387 | default: | 1430 | default: |
1388 | goto errout; | 1431 | goto errout; |
1389 | } | 1432 | } |