aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/uapi/linux/if_link.h1
-rw-r--r--net/core/rtnetlink.c16
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
902static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev) 904static 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
1324static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { 1328static 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
1861errout: 1873errout:
1862 if (status & DO_SETLINK_MODIFIED) { 1874 if (status & DO_SETLINK_MODIFIED) {
1863 if (status & DO_SETLINK_NOTIFY) 1875 if (status & DO_SETLINK_NOTIFY)