+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;
+}
+