[v3] net/ixgbe: add support for VF MAC address add and remove

Message ID 20191224032357.3317-1-guinanx.sun@intel.com (mailing list archive)
State Accepted, archived
Delegated to: xiaolong ye
Headers
Series [v3] net/ixgbe: add support for VF MAC address add and remove |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-nxp-Performance success Performance Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/travis-robot warning Travis build: failed
ci/iol-testing success Testing PASS
ci/Intel-compilation success Compilation OK

Commit Message

Guinan Sun Dec. 24, 2019, 3:23 a.m. UTC
Ixgbe PMD pf host code needs to support ixgbevf mac address
add and remove. For this purpose, a response was added
between pf and vf to update the mac address.

Signed-off-by: Guinan Sun <guinanx.sun@intel.com>
---
v3:
* Changed from `RTE_LOG` to `PMD_DRV_LOG`.
v2:
* Changed the title of commit message.
* Checked null in front of valid ether addr check.
---
 drivers/net/ixgbe/ixgbe_ethdev.h |  1 +
 drivers/net/ixgbe/ixgbe_pf.c     | 35 ++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)
  

Comments

Xiaolong Ye Dec. 24, 2019, 6:06 a.m. UTC | #1
On 12/24, Guinan Sun wrote:
>Ixgbe PMD pf host code needs to support ixgbevf mac address
>add and remove. For this purpose, a response was added
>between pf and vf to update the mac address.
>
>Signed-off-by: Guinan Sun <guinanx.sun@intel.com>
>---
>v3:
>* Changed from `RTE_LOG` to `PMD_DRV_LOG`.
>v2:
>* Changed the title of commit message.
>* Checked null in front of valid ether addr check.
>---
> drivers/net/ixgbe/ixgbe_ethdev.h |  1 +
> drivers/net/ixgbe/ixgbe_pf.c     | 35 ++++++++++++++++++++++++++++++++
> 2 files changed, 36 insertions(+)
>
>diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
>index 76a1b9d18..e1cd8fd16 100644
>--- a/drivers/net/ixgbe/ixgbe_ethdev.h
>+++ b/drivers/net/ixgbe/ixgbe_ethdev.h
>@@ -270,6 +270,7 @@ struct ixgbe_vf_info {
> 	uint8_t api_version;
> 	uint16_t switch_domain_id;
> 	uint16_t xcast_mode;
>+	uint16_t mac_count;
> };
> 
> /*
>diff --git a/drivers/net/ixgbe/ixgbe_pf.c b/drivers/net/ixgbe/ixgbe_pf.c
>index d0d85e138..c93c0fdc2 100644
>--- a/drivers/net/ixgbe/ixgbe_pf.c
>+++ b/drivers/net/ixgbe/ixgbe_pf.c
>@@ -748,6 +748,37 @@ ixgbe_set_vf_mc_promisc(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf)
> 	return 0;
> }
> 
>+static int
>+ixgbe_set_vf_macvlan_msg(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf)
>+{
>+	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>+	struct ixgbe_vf_info *vf_info =
>+		*(IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private));
>+	uint8_t *new_mac = (uint8_t *)(&msgbuf[1]);
>+	int index = (msgbuf[0] & IXGBE_VT_MSGINFO_MASK) >>
>+		    IXGBE_VT_MSGINFO_SHIFT;
>+
>+	if (index) {
>+		if (new_mac == NULL)
>+			return -1;
>+
>+		if (!rte_is_valid_assigned_ether_addr(
>+			(struct rte_ether_addr *)new_mac)) {
>+			PMD_DRV_LOG(ERR, "set invalid mac vf:%d\n", vf);
>+			return -1;
>+		}
>+
>+		vf_info[vf].mac_count++;
>+
>+		hw->mac.ops.set_rar(hw, vf_info[vf].mac_count,
>+				new_mac, vf, IXGBE_RAH_AV);
>+	} else {
>+		hw->mac.ops.clear_rar(hw, vf_info[vf].mac_count);
>+		vf_info[vf].mac_count = 0;
>+	}
>+	return 0;
>+}
>+
> static int
> ixgbe_rcv_msg_from_vf(struct rte_eth_dev *dev, uint16_t vf)
> {
>@@ -835,6 +866,10 @@ ixgbe_rcv_msg_from_vf(struct rte_eth_dev *dev, uint16_t vf)
> 		if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)
> 			retval = ixgbe_set_vf_mc_promisc(dev, vf, msgbuf);
> 		break;
>+	case IXGBE_VF_SET_MACVLAN:
>+		if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)
>+			retval = ixgbe_set_vf_macvlan_msg(dev, vf, msgbuf);
>+		break;
> 	default:
> 		PMD_DRV_LOG(DEBUG, "Unhandled Msg %8.8x", (unsigned)msgbuf[0]);
> 		retval = IXGBE_ERR_MBX;
>-- 
>2.17.1
>

Acked-by: Xiaolong Ye <xiaolong.ye@intel.com>

Applied to dpdk-next-net-intel, Thanks.
  
Zhao1, Wei May 8, 2020, 6:58 a.m. UTC | #2
Hi, Guinan

	There is a bug for this patch:
The second input parameter of function hw->mac.ops.set_rar() should be index of MAC address register IXGBE_RAL/H.
This index should be management by pf host for all the vf, not only index for one vf, or vf1 maybe overwrite this MAC address of vf0.
Although this patch has been merged, please commit fix patch for it.


> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Guinan Sun
> Sent: Tuesday, December 24, 2019 11:24 AM
> To: dev@dpdk.org
> Cc: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Yang, Qiming
> <qiming.yang@intel.com>; Sun, GuinanX <guinanx.sun@intel.com>
> Subject: [dpdk-dev] [PATCH v3] net/ixgbe: add support for VF MAC address add
> and remove
> 
> Ixgbe PMD pf host code needs to support ixgbevf mac address add and remove.
> For this purpose, a response was added between pf and vf to update the mac
> address.
> 
> Signed-off-by: Guinan Sun <guinanx.sun@intel.com>
> ---
> v3:
> * Changed from `RTE_LOG` to `PMD_DRV_LOG`.
> v2:
> * Changed the title of commit message.
> * Checked null in front of valid ether addr check.
> ---
>  drivers/net/ixgbe/ixgbe_ethdev.h |  1 +
>  drivers/net/ixgbe/ixgbe_pf.c     | 35
> ++++++++++++++++++++++++++++++++
>  2 files changed, 36 insertions(+)
> 
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h
> b/drivers/net/ixgbe/ixgbe_ethdev.h
> index 76a1b9d18..e1cd8fd16 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.h
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.h
> @@ -270,6 +270,7 @@ struct ixgbe_vf_info {
>  	uint8_t api_version;
>  	uint16_t switch_domain_id;
>  	uint16_t xcast_mode;
> +	uint16_t mac_count;
>  };
> 
>  /*
> diff --git a/drivers/net/ixgbe/ixgbe_pf.c b/drivers/net/ixgbe/ixgbe_pf.c index
> d0d85e138..c93c0fdc2 100644
> --- a/drivers/net/ixgbe/ixgbe_pf.c
> +++ b/drivers/net/ixgbe/ixgbe_pf.c
> @@ -748,6 +748,37 @@ ixgbe_set_vf_mc_promisc(struct rte_eth_dev *dev,
> uint32_t vf, uint32_t *msgbuf)
>  	return 0;
>  }
> 
> +static int
> +ixgbe_set_vf_macvlan_msg(struct rte_eth_dev *dev, uint32_t vf, uint32_t
> +*msgbuf) {
> +	struct ixgbe_hw *hw =
> IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> +	struct ixgbe_vf_info *vf_info =
> +		*(IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private));
> +	uint8_t *new_mac = (uint8_t *)(&msgbuf[1]);
> +	int index = (msgbuf[0] & IXGBE_VT_MSGINFO_MASK) >>
> +		    IXGBE_VT_MSGINFO_SHIFT;
> +
> +	if (index) {
> +		if (new_mac == NULL)
> +			return -1;
> +
> +		if (!rte_is_valid_assigned_ether_addr(
> +			(struct rte_ether_addr *)new_mac)) {
> +			PMD_DRV_LOG(ERR, "set invalid mac vf:%d\n", vf);
> +			return -1;
> +		}
> +
> +		vf_info[vf].mac_count++;
> +
> +		hw->mac.ops.set_rar(hw, vf_info[vf].mac_count,
> +				new_mac, vf, IXGBE_RAH_AV);
> +	} else {
> +		hw->mac.ops.clear_rar(hw, vf_info[vf].mac_count);
> +		vf_info[vf].mac_count = 0;
> +	}
> +	return 0;
> +}
> +
>  static int
>  ixgbe_rcv_msg_from_vf(struct rte_eth_dev *dev, uint16_t vf)  { @@ -835,6
> +866,10 @@ ixgbe_rcv_msg_from_vf(struct rte_eth_dev *dev, uint16_t vf)
>  		if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)
>  			retval = ixgbe_set_vf_mc_promisc(dev, vf, msgbuf);
>  		break;
> +	case IXGBE_VF_SET_MACVLAN:
> +		if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)
> +			retval = ixgbe_set_vf_macvlan_msg(dev, vf, msgbuf);
> +		break;
>  	default:
>  		PMD_DRV_LOG(DEBUG, "Unhandled Msg %8.8x",
> (unsigned)msgbuf[0]);
>  		retval = IXGBE_ERR_MBX;
> --
> 2.17.1
  
Guinan Sun May 8, 2020, 8:19 a.m. UTC | #3
Hi zhaowei

> -----Original Message-----
> From: Zhao1, Wei
> Sent: Friday, May 8, 2020 2:58 PM
> To: Sun, GuinanX <guinanx.sun@intel.com>; dev@dpdk.org
> Cc: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Yang, Qiming
> <qiming.yang@intel.com>; Sun, GuinanX <guinanx.sun@intel.com>; Guo, Jia
> <jia.guo@intel.com>
> Subject: RE: [dpdk-dev] [PATCH v3] net/ixgbe: add support for VF MAC address
> add and remove
> 
> Hi, Guinan
> 
> There is a bug for this patch:
> The second input parameter of function hw->mac.ops.set_rar() should be index
> of MAC address register IXGBE_RAL/H.
> This index should be management by pf host for all the vf, not only index for one
> vf, or vf1 maybe overwrite this MAC address of vf0.
> Although this patch has been merged, please commit fix patch for it.
> 

I will double check for this function.
Thank you very much.

> 
> > -----Original Message-----
> > From: dev <dev-bounces@dpdk.org> On Behalf Of Guinan Sun
> > Sent: Tuesday, December 24, 2019 11:24 AM
> > To: dev@dpdk.org
> > Cc: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Yang, Qiming
> > <qiming.yang@intel.com>; Sun, GuinanX <guinanx.sun@intel.com>
> > Subject: [dpdk-dev] [PATCH v3] net/ixgbe: add support for VF MAC
> > address add and remove
> >
> > Ixgbe PMD pf host code needs to support ixgbevf mac address add and remove.
> > For this purpose, a response was added between pf and vf to update the
> > mac address.
> >
> > Signed-off-by: Guinan Sun <guinanx.sun@intel.com>
> > ---
> > v3:
> > * Changed from `RTE_LOG` to `PMD_DRV_LOG`.
> > v2:
> > * Changed the title of commit message.
> > * Checked null in front of valid ether addr check.
> > ---
> >  drivers/net/ixgbe/ixgbe_ethdev.h |  1 +
> >  drivers/net/ixgbe/ixgbe_pf.c     | 35
> > ++++++++++++++++++++++++++++++++
> >  2 files changed, 36 insertions(+)
> >
> > diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h
> > b/drivers/net/ixgbe/ixgbe_ethdev.h
> > index 76a1b9d18..e1cd8fd16 100644
> > --- a/drivers/net/ixgbe/ixgbe_ethdev.h
> > +++ b/drivers/net/ixgbe/ixgbe_ethdev.h
> > @@ -270,6 +270,7 @@ struct ixgbe_vf_info {  uint8_t api_version;
> > uint16_t switch_domain_id;  uint16_t xcast_mode;
> > +uint16_t mac_count;
> >  };
> >
> >  /*
> > diff --git a/drivers/net/ixgbe/ixgbe_pf.c
> > b/drivers/net/ixgbe/ixgbe_pf.c index
> > d0d85e138..c93c0fdc2 100644
> > --- a/drivers/net/ixgbe/ixgbe_pf.c
> > +++ b/drivers/net/ixgbe/ixgbe_pf.c
> > @@ -748,6 +748,37 @@ ixgbe_set_vf_mc_promisc(struct rte_eth_dev *dev,
> > uint32_t vf, uint32_t *msgbuf)  return 0;  }
> >
> > +static int
> > +ixgbe_set_vf_macvlan_msg(struct rte_eth_dev *dev, uint32_t vf,
> > +uint32_t
> > +*msgbuf) {
> > +struct ixgbe_hw *hw =
> > IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> > +struct ixgbe_vf_info *vf_info =
> > +*(IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private));
> > +uint8_t *new_mac = (uint8_t *)(&msgbuf[1]); int index = (msgbuf[0] &
> > +IXGBE_VT_MSGINFO_MASK) >>
> > +    IXGBE_VT_MSGINFO_SHIFT;
> > +
> > +if (index) {
> > +if (new_mac == NULL)
> > +return -1;
> > +
> > +if (!rte_is_valid_assigned_ether_addr(
> > +(struct rte_ether_addr *)new_mac)) {
> > +PMD_DRV_LOG(ERR, "set invalid mac vf:%d\n", vf); return -1; }
> > +
> > +vf_info[vf].mac_count++;
> > +
> > +hw->mac.ops.set_rar(hw, vf_info[vf].mac_count,
> > +new_mac, vf, IXGBE_RAH_AV);
> > +} else {
> > +hw->mac.ops.clear_rar(hw, vf_info[vf].mac_count);
> > +vf_info[vf].mac_count = 0;
> > +}
> > +return 0;
> > +}
> > +
> >  static int
> >  ixgbe_rcv_msg_from_vf(struct rte_eth_dev *dev, uint16_t vf)  { @@
> > -835,6
> > +866,10 @@ ixgbe_rcv_msg_from_vf(struct rte_eth_dev *dev, uint16_t vf)
> >  if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)  retval =
> > ixgbe_set_vf_mc_promisc(dev, vf, msgbuf);  break;
> > +case IXGBE_VF_SET_MACVLAN:
> > +if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED) retval =
> > +ixgbe_set_vf_macvlan_msg(dev, vf, msgbuf); break;
> >  default:
> >  PMD_DRV_LOG(DEBUG, "Unhandled Msg %8.8x", (unsigned)msgbuf[0]);
> > retval = IXGBE_ERR_MBX;
> > --
> > 2.17.1
>
  

Patch

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
index 76a1b9d18..e1cd8fd16 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.h
+++ b/drivers/net/ixgbe/ixgbe_ethdev.h
@@ -270,6 +270,7 @@  struct ixgbe_vf_info {
 	uint8_t api_version;
 	uint16_t switch_domain_id;
 	uint16_t xcast_mode;
+	uint16_t mac_count;
 };
 
 /*
diff --git a/drivers/net/ixgbe/ixgbe_pf.c b/drivers/net/ixgbe/ixgbe_pf.c
index d0d85e138..c93c0fdc2 100644
--- a/drivers/net/ixgbe/ixgbe_pf.c
+++ b/drivers/net/ixgbe/ixgbe_pf.c
@@ -748,6 +748,37 @@  ixgbe_set_vf_mc_promisc(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf)
 	return 0;
 }
 
+static int
+ixgbe_set_vf_macvlan_msg(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf)
+{
+	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct ixgbe_vf_info *vf_info =
+		*(IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private));
+	uint8_t *new_mac = (uint8_t *)(&msgbuf[1]);
+	int index = (msgbuf[0] & IXGBE_VT_MSGINFO_MASK) >>
+		    IXGBE_VT_MSGINFO_SHIFT;
+
+	if (index) {
+		if (new_mac == NULL)
+			return -1;
+
+		if (!rte_is_valid_assigned_ether_addr(
+			(struct rte_ether_addr *)new_mac)) {
+			PMD_DRV_LOG(ERR, "set invalid mac vf:%d\n", vf);
+			return -1;
+		}
+
+		vf_info[vf].mac_count++;
+
+		hw->mac.ops.set_rar(hw, vf_info[vf].mac_count,
+				new_mac, vf, IXGBE_RAH_AV);
+	} else {
+		hw->mac.ops.clear_rar(hw, vf_info[vf].mac_count);
+		vf_info[vf].mac_count = 0;
+	}
+	return 0;
+}
+
 static int
 ixgbe_rcv_msg_from_vf(struct rte_eth_dev *dev, uint16_t vf)
 {
@@ -835,6 +866,10 @@  ixgbe_rcv_msg_from_vf(struct rte_eth_dev *dev, uint16_t vf)
 		if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)
 			retval = ixgbe_set_vf_mc_promisc(dev, vf, msgbuf);
 		break;
+	case IXGBE_VF_SET_MACVLAN:
+		if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)
+			retval = ixgbe_set_vf_macvlan_msg(dev, vf, msgbuf);
+		break;
 	default:
 		PMD_DRV_LOG(DEBUG, "Unhandled Msg %8.8x", (unsigned)msgbuf[0]);
 		retval = IXGBE_ERR_MBX;