+ int rv;
+ vppcom_endpt_t ep;
+
+ if (__addr)
+ {
+ ep.ip = (u8 *) & ((const struct sockaddr_in *) __addr)->sin_addr;
+ rv = vppcom_session_recvfrom (__sid, __buf, __n, __flags, &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;
+ *__addr_len = sizeof (struct sockaddr_in);
+ break;
+
+ case AF_INET6:
+ ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
+ *__addr_len = sizeof (struct sockaddr_in6);
+ break;
+
+ default:
+ rv = -1;
+ break;
+ }
+ }
+ else
+ rv = -1;
+ }
+ }
+ else
+ rv = vppcom_session_recvfrom (__sid, __buf, __n, __flags, NULL);