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 --- |