int __flags, __CONST_SOCKADDR_ARG __addr,
socklen_t __addr_len)
{
- int rv = -1;
- /* TBD add new vpp api */
- /* TBD add flags parameter */
- rv = vppcom_session_write (__sid, (void *) __buf, (int) __n);
- return rv;
+ vppcom_endpt_t *ep = 0;
+
+ if (__addr)
+ {
+ vppcom_endpt_t _ep;
+
+ ep = &_ep;
+ ep->vrf = VPPCOM_VRF_DEFAULT;
+ 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 vppcom_session_sendto (__sid, __buf, __n, __flags, ep);;
}
ssize_t
int __flags, __CONST_SOCKADDR_ARG __addr,
socklen_t __addr_len)
{
- int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
uword *p;
vcom_socket_t *vsock;
}
}
- rv = vcom_session_sendto (vsock->sid, (void *) __buf, (int) __n,
- __flags, __addr, __addr_len);
- return rv;
+ return vcom_session_sendto (vsock->sid, (void *) __buf, (int) __n,
+ __flags, __addr, __addr_len);
}
static inline ssize_t
int __flags, __SOCKADDR_ARG __addr,
socklen_t * __restrict __addr_len)
{
- int rv = -1;
+ 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);
- /* TBD add flags parameter */
- rv = vppcom_session_read (__sid, __buf, __n);
return rv;
}
uword *p;
vcom_socket_t *vsock;
- if (!__buf || !__addr || !__addr_len)
- {
- return -EINVAL;
- }
+ if (__addr && !__addr_len)
+ return -EINVAL;
p = hash_get (vsm->sockidx_by_fd, __fd);
if (!p)
void *__restrict __optval,
socklen_t * __restrict __optlen)
{
+ int rv = 0;
+
/* 1. for socket level options that are NOT socket attributes
* and that has corresponding vpp options get from vppcom */
- return 0;
+ switch (__level)
+ {
+ case SOL_SOCKET:
+ switch (__optname)
+ {
+ case SO_ERROR:
+ *(int *) __optval = 0;
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+ /* 2. unhandled options */
+ return rv;
}
int
switch (__level)
{
- /* handle options at socket level */
case SOL_SOCKET:
switch (__optname)
{
case SO_TYPE:
case SO_PROTOCOL:
case SO_DOMAIN:
- case SO_ERROR:
case SO_OOBINLINE:
case SO_NO_CHECK:
case SO_PRIORITY:
}
break;
+ case SO_ERROR:
+ rv = vcom_session_get_sockopt (vsock->sid, __level, __optname,
+ __optval, __optlen);
+ break;
+
default:
/* We implement the SO_SNDLOWAT etc to not be settable
* (1003.1g 7).