diff options
| author | Vinicius Costa Gomes <vinicius.gomes@intel.com> | 2018-04-10 20:49:58 +0300 | 
|---|---|---|
| committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2018-04-25 21:03:05 +0300 | 
| commit | f8f3d34e5470c48a10c27c4f6f65e149e10d04ec (patch) | |
| tree | 269b005c3317d38de580395d99d73240142c0949 /drivers/net/ethernet/intel/igb/igb_main.c | |
| parent | b4a38d4276e1c3ca46141d6424a8da86bc5b74b0 (diff) | |
| download | linux-f8f3d34e5470c48a10c27c4f6f65e149e10d04ec.tar.xz | |
igb: Add the skeletons for tc-flower offloading
This adds basic functions needed to implement offloading for filters
created by tc-flower.
Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 66 | 
1 files changed, 66 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 9a5c2dc3cf5a..26b0f0efc97e 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -36,6 +36,7 @@  #include <net/checksum.h>  #include <net/ip6_checksum.h>  #include <net/pkt_sched.h> +#include <net/pkt_cls.h>  #include <linux/net_tstamp.h>  #include <linux/mii.h>  #include <linux/ethtool.h> @@ -2513,6 +2514,69 @@ static int igb_offload_cbs(struct igb_adapter *adapter,  	return 0;  } +static int igb_configure_clsflower(struct igb_adapter *adapter, +				   struct tc_cls_flower_offload *cls_flower) +{ +	return -EOPNOTSUPP; +} + +static int igb_delete_clsflower(struct igb_adapter *adapter, +				struct tc_cls_flower_offload *cls_flower) +{ +	return -EOPNOTSUPP; +} + +static int igb_setup_tc_cls_flower(struct igb_adapter *adapter, +				   struct tc_cls_flower_offload *cls_flower) +{ +	switch (cls_flower->command) { +	case TC_CLSFLOWER_REPLACE: +		return igb_configure_clsflower(adapter, cls_flower); +	case TC_CLSFLOWER_DESTROY: +		return igb_delete_clsflower(adapter, cls_flower); +	case TC_CLSFLOWER_STATS: +		return -EOPNOTSUPP; +	default: +		return -EINVAL; +	} +} + +static int igb_setup_tc_block_cb(enum tc_setup_type type, void *type_data, +				 void *cb_priv) +{ +	struct igb_adapter *adapter = cb_priv; + +	if (!tc_cls_can_offload_and_chain0(adapter->netdev, type_data)) +		return -EOPNOTSUPP; + +	switch (type) { +	case TC_SETUP_CLSFLOWER: +		return igb_setup_tc_cls_flower(adapter, type_data); + +	default: +		return -EOPNOTSUPP; +	} +} + +static int igb_setup_tc_block(struct igb_adapter *adapter, +			      struct tc_block_offload *f) +{ +	if (f->binder_type != TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS) +		return -EOPNOTSUPP; + +	switch (f->command) { +	case TC_BLOCK_BIND: +		return tcf_block_cb_register(f->block, igb_setup_tc_block_cb, +					     adapter, adapter); +	case TC_BLOCK_UNBIND: +		tcf_block_cb_unregister(f->block, igb_setup_tc_block_cb, +					adapter); +		return 0; +	default: +		return -EOPNOTSUPP; +	} +} +  static int igb_setup_tc(struct net_device *dev, enum tc_setup_type type,  			void *type_data)  { @@ -2521,6 +2585,8 @@ static int igb_setup_tc(struct net_device *dev, enum tc_setup_type type,  	switch (type) {  	case TC_SETUP_QDISC_CBS:  		return igb_offload_cbs(adapter, type_data); +	case TC_SETUP_BLOCK: +		return igb_setup_tc_block(adapter, type_data);  	default:  		return -EOPNOTSUPP;  | 
