> -----Original Message----- > From: Wang, Liang-min > Sent: Tuesday, June 02, 2015 1:24 PM > To: Ananyev, Konstantin; dev at dpdk.org > Cc: Richardson, Bruce; dharton at cisco.com; agh at cisco.com > Subject: RE: [PATCH 1/2] ethdev: add api to set default mac address > > > >> -----Original Message----- > >> From: Wang, Liang-min > >> Sent: Friday, May 29, 2015 8:27 PM > >> To: dev at dpdk.org > >> Cc: Richardson, Bruce; Ananyev, Konstantin; dharton at cisco.com; > > >agh at cisco.com; Wang, Liang-min > >> Subject: [PATCH 1/2] ethdev: add api to set default mac address > > > > >> add a new api: rte_eth_dev_default_mac_addr_set to support changing > >> default mac address of a NIC > > > > > >Signed-off-by: Liang-Min Larry Wang <liang-min.wang at intel.com> > >> --- > > > lib/librte_ether/rte_ethdev.c | 16 ++++++++++++++++ > > > lib/librte_ether/rte_ethdev.h | 14 ++++++++++++++ > >> lib/librte_ether/rte_ether_version.map | 1 + > >> 3 files changed, 31 insertions(+) > >> > >> diff --git a/lib/librte_ether/rte_ethdev.c > >> b/lib/librte_ether/rte_ethdev.c index 024fe8b..96ee00e 100644 > >> --- a/lib/librte_ether/rte_ethdev.c > >> +++ b/lib/librte_ether/rte_ethdev.c > >> @@ -2752,6 +2752,22 @@ rte_eth_dev_mac_addr_remove(uint8_t port_id, > >> struct ether_addr *addr) } > >> > >> int > >> +rte_eth_dev_default_mac_addr_set(uint8_t port_id, struct ether_addr > >> +*addr) { > >> + struct rte_eth_dev *dev; > >> + > >> + if (!rte_eth_dev_is_valid_port(port_id)) { > >> + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); > >> + return -ENODEV; > >> + } > >> + > >> + dev = &rte_eth_devices[port_id]; > >> + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mac_addr_set, -ENOTSUP); > >> + > >> + return (*dev->dev_ops->mac_addr_set)(dev, addr); } > > > >As I can see mac_addr_set() is implemented now only for virtio. > >Which means that for all Intel HW your new rte_eth_dev_default_mac_addr_set() > >would not work right now? > >Probably rte_eth_dev_default_mac_addr_set() should combine both approaches: > >If mac_addr_set() is implemented by dev, then use it, otherwise try to use > >addr_remove()/addr_add() (as your first version did)? > >Konstantin > > The implementation of mac_addr_set() through mac_addr_remove() and > mac_addr_add() is very creative, but it may not work for > devices other than igb/ixgbe. I will release a patch latter to add hooks on > igb and ixgbe(). Just want to keep this interface clean and not > to be confined to igb/ixgbe characteristics.
Ok, if you think it would be more clean way - no objections from me. Konstantin > > > + > > +int > > rte_eth_dev_set_vf_rxmode(uint8_t port_id, uint16_t vf, > > uint16_t rx_mode, uint8_t on) > > { > > diff --git a/lib/librte_ether/rte_ethdev.h > > b/lib/librte_ether/rte_ethdev.h index 16dbe00..5f07e0d 100644 > > --- a/lib/librte_ether/rte_ethdev.h > > +++ b/lib/librte_ether/rte_ethdev.h > > @@ -2982,6 +2982,20 @@ int rte_eth_dev_mac_addr_add(uint8_t port, > > struct ether_addr *mac_addr, int rte_eth_dev_mac_addr_remove(uint8_t > > port, struct ether_addr *mac_addr); > > > > /** > > + * Set the default MAC address. > > + * > > + * @param port > > + * The port identifier of the Ethernet device. > > + * @param mac_addr > > + * New default MAC address. > > + * @return > > + * - (0) if successful, or *mac_addr* didn't exist. > > + * - (-ENOTSUP) if hardware doesn't support. > > + * - (-ENODEV) if *port* invalid. > > + */ > > +int rte_eth_dev_default_mac_addr_set(uint8_t port, struct ether_addr > > +*mac_addr); > > + > > +/** > > * Update Redirection Table(RETA) of Receive Side Scaling of Ethernet > > device. > > * > > * @param port > > diff --git a/lib/librte_ether/rte_ether_version.map > > b/lib/librte_ether/rte_ether_version.map > > index a2d25a6..2dbbaa7 100644 > > --- a/lib/librte_ether/rte_ether_version.map > > +++ b/lib/librte_ether/rte_ether_version.map > > @@ -102,6 +102,7 @@ DPDK_2.0 { > > rte_eth_tx_queue_setup; > > rte_eth_xstats_get; > > rte_eth_xstats_reset; > > + rte_eth_dev_default_mac_addr_set; > > > > local: *; > > }; > > -- > > 2.1.4