diff options
author | Rony Efraim <ronye@mellanox.com> | 2013-06-13 06:19:10 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-06-13 20:51:04 -0400 |
commit | 1d8faf48c74b8329a0322dc4b2a2030ae5003c86 (patch) | |
tree | 63471c7ee9379f70e30b27b82cf6f155683b4468 /net/core | |
parent | 3dc6475c0c9e55ac7f053ad6b8b398e779954545 (diff) |
net/core: Add VF link state control
Add netlink directives and ndo entry to allow for controling
VF link, which can be in one of three states:
Auto - VF link state reflects the PF link state (default)
Up - VF link state is up, traffic from VF to VF works even if
the actual PF link is down
Down - VF link state is down, no traffic from/to this VF, can be of
use while configuring the VF
Signed-off-by: Rony Efraim <ronye@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/rtnetlink.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 49c14451d8ab..9007533867f0 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -947,6 +947,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
947 | struct ifla_vf_vlan vf_vlan; | 947 | struct ifla_vf_vlan vf_vlan; |
948 | struct ifla_vf_tx_rate vf_tx_rate; | 948 | struct ifla_vf_tx_rate vf_tx_rate; |
949 | struct ifla_vf_spoofchk vf_spoofchk; | 949 | struct ifla_vf_spoofchk vf_spoofchk; |
950 | struct ifla_vf_link_state vf_linkstate; | ||
950 | 951 | ||
951 | /* | 952 | /* |
952 | * Not all SR-IOV capable drivers support the | 953 | * Not all SR-IOV capable drivers support the |
@@ -956,18 +957,24 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
956 | */ | 957 | */ |
957 | ivi.spoofchk = -1; | 958 | ivi.spoofchk = -1; |
958 | memset(ivi.mac, 0, sizeof(ivi.mac)); | 959 | memset(ivi.mac, 0, sizeof(ivi.mac)); |
960 | /* The default value for VF link state is "auto" | ||
961 | * IFLA_VF_LINK_STATE_AUTO which equals zero | ||
962 | */ | ||
963 | ivi.linkstate = 0; | ||
959 | if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi)) | 964 | if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi)) |
960 | break; | 965 | break; |
961 | vf_mac.vf = | 966 | vf_mac.vf = |
962 | vf_vlan.vf = | 967 | vf_vlan.vf = |
963 | vf_tx_rate.vf = | 968 | vf_tx_rate.vf = |
964 | vf_spoofchk.vf = ivi.vf; | 969 | vf_spoofchk.vf = |
970 | vf_linkstate.vf = ivi.vf; | ||
965 | 971 | ||
966 | memcpy(vf_mac.mac, ivi.mac, sizeof(ivi.mac)); | 972 | memcpy(vf_mac.mac, ivi.mac, sizeof(ivi.mac)); |
967 | vf_vlan.vlan = ivi.vlan; | 973 | vf_vlan.vlan = ivi.vlan; |
968 | vf_vlan.qos = ivi.qos; | 974 | vf_vlan.qos = ivi.qos; |
969 | vf_tx_rate.rate = ivi.tx_rate; | 975 | vf_tx_rate.rate = ivi.tx_rate; |
970 | vf_spoofchk.setting = ivi.spoofchk; | 976 | vf_spoofchk.setting = ivi.spoofchk; |
977 | vf_linkstate.link_state = ivi.linkstate; | ||
971 | vf = nla_nest_start(skb, IFLA_VF_INFO); | 978 | vf = nla_nest_start(skb, IFLA_VF_INFO); |
972 | if (!vf) { | 979 | if (!vf) { |
973 | nla_nest_cancel(skb, vfinfo); | 980 | nla_nest_cancel(skb, vfinfo); |
@@ -978,7 +985,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
978 | nla_put(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate), | 985 | nla_put(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate), |
979 | &vf_tx_rate) || | 986 | &vf_tx_rate) || |
980 | nla_put(skb, IFLA_VF_SPOOFCHK, sizeof(vf_spoofchk), | 987 | nla_put(skb, IFLA_VF_SPOOFCHK, sizeof(vf_spoofchk), |
981 | &vf_spoofchk)) | 988 | &vf_spoofchk) || |
989 | nla_put(skb, IFLA_VF_LINK_STATE, sizeof(vf_linkstate), | ||
990 | &vf_linkstate)) | ||
982 | goto nla_put_failure; | 991 | goto nla_put_failure; |
983 | nla_nest_end(skb, vf); | 992 | nla_nest_end(skb, vf); |
984 | } | 993 | } |
@@ -1238,6 +1247,15 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr *attr) | |||
1238 | ivs->setting); | 1247 | ivs->setting); |
1239 | break; | 1248 | break; |
1240 | } | 1249 | } |
1250 | case IFLA_VF_LINK_STATE: { | ||
1251 | struct ifla_vf_link_state *ivl; | ||
1252 | ivl = nla_data(vf); | ||
1253 | err = -EOPNOTSUPP; | ||
1254 | if (ops->ndo_set_vf_link_state) | ||
1255 | err = ops->ndo_set_vf_link_state(dev, ivl->vf, | ||
1256 | ivl->link_state); | ||
1257 | break; | ||
1258 | } | ||
1241 | default: | 1259 | default: |
1242 | err = -EINVAL; | 1260 | err = -EINVAL; |
1243 | break; | 1261 | break; |