aboutsummaryrefslogtreecommitdiffstats
path: root/net/dcb/dcbnl.c
diff options
context:
space:
mode:
authorShmulik Ravid <shmulikr@broadcom.com>2010-12-30 01:26:48 -0500
committerDavid S. Miller <davem@davemloft.net>2010-12-31 13:50:54 -0500
commit6241b6259b16aa390ff4bf50f520685b3801200b (patch)
treee80fbdd538b1edd1220b93103b66271194a0653d /net/dcb/dcbnl.c
parent96b99684e365f28d49bdb1221ca022b75cb91a98 (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.c43
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 */
1277static 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
1291static 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
1274static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) 1309static 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 }