/* uipc_socket2.c 4.9 81/11/23 */
#include "../h/protosw.h"
#include "../h/socketvar.h"
#include "../net/inet_systm.h"
* Primitive routines for operating on sockets and socket buffers
* Procedures to manipulate state flags of socket
* and do appropriate wakeups.
so
->so_state
&= ~(SS_ISCONNECTED
|SS_ISDISCONNECTING
);
so
->so_state
|= SS_ISCONNECTING
;
wakeup((caddr_t
)&so
->so_timeo
);
so
->so_state
&= ~(SS_ISCONNECTING
|SS_ISDISCONNECTING
);
so
->so_state
|= SS_ISCONNECTED
;
wakeup((caddr_t
)&so
->so_timeo
);
so
->so_state
&= ~(SS_ISCONNECTED
|SS_ISCONNECTING
);
so
->so_state
|= (SS_ISDISCONNECTING
|SS_CANTRCVMORE
|SS_CANTSENDMORE
);
wakeup((caddr_t
)&so
->so_timeo
);
so
->so_state
&= ~(SS_ISCONNECTING
|SS_ISCONNECTED
|SS_ISDISCONNECTING
);
so
->so_state
|= (SS_CANTRCVMORE
|SS_CANTSENDMORE
);
wakeup((caddr_t
)&so
->so_timeo
);
so
->so_state
|= SS_CANTSENDMORE
;
so
->so_state
|= SS_CANTRCVMORE
;
register struct socket
*so
;
* Queue a process for a select on a socket buffer.
if ((p
= sb
->sb_sel
) && p
->p_wchan
== (caddr_t
)&selwait
)
* Wait for data to arrive at/drain from a socket buffer.
sleep((caddr_t
)&sb
->sb_cc
, PZERO
+1);
* Wakeup processes waiting on a socket buffer.
selwakeup(sb
->sb_sel
, sb
->sb_flags
& SB_COLL
);
sb
->sb_flags
&= ~SB_COLL
;
if (sb
->sb_flags
& SB_WAIT
) {
sb
->sb_flags
&= ~SB_WAIT
;
wakeup((caddr_t
)&sb
->sb_cc
);
* Allot mbufs to a sockbuf.
if (m_reserve((cc
*2)/MSIZE
) == 0)
* Free mbufs held by a socket, and reserved mbuf space.
m_release(sb
->sb_mbmax
/MSIZE
);
sb
->sb_hiwat
= sb
->sb_mbmax
= 0;
* Routines to add (at the end) and remove (from the beginning)
* data from a mbuf queue.
* Append mbuf queue m to sockbuf sb.
register struct sockbuf
*sb
;
register struct mbuf
**np
, *n
;
if (n
&& n
->m_off
<= MMAXOFF
&& m
->m_off
<= MMAXOFF
&&
(int)n
->m_act
== 0 && (int)m
->m_act
== 0 &&
(n
->m_off
+ n
->m_len
+ m
->m_len
) <= MMAXOFF
) {
bcopy(mtod(m
, caddr_t
), mtod(n
, caddr_t
) + n
->m_len
,
sbappendaddr(sb
, asa
, m0
)
register int len
= sizeof (struct sockaddr
);
m
->m_act
= (struct mbuf
*)1;
m
->m_len
= sizeof (struct sockaddr
);
msa
= mtod(m
, struct sockaddr
*);
m
->m_act
= (struct mbuf
*)1;
* Free all mbufs on a sockbuf mbuf chain.
* Check that resource allocations return to 0.
if (sb
->sb_flags
& SB_LOCK
)
if (sb
->sb_cc
|| sb
->sb_mbcnt
|| sb
->sb_mb
)
* Drop data from (the front of) a sockbuf chain.
register struct sockbuf
*sb
;
register struct mbuf
*m
= sb
->sb_mb
, *mn
;