void oo_os_sock_release(ci_netif* ni, oo_os_file fd) { int rc = ci_sys_close(fd); oo_rwlock_unlock_read(&citp_dup2_lock); if( rc != 0 ) LOG_E(ci_log("%s: [%d] ci_sys_close returned %d (errno=%d)", __FUNCTION__, NI_ID(ni), rc, errno)); }
static int fdtable_fd_move(ci_fd_t sock_fd, int op) { ci_uint32 io_fd = sock_fd; int rc; oo_rwlock_lock_read(&citp_dup2_lock); rc = oo_resource_op(sock_fd, op, &io_fd); if( rc != 0 || io_fd == sock_fd ) { oo_rwlock_unlock_read(&citp_dup2_lock); return rc; } /* Kernel failed to hand over, but there is no epoll here - let's dup */ rc = ci_sys_dup2(io_fd, sock_fd); ci_tcp_helper_close_no_trampoline(io_fd); oo_rwlock_unlock_read(&citp_dup2_lock); if( rc == sock_fd ) return 0; else if( rc >= 0 ) return -EINVAL; return rc; }
void citp_passthrough_init(citp_alien_fdi* epi) { int rc = oo_os_sock_get(epi->netif, epi->ep->bufid, &epi->os_socket); /* No sensible way to handle oo_os_sock_get failure. Just record it. */ if( rc != 0 ) { Log_U(ci_log("%s: oo_os_sock_get([%d:%d]) returned %d", __func__, NI_ID(epi->netif), epi->ep->bufid, rc)); epi->os_socket = -1; return; } __citp_fdtable_reserve(epi->os_socket, 1); /* ci_tcp_helper_get_sock_fd gets the citp_dup2_lock lock: release it */ oo_rwlock_unlock_read(&citp_dup2_lock); }
int oo_os_sock_get(ci_netif* ni, oo_sp sock_p, oo_os_file* os_sock_out) { oo_os_sock_fd_get_t op; int rc; oo_rwlock_lock_read(&citp_dup2_lock); op.sock_id = OO_SP_TO_INT(sock_p); rc = oo_resource_op(ci_netif_get_driver_handle(ni), OO_IOC_OS_SOCK_FD_GET, &op); if( rc == 0 ) *os_sock_out = op.fd_out; else oo_rwlock_unlock_read (&citp_dup2_lock); return rc; }
int oo_os_sock_sendmsg_raw(ci_netif* ni, oo_sp sock_p, const struct msghdr* msg, int flags) { unsigned long socketcall_args[8]; oo_os_sock_sendmsg_raw_t op; int rc; op.sock_id = OO_SP_TO_INT(sock_p); op.sizeof_ptr = sizeof(void*); op.flags = flags; CI_USER_PTR_SET(op.msg, msg); CI_USER_PTR_SET(op.socketcall_args, socketcall_args); oo_rwlock_lock_read(&citp_dup2_lock); rc = oo_resource_op(ci_netif_get_driver_handle(ni), OO_IOC_OS_SOCK_SENDMSG_RAW, &op); oo_rwlock_unlock_read (&citp_dup2_lock); return rc; }