diff options
| -rw-r--r-- | include/uapi/linux/if_link.h | 1 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 16 |
2 files changed, 15 insertions, 2 deletions
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index 2c7e8e3d3981..24d68b797c59 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h | |||
| @@ -148,6 +148,7 @@ enum { | |||
| 148 | IFLA_PHYS_SWITCH_ID, | 148 | IFLA_PHYS_SWITCH_ID, |
| 149 | IFLA_LINK_NETNSID, | 149 | IFLA_LINK_NETNSID, |
| 150 | IFLA_PHYS_PORT_NAME, | 150 | IFLA_PHYS_PORT_NAME, |
| 151 | IFLA_PROTO_DOWN, | ||
| 151 | __IFLA_MAX | 152 | __IFLA_MAX |
| 152 | }; | 153 | }; |
| 153 | 154 | ||
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 9e433d58d265..03d61b54aac0 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -896,7 +896,9 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, | |||
| 896 | + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ | 896 | + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ |
| 897 | + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ | 897 | + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ |
| 898 | + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ | 898 | + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ |
| 899 | + nla_total_size(MAX_PHYS_ITEM_ID_LEN); /* IFLA_PHYS_SWITCH_ID */ | 899 | + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */ |
| 900 | + nla_total_size(1); /* IFLA_PROTO_DOWN */ | ||
| 901 | |||
| 900 | } | 902 | } |
| 901 | 903 | ||
| 902 | static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev) | 904 | static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev) |
| @@ -1082,7 +1084,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
| 1082 | (dev->ifalias && | 1084 | (dev->ifalias && |
| 1083 | nla_put_string(skb, IFLA_IFALIAS, dev->ifalias)) || | 1085 | nla_put_string(skb, IFLA_IFALIAS, dev->ifalias)) || |
| 1084 | nla_put_u32(skb, IFLA_CARRIER_CHANGES, | 1086 | nla_put_u32(skb, IFLA_CARRIER_CHANGES, |
| 1085 | atomic_read(&dev->carrier_changes))) | 1087 | atomic_read(&dev->carrier_changes)) || |
| 1088 | nla_put_u8(skb, IFLA_PROTO_DOWN, dev->proto_down)) | ||
| 1086 | goto nla_put_failure; | 1089 | goto nla_put_failure; |
| 1087 | 1090 | ||
| 1088 | if (1) { | 1091 | if (1) { |
| @@ -1319,6 +1322,7 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = { | |||
| 1319 | [IFLA_CARRIER_CHANGES] = { .type = NLA_U32 }, /* ignored */ | 1322 | [IFLA_CARRIER_CHANGES] = { .type = NLA_U32 }, /* ignored */ |
| 1320 | [IFLA_PHYS_SWITCH_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN }, | 1323 | [IFLA_PHYS_SWITCH_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN }, |
| 1321 | [IFLA_LINK_NETNSID] = { .type = NLA_S32 }, | 1324 | [IFLA_LINK_NETNSID] = { .type = NLA_S32 }, |
| 1325 | [IFLA_PROTO_DOWN] = { .type = NLA_U8 }, | ||
| 1322 | }; | 1326 | }; |
| 1323 | 1327 | ||
| 1324 | static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { | 1328 | static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { |
| @@ -1858,6 +1862,14 @@ static int do_setlink(const struct sk_buff *skb, | |||
| 1858 | } | 1862 | } |
| 1859 | err = 0; | 1863 | err = 0; |
| 1860 | 1864 | ||
| 1865 | if (tb[IFLA_PROTO_DOWN]) { | ||
| 1866 | err = dev_change_proto_down(dev, | ||
| 1867 | nla_get_u8(tb[IFLA_PROTO_DOWN])); | ||
| 1868 | if (err) | ||
| 1869 | goto errout; | ||
| 1870 | status |= DO_SETLINK_NOTIFY; | ||
| 1871 | } | ||
| 1872 | |||
| 1861 | errout: | 1873 | errout: |
| 1862 | if (status & DO_SETLINK_MODIFIED) { | 1874 | if (status & DO_SETLINK_MODIFIED) { |
| 1863 | if (status & DO_SETLINK_NOTIFY) | 1875 | if (status & DO_SETLINK_NOTIFY) |
