diff options
-rw-r--r-- | net/dcb/dcbnl.c | 81 |
1 files changed, 37 insertions, 44 deletions
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c index ff3c12d2cd72..9399af565715 100644 --- a/net/dcb/dcbnl.c +++ b/net/dcb/dcbnl.c | |||
@@ -1286,10 +1286,10 @@ nlmsg_failure: | |||
1286 | static int dcbnl_getdcbx(struct net_device *netdev, struct nlattr **tb, | 1286 | static int dcbnl_getdcbx(struct net_device *netdev, struct nlattr **tb, |
1287 | u32 pid, u32 seq, u16 flags) | 1287 | u32 pid, u32 seq, u16 flags) |
1288 | { | 1288 | { |
1289 | int ret = -EINVAL; | 1289 | int ret; |
1290 | 1290 | ||
1291 | if (!netdev->dcbnl_ops->getdcbx) | 1291 | if (!netdev->dcbnl_ops->getdcbx) |
1292 | return ret; | 1292 | return -EOPNOTSUPP; |
1293 | 1293 | ||
1294 | ret = dcbnl_reply(netdev->dcbnl_ops->getdcbx(netdev), RTM_GETDCB, | 1294 | ret = dcbnl_reply(netdev->dcbnl_ops->getdcbx(netdev), RTM_GETDCB, |
1295 | DCB_CMD_GDCBX, DCB_ATTR_DCBX, pid, seq, flags); | 1295 | DCB_CMD_GDCBX, DCB_ATTR_DCBX, pid, seq, flags); |
@@ -1300,11 +1300,14 @@ static int dcbnl_getdcbx(struct net_device *netdev, struct nlattr **tb, | |||
1300 | static int dcbnl_setdcbx(struct net_device *netdev, struct nlattr **tb, | 1300 | static int dcbnl_setdcbx(struct net_device *netdev, struct nlattr **tb, |
1301 | u32 pid, u32 seq, u16 flags) | 1301 | u32 pid, u32 seq, u16 flags) |
1302 | { | 1302 | { |
1303 | int ret = -EINVAL; | 1303 | int ret; |
1304 | u8 value; | 1304 | u8 value; |
1305 | 1305 | ||
1306 | if (!tb[DCB_ATTR_DCBX] || !netdev->dcbnl_ops->setdcbx) | 1306 | if (!netdev->dcbnl_ops->setdcbx) |
1307 | return ret; | 1307 | return -EOPNOTSUPP; |
1308 | |||
1309 | if (!tb[DCB_ATTR_DCBX]) | ||
1310 | return -EINVAL; | ||
1308 | 1311 | ||
1309 | value = nla_get_u8(tb[DCB_ATTR_DCBX]); | 1312 | value = nla_get_u8(tb[DCB_ATTR_DCBX]); |
1310 | 1313 | ||
@@ -1323,23 +1326,23 @@ static int dcbnl_getfeatcfg(struct net_device *netdev, struct nlattr **tb, | |||
1323 | struct dcbmsg *dcb; | 1326 | struct dcbmsg *dcb; |
1324 | struct nlattr *data[DCB_FEATCFG_ATTR_MAX + 1], *nest; | 1327 | struct nlattr *data[DCB_FEATCFG_ATTR_MAX + 1], *nest; |
1325 | u8 value; | 1328 | u8 value; |
1326 | int ret = -EINVAL; | 1329 | int ret, i; |
1327 | int i; | ||
1328 | int getall = 0; | 1330 | int getall = 0; |
1329 | 1331 | ||
1330 | if (!tb[DCB_ATTR_FEATCFG] || !netdev->dcbnl_ops->getfeatcfg) | 1332 | if (!netdev->dcbnl_ops->getfeatcfg) |
1331 | return ret; | 1333 | return -EOPNOTSUPP; |
1334 | |||
1335 | if (!tb[DCB_ATTR_FEATCFG]) | ||
1336 | return -EINVAL; | ||
1332 | 1337 | ||
1333 | ret = nla_parse_nested(data, DCB_FEATCFG_ATTR_MAX, tb[DCB_ATTR_FEATCFG], | 1338 | ret = nla_parse_nested(data, DCB_FEATCFG_ATTR_MAX, tb[DCB_ATTR_FEATCFG], |
1334 | dcbnl_featcfg_nest); | 1339 | dcbnl_featcfg_nest); |
1335 | if (ret) { | 1340 | if (ret) |
1336 | ret = -EINVAL; | ||
1337 | goto err_out; | 1341 | goto err_out; |
1338 | } | ||
1339 | 1342 | ||
1340 | dcbnl_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | 1343 | dcbnl_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
1341 | if (!dcbnl_skb) { | 1344 | if (!dcbnl_skb) { |
1342 | ret = -EINVAL; | 1345 | ret = -ENOBUFS; |
1343 | goto err_out; | 1346 | goto err_out; |
1344 | } | 1347 | } |
1345 | 1348 | ||
@@ -1351,8 +1354,8 @@ static int dcbnl_getfeatcfg(struct net_device *netdev, struct nlattr **tb, | |||
1351 | 1354 | ||
1352 | nest = nla_nest_start(dcbnl_skb, DCB_ATTR_FEATCFG); | 1355 | nest = nla_nest_start(dcbnl_skb, DCB_ATTR_FEATCFG); |
1353 | if (!nest) { | 1356 | if (!nest) { |
1354 | ret = -EINVAL; | 1357 | ret = -EMSGSIZE; |
1355 | goto err; | 1358 | goto nla_put_failure; |
1356 | } | 1359 | } |
1357 | 1360 | ||
1358 | if (data[DCB_FEATCFG_ATTR_ALL]) | 1361 | if (data[DCB_FEATCFG_ATTR_ALL]) |
@@ -1363,30 +1366,22 @@ static int dcbnl_getfeatcfg(struct net_device *netdev, struct nlattr **tb, | |||
1363 | continue; | 1366 | continue; |
1364 | 1367 | ||
1365 | ret = netdev->dcbnl_ops->getfeatcfg(netdev, i, &value); | 1368 | ret = netdev->dcbnl_ops->getfeatcfg(netdev, i, &value); |
1366 | if (!ret) { | 1369 | if (!ret) |
1367 | ret = nla_put_u8(dcbnl_skb, i, value); | 1370 | ret = nla_put_u8(dcbnl_skb, i, value); |
1368 | 1371 | ||
1369 | if (ret) { | 1372 | if (ret) { |
1370 | nla_nest_cancel(dcbnl_skb, nest); | 1373 | nla_nest_cancel(dcbnl_skb, nest); |
1371 | ret = -EINVAL; | 1374 | goto nla_put_failure; |
1372 | goto err; | 1375 | } |
1373 | } | ||
1374 | } else | ||
1375 | goto err; | ||
1376 | } | 1376 | } |
1377 | nla_nest_end(dcbnl_skb, nest); | 1377 | nla_nest_end(dcbnl_skb, nest); |
1378 | 1378 | ||
1379 | nlmsg_end(dcbnl_skb, nlh); | 1379 | nlmsg_end(dcbnl_skb, nlh); |
1380 | 1380 | ||
1381 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); | 1381 | return rtnl_unicast(dcbnl_skb, &init_net, pid); |
1382 | if (ret) { | 1382 | nla_put_failure: |
1383 | ret = -EINVAL; | 1383 | nlmsg_cancel(dcbnl_skb, nlh); |
1384 | goto err_out; | ||
1385 | } | ||
1386 | |||
1387 | return 0; | ||
1388 | nlmsg_failure: | 1384 | nlmsg_failure: |
1389 | err: | ||
1390 | kfree_skb(dcbnl_skb); | 1385 | kfree_skb(dcbnl_skb); |
1391 | err_out: | 1386 | err_out: |
1392 | return ret; | 1387 | return ret; |
@@ -1396,20 +1391,20 @@ static int dcbnl_setfeatcfg(struct net_device *netdev, struct nlattr **tb, | |||
1396 | u32 pid, u32 seq, u16 flags) | 1391 | u32 pid, u32 seq, u16 flags) |
1397 | { | 1392 | { |
1398 | struct nlattr *data[DCB_FEATCFG_ATTR_MAX + 1]; | 1393 | struct nlattr *data[DCB_FEATCFG_ATTR_MAX + 1]; |
1399 | int ret = -EINVAL; | 1394 | int ret, i; |
1400 | u8 value; | 1395 | u8 value; |
1401 | int i; | ||
1402 | 1396 | ||
1403 | if (!tb[DCB_ATTR_FEATCFG] || !netdev->dcbnl_ops->setfeatcfg) | 1397 | if (!netdev->dcbnl_ops->setfeatcfg) |
1404 | return ret; | 1398 | return -ENOTSUPP; |
1399 | |||
1400 | if (!tb[DCB_ATTR_FEATCFG]) | ||
1401 | return -EINVAL; | ||
1405 | 1402 | ||
1406 | ret = nla_parse_nested(data, DCB_FEATCFG_ATTR_MAX, tb[DCB_ATTR_FEATCFG], | 1403 | ret = nla_parse_nested(data, DCB_FEATCFG_ATTR_MAX, tb[DCB_ATTR_FEATCFG], |
1407 | dcbnl_featcfg_nest); | 1404 | dcbnl_featcfg_nest); |
1408 | 1405 | ||
1409 | if (ret) { | 1406 | if (ret) |
1410 | ret = -EINVAL; | ||
1411 | goto err; | 1407 | goto err; |
1412 | } | ||
1413 | 1408 | ||
1414 | for (i = DCB_FEATCFG_ATTR_ALL+1; i <= DCB_FEATCFG_ATTR_MAX; i++) { | 1409 | for (i = DCB_FEATCFG_ATTR_ALL+1; i <= DCB_FEATCFG_ATTR_MAX; i++) { |
1415 | if (data[i] == NULL) | 1410 | if (data[i] == NULL) |
@@ -1420,14 +1415,12 @@ static int dcbnl_setfeatcfg(struct net_device *netdev, struct nlattr **tb, | |||
1420 | ret = netdev->dcbnl_ops->setfeatcfg(netdev, i, value); | 1415 | ret = netdev->dcbnl_ops->setfeatcfg(netdev, i, value); |
1421 | 1416 | ||
1422 | if (ret) | 1417 | if (ret) |
1423 | goto operr; | 1418 | goto err; |
1424 | } | 1419 | } |
1425 | |||
1426 | operr: | ||
1427 | ret = dcbnl_reply(!!ret, RTM_SETDCB, DCB_CMD_SFEATCFG, | ||
1428 | DCB_ATTR_FEATCFG, pid, seq, flags); | ||
1429 | |||
1430 | err: | 1420 | err: |
1421 | dcbnl_reply(ret, RTM_SETDCB, DCB_CMD_SFEATCFG, DCB_ATTR_FEATCFG, | ||
1422 | pid, seq, flags); | ||
1423 | |||
1431 | return ret; | 1424 | return ret; |
1432 | } | 1425 | } |
1433 | 1426 | ||