}
static inline int
-vcom_session_getsockname (int sid, vppcom_endpt_t * ep)
+vcom_socket_copy_ep_to_sockaddr (__SOCKADDR_ARG __addr,
+ socklen_t * __restrict __len,
+ vppcom_endpt_t * ep)
{
- int rv;
- uint32_t size = sizeof (*ep);
+ int rv = 0;
+ int sa_len, copy_len;
+
+ __addr->sa_family = (ep->is_ip4 == VPPCOM_IS_IP4) ? AF_INET : AF_INET6;
+ switch (__addr->sa_family)
+ {
+ case AF_INET:
+ ((struct sockaddr_in *) __addr)->sin_port = ep->port;
+ if (*__len > sizeof (struct sockaddr_in))
+ *__len = sizeof (struct sockaddr_in);
+ sa_len = sizeof (struct sockaddr_in) - sizeof (struct in_addr);
+ copy_len = *__len - sa_len;
+ if (copy_len > 0)
+ memcpy (&((struct sockaddr_in *) __addr)->sin_addr, ep->ip, copy_len);
+ break;
+
+ case AF_INET6:
+ ((struct sockaddr_in6 *) __addr)->sin6_port = ep->port;
+ if (*__len > sizeof (struct sockaddr_in6))
+ *__len = sizeof (struct sockaddr_in6);
+ sa_len = sizeof (struct sockaddr_in6) - sizeof (struct in6_addr);
+ copy_len = *__len - sa_len;
+ if (copy_len > 0)
+ memcpy (((struct sockaddr_in6 *) __addr)->sin6_addr.
+ __in6_u.__u6_addr8, ep->ip, copy_len);
+ break;
+
+ default:
+ /* Not possible */
+ rv = -EAFNOSUPPORT;
+ break;
+ }
- rv = vppcom_session_attr (sid, VPPCOM_ATTR_GET_LCL_ADDR, ep, &size);
return rv;
}
vcom_socket_main_t *vsm = &vcom_socket_main;
uword *p;
vcom_socket_t *vsock;
+ vppcom_endpt_t ep;
+ u8 addr_buf[sizeof (struct in6_addr)];
+ uint32_t size = sizeof (ep);
+ if (!__addr || !__len)
+ return -EFAULT;
p = hash_get (vsm->sockidx_by_fd, __fd);
if (!p)
if (vsock->type != SOCKET_TYPE_VPPCOM_BOUND)
return -EINVAL;
- if (!__addr || !__len)
- return -EFAULT;
-
- vppcom_endpt_t ep;
- ep.ip = (u8 *) & ((const struct sockaddr_in *) __addr)->sin_addr;
- rv = vcom_session_getsockname (vsock->sid, &ep);
- if (rv == 0)
- {
- if (ep.vrf == VPPCOM_VRF_DEFAULT)
- {
- __addr->sa_family = ep.is_ip4 == VPPCOM_IS_IP4 ? AF_INET : AF_INET6;
- switch (__addr->sa_family)
- {
- case AF_INET:
- ((struct sockaddr_in *) __addr)->sin_port = ep.port;
- *__len = sizeof (struct sockaddr_in);
- break;
-
- case AF_INET6:
- ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
- *__len = sizeof (struct sockaddr_in6);
- break;
-
- default:
- break;
- }
- }
- }
+ ep.ip = addr_buf;
+ rv = vppcom_session_attr (vsock->sid, VPPCOM_ATTR_GET_LCL_ADDR, &ep, &size);
+ if (rv == VPPCOM_OK)
+ rv = vcom_socket_copy_ep_to_sockaddr (__addr, __len, &ep);
return rv;
}
return rv;
}
-static inline int
-vcom_socket_copy_ep_to_sockaddr (__SOCKADDR_ARG __addr,
- socklen_t * __restrict __len,
- vppcom_endpt_t * ep)
-{
- int rv = 0;
- int sa_len, copy_len;
-
- __addr->sa_family = (ep->is_ip4 == VPPCOM_IS_IP4) ? AF_INET : AF_INET6;
- switch (__addr->sa_family)
- {
- case AF_INET:
- ((struct sockaddr_in *) __addr)->sin_port = ep->port;
- if (*__len > sizeof (struct sockaddr_in))
- *__len = sizeof (struct sockaddr_in);
- sa_len = sizeof (struct sockaddr_in) - sizeof (struct in_addr);
- copy_len = *__len - sa_len;
- if (copy_len > 0)
- memcpy (&((struct sockaddr_in *) __addr)->sin_addr, ep->ip, copy_len);
- break;
-
- case AF_INET6:
- ((struct sockaddr_in6 *) __addr)->sin6_port = ep->port;
- if (*__len > sizeof (struct sockaddr_in6))
- *__len = sizeof (struct sockaddr_in6);
- sa_len = sizeof (struct sockaddr_in6) - sizeof (struct in6_addr);
- copy_len = *__len - sa_len;
- if (copy_len > 0)
- memcpy (((struct sockaddr_in6 *) __addr)->sin6_addr.
- __in6_u.__u6_addr8, ep->ip, copy_len);
- break;
-
- default:
- /* Not possible */
- rv = -EAFNOSUPPORT;
- break;
- }
-
- return rv;
-}
-
int
vcom_socket_getpeername (int __fd, __SOCKADDR_ARG __addr,
socklen_t * __restrict __len)
{
vcom_socket_main_t *vsm = &vcom_socket_main;
int rv = -EBADF;
- int rv2;
double time_to_wait = (double) 0;
double timeout, now = 0;
vcom_epoll_t *vepoll;
i32 vep_idx;
- static struct epoll_event *libc_ev = 0;
/* validate __event */
if (!__events || (__timeout < -1))
"__timeout = %d)\n",
getpid (), vepoll->vcl_cnt, vepoll->libc_cnt,
time_to_wait, __timeout);
- vec_validate (libc_ev, __maxevents);
timeout = clib_time_now (&vsm->clib_time) + time_to_wait;
do
{
rv = vppcom_epoll_wait (vep_idx, __events, __maxevents, 0);
- rv2 = libc_epoll_pwait (__epfd, libc_ev, __maxevents, 1, __ss);
- if (VCOM_DEBUG == 666)
- fprintf (stderr, "[%d] vcom_socket_epoll_pwait: "
- "rv = %d, rv2 = %d, timeout = %f, now = %f\n",
- getpid (), rv, rv2, timeout, now);
- if ((rv > 0) || (rv2 > 0))
+ if (rv > 0)
{
if (VCOM_DEBUG > 2)
fprintf (stderr, "[%d] vcom_socket_epoll_pwait: "
- "rv = %d, rv2 = %d\n", getpid (), rv, rv2);
- int n = __maxevents - rv;
- n = rv2 <= n ? rv2 : n;
- rv = (rv > 0) ? rv : 0;
+ "vppcom_epoll_wait() returned %d\n", getpid (), rv);
+ goto out;
+ }
+ else if (rv < 0)
+ {
+ if (VCOM_DEBUG > 2)
+ fprintf (stderr, "[%d] ERROR: vcom_socket_epoll_pwait: "
+ "vppcom_epoll_wait() returned %d\n", getpid (), rv);
- clib_memcpy (&__events[rv], libc_ev, n * sizeof (*libc_ev));
- rv += rv2;
goto out;
}
- else if ((rv < 0) || (rv2 < 0))
+ rv = libc_epoll_pwait (__epfd, __events, __maxevents, 1, __ss);
+ if (rv > 0)
{
- if (rv < 0)
- fprintf (stderr,
- "[%d] ERROR: vppcom_epoll_wait() returned %d\n",
- getpid (), rv);
- if (rv2 < 0)
- {
- fprintf (stderr,
- "[%d] ERROR: libc_epoll_wait() failed, errno %d\n",
- getpid (), errno);
- rv = (rv < 0) ? rv : -errno;
- }
+ if (VCOM_DEBUG > 2)
+ fprintf (stderr, "[%d] vcom_socket_epoll_pwait: "
+ "libc_epoll_pwait() returned %d\n", getpid (), rv);
+ goto out;
+ }
+ else if (rv < 0)
+ {
+ int errno_val = errno;
+ perror ("libc_epoll_wait");
+ fprintf (stderr, "[%d] vcom_socket_epoll_pwait: "
+ "libc_epoll_wait() failed, errno %d\n",
+ getpid (), errno_val);
goto out;
}
if (__timeout != -1)
}
while (now < timeout);
}
-
out:
- vec_reset_length (libc_ev);
return rv;
}