Lines Matching defs:so

30  * furnished to do so, subject to the following conditions:
75 # define DO_ENGAGE_EVENT1(so, fdset, label) \
77 if ( so->so_poll_index != -1 \
78 && so->s == polls[so->so_poll_index].fd) \
80 polls[so->so_poll_index].events |= N_(fdset ## _poll); \
85 polls[poll_index].fd = (so)->s; \
86 (so)->so_poll_index = poll_index; \
92 # define DO_ENGAGE_EVENT2(so, fdset1, fdset2, label) \
94 if ( so->so_poll_index != -1 \
95 && so->s == polls[so->so_poll_index].fd) \
97 polls[so->so_poll_index].events |= \
102 polls[poll_index].fd = (so)->s; \
103 (so)->so_poll_index = poll_index; \
109 # define DO_POLL_EVENTS(rc, error, so, events, label) do {} while (0)
113 * gcc warns about attempts to log POLLNVAL so construction in a last to lines
117 # define DO_CHECK_FD_SET(so, events, fdset) \
118 ( ((so)->so_poll_index != -1) \
119 && ((so)->so_poll_index <= ndfs) \
120 && ((so)->s == polls[so->so_poll_index].fd) \
121 && (polls[(so)->so_poll_index].revents & N_(fdset ## _poll)) \
123 || !(polls[(so)->so_poll_index].revents & POLLNVAL)))
126 # define DO_WIN_CHECK_FD_SET(so, events, fdset) 0
143 # define ICMP_ENGAGE_EVENT(so, fdset) \
146 DO_ENGAGE_EVENT1((so), fdset, ICMP); \
155 # define ICMP_ENGAGE_EVENT(so, fdset) do {} while (0)
160 # define DO_ENGAGE_EVENT1(so, fdset1, label) \
162 rc = WSAEventSelect((so)->s, VBOX_SOCKET_EVENT, FD_ALL_EVENTS); \
167 LogRel(("WSAEventSelect (" #label ") error %d (so=%x, socket=%s, event=%x)\n", \
168 error, (so), (so)->s, VBOX_SOCKET_EVENT)); \
173 # define DO_ENGAGE_EVENT2(so, fdset1, fdset2, label) \
174 DO_ENGAGE_EVENT1((so), (fdset1), label)
176 # define DO_POLL_EVENTS(rc, error, so, events, label) \
177 (rc) = WSAEnumNetworkEvents((so)->s, VBOX_SOCKET_EVENT, (events)); \
181 LogRel(("WSAEnumNetworkEvents %R[natsock] " #label " error %d\n", (so), (error))); \
182 LogFunc(("WSAEnumNetworkEvents %R[natsock] " #label " error %d\n", (so), (error))); \
202 # define DO_CHECK_FD_SET(so, events, fdset) \
205 # define DO_WIN_CHECK_FD_SET(so, events, fdset) DO_CHECK_FD_SET((so), (events), fdset)
206 # define DO_UNIX_CHECK_FD_SET(so, events, fdset) 1 /*specific for Unix API */
210 #define TCP_ENGAGE_EVENT1(so, fdset) \
211 DO_ENGAGE_EVENT1((so), fdset, tcp)
213 #define TCP_ENGAGE_EVENT2(so, fdset1, fdset2) \
214 DO_ENGAGE_EVENT2((so), fdset1, fdset2, tcp)
217 # define WIN_TCP_ENGAGE_EVENT2(so, fdset, fdset2) TCP_ENGAGE_EVENT2(so, fdset1, fdset2)
220 #define UDP_ENGAGE_EVENT(so, fdset) \
221 DO_ENGAGE_EVENT1((so), fdset, udp)
223 #define POLL_TCP_EVENTS(rc, error, so, events) \
224 DO_POLL_EVENTS((rc), (error), (so), (events), tcp)
226 #define POLL_UDP_EVENTS(rc, error, so, events) \
227 DO_POLL_EVENTS((rc), (error), (so), (events), udp)
229 #define CHECK_FD_SET(so, events, set) \
230 (DO_CHECK_FD_SET((so), (events), set))
232 #define WIN_CHECK_FD_SET(so, events, set) \
233 (DO_WIN_CHECK_FD_SET((so), (events), set))
240 # define DO_LOG_NAT_SOCK(so, proto, winevent, r_fdset, w_fdset, x_fdset) \
242 LogRel((" " #proto " %R[natsock] %R[natwinnetevents]\n", (so), (winevent))); \
245 # define DO_LOG_NAT_SOCK(so, proto, winevent, r_fdset, w_fdset, x_fdset) \
247 LogRel((" " #proto " %R[natsock] %s %s %s er: %s, %s, %s\n", (so), \
248 CHECK_FD_SET(so, ign ,r_fdset) ? "READ":"", \
249 CHECK_FD_SET(so, ign, w_fdset) ? "WRITE":"", \
250 CHECK_FD_SET(so, ign, x_fdset) ? "OOB":"", \
251 CHECK_FD_SET(so, ign, rderr) ? "RDERR":"", \
252 CHECK_FD_SET(so, ign, rdhup) ? "RDHUP":"", \
253 CHECK_FD_SET(so, ign, nval) ? "RDNVAL":"")); \
257 # define DO_LOG_NAT_SOCK(so, proto, winevent, r_fdset, w_fdset, x_fdset) do {} while (0)
260 #define LOG_NAT_SOCK(so, proto, winevent, r_fdset, w_fdset, x_fdset) \
261 DO_LOG_NAT_SOCK((so), proto, (winevent), r_fdset, w_fdset, x_fdset)
491 struct socket *so;
499 while ((so = tcb.so_next) != &tcb)
502 if ( !sototcpcb(so)
503 && ( so->so_state & SS_NOFDREF
504 || so->s == -1))
505 sofree(pData, so);
507 tcp_close(pData, sototcpcb(so));
510 while ((so = udb.so_next) != &udb)
511 udp_detach(pData, so);
589 #define CONN_CANFSEND(so) (((so)->so_state & (SS_FCANTSENDMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
590 #define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
620 struct socket *so, *so_next;
669 QSOCKET_FOREACH(so, so_next, tcp)
671 Assert(so->so_type == IPPROTO_TCP);
673 so->so_poll_index = -1;
678 Assert((!so->so_cloneOf));
684 && so->so_tcpcb != NULL
685 && so->so_tcpcb->t_flags & TF_DELACK)
694 if (so->so_state & SS_NOFDREF || so->s == -1)
700 if (so->so_state & SS_FACCEPTCONN)
703 TCP_ENGAGE_EVENT1(so, readfds);
710 if (so->so_state & SS_ISFCONNECTING)
712 Log2(("connecting %R[natsock] engaged\n",so));
715 WIN_TCP_ENGAGE_EVENT2(so, writefds, connectfds);
717 TCP_ENGAGE_EVENT1(so, writefds);
725 if (CONN_CANFSEND(so) && SBUF_LEN(&so->so_rcv))
728 TCP_ENGAGE_EVENT1(so, writefds);
736 if ( CONN_CANFRCV(so)
737 && (SBUF_LEN(&so->so_snd) < (SBUF_SIZE(&so->so_snd)/2))
739 && !(so->so_state & SS_ISFCONNECTING)
744 TCP_ENGAGE_EVENT2(so, readfds, xfds);
746 LOOP_LABEL(tcp, so, so_next);
755 QSOCKET_FOREACH(so, so_next, udp)
758 Assert(so->so_type == IPPROTO_UDP);
761 so->so_poll_index = -1;
767 if (so->so_expire)
769 if (so->so_expire <= curtime)
771 Log2(("NAT: %R[natsock] expired\n", so));
772 if (so->so_timeout != NULL)
775 * drop so_timeout* from so.
777 so->so_timeout(pData, so, so->so_timeout_arg);
778 /* on 4.2 so->
780 if ( so_next->so_prev != so /* so_timeout freed the socket */
781 || so->so_timeout) /* so_timeout just freed so_timeout */
784 UDP_DETACH(pData, so, so_next);
789 if (so->so_cloneOf)
795 * sendto()'d straight away, so no need for setting for writing
803 if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <= 4)
806 UDP_ENGAGE_EVENT(so, readfds);
808 LOOP_LABEL(udp, so, so_next);
828 static bool slirpConnectOrWrite(PNATState pData, struct socket *so, bool fConnectOnly)
831 LogFlowFunc(("ENTER: so:%R[natsock], fConnectOnly:%RTbool\n", so, fConnectOnly));
835 if (so->so_state & SS_ISFCONNECTING)
837 Log2(("connecting %R[natsock] catched\n", so));
839 so->so_state &= ~SS_ISFCONNECTING;
848 ret = send(so->s, (const char *)&ret, 0, 0);
860 so->so_state = SS_NOFDREF;
862 /* else so->so_state &= ~SS_ISFCONNECTING; */
868 TCP_INPUT(pData, (struct mbuf *)NULL, sizeof(struct ip), so);
873 SOWRITE(ret, pData, so);
881 struct tcpcb *tp = sototcpcb(so);
897 struct socket *so, *so_next;
951 QSOCKET_FOREACH(so, so_next, tcp)
955 Assert((!so->so_cloneOf));
957 Assert(!so->fUnderPolling);
958 so->fUnderPolling = 1;
959 if (slirpVerifyAndFreeSocket(pData, so))
965 if (so->so_state & SS_NOFDREF || so->s == -1)
967 so->fUnderPolling = 0;
971 POLL_TCP_EVENTS(rc, error, so, &NetworkEvents);
973 LOG_NAT_SOCK(so, TCP, &NetworkEvents, readfds, writefds, xfds);
975 if (so->so_state & SS_ISFCONNECTING)
987 if ( CHECK_FD_SET(so, NetworkEvents, closefds) /* POLLHUP */
988 || CHECK_FD_SET(so, NetworkEvents, rderr)) /* POLLERR */
994 else if (CHECK_FD_SET(so, NetworkEvents, writefds)) /* POLLOUT */
1003 ret = getsockopt(so->s, SOL_SOCKET, SO_ERROR, &sockerr, &optlen);
1019 tcp_fconnect_failed(pData, so, sockerr);
1020 ret = slirpVerifyAndFreeSocket(pData, so);
1033 * This will soread as well, so no need to
1038 if ( CHECK_FD_SET(so, NetworkEvents, xfds)
1043 && !CHECK_FD_SET(so, NetworkEvents, closefds)
1049 && !WIN_CHECK_FD_SET(so, NetworkEvents, closefds)
1053 sorecvoob(pData, so);
1054 if (slirpVerifyAndFreeSocket(pData, so))
1061 else if ( CHECK_FD_SET(so, NetworkEvents, readfds)
1062 || WIN_CHECK_FD_SET(so, NetworkEvents, acceptds))
1066 if (WIN_CHECK_FD_SET(so, NetworkEvents, connectfds))
1070 bool fRet = slirpConnectOrWrite(pData, so, true);
1072 if (slirpVerifyAndFreeSocket(pData, so))
1079 if (so->so_state & SS_FACCEPTCONN)
1081 TCP_CONNECT(pData, so);
1082 if (slirpVerifyAndFreeSocket(pData, so))
1084 if (!CHECK_FD_SET(so, NetworkEvents, closefds))
1086 so->fUnderPolling = 0;
1091 ret = soread(pData, so);
1092 if (slirpVerifyAndFreeSocket(pData, so))
1096 TCP_OUTPUT(pData, sototcpcb(so));
1098 if (slirpVerifyAndFreeSocket(pData, so))
1106 if ( CHECK_FD_SET(so, NetworkEvents, closefds)
1107 || (so->so_close == 1))
1112 for (; so_next->so_prev == so
1113 && !slirpVerifyAndFreeSocket(pData, so);)
1115 ret = soread(pData, so);
1116 if (slirpVerifyAndFreeSocket(pData, so))
1120 TCP_OUTPUT(pData, sototcpcb(so));
1121 else if (so_next->so_prev == so)
1123 Log2(("%R[natsock] errno %d (%s)\n", so, errno, strerror(errno)));
1128 /* if socket freed ''so'' is PHANTOM and next socket isn't points on it */
1129 if (so_next->so_prev == so)
1132 so->so_close = 1;
1136 if (CHECK_FD_SET(so, NetworkEvents, rderr))
1137 sofcantsendmore(so);
1140 if (so_next->so_prev == so)
1141 so->fUnderPolling = 0;
1148 if ( CHECK_FD_SET(so, NetworkEvents, writefds)
1150 || WIN_CHECK_FD_SET(so, NetworkEvents, connectfds)
1154 int fConnectOrWriteSuccess = slirpConnectOrWrite(pData, so, false);
1156 * so we should be ready to such situations.
1158 if (slirpVerifyAndFreeSocket(pData, so))
1162 so->fUnderPolling = 0;
1173 if (so->so_state & SS_ISFCONNECTING)
1175 ret = recv(so->s, (char *)&ret, 0, 0);
1187 so->so_state = SS_NOFDREF;
1193 ret = send(so->s, &ret, 0, 0);
1203 so->so_state = SS_NOFDREF;
1206 so->so_state &= ~SS_ISFCONNECTING;
1209 TCP_INPUT((struct mbuf *)NULL, sizeof(struct ip),so);
1212 if (!slirpVerifyAndFreeSocket(pData, so))
1213 so->fUnderPolling = 0;
1214 LOOP_LABEL(tcp, so, so_next);
1222 QSOCKET_FOREACH(so, so_next, udp)
1225 if (so->so_cloneOf)
1229 so->fUnderPolling = 1;
1230 if(slirpVerifyAndFreeSocket(pData, so));
1232 so->fUnderPolling = 0;
1235 POLL_UDP_EVENTS(rc, error, so, &NetworkEvents);
1237 LOG_NAT_SOCK(so, UDP, &NetworkEvents, readfds, writefds, xfds);
1239 if (so->s != -1 && CHECK_FD_SET(so, NetworkEvents, readfds))
1241 SORECVFROM(pData, so);
1243 LOOP_LABEL(udp, so, so_next);
1534 struct socket *so;
1563 so = udp_listen(pData, rule->bind_ip.s_addr, RT_H2N_U16(rule->host_port), guest_addr,
1566 so = solisten(pData, rule->bind_ip.s_addr, RT_H2N_U16(rule->host_port), guest_addr,
1569 if (so == NULL)
1578 rc = getsockname(so->s, &sa, &socketlen);
1583 rule->so = so;
1665 udp_detach(pData, rule->so);
1667 tcp_close(pData, sototcpcb(rule->so));
2058 struct socket *so, *so_next;
2066 QSOCKET_FOREACH(so, so_next, tcp)
2068 pHlp->pfnPrintf(pHlp, " %R[natsock]\n", so);
2072 QSOCKET_FOREACH(so, so_next, udp)
2074 pHlp->pfnPrintf(pHlp, " %R[natsock]\n", so);