Lines Matching refs:nso

313 	struct nfs_socket *nso = arg;
318 if (nso->nso_flags & NSO_CONNECTING) {
319 NFS_SOCK_DBG(("nfs connect - socket %p upcall - connecting\n", nso));
320 wakeup(nso->nso_wake);
324 lck_mtx_lock(&nso->nso_lock);
325 if ((nso->nso_flags & (NSO_UPCALL|NSO_DISCONNECTING|NSO_DEAD)) || !(nso->nso_flags & NSO_PINGING)) {
326 NFS_SOCK_DBG(("nfs connect - socket %p upcall - nevermind\n", nso));
327 lck_mtx_unlock(&nso->nso_lock);
330 NFS_SOCK_DBG(("nfs connect - socket %p upcall\n", nso));
331 nso->nso_flags |= NSO_UPCALL;
336 if (nso->nso_flags & (NSO_DISCONNECTING|NSO_DEAD))
338 lck_mtx_unlock(&nso->nso_lock);
340 if (nso->nso_sotype == SOCK_STREAM) {
341 error = nfs_rpc_record_read(so, &nso->nso_rrs, MSG_DONTWAIT, &recv, &m);
347 lck_mtx_lock(&nso->nso_lock);
357 if (!error && ((reply != RPC_REPLY) || (rxid != nso->nso_pingxid)))
372 if ((accepted_status == RPC_PROGMISMATCH) && !nso->nso_version) {
377 if (nso->nso_protocol == PMAPPROG) {
380 else if ((nso->nso_saddr->sa_family == AF_INET) &&
382 nso->nso_version = PMAPVERS;
383 else if (nso->nso_saddr->sa_family == AF_INET6) {
385 nso->nso_version = RPCBVERS4;
387 nso->nso_version = RPCBVERS3;
389 } else if (nso->nso_protocol == NFS_PROG) {
393 nso->nso_version = NFS_VER3;
395 nso->nso_version = NFS_VER2;
397 nso->nso_version = NFS_VER4;
399 if (!error && nso->nso_version)
426 nso->nso_flags &= ~NSO_PINGING;
428 nso->nso_error = error;
429 nso->nso_flags |= NSO_DEAD;
431 nso->nso_flags |= NSO_VERIFIED;
435 wakeup(nso->nso_wake);
440 nso->nso_flags &= ~NSO_UPCALL;
443 nso->nso_error = error ? error : EPIPE;
444 nso->nso_flags |= NSO_DEAD;
445 wakeup(nso->nso_wake);
447 if (nso->nso_flags & NSO_DISCONNECTING)
448 wakeup(&nso->nso_flags);
449 lck_mtx_unlock(&nso->nso_lock);
466 struct nfs_socket *nso;
484 MALLOC(nso, struct nfs_socket *, sizeof(struct nfs_socket), M_TEMP, M_WAITOK|M_ZERO);
485 if (nso)
486 MALLOC(nso->nso_saddr, struct sockaddr *, sa->sa_len, M_SONAME, M_WAITOK|M_ZERO);
487 if (!nso || !nso->nso_saddr) {
488 if (nso)
489 FREE(nso, M_TEMP);
492 lck_mtx_init(&nso->nso_lock, nfs_request_grp, LCK_ATTR_NULL);
493 nso->nso_sotype = sotype;
494 if (nso->nso_sotype == SOCK_STREAM)
495 nfs_rpc_record_state_init(&nso->nso_rrs);
497 nso->nso_timestamp = now.tv_sec;
498 bcopy(sa, nso->nso_saddr, sa->sa_len);
500 ((struct sockaddr_in*)nso->nso_saddr)->sin_port = htons(port);
502 ((struct sockaddr_in6*)nso->nso_saddr)->sin6_port = htons(port);
503 nso->nso_protocol = protocol;
504 nso->nso_version = vers;
506 error = sock_socket(sa->sa_family, nso->nso_sotype, 0, NULL, NULL, &nso->nso_so);
515 error = sock_setsockopt(nso->nso_so, level, optname, &portrange, sizeof(portrange));
529 error = sock_bind(nso->nso_so, (struct sockaddr*)&ss);
535 vfs_statfs(nmp->nm_mountp)->f_mntfromname, error, nso, naddr, sotype,
537 nfs_socket_destroy(nso);
540 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, naddr,
542 *nsop = nso;
551 nfs_socket_destroy(struct nfs_socket *nso)
555 lck_mtx_lock(&nso->nso_lock);
556 nso->nso_flags |= NSO_DISCONNECTING;
557 if (nso->nso_flags & NSO_UPCALL) /* give upcall a chance to complete */
558 msleep(&nso->nso_flags, &nso->nso_lock, PZERO-1, "nfswaitupcall", &ts);
559 lck_mtx_unlock(&nso->nso_lock);
560 sock_shutdown(nso->nso_so, SHUT_RDWR);
561 sock_close(nso->nso_so);
562 if (nso->nso_sotype == SOCK_STREAM)
563 nfs_rpc_record_state_cleanup(&nso->nso_rrs);
564 lck_mtx_destroy(&nso->nso_lock, nfs_request_grp);
565 if (nso->nso_saddr)
566 FREE(nso->nso_saddr, M_SONAME);
567 if (nso->nso_saddr2)
568 FREE(nso->nso_saddr2, M_SONAME);
569 NFS_SOCK_DBG(("nfs connect - socket %p destroyed\n", nso));
570 FREE(nso, M_TEMP);
577 nfs_socket_options(struct nfsmount *nmp, struct nfs_socket *nso)
591 sock_setsockopt(nso->nso_so, SOL_SOCKET, SO_RCVTIMEO, &timeo, sizeof(timeo));
592 sock_setsockopt(nso->nso_so, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo));
593 if (nso->nso_sotype == SOCK_STREAM) {
595 sock_setsockopt(nso->nso_so, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on));
597 sock_gettype(nso->nso_so, NULL, NULL, &proto);
599 sock_setsockopt(nso->nso_so, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));
601 if (nso->nso_sotype == SOCK_DGRAM) { /* set socket buffer sizes for UDP */
603 sock_setsockopt(nso->nso_so, SOL_SOCKET, SO_SNDBUF, &reserve, sizeof(reserve));
604 sock_setsockopt(nso->nso_so, SOL_SOCKET, SO_RCVBUF, &reserve, sizeof(reserve));
607 sock_setsockopt(nso->nso_so, SOL_SOCKET, SO_NOADDRERR, &on, sizeof(on));
609 sock_setsockopt(nso->nso_so, SOL_SOCKET, SO_UPCALLCLOSEWAIT, &on, sizeof(on));
612 sock_nointerrupt(nso->nso_so, 1);
621 struct nfs_socket *nso, *nsonext;
623 TAILQ_FOREACH_SAFE(nso, &nss->nss_socklist, nso_link, nsonext) {
624 TAILQ_REMOVE(&nss->nss_socklist, nso, nso_link);
626 nfs_socket_destroy(nso);
689 struct nfs_socket *nso, *nsonext;
734 ((nss->nss_protocol == NFS_PROG) && NMFLAG(nmp, RESVPORT)), &nso);
738 nso->nso_location = nss->nss_nextloc;
739 nso->nso_wake = nss;
740 error = sock_setupcall(nso->nso_so, nfs_connect_upcall, nso);
742 lck_mtx_lock(&nso->nso_lock);
743 nso->nso_error = error;
744 nso->nso_flags |= NSO_DEAD;
745 lck_mtx_unlock(&nso->nso_lock);
748 TAILQ_INSERT_TAIL(&nss->nss_socklist, nso, nso_link);
756 TAILQ_FOREACH(nso, &nss->nss_socklist, nso_link) {
757 lck_mtx_lock(&nso->nso_lock);
758 if (!(nso->nso_flags & NSO_CONNECTED)) {
759 if ((nso->nso_sotype != SOCK_STREAM) && NMFLAG(nmp, NOCONNECT)) {
761 nso->nso_flags |= NSO_CONNECTED;
763 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
764 } else if (!(nso->nso_flags & NSO_CONNECTING)) {
766 nso->nso_flags |= NSO_CONNECTING;
767 lck_mtx_unlock(&nso->nso_lock);
769 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
770 error = sock_connect(nso->nso_so, nso->nso_saddr, MSG_DONTWAIT);
771 lck_mtx_lock(&nso->nso_lock);
773 nso->nso_error = error;
774 nso->nso_flags |= NSO_DEAD;
775 lck_mtx_unlock(&nso->nso_lock);
779 if (nso->nso_flags & NSO_CONNECTING) {
781 if (sock_isconnected(nso->nso_so)) {
783 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
784 nso->nso_flags &= ~NSO_CONNECTING;
785 nso->nso_flags |= NSO_CONNECTED;
789 sock_getsockopt(nso->nso_so, SOL_SOCKET, SO_ERROR, &error, &optlen);
792 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error));
796 nso->nso_error = error;
797 nso->nso_flags |= NSO_DEAD;
798 lck_mtx_unlock(&nso->nso_lock);
803 if (nso->nso_flags & NSO_CONNECTED)
804 nfs_socket_options(nmp, nso);
806 if (!(nso->nso_flags & NSO_CONNECTED)) {
807 lck_mtx_unlock(&nso->nso_lock);
810 if (!(nso->nso_flags & (NSO_PINGING|NSO_VERIFIED)) ||
811 ((nso->nso_sotype == SOCK_DGRAM) && (now.tv_sec >= nso->nso_reqtimestamp+2))) {
813 uint64_t xid = nso->nso_pingxid;
819 if (!(vers = nso->nso_version)) {
820 if (nso->nso_protocol == PMAPPROG)
821 vers = (nso->nso_saddr->sa_family == AF_INET) ? PMAPVERS : RPCBVERS4;
822 else if (nso->nso_protocol == NFS_PROG)
825 lck_mtx_unlock(&nso->nso_lock);
826 error = nfsm_rpchead2(nmp, nso->nso_sotype, nso->nso_protocol, vers, 0, RPCAUTH_SYS,
828 lck_mtx_lock(&nso->nso_lock);
830 nso->nso_flags |= NSO_PINGING;
831 nso->nso_pingxid = R_XID32(xid);
832 nso->nso_reqtimestamp = now.tv_sec;
834 if ((nso->nso_sotype != SOCK_STREAM) && !sock_isconnected(nso->nso_so)) {
835 msg.msg_name = nso->nso_saddr;
836 msg.msg_namelen = nso->nso_saddr->sa_len;
840 lck_mtx_unlock(&nso->nso_lock);
841 error = sock_sendmbuf(nso->nso_so, &msg, mreq, 0, &sentlen);
843 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error));
844 lck_mtx_lock(&nso->nso_lock);
849 nso->nso_error = error;
850 nso->nso_flags |= NSO_DEAD;
851 lck_mtx_unlock(&nso->nso_lock);
855 if (nso->nso_flags & NSO_VERIFIED) {
858 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
859 if (!nso->nso_version) {
861 if (nso->nso_protocol == PMAPPROG)
862 nso->nso_version = (nso->nso_saddr->sa_family == AF_INET) ? PMAPVERS : RPCBVERS4;
863 if (nso->nso_protocol == NFS_PROG)
864 nso->nso_version = NFS_VER3;
866 lck_mtx_unlock(&nso->nso_lock);
867 TAILQ_REMOVE(&nss->nss_socklist, nso, nso_link);
869 nss->nss_sock = nso;
872 lck_mtx_unlock(&nso->nso_lock);
875 TAILQ_FOREACH_SAFE(nso, &nss->nss_socklist, nso_link, nsonext) {
876 lck_mtx_lock(&nso->nso_lock);
877 if (now.tv_sec >= (nso->nso_timestamp + nss->nss_timeo)) {
880 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
881 nso->nso_error = ETIMEDOUT;
882 nso->nso_flags |= NSO_DEAD;
884 if (!(nso->nso_flags & NSO_DEAD)) {
885 lck_mtx_unlock(&nso->nso_lock);
888 lck_mtx_unlock(&nso->nso_lock);
890 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, nso->nso_error));
891 nfs_socket_search_update_error(nss, nso->nso_error);
892 TAILQ_REMOVE(&nss->nss_socklist, nso, nso_link);
894 nfs_socket_destroy(nso);
943 struct nfs_socket *nso, *nsonfs;
1093 nso = nss.nss_sock;
1097 if (nso->nso_saddr->sa_family == AF_INET)
1098 port = ntohs(((struct sockaddr_in*)nso->nso_saddr)->sin_port);
1100 port = ntohs(((struct sockaddr_in6*)nso->nso_saddr)->sin6_port);
1104 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
1107 sock_setupcall(nso->nso_so, NULL, NULL);
1110 bcopy(nso->nso_saddr, &ss, nso->nso_saddr->sa_len);
1121 nso->nso_so, NFS_PROG, nfsvers,
1122 (nso->nso_sotype == SOCK_DGRAM) ? IPPROTO_UDP : IPPROTO_TCP, timeo);
1134 nso->nso_so, NFS_PROG, nfsvers,
1135 (nso->nso_sotype == SOCK_DGRAM) ? IPPROTO_UDP : IPPROTO_TCP, timeo);
1147 nfs_socket_destroy(nso);
1152 error = nfs_socket_create(nmp, (struct sockaddr*)&ss, nso->nso_sotype, port,
1156 nfs_socket_destroy(nso);
1159 nsonfs->nso_location = nso->nso_location;
1165 nfs_socket_destroy(nso);
1173 bcopy(nso->nso_saddr, &ss, nso->nso_saddr->sa_len);
1183 int mntproto = (NM_OMFLAG(nmp, MNTUDP) || (nso->nso_sotype == SOCK_DGRAM)) ? IPPROTO_UDP : IPPROTO_TCP;
1185 nso->nso_so, RPCPROG_MNT, mntvers, mntproto, timeo);
1209 nfs_socket_destroy(nso);
1213 /* nso is an NFS socket */
1214 NFS_SOCK_DBG(("nfs connect %s got NFS socket %p\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
1217 nfsvers = nmp->nm_vers ? nmp->nm_vers : (int)nso->nso_version;
1222 saddr = nso->nso_saddr2;
1225 bcopy(nso->nso_saddr, &ss, nso->nso_saddr->sa_len);
1234 int mntproto = (NM_OMFLAG(nmp, MNTUDP) || (nso->nso_sotype == SOCK_DGRAM)) ? IPPROTO_UDP : IPPROTO_TCP;
1263 nfs_socket_destroy(nso);
1266 nfs_location_mntfromname(&nmp->nm_locations, nso->nso_location, path, MAXPATHLEN, 1);
1267 error = nfs3_mount_rpc(nmp, saddr, nso->nso_sotype, nfsvers,
1270 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error));
1325 nfs_socket_destroy(nso);
1336 upcall = (nso->nso_sotype == SOCK_STREAM) ? nfs_tcp_rcv : nfs_udp_rcv;
1337 error = sock_setupcall(nso->nso_so, upcall, nmp);
1340 nfs_socket_destroy(nso);
1347 nfs_location_mntfromname(&nmp->nm_locations, nso->nso_location,
1352 nmp->nm_sotype = nso->nso_sotype;
1357 if (nso->nso_saddr->sa_family == AF_INET)
1358 port = ((struct sockaddr_in*)nso->nso_saddr)->sin_port = htons(port);
1359 else if (nso->nso_saddr->sa_family == AF_INET6)
1360 port = ((struct sockaddr_in6*)nso->nso_saddr)->sin6_port = htons(port);
1382 if (nso->nso_sotype == SOCK_DGRAM) {
1385 } else if (nso->nso_sotype == SOCK_STREAM) {
1391 nmp->nm_nso = nso;
1393 nmp->nm_saddr = nso->nso_saddr;
1404 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error));
1426 nfs_socket_destroy(nso);
1432 (nmp->nm_locations.nl_current.nli_serv != nso->nso_location.nli_serv)) {
1436 nmp->nm_locations.nl_current = nso->nso_location;
1579 struct nfs_socket *nso;
1596 nso = nmp->nm_nso;
1598 if (nso->nso_saddr == nmp->nm_saddr)
1599 nso->nso_saddr = NULL;
1601 nfs_socket_destroy(nso);
2773 struct nfs_socket *nso;
2875 nso = nmp->nm_nso;
2879 if (!nso) {
2960 if ((sotype != SOCK_STREAM) && !sock_isconnected(nso->nso_so) && ((sendnam = nmp->nm_saddr))) {
2964 error = sock_sendmbuf(nso->nso_so, &msg, mreqcopy, 0, &sentlen);
3014 (error != EWOULDBLOCK) && (error != EIO) && (nso == nmp->nm_nso)) {
3016 sock_getsockopt(nso->nso_so, SOL_SOCKET, SO_ERROR, &clearerror, &optlen);
3046 if (needrecon && (nso == nmp->nm_nso)) { /* mark socket as needing reconnect */
3099 struct nfs_socket *nso = nmp->nm_nso;
3109 if (!nso || (nso->nso_so != so))
3131 struct nfs_socket *nso = nmp->nm_nso;
3142 nso = nmp->nm_nso;
3143 if (!nso || (nso->nso_so != so) || (nmp->nm_sockflags & (NMSOCK_DISCONNECTING))) {
3150 lck_mtx_lock(&nso->nso_lock);
3151 if (nso->nso_flags & (NSO_UPCALL|NSO_DISCONNECTING|NSO_DEAD)) {
3152 lck_mtx_unlock(&nso->nso_lock);
3155 nso->nso_flags |= NSO_UPCALL;
3156 nrrs = nso->nso_rrs;
3157 lck_mtx_unlock(&nso->nso_lock);
3167 if (nmp->nm_nso == nso) {
3170 lck_mtx_lock(&nso->nso_lock);
3171 nso->nso_rrs = nrrs;
3172 nso->nso_flags &= ~NSO_UPCALL;
3173 lck_mtx_unlock(&nso->nso_lock);