/* in_pcb.c 4.6 81/11/20 */
#include "../h/socketvar.h"
#include "../net/inet_systm.h"
#include "../net/inet_pcb.h"
* Allocate a protocol control block, space
* for send and receive data, and local host information.
* Return error. If no error make socket point at pcb.
in_pcballoc(so
, head
, sndcc
, rcvcc
, sin
)
register struct inpcb
*inp
;
if (sin
->sin_family
!= AF_INET
)
ifp
= if_ifwithaddr(sin
->sin_addr
);
for (; inp
!= head
; inp
= inp
->inp_next
)
if (inp
->inp_laddr
.s_addr
==
inp
->inp_lport
== lport
&&
inp
->inp_faddr
.s_addr
== 0)
ifp
= if_ifwithaddr(ifnet
->if_addr
);
if (sbreserve(&so
->so_snd
, sndcc
) == 0)
if (sbreserve(&so
->so_rcv
, rcvcc
) == 0)
inp
= mtod(m
, struct inpcb
*);
inp
->inp_laddr
= ifp
->if_addr
;
if (head
->inp_lport
++ < 1024)
for (inp
= head
->inp_next
; inp
!= head
; inp
= inp
->inp_next
)
if (inp
->inp_lport
== head
->inp_lport
)
so
->so_pcb
= (caddr_t
)inp
;
sin
= (struct sockaddr_in
*)&so
->so_addr
;
sin
->sin_family
= AF_INET
;
sin
->sin_addr
= inp
->inp_laddr
;
sin
->sin_port
= inp
->inp_lport
;
if (sin
->sin_family
!= AF_INET
)
if (sin
->sin_addr
.s_addr
== 0 || sin
->sin_port
== 0)
/* should check not already in use... */
inp
->inp_faddr
= sin
->sin_addr
;
inp
->inp_fport
= sin
->sin_port
;
struct socket
*so
= inp
->inp_socket
;
if (so
->so_state
& SS_USERGONE
)
(void) m_free(dtom(inp
));
in_pcblookup(head
, faddr
, fport
, laddr
, lport
)
struct in_addr faddr
, laddr
;
register struct inpcb
*inp
;
for (inp
= head
->inp_next
; inp
!= head
; inp
= inp
->inp_next
)
if (inp
->inp_faddr
.s_addr
== faddr
.s_addr
&&
inp
->inp_fport
== fport
&&
inp
->inp_laddr
.s_addr
== laddr
.s_addr
&&
for (inp
= head
->inp_next
; inp
!= head
; inp
= inp
->inp_next
)
if ((inp
->inp_faddr
.s_addr
== faddr
.s_addr
||
inp
->inp_faddr
.s_addr
== 0) &&
(inp
->inp_fport
== fport
|| inp
->inp_fport
== 0) &&
inp
->inp_laddr
.s_addr
== laddr
.s_addr
&&
(inp
->inp_lport
== lport
|| inp
->inp_lport
== 0))