pool_alloc (ldp->workers, LDP_MAX_NWORKERS);
}
-static inline int
+static int
ldp_init (void)
{
ldp_worker_ctx_t *ldpw;
int rv;
- if (PREDICT_TRUE (ldp->init))
- return 0;
+ ASSERT (!ldp->init);
ldp->init = 1;
ldp->vcl_needs_real_epoll = 1;
/* Make sure there are enough bits in the fd set for vcl sessions */
if (ldp->vlsh_bit_val > FD_SETSIZE / 2)
{
- LDBG (0, "ERROR: LDP vlsh bit value %d > FD_SETSIZE/2 %d!",
+ /* Only valid for select/pselect, so just WARNING and not exit */
+ LDBG (0,
+ "WARNING: LDP vlsh bit value %d > FD_SETSIZE/2 %d, "
+ "select/pselect not supported now!",
ldp->vlsh_bit_val, FD_SETSIZE / 2);
- ldp->init = 0;
- return -1;
}
}
env_var_str = getenv (LDP_ENV_TLS_TRANS);
return 0;
}
+#define ldp_init_check() \
+ if (PREDICT_FALSE (!ldp->init)) \
+ { \
+ if ((errno = -ldp_init ())) \
+ return -1; \
+ }
+
int
close (int fd)
{
vls_handle_t vlsh;
int rv, epfd;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
vls_handle_t vlsh;
ssize_t size;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
vls_handle_t vlsh;
ssize_t size = 0;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
vls_handle_t vlsh;
ssize_t size = 0;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
vls_handle_t vlsh;
int i, rv = 0;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
va_list ap;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
va_start (ap, cmd);
rv = fcntl_internal (fd, cmd, ap);
va_list ap;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
va_start (ap, cmd);
rv = fcntl_internal (fd, cmd, ap);
va_list ap;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
va_start (ap, cmd);
time_out = (timeout->tv_sec == 0 && timeout->tv_nsec == 0) ?
(f64) 0 : (f64) timeout->tv_sec + (f64) timeout->tv_nsec / (f64) 1e9;
+ time_out += clib_time_now (&ldpw->clib_time);
+
/* select as fine grained sleep */
if (!nfds)
{
- time_out += clib_time_now (&ldpw->clib_time);
while (clib_time_now (&ldpw->clib_time) < time_out)
;
return 0;
return -1;
ckp_len = sizeof (ldp->ckpair_index);
- return vppcom_session_attr (vlsh_to_session_index (vlsh),
- VPPCOM_ATTR_SET_CKPAIR, &ldp->ckpair_index,
- &ckp_len);
+ return vls_attr (vlsh, VPPCOM_ATTR_SET_CKPAIR, &ldp->ckpair_index, &ckp_len);
}
int
u8 is_nonblocking = type & SOCK_NONBLOCK ? 1 : 0;
vls_handle_t vlsh;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
if (((domain == AF_INET) || (domain == AF_INET6)) &&
((sock_type == SOCK_STREAM) || (sock_type == SOCK_DGRAM)))
{
int rv, sock_type = type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK);
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
if (((domain == AF_INET) || (domain == AF_INET6)) &&
((sock_type == SOCK_STREAM) || (sock_type == SOCK_DGRAM)))
vls_handle_t vlsh;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
int rv = 0;
int sa_len, copy_len;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
if (addr && len && ep)
{
vls_handle_t vlsh;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
vls_handle_t vlsh;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
if (!addr)
{
vls_handle_t vlsh;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
vls_handle_t vlsh = ldp_fd_to_vlsh (fd);
ssize_t size;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
if (vlsh != VLS_INVALID_HANDLE)
{
vls_handle_t vlsh;
ssize_t size = 0;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (out_fd);
if (vlsh != VLS_INVALID_HANDLE)
vls_handle_t vlsh;
ssize_t size;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
return size;
}
+ssize_t
+__recv_chk (int fd, void *buf, size_t n, size_t buflen, int flags)
+{
+ if (n > buflen)
+ return -1;
+
+ return recv (fd, buf, n, flags);
+}
+
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)
vls_handle_t vlsh;
ssize_t size;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
- if (vlsh != INVALID_SESSION_ID)
+ if (vlsh != VLS_INVALID_HANDLE)
{
size = ldp_vls_sendo (vlsh, buf, n, flags, addr, addr_len);
if (size < 0)
vls_handle_t vlsh;
ssize_t size;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
vls_handle_t vlsh;
ssize_t size;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
const char *func_str;
u32 sh = ldp_fd_to_vlsh (fd);
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
- if (sh != INVALID_SESSION_ID)
+ if (sh != VLS_INVALID_HANDLE)
{
clib_warning ("LDP<%d>: LDP-TBD", getpid ());
errno = ENOSYS;
vls_handle_t vlsh;
ssize_t size;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
const char *func_str;
u32 sh = ldp_fd_to_vlsh (fd);
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
- if (sh != INVALID_SESSION_ID)
+ if (sh != VLS_INVALID_HANDLE)
{
clib_warning ("LDP<%d>: LDP-TBD", getpid ());
errno = ENOSYS;
vls_handle_t vlsh;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
case SO_ERROR:
rv = vls_attr (vlsh, VPPCOM_ATTR_GET_ERROR, optval, optlen);
break;
+ case SO_BINDTODEVICE:
+ rv = 0;
+ break;
default:
LDBG (0, "ERROR: fd %d: getsockopt SOL_SOCKET: vlsh %u "
"optname %d unsupported!", fd, vlsh, optname);
vls_handle_t vlsh;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
rv = vls_attr (vlsh, VPPCOM_ATTR_SET_BROADCAST,
(void *) optval, &optlen);
break;
+ case SO_LINGER:
+ rv = 0;
+ break;
default:
LDBG (0, "ERROR: fd %d: setsockopt SOL_SOCKET: vlsh %u "
"optname %d unsupported!", fd, vlsh, optname);
vls_handle_t vlsh;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
vls_handle_t listen_vlsh, accept_vlsh;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
listen_vlsh = ldp_fd_to_vlsh (listen_fd);
if (listen_vlsh != VLS_INVALID_HANDLE)
shutdown (int fd, int how)
{
vls_handle_t vlsh;
- int rv = 0, flags;
- u32 flags_len = sizeof (flags);
+ int rv = 0;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
{
LDBG (0, "called shutdown: fd %u vlsh %u how %d", fd, vlsh, how);
-
- if (vls_attr (vlsh, VPPCOM_ATTR_SET_SHUT, &how, &flags_len))
- {
- close (fd);
- return -1;
- }
-
- if (vls_attr (vlsh, VPPCOM_ATTR_GET_SHUT, &flags, &flags_len))
- {
- close (fd);
- return -1;
- }
-
- if (flags == SHUT_RDWR)
- rv = close (fd);
- else if (flags == SHUT_WR)
- rv = vls_shutdown (vlsh);
+ rv = vls_shutdown (vlsh, how);
}
else
{
vls_handle_t vlsh;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
if (ldp->vcl_needs_real_epoll || vls_use_real_epoll ())
{
vls_handle_t vep_vlsh, vlsh;
int rv;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
vep_vlsh = ldp_fd_to_vlsh (epfd);
if (PREDICT_FALSE (vep_vlsh == VLS_INVALID_HANDLE))
int libc_epfd, rv = 0;
vls_handle_t ep_vlsh;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
if (PREDICT_FALSE (!events || (timeout < -1)))
{
int libc_epfd, rv = 0, num_ev;
vls_handle_t ep_vlsh;
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
if (PREDICT_FALSE (!events || (timeout < -1)))
{
ppoll (struct pollfd *fds, nfds_t nfds,
const struct timespec *timeout, const sigset_t * sigmask)
{
- if ((errno = -ldp_init ()))
- return -1;
+ ldp_init_check ();
clib_warning ("LDP<%d>: LDP-TBD", getpid ());
errno = ENOSYS;