diff options
author | Santwona Behera <santwona.behera@sun.com> | 2008-07-02 06:47:41 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-02 06:47:41 -0400 |
commit | 0853ad66b14feb12acde7ac13b7c3b75770a0adc (patch) | |
tree | 0091f893aec69d708ec37ed9e56e1467fd5c95d8 /net | |
parent | ecbed6a41900126e7b9509e12a8d0cc22176e3eb (diff) |
netdev: Add support for rx flow hash configuration, using ethtool.
Added new interfaces to ethtool to configure receive network flow
distribution across multiple rx rings using hashing.
Signed-off-by: Santwona Behera <santwona.behera@sun.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/ethtool.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 0133b5ebd545..14ada537f895 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
@@ -209,6 +209,36 @@ static int ethtool_get_drvinfo(struct net_device *dev, void __user *useraddr) | |||
209 | return 0; | 209 | return 0; |
210 | } | 210 | } |
211 | 211 | ||
212 | static int ethtool_set_rxhash(struct net_device *dev, void __user *useraddr) | ||
213 | { | ||
214 | struct ethtool_rxnfc cmd; | ||
215 | |||
216 | if (!dev->ethtool_ops->set_rxhash) | ||
217 | return -EOPNOTSUPP; | ||
218 | |||
219 | if (copy_from_user(&cmd, useraddr, sizeof(cmd))) | ||
220 | return -EFAULT; | ||
221 | |||
222 | return dev->ethtool_ops->set_rxhash(dev, &cmd); | ||
223 | } | ||
224 | |||
225 | static int ethtool_get_rxhash(struct net_device *dev, void __user *useraddr) | ||
226 | { | ||
227 | struct ethtool_rxnfc info; | ||
228 | |||
229 | if (!dev->ethtool_ops->get_rxhash) | ||
230 | return -EOPNOTSUPP; | ||
231 | |||
232 | if (copy_from_user(&info, useraddr, sizeof(info))) | ||
233 | return -EFAULT; | ||
234 | |||
235 | dev->ethtool_ops->get_rxhash(dev, &info); | ||
236 | |||
237 | if (copy_to_user(useraddr, &info, sizeof(info))) | ||
238 | return -EFAULT; | ||
239 | return 0; | ||
240 | } | ||
241 | |||
212 | static int ethtool_get_regs(struct net_device *dev, char __user *useraddr) | 242 | static int ethtool_get_regs(struct net_device *dev, char __user *useraddr) |
213 | { | 243 | { |
214 | struct ethtool_regs regs; | 244 | struct ethtool_regs regs; |
@@ -826,6 +856,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) | |||
826 | case ETHTOOL_GGSO: | 856 | case ETHTOOL_GGSO: |
827 | case ETHTOOL_GFLAGS: | 857 | case ETHTOOL_GFLAGS: |
828 | case ETHTOOL_GPFLAGS: | 858 | case ETHTOOL_GPFLAGS: |
859 | case ETHTOOL_GRXFH: | ||
829 | break; | 860 | break; |
830 | default: | 861 | default: |
831 | if (!capable(CAP_NET_ADMIN)) | 862 | if (!capable(CAP_NET_ADMIN)) |
@@ -977,6 +1008,12 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) | |||
977 | rc = ethtool_set_value(dev, useraddr, | 1008 | rc = ethtool_set_value(dev, useraddr, |
978 | dev->ethtool_ops->set_priv_flags); | 1009 | dev->ethtool_ops->set_priv_flags); |
979 | break; | 1010 | break; |
1011 | case ETHTOOL_GRXFH: | ||
1012 | rc = ethtool_get_rxhash(dev, useraddr); | ||
1013 | break; | ||
1014 | case ETHTOOL_SRXFH: | ||
1015 | rc = ethtool_set_rxhash(dev, useraddr); | ||
1016 | break; | ||
980 | default: | 1017 | default: |
981 | rc = -EOPNOTSUPP; | 1018 | rc = -EOPNOTSUPP; |
982 | } | 1019 | } |