+static int
+ldp_vls_sendo (vls_handle_t vlsh, const void *buf, size_t n, int flags,
+ __CONST_SOCKADDR_ARG addr, socklen_t addr_len)
+{
+ vppcom_endpt_t *ep = 0;
+ vppcom_endpt_t _ep;
+
+ if (addr)
+ {
+ ep = &_ep;
+ switch (addr->sa_family)
+ {
+ case AF_INET:
+ ep->is_ip4 = VPPCOM_IS_IP4;
+ ep->ip =
+ (uint8_t *) & ((const struct sockaddr_in *) addr)->sin_addr;
+ ep->port = (uint16_t) ((const struct sockaddr_in *) addr)->sin_port;
+ break;
+
+ case AF_INET6:
+ ep->is_ip4 = VPPCOM_IS_IP6;
+ ep->ip =
+ (uint8_t *) & ((const struct sockaddr_in6 *) addr)->sin6_addr;
+ ep->port =
+ (uint16_t) ((const struct sockaddr_in6 *) addr)->sin6_port;
+ break;
+
+ default:
+ return EAFNOSUPPORT;
+ }
+ }
+
+ return vls_sendto (vlsh, (void *) buf, n, flags, ep);
+}
+
+static int
+ldp_vls_recvfrom (vls_handle_t vlsh, void *__restrict buf, size_t n,
+ int flags, __SOCKADDR_ARG addr,
+ socklen_t * __restrict addr_len)
+{
+ u8 src_addr[sizeof (struct sockaddr_in6)];
+ vppcom_endpt_t ep;
+ ssize_t size;
+ int rv;
+
+ if (addr)
+ {
+ ep.ip = src_addr;
+ size = vls_recvfrom (vlsh, buf, n, flags, &ep);
+
+ if (size > 0)
+ {
+ rv = ldp_copy_ep_to_sockaddr (addr, addr_len, &ep);
+ if (rv < 0)
+ size = rv;
+ }
+ }
+ else
+ size = vls_recvfrom (vlsh, buf, n, flags, NULL);
+
+ return size;
+}
+