rtnetlink.c (1397e171f143878dd16ad5f8c99f7b9440cc8911) rtnetlink.c (13ad17745c2cbd437d9e24b2d97393e0be11c439)
1/*
2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
5 *
6 * Routing netlink socket interface: protocol independent part.
7 *
8 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>

--- 854 unchanged lines hidden (view full) ---

863 ifm->ifi_change = change;
864
865 NLA_PUT_STRING(skb, IFLA_IFNAME, dev->name);
866 NLA_PUT_U32(skb, IFLA_TXQLEN, dev->tx_queue_len);
867 NLA_PUT_U8(skb, IFLA_OPERSTATE,
868 netif_running(dev) ? dev->operstate : IF_OPER_DOWN);
869 NLA_PUT_U8(skb, IFLA_LINKMODE, dev->link_mode);
870 NLA_PUT_U32(skb, IFLA_MTU, dev->mtu);
1/*
2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
5 *
6 * Routing netlink socket interface: protocol independent part.
7 *
8 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>

--- 854 unchanged lines hidden (view full) ---

863 ifm->ifi_change = change;
864
865 NLA_PUT_STRING(skb, IFLA_IFNAME, dev->name);
866 NLA_PUT_U32(skb, IFLA_TXQLEN, dev->tx_queue_len);
867 NLA_PUT_U8(skb, IFLA_OPERSTATE,
868 netif_running(dev) ? dev->operstate : IF_OPER_DOWN);
869 NLA_PUT_U8(skb, IFLA_LINKMODE, dev->link_mode);
870 NLA_PUT_U32(skb, IFLA_MTU, dev->mtu);
871 NLA_PUT_U32(skb, IFLA_GROUP, dev->group);
872
873 if (dev->ifindex != dev->iflink)
874 NLA_PUT_U32(skb, IFLA_LINK, dev->iflink);
875
876 if (dev->master)
877 NLA_PUT_U32(skb, IFLA_MASTER, dev->master->ifindex);
878
879 if (dev->qdisc)

--- 380 unchanged lines hidden (view full) ---

1260
1261 if (tb[IFLA_MTU]) {
1262 err = dev_set_mtu(dev, nla_get_u32(tb[IFLA_MTU]));
1263 if (err < 0)
1264 goto errout;
1265 modified = 1;
1266 }
1267
871
872 if (dev->ifindex != dev->iflink)
873 NLA_PUT_U32(skb, IFLA_LINK, dev->iflink);
874
875 if (dev->master)
876 NLA_PUT_U32(skb, IFLA_MASTER, dev->master->ifindex);
877
878 if (dev->qdisc)

--- 380 unchanged lines hidden (view full) ---

1259
1260 if (tb[IFLA_MTU]) {
1261 err = dev_set_mtu(dev, nla_get_u32(tb[IFLA_MTU]));
1262 if (err < 0)
1263 goto errout;
1264 modified = 1;
1265 }
1266
1268 if (tb[IFLA_GROUP]) {
1269 dev_set_group(dev, nla_get_u32(tb[IFLA_GROUP]));
1270 modified = 1;
1271 }
1272
1273 /*
1274 * Interface selected by interface index but interface
1275 * name provided implies that a name change has been
1276 * requested.
1277 */
1278 if (ifm->ifi_index > 0 && ifname[0]) {
1279 err = dev_change_name(dev, ifname);
1280 if (err < 0)

--- 261 unchanged lines hidden (view full) ---

1542 memcpy(dev->broadcast, nla_data(tb[IFLA_BROADCAST]),
1543 nla_len(tb[IFLA_BROADCAST]));
1544 if (tb[IFLA_TXQLEN])
1545 dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]);
1546 if (tb[IFLA_OPERSTATE])
1547 set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE]));
1548 if (tb[IFLA_LINKMODE])
1549 dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]);
1267 /*
1268 * Interface selected by interface index but interface
1269 * name provided implies that a name change has been
1270 * requested.
1271 */
1272 if (ifm->ifi_index > 0 && ifname[0]) {
1273 err = dev_change_name(dev, ifname);
1274 if (err < 0)

--- 261 unchanged lines hidden (view full) ---

1536 memcpy(dev->broadcast, nla_data(tb[IFLA_BROADCAST]),
1537 nla_len(tb[IFLA_BROADCAST]));
1538 if (tb[IFLA_TXQLEN])
1539 dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]);
1540 if (tb[IFLA_OPERSTATE])
1541 set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE]));
1542 if (tb[IFLA_LINKMODE])
1543 dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]);
1550 if (tb[IFLA_GROUP])
1551 dev_set_group(dev, nla_get_u32(tb[IFLA_GROUP]));
1552
1553 return dev;
1554
1555err_free:
1556 free_netdev(dev);
1557err:
1558 return ERR_PTR(err);
1559}
1560EXPORT_SYMBOL(rtnl_create_link);
1561
1544
1545 return dev;
1546
1547err_free:
1548 free_netdev(dev);
1549err:
1550 return ERR_PTR(err);
1551}
1552EXPORT_SYMBOL(rtnl_create_link);
1553
1562static int rtnl_group_changelink(struct net *net, int group,
1563 struct ifinfomsg *ifm,
1564 struct nlattr **tb)
1565{
1566 struct net_device *dev;
1567 int err;
1568
1569 for_each_netdev(net, dev) {
1570 if (dev->group == group) {
1571 err = do_setlink(dev, ifm, tb, NULL, 0);
1572 if (err < 0)
1573 return err;
1574 }
1575 }
1576
1577 return 0;
1578}
1579
1580static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1581{
1582 struct net *net = sock_net(skb->sk);
1583 const struct rtnl_link_ops *ops;
1584 struct net_device *dev;
1585 struct ifinfomsg *ifm;
1586 char kind[MODULE_NAME_LEN];
1587 char ifname[IFNAMSIZ];

--- 11 unchanged lines hidden (view full) ---

1599 if (tb[IFLA_IFNAME])
1600 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
1601 else
1602 ifname[0] = '\0';
1603
1604 ifm = nlmsg_data(nlh);
1605 if (ifm->ifi_index > 0)
1606 dev = __dev_get_by_index(net, ifm->ifi_index);
1554static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1555{
1556 struct net *net = sock_net(skb->sk);
1557 const struct rtnl_link_ops *ops;
1558 struct net_device *dev;
1559 struct ifinfomsg *ifm;
1560 char kind[MODULE_NAME_LEN];
1561 char ifname[IFNAMSIZ];

--- 11 unchanged lines hidden (view full) ---

1573 if (tb[IFLA_IFNAME])
1574 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
1575 else
1576 ifname[0] = '\0';
1577
1578 ifm = nlmsg_data(nlh);
1579 if (ifm->ifi_index > 0)
1580 dev = __dev_get_by_index(net, ifm->ifi_index);
1607 else {
1608 if (ifname[0])
1609 dev = __dev_get_by_name(net, ifname);
1610 else
1611 dev = NULL;
1612 }
1581 else if (ifname[0])
1582 dev = __dev_get_by_name(net, ifname);
1583 else
1584 dev = NULL;
1613
1614 err = validate_linkmsg(dev, tb);
1615 if (err < 0)
1616 return err;
1617
1618 if (tb[IFLA_LINKINFO]) {
1619 err = nla_parse_nested(linkinfo, IFLA_INFO_MAX,
1620 tb[IFLA_LINKINFO], ifla_info_policy);

--- 47 unchanged lines hidden (view full) ---

1668 if (err < 0)
1669 return err;
1670 modified = 1;
1671 }
1672
1673 return do_setlink(dev, ifm, tb, ifname, modified);
1674 }
1675
1585
1586 err = validate_linkmsg(dev, tb);
1587 if (err < 0)
1588 return err;
1589
1590 if (tb[IFLA_LINKINFO]) {
1591 err = nla_parse_nested(linkinfo, IFLA_INFO_MAX,
1592 tb[IFLA_LINKINFO], ifla_info_policy);

--- 47 unchanged lines hidden (view full) ---

1640 if (err < 0)
1641 return err;
1642 modified = 1;
1643 }
1644
1645 return do_setlink(dev, ifm, tb, ifname, modified);
1646 }
1647
1676 if (!(nlh->nlmsg_flags & NLM_F_CREATE)) {
1677 if (ifm->ifi_index == 0 && tb[IFLA_GROUP])
1678 return rtnl_group_changelink(net,
1679 nla_get_u32(tb[IFLA_GROUP]),
1680 ifm, tb);
1648 if (!(nlh->nlmsg_flags & NLM_F_CREATE))
1681 return -ENODEV;
1649 return -ENODEV;
1682 }
1683
1684 if (ifm->ifi_index)
1685 return -EOPNOTSUPP;
1686 if (tb[IFLA_MAP] || tb[IFLA_MASTER] || tb[IFLA_PROTINFO])
1687 return -EOPNOTSUPP;
1688
1689 if (!ops) {
1690#ifdef CONFIG_MODULES

--- 8 unchanged lines hidden (view full) ---

1699#endif
1700 return -EOPNOTSUPP;
1701 }
1702
1703 if (!ifname[0])
1704 snprintf(ifname, IFNAMSIZ, "%s%%d", ops->kind);
1705
1706 dest_net = rtnl_link_get_net(net, tb);
1650
1651 if (ifm->ifi_index)
1652 return -EOPNOTSUPP;
1653 if (tb[IFLA_MAP] || tb[IFLA_MASTER] || tb[IFLA_PROTINFO])
1654 return -EOPNOTSUPP;
1655
1656 if (!ops) {
1657#ifdef CONFIG_MODULES

--- 8 unchanged lines hidden (view full) ---

1666#endif
1667 return -EOPNOTSUPP;
1668 }
1669
1670 if (!ifname[0])
1671 snprintf(ifname, IFNAMSIZ, "%s%%d", ops->kind);
1672
1673 dest_net = rtnl_link_get_net(net, tb);
1674 if (IS_ERR(dest_net))
1675 return PTR_ERR(dest_net);
1676
1707 dev = rtnl_create_link(net, dest_net, ifname, ops, tb);
1708
1709 if (IS_ERR(dev))
1710 err = PTR_ERR(dev);
1711 else if (ops->newlink)
1712 err = ops->newlink(net, dev, tb, data);
1713 else
1714 err = register_netdevice(dev);

--- 267 unchanged lines hidden ---
1677 dev = rtnl_create_link(net, dest_net, ifname, ops, tb);
1678
1679 if (IS_ERR(dev))
1680 err = PTR_ERR(dev);
1681 else if (ops->newlink)
1682 err = ops->newlink(net, dev, tb, data);
1683 else
1684 err = register_netdevice(dev);

--- 267 unchanged lines hidden ---