Skip to content

Commit 9eb03bb

Browse files
Yinjun Zhangkuba-moo
authored andcommitted
nfp: add ethtool flow steering callbacks
This is the first part to implement flow steering. The communication between ethtool and driver is done. User can use following commands to display and set flows: ethtool -n <netdev> ethtool -N <netdev> flow-type ... Signed-off-by: Yinjun Zhang <yinjun.zhang@corigine.com> Signed-off-by: Louis Peens <louis.peens@corigine.com> Reviewed-by: Simon Horman <horms@kernel.org> Link: https://lore.kernel.org/r/20231117071114.10667-2-louis.peens@corigine.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 21612f5 commit 9eb03bb

File tree

4 files changed

+430
-0
lines changed

4 files changed

+430
-0
lines changed

drivers/net/ethernet/netronome/nfp/nfp_net.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,9 @@ struct nfp_net_dp {
621621
* @mbox_amsg.lock: Protect message list
622622
* @mbox_amsg.list: List of message to process
623623
* @mbox_amsg.work: Work to process message asynchronously
624+
* @fs: Flow steering
625+
* @fs.count: Flow count
626+
* @fs.list: List of flows
624627
* @app_priv: APP private data for this vNIC
625628
*/
626629
struct nfp_net {
@@ -728,9 +731,39 @@ struct nfp_net {
728731
struct work_struct work;
729732
} mbox_amsg;
730733

734+
struct {
735+
u16 count;
736+
struct list_head list;
737+
} fs;
738+
731739
void *app_priv;
732740
};
733741

742+
struct nfp_fs_entry {
743+
struct list_head node;
744+
u32 flow_type;
745+
u32 loc;
746+
struct {
747+
union {
748+
struct {
749+
__be32 sip4;
750+
__be32 dip4;
751+
};
752+
struct {
753+
__be32 sip6[4];
754+
__be32 dip6[4];
755+
};
756+
};
757+
union {
758+
__be16 l3_proto;
759+
u8 l4_proto;
760+
};
761+
__be16 sport;
762+
__be16 dport;
763+
} key, msk;
764+
u64 action;
765+
};
766+
734767
struct nfp_mbox_amsg_entry {
735768
struct list_head list;
736769
int (*cfg)(struct nfp_net *nn, struct nfp_mbox_amsg_entry *entry);
@@ -987,6 +1020,9 @@ struct nfp_net_dp *nfp_net_clone_dp(struct nfp_net *nn);
9871020
int nfp_net_ring_reconfig(struct nfp_net *nn, struct nfp_net_dp *new,
9881021
struct netlink_ext_ack *extack);
9891022

1023+
int nfp_net_fs_add_hw(struct nfp_net *nn, struct nfp_fs_entry *entry);
1024+
int nfp_net_fs_del_hw(struct nfp_net *nn, struct nfp_fs_entry *entry);
1025+
9901026
#ifdef CONFIG_NFP_DEBUG
9911027
void nfp_net_debugfs_create(void);
9921028
void nfp_net_debugfs_destroy(void);

drivers/net/ethernet/netronome/nfp/nfp_net_common.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,6 +1763,27 @@ nfp_net_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, u16 vid)
17631763
return nfp_net_mbox_reconfig_and_unlock(nn, cmd);
17641764
}
17651765

1766+
int nfp_net_fs_add_hw(struct nfp_net *nn, struct nfp_fs_entry *entry)
1767+
{
1768+
return -EOPNOTSUPP;
1769+
}
1770+
1771+
int nfp_net_fs_del_hw(struct nfp_net *nn, struct nfp_fs_entry *entry)
1772+
{
1773+
return -EOPNOTSUPP;
1774+
}
1775+
1776+
static void nfp_net_fs_clean(struct nfp_net *nn)
1777+
{
1778+
struct nfp_fs_entry *entry, *tmp;
1779+
1780+
list_for_each_entry_safe(entry, tmp, &nn->fs.list, node) {
1781+
nfp_net_fs_del_hw(nn, entry);
1782+
list_del(&entry->node);
1783+
kfree(entry);
1784+
}
1785+
}
1786+
17661787
static void nfp_net_stat64(struct net_device *netdev,
17671788
struct rtnl_link_stats64 *stats)
17681789
{
@@ -2740,6 +2761,8 @@ int nfp_net_init(struct nfp_net *nn)
27402761
INIT_LIST_HEAD(&nn->mbox_amsg.list);
27412762
INIT_WORK(&nn->mbox_amsg.work, nfp_net_mbox_amsg_work);
27422763

2764+
INIT_LIST_HEAD(&nn->fs.list);
2765+
27432766
return register_netdev(nn->dp.netdev);
27442767

27452768
err_clean_mbox:
@@ -2759,6 +2782,7 @@ void nfp_net_clean(struct nfp_net *nn)
27592782
unregister_netdev(nn->dp.netdev);
27602783
nfp_net_ipsec_clean(nn);
27612784
nfp_ccm_mbox_clean(nn);
2785+
nfp_net_fs_clean(nn);
27622786
flush_work(&nn->mbox_amsg.work);
27632787
nfp_net_reconfig_wait_posted(nn);
27642788
}

drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@
269269
#define NFP_NET_CFG_CTRL_IPSEC (0x1 << 1) /* IPsec offload */
270270
#define NFP_NET_CFG_CTRL_MCAST_FILTER (0x1 << 2) /* Multicast Filter */
271271
#define NFP_NET_CFG_CTRL_FREELIST_EN (0x1 << 6) /* Freelist enable flag bit */
272+
#define NFP_NET_CFG_CTRL_FLOW_STEER (0x1 << 8) /* Flow steering */
272273

273274
#define NFP_NET_CFG_CAP_WORD1 0x00a4
274275

0 commit comments

Comments
 (0)