/** * _9p_create_socket: create the accept socket for 9P * * This function create the accept socket for the 9p dispatcher thread. * * @return socket fd or -1 if failed. * */ int _9p_create_socket(void) { int sock = -1; int one = 1; int centvingt = 120; int neuf = 9; struct sockaddr_in6 sinaddr_tcp6; struct netbuf netbuf_tcp6; struct t_bind bindaddr_tcp6; struct __rpc_sockinfo si_tcp6; sock = socket(P_FAMILY, SOCK_STREAM, IPPROTO_TCP); if (sock == -1) goto bad_socket; if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) == -1) || (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)) == -1) || (setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, ¢vingt, sizeof(centvingt)) == -1) || (setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, ¢vingt, sizeof(centvingt)) == -1) || (setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, &neuf, sizeof(neuf)) == -1)) goto bad_socket; socket_setoptions(sock); memset(&sinaddr_tcp6, 0, sizeof(sinaddr_tcp6)); sinaddr_tcp6.sin6_family = AF_INET6; /* All the interfaces on the machine are used */ sinaddr_tcp6.sin6_addr = in6addr_any; sinaddr_tcp6.sin6_port = htons(_9p_param._9p_tcp_port); netbuf_tcp6.maxlen = sizeof(sinaddr_tcp6); netbuf_tcp6.len = sizeof(sinaddr_tcp6); netbuf_tcp6.buf = &sinaddr_tcp6; bindaddr_tcp6.qlen = SOMAXCONN; bindaddr_tcp6.addr = netbuf_tcp6; if (!__rpc_fd2sockinfo(sock, &si_tcp6)) { LogFatal(COMPONENT_DISPATCH, "Cannot get 9p socket info for tcp6 socket errno=%d (%s)", errno, strerror(errno)); return -1; } if (bind(sock, (struct sockaddr *)bindaddr_tcp6.addr.buf, (socklen_t) si_tcp6.si_alen) == -1) { LogFatal(COMPONENT_DISPATCH, "Cannot bind 9p tcp6 socket, error %d (%s)", errno, strerror(errno)); return -1; } if (listen(sock, 20) == -1) { LogFatal(COMPONENT_DISPATCH, "Cannot bind 9p tcp6 socket, error %d (%s)", errno, strerror(errno)); return -1; } return sock; bad_socket: LogFatal(COMPONENT_9P_DISPATCH, "Bad socket option 9p, error %d (%s)", errno, strerror(errno)); return -1; } /* _9p_create_socket */
/** * _9p_create_socket_V4 : create the socket and bind for 9P using * the available V4 interfaces on the host. This is not the default * for ganesha. We expect _9p_create_socket_V6 to be called first * and succeed. Only when the V6 function returns failure is this * function expected to be called. See _9p_create_socket(). * * @return socket fd or -1 in case of failure * */ static int _9p_create_socket_V4(void) { int sock = -1; int one = 1; int centvingt = 120; int neuf = 9; struct netbuf netbuf_tcp; struct t_bind bindaddr_tcp; struct __rpc_sockinfo si_tcp; struct sockaddr_in sinaddr_tcp; sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == -1) { LogWarn(COMPONENT_9P_DISPATCH, "Error creating 9p V4 socket, error %d(%s)", errno, strerror(errno)); return -1; } if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) == -1) || (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)) == -1) || (setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, ¢vingt, sizeof(centvingt)) == -1) || (setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, ¢vingt, sizeof(centvingt)) == -1) || (setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, &neuf, sizeof(neuf)) == -1)) { LogWarn(COMPONENT_9P_DISPATCH, "Error setting 9p V4 socket option, error %d(%s)", errno, strerror(errno)); goto err; } socket_setoptions(sock); memset(&sinaddr_tcp, 0, sizeof(sinaddr_tcp)); sinaddr_tcp.sin_family = AF_INET; /* All the interfaces on the machine are used */ sinaddr_tcp.sin_addr.s_addr = htonl(INADDR_ANY); sinaddr_tcp.sin_port = htons(_9p_param._9p_tcp_port); netbuf_tcp.maxlen = sizeof(sinaddr_tcp); netbuf_tcp.len = sizeof(sinaddr_tcp); netbuf_tcp.buf = &sinaddr_tcp; bindaddr_tcp.qlen = SOMAXCONN; bindaddr_tcp.addr = netbuf_tcp; if (!__rpc_fd2sockinfo(sock, &si_tcp)) { LogWarn(COMPONENT_9P_DISPATCH, "Cannot get 9p socket info for tcp V4 socket error %d(%s)", errno, strerror(errno)); goto err; } if (bind(sock, (struct sockaddr *)bindaddr_tcp.addr.buf, (socklen_t) si_tcp.si_alen) == -1) { LogWarn(COMPONENT_9P_DISPATCH, "Cannot bind 9p tcp V4 socket, error %d(%s)", errno, strerror(errno)); goto err; } if (listen(sock, 20) == -1) { LogWarn(COMPONENT_9P_DISPATCH, "Cannot bind 9p tcp V4 socket, error %d(%s)", errno, strerror(errno)); goto err; } return sock; err: close(sock); return -1; }