Lines Matching defs:so

51     LogFlowFunc(("Enter: fBindSocket:%RTbool, so:%R[natsock], u32ForeignAddr:%RTnaipv4\n", fBindSocket, pSo, u32ForeignAddr));
145 struct socket *so;
147 for (so = head->so_next; so != head; so = so->so_next)
149 if ( so->so_lport == lport
150 && so->so_laddr.s_addr == laddr.s_addr
151 && so->so_faddr.s_addr == faddr.s_addr
152 && so->so_fport == fport)
153 return so;
167 struct socket *so;
169 so = (struct socket *)RTMemAllocZ(sizeof(struct socket));
170 if (so)
172 so->so_state = SS_NOFDREF;
173 so->s = -1;
175 so->so_poll_index = -1;
178 return so;
185 sofree(PNATState pData, struct socket *so)
187 LogFlowFunc(("ENTER:%R[natsock]\n", so));
192 if (so->fUnderPolling)
194 so->fShouldBeRemoved = 1;
195 LogFlowFunc(("LEAVE:%R[natsock] postponed deletion\n", so));
201 Assert(!sototcpcb(so));
203 Assert(!so->so_timeout);
204 Assert(!so->so_timeout_arg);
205 if (so == tcp_last_so)
207 else if (so == udp_last_so)
211 if (so->so_m != NULL)
213 m_freem(pData, so->so_m);
214 so->so_m = NULL;
217 if (so->so_ohdr != NULL)
219 RTMemFree(so->so_ohdr);
220 so->so_ohdr = NULL;
223 if (so->so_next && so->so_prev)
225 remque(pData, so); /* crashes if so is not in a queue */
229 RTMemFree(so);
234 * Read from so's socket into sb_snd, updating all relevant sbuf fields
235 * NOTE: This will only be called if it is select()ed for reading, so
239 soread(PNATState pData, struct socket *so)
242 struct sbuf *sb = &so->so_snd;
245 int mss = so->so_tcpcb->t_maxseg;
252 SOCKET_LOCK(so);
255 LogFlow(("soread: so = %R[natsock]\n", so));
256 Log2(("%s: so = %R[natsock] so->so_snd = %R[sbuf]\n", __PRETTY_FUNCTION__, so, sb));
319 nn = readv(so->s, (struct iovec *)iov, n);
321 nn = recv(so->s, iov[0].iov_base, iov[0].iov_len, (so->so_tcpcb->t_force? MSG_OOB:0));
324 Log2(("%s: so = %R[natsock] so->so_snd = %R[sbuf]\n", __PRETTY_FUNCTION__, so, sb));
336 status = ioctlsocket(so->s, FIONREAD, &pending);
341 SOCKET_UNLOCK(so);
348 SOCKET_UNLOCK(so);
355 fUninitiolizedTemplate = RT_BOOL(( sototcpcb(so)
356 && ( sototcpcb(so)->t_template.ti_src.s_addr == INADDR_ANY
357 || sototcpcb(so)->t_template.ti_dst.s_addr == INADDR_ANY)));
361 sofcantrcvmore(so);
363 tcp_sockclosed(pData, sototcpcb(so));
365 tcp_drop(pData, sototcpcb(so), errno);
366 SOCKET_UNLOCK(so);
397 ret = recv(so->s, iov[1].iov_base, iov[1].iov_len, 0);
422 SOCKET_UNLOCK(so);
430 * so when OOB data arrives, we soread() it and everything
434 sorecvoob(PNATState pData, struct socket *so)
436 struct tcpcb *tp = sototcpcb(so);
439 LogFlowFunc(("sorecvoob: so = %R[natsock]\n", so));
449 ret = soread(pData, so);
452 tp->snd_up = tp->snd_una + SBUF_LEN(&so->so_snd);
464 sosendoob(struct socket *so)
466 struct sbuf *sb = &so->so_rcv;
471 LogFlowFunc(("sosendoob so = %R[natsock]\n", so));
473 if (so->so_urgc > sizeof(buff))
474 so->so_urgc = sizeof(buff); /* XXX */
479 n = send(so->s, sb->sb_rptr, so->so_urgc, (MSG_OOB)); /* |MSG_DONTWAIT)); */
480 so->so_urgc -= n;
483 n, so->so_urgc));
493 if (len > so->so_urgc)
494 len = so->so_urgc;
496 so->so_urgc -= len;
497 if (so->so_urgc)
500 if (n > so->so_urgc)
501 n = so->so_urgc;
503 so->so_urgc -= n;
506 n = send(so->s, buff, len, (MSG_OOB)); /* |MSG_DONTWAIT)); */
512 n, so->so_urgc));
524 * Write data from so_rcv to so's socket,
528 sowrite(PNATState pData, struct socket *so)
531 struct sbuf *sb = &so->so_rcv;
544 LogFlowFunc(("so = %R[natsock]\n", so));
545 Log2(("%s: so = %R[natsock] so->so_rcv = %R[sbuf]\n", __PRETTY_FUNCTION__, so, sb));
547 SOCKET_LOCK(so);
549 if (so->so_urgc)
551 sosendoob(so);
554 SOCKET_UNLOCK(so);
608 /* Check if there's urgent data to send, and if so, send it */
610 nn = writev(so->s, (const struct iovec *)iov, n);
612 nn = send(so->s, iov[0].iov_base, iov[0].iov_len, 0);
619 SOCKET_UNLOCK(so);
626 Log2(("%s: disconnected, so->so_state = %x, errno = %d\n",
627 __PRETTY_FUNCTION__, so->so_state, errno));
628 sofcantsendmore(so);
629 tcp_sockclosed(pData, sototcpcb(so));
630 SOCKET_UNLOCK(so);
639 ret = send(so->s, iov[1].iov_base, iov[1].iov_len, 0);
667 if ((so->so_state & SS_FWDRAIN) && sb->sb_cc == 0)
668 sofcantsendmore(so);
670 SOCKET_UNLOCK(so);
679 sorecvfrom(PNATState pData, struct socket *so)
681 LogFlowFunc(("sorecvfrom: so = %lx\n", (long)so));
685 Assert(so->so_type == IPPROTO_UDP);
687 if (so->so_type == IPPROTO_ICMP)
690 sorecvfrom_icmp_unix(pData, so);
691 udp_detach(pData, so);
706 SOCKET_LOCK(so);
712 SOCKET_UNLOCK(so);
739 nread = recvmsg(so->s, &mh, 0);
748 status = WSARecvFrom(so->s, iov, 2, &nbytes, &flags,
774 if (so->so_expire)
776 if (so->so_fport != RT_H2N_U16_C(53))
777 so->so_expire = curtime + SO_EXPIRE;
788 && so->so_fport == RT_H2N_U16_C(53)
789 && CTL_CHECK(so->so_faddr.s_addr, CTL_DNS))
790 dnsproxy_answer(pData, so, m);
800 udp_output(pData, so, m, &addr);
817 icmp_error(pData, so->so_m, ICMP_UNREACH, code, 0, strerror(errno));
818 so->so_m = NULL;
822 SOCKET_UNLOCK(so);
830 sosendto(PNATState pData, struct socket *so, struct mbuf *m)
841 LogFlowFunc(("sosendto: so = %R[natsock], m = %lx\n", so, (long)m));
849 if ((so->so_faddr.s_addr & RT_H2N_U32(pData->netmask)) == pData->special_addr.s_addr)
852 uint32_t last_byte = RT_N2H_U32(so->so_faddr.s_addr) & ~pData->netmask;
865 host_addr.sin_port = so->so_fport;
867 sendto(so->s, m->m_data, m->m_len, 0,
882 paddr->sin_addr = so->so_faddr;
883 paddr->sin_port = so->so_fport;
903 ret = sendto(so->s, buf, mlen, 0,
906 if (slirpIsWideCasting(pData, so->so_faddr.s_addr))
908 slirpSend2Home(pData, so, buf, mlen, 0);
923 if (so->so_expire)
924 so->so_expire = curtime + SO_EXPIRE;
925 so->so_state = SS_ISFCONNECTED; /* So that it gets select()ed */
936 struct socket *so;
943 if ((so = socreate()) == NULL)
945 /* RTMemFree(so); Not sofree() ??? free(NULL) == NOP */
950 if ((so->so_tcpcb = tcp_newtcpcb(pData, so)) == NULL)
952 RTMemFree(so);
956 SOCKET_LOCK_CREATE(so);
957 SOCKET_LOCK(so);
959 insque(pData, so,&tcb);
967 so->so_tcpcb->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT*2;
969 so->so_state = (SS_FACCEPTCONN|flags);
970 so->so_lport = lport; /* Kept in network format */
971 so->so_laddr.s_addr = laddr; /* Ditto */
995 sofree(pData, so);
1002 if (sototcpcb(so))
1003 tcp_close(pData, sototcpcb(so));
1005 sofree(pData, so);
1015 so->so_fport = addr.sin_port;
1033 so->so_faddr = alias_addr;
1035 so->so_faddr = addr.sin_addr;
1037 so->s = s;
1038 SOCKET_UNLOCK(so);
1039 return so;
1049 sorwakeup(struct socket *so)
1051 NOREF(so);
1053 sowrite(so);
1054 FD_CLR(so->s,&writefds);
1064 sowwakeup(struct socket *so)
1066 NOREF(so);
1076 soisfconnecting(struct socket *so)
1078 so->so_state &= ~(SS_NOFDREF|SS_ISFCONNECTED|SS_FCANTRCVMORE|
1080 so->so_state |= SS_ISFCONNECTING; /* Clobber other states */
1084 soisfconnected(struct socket *so)
1086 LogFlowFunc(("ENTER: so:%R[natsock]\n", so));
1087 so->so_state &= ~(SS_ISFCONNECTING|SS_FWDRAIN|SS_NOFDREF);
1088 so->so_state |= SS_ISFCONNECTED; /* Clobber other states */
1089 LogFlowFunc(("LEAVE: so:%R[natsock]\n", so));
1093 sofcantrcvmore(struct socket *so)
1095 LogFlowFunc(("ENTER: so:%R[natsock]\n", so));
1096 if ((so->so_state & SS_NOFDREF) == 0)
1098 shutdown(so->s, 0);
1100 so->so_state &= ~(SS_ISFCONNECTING);
1101 if (so->so_state & SS_FCANTSENDMORE)
1102 so->so_state = SS_NOFDREF; /* Don't select it */
1105 so->so_state |= SS_FCANTRCVMORE;
1110 sofcantsendmore(struct socket *so)
1112 LogFlowFunc(("ENTER: so:%R[natsock]\n", so));
1113 if ((so->so_state & SS_NOFDREF) == 0)
1114 shutdown(so->s, 1); /* send FIN to fhost */
1116 so->so_state &= ~(SS_ISFCONNECTING);
1117 if (so->so_state & SS_FCANTRCVMORE)
1118 so->so_state = SS_NOFDREF; /* as above */
1120 so->so_state |= SS_FCANTSENDMORE;
1125 soisfdisconnected(struct socket *so)
1127 NOREF(so);
1129 so->so_state &= ~(SS_ISFCONNECTING|SS_ISFCONNECTED);
1130 close(so->s);
1131 so->so_state = SS_ISFDISCONNECTED;
1143 sofwdrain(struct socket *so)
1145 if (SBUF_LEN(&so->so_rcv))
1146 so->so_state |= SS_FWDRAIN;
1148 sofcantsendmore(so);
1248 * in host byte order so no byte order conversion is required. IP headers fields are converting
1308 /*XXX: so->so_m already freed so we shouldn't call sofree */
1322 static void sorecvfrom_icmp_unix(PNATState pData, struct socket *so)
1331 len = recvfrom(so->s, &ip, sizeof(struct ip), MSG_PEEK,
1354 icmp_error(pData, so->so_m, ICMP_UNREACH, code, 0, strerror(errno));
1355 so->so_m = NULL;
1388 len = recvfrom(so->s, buff, len, 0,