xref: /csrg-svn/sys/netinet/in_pcb.c (revision 4907)
1*4907Swnj /* in_pcb.c 4.2 81/11/16 */
24905Swnj 
34905Swnj #include "../h/param.h"
44905Swnj #include "../h/mbuf.h"
54905Swnj #include "../h/socket.h"
64905Swnj #include "../h/socketvar.h"
74905Swnj #include "../net/inet.h"
84905Swnj #include "../net/inet_systm.h"
9*4907Swnj #include "../net/inet_host.h"
10*4907Swnj #include "../net/inet_pcb.h"
114905Swnj 
124905Swnj struct inpcb *
134905Swnj in_pcballoc()
144905Swnj {
154905Swnj 
164905Swnj 	struct mbuf *m;
174905Swnj 
184905Swnj 	m = m_getclr(M_WAIT);
194905Swnj 	m->m_off = MMINOFF;
204905Swnj 	return (mtod(m, struct inpcb *));
214905Swnj }
224905Swnj 
234905Swnj in_pcbfree(inp)
244905Swnj 	struct inpcb *inp;
254905Swnj {
264905Swnj 	struct socket *so = inp->inp_socket;
274905Swnj 
284905Swnj 	if (so->so_isfilerefd == 0)
294905Swnj 		sofree(so);
304905Swnj 	else
314905Swnj 		so->so_pcb = 0;
324905Swnj 	if (inp->inp_lhost)
33*4907Swnj 		in_hostfree(inp->inp_lhost);
344905Swnj 	if (inp->inp_fhost)
35*4907Swnj 		in_hostfree(inp->inp_fhost);
36*4907Swnj 	(void) m_free(dtom(inp));
374905Swnj }
384905Swnj 
39*4907Swnj struct inpcb *
40*4907Swnj in_pcblookup(head, fhost, fport, lhost, lport)
414905Swnj 	struct inpcb *head;
424905Swnj 	struct ip_addr *fhost, *lhost;
434905Swnj 	u_short fport, lport;
444905Swnj {
454905Swnj 	register struct inpcb *inp;
464905Swnj 
47*4907Swnj 	for (inp = head->inp_next; inp != head; inp = inp->inp_next)
48*4907Swnj 		if (inp->inp_fhost->h_addr.s_addr == fhost->s_addr &&
494905Swnj 		    inp->inp_fport == fport &&
50*4907Swnj 		    inp->inp_lhost->h_addr.s_addr == lhost->s_addr &&
514905Swnj 		    inp->inp_lport == lport)
524905Swnj 			return (inp);
53*4907Swnj 	for (inp = head->inp_next; inp != head; inp = inp->inp_next)
54*4907Swnj 		if ((inp->inp_fhost->h_addr.s_addr == fhost->s_addr ||
554905Swnj 		     inp->inp_fhost == 0) &&
564905Swnj 		    (inp->inp_fport == fport || inp->inp_fport == 0) &&
57*4907Swnj 		     inp->inp_lhost->h_addr.s_addr == lhost->s_addr &&
584905Swnj 		    (inp->inp_lport == lport || inp->inp_lport == 0))
594905Swnj 			return (inp);
604905Swnj 	return (0);
614905Swnj }
624905Swnj 
63*4907Swnj in_pcbgenport(head)
64*4907Swnj 	struct inpcb *head;
654905Swnj {
664905Swnj 	register struct inpcb *inp;
674905Swnj 
684905Swnj again:
69*4907Swnj 	if (head->inp_lport++ < 1024)
70*4907Swnj 		head->inp_lport = 1024;
714905Swnj 	for (inp = head->inp_next; inp != head; inp = inp->inp_next)
72*4907Swnj 		if (inp->inp_lport == head->inp_lport)
734905Swnj 			goto again;
74*4907Swnj 	return (head->inp_lport);
754905Swnj }
76