ethtool: Centralise validation of ETHTOOL_{G, S}RXFHINDIR parameters
Add a new ethtool operation (get_rxfh_indir_size) to get the indirectional table size. Use this to validate the user buffer size before calling get_rxfh_indir or set_rxfh_indir. Use get_rxnfc to get the number of RX rings, and validate the contents of the new indirection table before calling set_rxfh_indir. Remove this validation from drivers. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Acked-by: Dimitris Michailidis <dm@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
14596f7006
commit
7850f63f16
@@ -828,9 +828,13 @@ u32 ethtool_op_get_link(struct net_device *dev);
|
||||
* error code or zero.
|
||||
* @set_rx_ntuple: Set an RX n-tuple rule. Returns a negative error code
|
||||
* or zero.
|
||||
* @get_rxfh_indir_size: Get the size of the RX flow hash indirection table.
|
||||
* Returns zero if not supported for this specific device.
|
||||
* @get_rxfh_indir: Get the contents of the RX flow hash indirection table.
|
||||
* Will not be called if @get_rxfh_indir_size returns zero.
|
||||
* Returns a negative error code or zero.
|
||||
* @set_rxfh_indir: Set the contents of the RX flow hash indirection table.
|
||||
* Will not be called if @get_rxfh_indir_size returns zero.
|
||||
* Returns a negative error code or zero.
|
||||
* @get_channels: Get number of channels.
|
||||
* @set_channels: Set number of channels. Returns a negative error code or
|
||||
@@ -894,10 +898,9 @@ struct ethtool_ops {
|
||||
int (*reset)(struct net_device *, u32 *);
|
||||
int (*set_rx_ntuple)(struct net_device *,
|
||||
struct ethtool_rx_ntuple *);
|
||||
int (*get_rxfh_indir)(struct net_device *,
|
||||
struct ethtool_rxfh_indir *);
|
||||
int (*set_rxfh_indir)(struct net_device *,
|
||||
const struct ethtool_rxfh_indir *);
|
||||
u32 (*get_rxfh_indir_size)(struct net_device *);
|
||||
int (*get_rxfh_indir)(struct net_device *, u32 *);
|
||||
int (*set_rxfh_indir)(struct net_device *, const u32 *);
|
||||
void (*get_channels)(struct net_device *, struct ethtool_channels *);
|
||||
int (*set_channels)(struct net_device *, struct ethtool_channels *);
|
||||
int (*get_dump_flag)(struct net_device *, struct ethtool_dump *);
|
||||
|
Reference in New Issue
Block a user