Skip to content

Commit

Permalink
i40e: Add macvlan support on i40e
Browse files Browse the repository at this point in the history
This patch enables macvlan offloads for i40e. The idea is to use
channels as macvlan interfaces. The channels are VSIs of
type VMDQ. When the first macvlan is created, the maximum number of
channels possible are created. From then on, as a macvlan interface
is created, a macvlan filter is added to these already created
channels (VSIs).

This patch utilizes subordinate device traffic classes to make queue
groups(channels) available for an upper device like a macvlan.

Steps to configure macvlan offloads:
1. ethtool -K ethx l2-fwd-offload on
2. ip link add link ethx name macvlan1 type macvlan
3. ip addr add <address> dev macvlan1
4. ip link set macvlan1 up

Signed-off-by: Harshitha Ramamurthy <harshitha.ramamurthy@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
  • Loading branch information
Harshitha Ramamurthy authored and Jeff Kirsher committed Jun 28, 2019
1 parent 1e1b0c6 commit 1d8d80b
Show file tree
Hide file tree
Showing 2 changed files with 522 additions and 2 deletions.
27 changes: 27 additions & 0 deletions drivers/net/ethernet/intel/i40e/i40e.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <net/ip6_checksum.h>
#include <linux/ethtool.h>
#include <linux/if_vlan.h>
#include <linux/if_macvlan.h>
#include <linux/if_bridge.h>
#include <linux/clocksource.h>
#include <linux/net_tstamp.h>
Expand Down Expand Up @@ -412,6 +413,11 @@ struct i40e_flex_pit {
u8 pit_index;
};

struct i40e_fwd_adapter {
struct net_device *netdev;
int bit_no;
};

struct i40e_channel {
struct list_head list;
bool initialized;
Expand All @@ -426,11 +432,25 @@ struct i40e_channel {
struct i40e_aqc_vsi_properties_data info;

u64 max_tx_rate;
struct i40e_fwd_adapter *fwd;

/* track this channel belongs to which VSI */
struct i40e_vsi *parent_vsi;
};

static inline bool i40e_is_channel_macvlan(struct i40e_channel *ch)
{
return !!ch->fwd;
}

static inline u8 *i40e_channel_mac(struct i40e_channel *ch)
{
if (i40e_is_channel_macvlan(ch))
return ch->fwd->netdev->dev_addr;
else
return NULL;
}

/* struct that defines the Ethernet device */
struct i40e_pf {
struct pci_dev *pdev;
Expand Down Expand Up @@ -813,6 +833,13 @@ struct i40e_vsi {
struct list_head ch_list;
u16 tc_seid_map[I40E_MAX_TRAFFIC_CLASS];

/* macvlan fields */
#define I40E_MAX_MACVLANS 128 /* Max HW vectors - 1 on FVL */
#define I40E_MIN_MACVLAN_VECTORS 2 /* Min vectors to enable macvlans */
DECLARE_BITMAP(fwd_bitmask, I40E_MAX_MACVLANS);
struct list_head macvlan_list;
int macvlan_cnt;

void *priv; /* client driver data reference. */

/* VSI specific handlers */
Expand Down
Loading

0 comments on commit 1d8d80b

Please sign in to comment.