Hi,

There is no objection to the current API proposal, the discussions are
concerning the addition of new API proposal from Alex.
IMO, I will provide an updated patch incorporating some minor coding
comments and we can check-in this patch as of now.
Once we finalize on Alex and Petri's new proposal we can add that as an
add-on patch.

Does this make sense to everyone.

P.S: IpSec application can query the mac address using pktio_t handle API
which is provided in this patch.

Regards,
Bala


On 20 August 2014 00:34, Robbie King (robking) <[email protected]> wrote:

>  My apologies for not paying closer attention during the meeting today,
> do we now have a plan of action to
>
> address querying the MAC address?  That is currently a gating item for the
> IPsec application patch.
>
>
>
> *From:* [email protected] [mailto:
> [email protected]] *On Behalf Of *Savolainen, Petri (NSN -
> FI/Espoo)
> *Sent:* Tuesday, August 19, 2014 8:24 AM
> *To:* ext Bala Manoharan; Alexandru Badicioiu
>
> *Cc:* [email protected]
> *Subject:* Re: [lng-odp] [PATCH 1/1] API support to get mac address of an
> interface using odp_pktio_t
>
>
>
> Hi,
>
>
>
> As Bala mentioned, the intention is that user refers to an interface (by
> name) only once and that’s in  odp_pktio_open(). The resulting handle is
> used in  other packet IO calls after that.
>
>
>
> We may need to specify two different handle types / APIs: one for managing
> interface level configuration (cf. physical function, one per interface),
>  and one for packet IO / configuration read access (cf. virtual function,
> many per interface). The first would be used e.g. to set interface MAC
> address or promiscuous mode. The second could be used to read current MAC
> address, etc  - in addition to packet IO.
>
>
>
> -Petri
>
>
>
>
>
>
>
>
>
> *From:* [email protected] [
> mailto:[email protected] <[email protected]>]
> *On Behalf Of *ext Bala Manoharan
> *Sent:* Tuesday, August 19, 2014 12:14 PM
> *To:* Alexandru Badicioiu
> *Cc:* [email protected]
> *Subject:* Re: [lng-odp] [PATCH 1/1] API support to get mac address of an
> interface using odp_pktio_t
>
>
>
> Hi,
>
> If we add this additional API odp_get_mac_addr(const char* dev, char*
> mac_addr) then we need to have a limitation that this API cannot be called
> in case of bare-metal implementation before calling odp_pktio_open().
>
> The reason I am sceptical about this API is that this provides a means to
> access the mac_addr of an interface without using the odp_pktio_t handle
> which defeats the purpose of abstraction. But if there is a consensus on
> this new API then I can add the same and provide a patch.
>
> We can discuss this topic in detail during todays ODP call.
>
> Regards,
> Bala
>
>
>
> On 19 August 2014 14:19, Alexandru Badicioiu <
> [email protected]> wrote:
>
> I understand this bare metal use case where open() call initializes the
> port , but having the MAC address derived exclusively from a pktio assumes
> that this is meaningful for any implementation and the implementation has a
> way to do this.
>
> This is why I think there should be also an API call for getting the MAC
> address from a specific name.
>
>
>
> Alex
>
>
>
> On 19 August 2014 11:30, Bala Manoharan <[email protected]> wrote:
>
> Hi,
>
> I agree with your point "const char* dev" need not point to a device, it
> can point to the location of the physical port which can be defined by the
> platform. In case of a bare-metal implementation the physical port will
> have to be initialized and mac address needs to be assigned to the port
> during initialization. Hence odp_pktio_open() call can be used to
> initialize the physical port and once the port gets initialized the
> mac_address of the port can be read using pktio handle.
>
> Pls let me know if I am missing some points from your description.
>
> Regards,
> Bala
>
>
>
> On 19 August 2014 13:37, Alexandru Badicioiu <
> [email protected]> wrote:
>
>
>
>
>
> On 19 August 2014 10:13, Bala Manoharan <[email protected]> wrote:
>
> Hi Alex,
>
> I had the same thought while implementing this API.
>
> The reason I decided to go ahead with getting mac address only though
> odp_pktio_t is because if we have this API to get mac address directly with
> the device name then the user can try to get mac address of a device even
> without creating the PKTIO instance for the device.
>
>  Which could have an issue in the systems where some initialization is
> done during PKTIO creation. Also the check for validating the device name
> could be kept in odp_pktio_open() call alone.
>
>  Maybe I'm not aware of all the cases, but in Linux usually you don't
> need to bring up an interface (which triggers the netdev_ops open() call)
> to get the MAC address of the Ethernet port.
>
> However, there is no restriction that *dev argument of pktio_open() should
> denote an Ethernet interface or to be possible to derive a single Ethernet
> port from it. I think in this case a (const char *dev, char *mac_addr)
> function is mandatory.
>
>
>
> Alex
>
>
>
>  Regards,
>
> Bala
>
>
>
> On 19 August 2014 12:37, Alexandru Badicioiu <
> [email protected]> wrote:
>
> Hi,
>
> from the implementation of the proposed API call it looks like the intent
> of the API function is to get the MAC address of the device used to open
> the pktio.
>
> From the documentation it looks like the *dev is the actual IO device:
>
> /**
>
>  * Open an ODP packet IO instance
>
>  *
>
>  * @param dev    Packet IO device
>
>  * @param pool   Pool to use for packet IO
>
>  * @param params Set of parameters to pass to the arch dependent
> implementation
>
>  *
>
>  * @return ODP packet IO handle or ODP_PKTIO_INVALID on error
>
>  */
>
> odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
>
>                            odp_pktio_params_t *params);
>
>
>
> Should we have also an API call :
>
> int odp_get_mac_addr(const char *dev, unsigned char* mac_addr) ?
>
>
>
> Thanks,
>
> Alex
>
>
>
> On 19 August 2014 08:56, Balasubramanian Manoharan <
> [email protected]> wrote:
>
>  Regards,
> Bala
> Signed-off-by: Balasubramanian Manoharan <[email protected]>
> ---
>  include/odp_packet_io.h                            |  8 +++++++
>  platform/linux-generic/include/odp_packet_netmap.h |  1 +
>  platform/linux-generic/odp_packet_io.c             | 28
> +++++++++++++++++++++-
>  platform/linux-generic/odp_packet_netmap.c         |  4 +++-
>  platform/linux-generic/odp_packet_socket.c         |  8 +++----
>  5 files changed, 43 insertions(+), 6 deletions(-)
>
> diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
> index cfefac0..6c06520 100644
> --- a/include/odp_packet_io.h
> +++ b/include/odp_packet_io.h
> @@ -129,6 +129,14 @@ void odp_pktio_set_input(odp_packet_t pkt,
> odp_pktio_t id);
>   */
>  odp_pktio_t odp_pktio_get_input(odp_packet_t pkt);
>
> +/**
> + * Get mac address of the interface
> + *
> + * @param id           ODP packet IO handle
> + * @param mac_addr     Storage for Mac address of the packet IO interface
> (filled by function)
> + * @return  0 on success or -1 on error
> +**/
> +int odp_pktio_get_mac_addr(odp_pktio_t id, unsigned char* mac_addr);
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/platform/linux-generic/include/odp_packet_netmap.h
> b/platform/linux-generic/include/odp_packet_netmap.h
> index 57d9f2c..3693416 100644
> --- a/platform/linux-generic/include/odp_packet_netmap.h
> +++ b/platform/linux-generic/include/odp_packet_netmap.h
> @@ -40,6 +40,7 @@ typedef struct {
>         odp_queue_t tx_access; /* Used for exclusive access to send
> packets */
>         uint32_t if_flags;
>         char ifname[32];
> +       unsigned char if_mac[ETH_ALEN];
>  } pkt_netmap_t;
>
>  /**
> diff --git a/platform/linux-generic/odp_packet_io.c
> b/platform/linux-generic/odp_packet_io.c
> index 33ade10..069b0e1 100644
> --- a/platform/linux-generic/odp_packet_io.c
> +++ b/platform/linux-generic/odp_packet_io.c
> @@ -245,7 +245,7 @@ odp_pktio_t odp_pktio_open(const char *dev,
> odp_buffer_pool_t pool,
>                 ODP_ERR("This type of I/O is not supported. Please
> recompile.\n");
>                 break;
>         }
> -
> +       pktio_entry->s.params.type = params->type;
>         unlock_entry(pktio_entry);
>         return id;
>  }
> @@ -535,3 +535,29 @@ int pktin_deq_multi(queue_entry_t *qentry,
> odp_buffer_hdr_t *buf_hdr[], int num)
>
>         return nbr;
>  }
> +int odp_pktio_get_mac_addr(odp_pktio_t pkt, unsigned char* mac_addr){
> +
> +       pktio_entry_t * pktio_entry = get_entry(pkt);
> +       if(!pktio_entry){
> +               printf("Invalid odp_pktio_t value\n");
> +               return ODP_PKTIO_INVALID;
> +       }
> +       switch(pktio_entry->s.params.type){
> +               case ODP_PKTIO_TYPE_SOCKET_BASIC:
> +               case ODP_PKTIO_TYPE_SOCKET_MMSG:
> +                       memcpy(mac_addr, pktio_entry->s.pkt_sock.if_mac,
> ETH_ALEN);
> +                       break;
> +               case ODP_PKTIO_TYPE_SOCKET_MMAP:
> +                       memcpy(mac_addr,
> pktio_entry->s.pkt_sock_mmap.if_mac, ETH_ALEN);
> +                       break;
> +#ifdef ODP_HAVE_NETMAP
> +               case ODP_PKTIO_TYPE_NETMAP:
> +                       memcpy(mac_addr, pktio_entry->s.pkt_nm.if_mac,
> ETH_ALEN);
> +                       break;
> +#endif
> +               default:
> +                       ODP_ERR("Invalid pktio type: %02x\n",
> pktio_entry->s.params.type);
> +                       return ODP_PKTIO_INVALID;
> +       }
> +       return 0;
> +}
> diff --git a/platform/linux-generic/odp_packet_netmap.c
> b/platform/linux-generic/odp_packet_netmap.c
> index e2215ab..e9e9f56 100644
> --- a/platform/linux-generic/odp_packet_netmap.c
> +++ b/platform/linux-generic/odp_packet_netmap.c
> @@ -222,9 +222,11 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm,
> const char *netdev,
>                 ODP_ERR("Error: token creation failed\n");
>                 return -1;
>         }
> +       if( 0 != socket_store_hw_addr(pkt_nm->if_mac, netdev)
> +                return -1;
>
>         odp_queue_enq(pkt_nm->tx_access, token);
> -
> +
>         ODP_DBG("Wait for link to come up\n");
>         sleep(WAITLINK_TMO);
>         ODP_DBG("Done\n");
> diff --git a/platform/linux-generic/odp_packet_socket.c
> b/platform/linux-generic/odp_packet_socket.c
> index d44c333..d96aa8e 100644
> --- a/platform/linux-generic/odp_packet_socket.c
> +++ b/platform/linux-generic/odp_packet_socket.c
> @@ -735,7 +735,7 @@ static int mmap_bind_sock(pkt_sock_mmap_t *pkt_sock,
> const char *netdev)
>         return 0;
>  }
>
> -static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock,
> +static int socket_store_hw_addr(int sockfd,unsigned char * if_mac,
>                               const char *netdev)
>  {
>         struct ifreq ethreq;
> @@ -744,13 +744,13 @@ static int mmap_store_hw_addr(pkt_sock_mmap_t *
> const pkt_sock,
>         /* get MAC address */
>         memset(&ethreq, 0, sizeof(ethreq));
>         strncpy(ethreq.ifr_name, netdev, IFNAMSIZ);
> -       ret = ioctl(pkt_sock->sockfd, SIOCGIFHWADDR, &ethreq);
> +       ret = ioctl(sockfd, SIOCGIFHWADDR, &ethreq);
>         if (ret != 0) {
>                 perror("store_hw_addr() - ioctl(SIOCGIFHWADDR)");
>                 return -1;
>         }
>
> -       ethaddr_copy(pkt_sock->if_mac,
> +       ethaddr_copy(if_mac,
>                      (unsigned char *)ethreq.ifr_ifru.ifru_hwaddr.sa_data);
>
>         return 0;
> @@ -805,7 +805,7 @@ int setup_pkt_sock_mmap(pkt_sock_mmap_t * const
> pkt_sock, const char *netdev,
>         if (ret != 0)
>                 return -1;
>
> -       ret = mmap_store_hw_addr(pkt_sock, netdev);
> +       ret = socket_store_hw_addr(pkt_sock->sockfd, pkt_sock->if_mac,
> netdev);
>         if (ret != 0)
>                 return -1;
>
>
> --
> 2.0.1.472.g6f92e5f
>
> _______________________________________________
> lng-odp mailing list
> [email protected]
> http://lists.linaro.org/mailman/listinfo/lng-odp
>
>
>
>
>
>
>
>
>
>
>
>
>
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to