Any resolution to this for 0.10.0 ? On 22 January 2015 at 09:56, Taras Kondratiuk <[email protected]> wrote:
> Sorry if formatting is wrong. Replying from a phone. > > On Jan 21, 2015 6:14 PM, "Mario Torrecillas Rodriguez" < > [email protected]> wrote: > > > > Added odp_errno.c and odp_errno.h > > Changed odp_packet_io and odp_timer to use it. > > > > Signed-off-by: Mario Torrecillas Rodriguez < > [email protected]> > > --- > > (This code contribution is provided under the terms of agreement > LES-LTM-21309) > > > > Changes from previous version: > > * Changed doxygen comment > > * Removed <errno.h> from API file > > > > platform/linux-generic/Makefile.am | 2 + > > platform/linux-generic/include/api/odp_errno.h | 60 > ++++++++++++++++++++++++++ > > platform/linux-generic/include/odp_internal.h | 1 + > > platform/linux-generic/odp_errno.c | 35 +++++++++++++++ > > platform/linux-generic/odp_packet_io.c | 2 +- > > platform/linux-generic/odp_packet_socket.c | 17 ++++++++ > > platform/linux-generic/odp_timer.c | 5 ++- > > 7 files changed, 119 insertions(+), 3 deletions(-) > > create mode 100644 platform/linux-generic/include/api/odp_errno.h > > create mode 100644 platform/linux-generic/odp_errno.c > > > > diff --git a/platform/linux-generic/Makefile.am > b/platform/linux-generic/Makefile.am > > index a699ea6..1b71b71 100644 > > --- a/platform/linux-generic/Makefile.am > > +++ b/platform/linux-generic/Makefile.am > > @@ -19,6 +19,7 @@ include_HEADERS = \ > > > $(top_srcdir)/platform/linux-generic/include/api/odp_cpumask.h \ > > > $(top_srcdir)/platform/linux-generic/include/api/odp_crypto.h \ > > > $(top_srcdir)/platform/linux-generic/include/api/odp_debug.h \ > > + > $(top_srcdir)/platform/linux-generic/include/api/odp_errno.h \ > > > $(top_srcdir)/platform/linux-generic/include/api/odp_hints.h \ > > > $(top_srcdir)/platform/linux-generic/include/api/odp_init.h \ > > > $(top_srcdir)/platform/linux-generic/include/api/odp_packet_flags.h \ > > @@ -80,6 +81,7 @@ __LIB__libodp_la_SOURCES = \ > > odp_classification.c \ > > odp_cpumask.c \ > > odp_crypto.c \ > > + odp_errno.c \ > > odp_init.c \ > > odp_impl.c \ > > odp_linux.c \ > > diff --git a/platform/linux-generic/include/api/odp_errno.h > b/platform/linux-generic/include/api/odp_errno.h > > new file mode 100644 > > index 0000000..0157720 > > --- /dev/null > > +++ b/platform/linux-generic/include/api/odp_errno.h > > @@ -0,0 +1,60 @@ > > +/* Copyright (c) 2015, Linaro Limited > > + * All rights reserved. > > + * > > + * SPDX-License-Identifier: BSD-3-Clause > > + */ > > + > > +/** > > + * @file > > + * > > + * ODP errno API > > + */ > > + > > +#ifndef ODP_ERRNO_H_ > > +#define ODP_ERRNO_H_ > > + > > +#ifdef __cplusplus > > +extern "C" { > > +#endif > > + > > +/** > > +* Return latest ODP errno > > +* > > +* @return ODP errno > > +* @retval 0 No error > > +*/ > > +int odp_errno(void); > > + > > +/** > > +* Set ODP errno to zero > > +*/ > > +void odp_errno_zero(void); > > + > > +/** > > +* Print ODP errno > > +* > > +* Interprets the value of ODP errno as an error message, and prints it, > > +* optionally preceding it with the custom message specified in str. > > +* > > +* @param str NULL, or pointer to the string to be appended > > +*/ > > +void odp_errno_print(const char *str); > > + > > +/** > > +* Error message string > > +* > > +* Interprets the value of ODP errno, generating a string with a > > +* message that describes the error. > > +* It uses the system definition of errno. > > +* > > +* @param errnum Error code > > +* > > +* @retval Pointer to the string > > +*/ > > +const char *odp_errno_str(int errnum); > > + > > +#ifdef __cplusplus > > +} > > +#endif > > + > > +#endif > > diff --git a/platform/linux-generic/include/odp_internal.h > b/platform/linux-generic/include/odp_internal.h > > index 549d406..b953163 100644 > > --- a/platform/linux-generic/include/odp_internal.h > > +++ b/platform/linux-generic/include/odp_internal.h > > @@ -18,6 +18,7 @@ > > extern "C" { > > #endif > > > > +extern __thread int __odp_errno; > > > > int odp_system_info_init(void); > > > > diff --git a/platform/linux-generic/odp_errno.c > b/platform/linux-generic/odp_errno.c > > new file mode 100644 > > index 0000000..ba080e7 > > --- /dev/null > > +++ b/platform/linux-generic/odp_errno.c > > @@ -0,0 +1,35 @@ > > +/* Copyright (c) 2015, Linaro Limited > > + * All rights reserved. > > + * > > + * SPDX-License-Identifier: BSD-3-Clause > > + */ > > + > > +#include <odp_errno.h> > > +#include <odp_internal.h> > > +#include <string.h> > > +#include <stdio.h> > > + > > +__thread int __odp_errno; > > + > > +int odp_errno(void) > > +{ > > + return __odp_errno; > > +} > > + > > +void odp_errno_zero(void) > > +{ > > + __odp_errno = 0; > > +} > > + > > +void odp_errno_print(const char *str) > > +{ > > + if (str != NULL) > > + printf("%s ", str); > > + > > + printf("%s\n", strerror(__odp_errno)); > > ODP_PRINT should be used instead of printf. > > > +} > > + > > +const char *odp_errno_str(int errnum) > > +{ > > + return strerror(errnum); > > +} > > diff --git a/platform/linux-generic/odp_packet_io.c > b/platform/linux-generic/odp_packet_io.c > > index c03f47c..18475b8 100644 > > --- a/platform/linux-generic/odp_packet_io.c > > +++ b/platform/linux-generic/odp_packet_io.c > > @@ -264,7 +264,7 @@ odp_pktio_t odp_pktio_open(const char *dev, > odp_buffer_pool_t pool) > > id = odp_pktio_lookup(dev); > > if (id != ODP_PKTIO_INVALID) { > > /* interface is already open */ > > - errno = -EEXIST; > > + __odp_errno = -EEXIST; > > return ODP_PKTIO_INVALID; > > } > > > > diff --git a/platform/linux-generic/odp_packet_socket.c > b/platform/linux-generic/odp_packet_socket.c > > index da7fb2c..ed65edb 100644 > > --- a/platform/linux-generic/odp_packet_socket.c > > +++ b/platform/linux-generic/odp_packet_socket.c > > @@ -40,6 +40,8 @@ > > #include <odp_align_internal.h> > > #include <odp_debug_internal.h> > > #include <odp_hints.h> > > +#include <odp_errno.h> > > +#include <odp_internal.h> > > > > #include <odph_eth.h> > > #include <odph_ip.h> > > @@ -112,6 +114,7 @@ static int set_pkt_sock_fanout_mmap(pkt_sock_mmap_t > *const pkt_sock, > > > > err = setsockopt(sockfd, SOL_PACKET, PACKET_FANOUT, &val, > sizeof(val)); > > if (err != 0) { > > + __odp_errno = errno; > > ODP_ERR("setsockopt(PACKET_FANOUT): %s\n", > strerror(errno)); > > return -1; > > } > > @@ -185,6 +188,8 @@ int setup_pkt_sock(pkt_sock_t *const pkt_sock, const > char *netdev, > > return sockfd; > > > > error: > > + __odp_errno = errno; > > + > > return -1; > > } > > > > @@ -195,6 +200,7 @@ error: > > int close_pkt_sock(pkt_sock_t *const pkt_sock) > > { > > if (pkt_sock->sockfd != -1 && close(pkt_sock->sockfd) != 0) { > > + __odp_errno = errno; > > ODP_ERR("close(sockfd): %s\n", strerror(errno)); > > return -1; > > } > > @@ -430,12 +436,14 @@ static int mmap_pkt_socket(void) > > > > int ret, sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); > > if (sock == -1) { > > + __odp_errno = errno; > > ODP_ERR("socket(SOCK_RAW): %s\n", strerror(errno)); > > return -1; > > } > > > > ret = setsockopt(sock, SOL_PACKET, PACKET_VERSION, &ver, > sizeof(ver)); > > if (ret == -1) { > > + __odp_errno = errno; > > ODP_ERR("setsockopt(PACKET_VERSION): %s\n", > strerror(errno)); > > close(sock); > > return -1; > > @@ -568,6 +576,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock, > struct ring *ring, > > ret = sendto(sock, NULL, 0, MSG_DONTWAIT, NULL, 0); > > if (ret == -1) { > > if (errno != EAGAIN) { > > + __odp_errno = errno; > > ODP_ERR("sendto(pkt mmap): %s\n", > strerror(errno)); > > return -1; > > } > > @@ -597,6 +606,7 @@ static int mmap_set_packet_loss_discard(int sock) > > ret = setsockopt(sock, SOL_PACKET, PACKET_LOSS, (void *)&discard, > > sizeof(discard)); > > if (ret == -1) { > > + __odp_errno = errno; > > ODP_ERR("setsockopt(PACKET_LOSS): %s\n", > strerror(errno)); > > return -1; > > } > > @@ -623,6 +633,7 @@ static int mmap_setup_ring(int sock, struct ring > *ring, int type) > > > > ret = setsockopt(sock, SOL_PACKET, type, &ring->req, > sizeof(ring->req)); > > if (ret == -1) { > > + __odp_errno = errno; > > ODP_ERR("setsockopt(pkt mmap): %s\n", strerror(errno)); > > return -1; > > } > > @@ -630,6 +641,7 @@ static int mmap_setup_ring(int sock, struct ring > *ring, int type) > > ring->rd_len = ring->rd_num * sizeof(*ring->rd); > > ring->rd = malloc(ring->rd_len); > > if (ring->rd == NULL) { > > + __odp_errno = errno; > > ODP_ERR("malloc(): %s\n", strerror(errno)); > > return -1; > > } > > @@ -654,6 +666,7 @@ static int mmap_sock(pkt_sock_mmap_t *pkt_sock) > > MAP_SHARED | MAP_LOCKED | MAP_POPULATE, sock, 0); > > > > if (pkt_sock->mmap_base == MAP_FAILED) { > > + __odp_errno = errno; > > ODP_ERR("mmap rx&tx buffer failed: %s\n", > strerror(errno)); > > return -1; > > } > > @@ -701,6 +714,7 @@ static int mmap_bind_sock(pkt_sock_mmap_t *pkt_sock, > const char *netdev) > > ret = bind(pkt_sock->sockfd, (struct sockaddr *)&pkt_sock->ll, > > sizeof(pkt_sock->ll)); > > if (ret == -1) { > > + __odp_errno = errno; > > ODP_ERR("bind(to IF): %s\n", strerror(errno)); > > return -1; > > } > > @@ -719,6 +733,7 @@ static int mmap_store_hw_addr(pkt_sock_mmap_t *const > pkt_sock, > > snprintf(ethreq.ifr_name, IFNAMSIZ, "%s", netdev); > > ret = ioctl(pkt_sock->sockfd, SIOCGIFHWADDR, ðreq); > > if (ret != 0) { > > + __odp_errno = errno; > > ODP_ERR("ioctl(SIOCGIFHWADDR): %s\n", strerror(errno)); > > return -1; > > } > > @@ -775,6 +790,7 @@ int setup_pkt_sock_mmap(pkt_sock_mmap_t *const > pkt_sock, const char *netdev, > > > > if_idx = if_nametoindex(netdev); > > if (if_idx == 0) { > > + __odp_errno = errno; > > ODP_ERR("if_nametoindex(): %s\n", strerror(errno)); > > return -1; > > } > > @@ -796,6 +812,7 @@ int close_pkt_sock_mmap(pkt_sock_mmap_t *const > pkt_sock) > > { > > mmap_unmap_sock(pkt_sock); > > if (pkt_sock->sockfd != -1 && close(pkt_sock->sockfd) != 0) { > > + __odp_errno = errno; > > ODP_ERR("close(sockfd): %s\n", strerror(errno)); > > return -1; > > } > > diff --git a/platform/linux-generic/odp_timer.c > b/platform/linux-generic/odp_timer.c > > index 3ba32a1..a8e00f8 100644 > > --- a/platform/linux-generic/odp_timer.c > > +++ b/platform/linux-generic/odp_timer.c > > @@ -50,6 +50,7 @@ > > #include <odp_time.h> > > #include <odp_timer.h> > > #include <odp_timer_internal.h> > > +#include <odp_errno.h> > > > > #define TMO_UNUSED ((uint64_t)0xFFFFFFFFFFFFFFFF) > > /* TMO_INACTIVE is or-ed with the expiration tick to indicate an > expired timer. > > @@ -210,7 +211,7 @@ static odp_timer_pool *odp_timer_pool_new( > > if (odp_unlikely(tp_idx >= MAX_TIMER_POOLS)) { > > /* Restore the previous value */ > > odp_atomic_sub_u32(&num_timer_pools, 1); > > - errno = ENFILE; /* Table overflow */ > > + __odp_errno = ENFILE; /* Table overflow */ > > return NULL; > > } > > size_t sz0 = ODP_ALIGN_ROUNDUP(sizeof(odp_timer_pool), > > @@ -295,7 +296,7 @@ static inline odp_timer_t timer_alloc(odp_timer_pool > *tp, > > _ODP_MEMMODEL_RLS); > > hdl = tp_idx_to_handle(tp, idx); > > } else { > > - errno = ENFILE; /* Reusing file table overflow */ > > + __odp_errno = ENFILE; /* Reusing file table overflow */ > > hdl = ODP_TIMER_INVALID; > > } > > odp_spinlock_unlock(&tp->lock); > > -- > > 1.9.1 > > > > > > > > _______________________________________________ > > 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 > > -- *Mike Holmes* Linaro Sr Technical Manager LNG - ODP
_______________________________________________ lng-odp mailing list [email protected] http://lists.linaro.org/mailman/listinfo/lng-odp
