xref: /csrg-svn/sys/netinet/in_pcb.c (revision 4923)
1*4923Swnj /* in_pcb.c 4.3 81/11/18 */
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"
94907Swnj #include "../net/inet_host.h"
104907Swnj #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 
23*4923Swnj in_pcbenter(head, new)
24*4923Swnj 	struct inpcb *head, *new;
25*4923Swnj {
26*4923Swnj 	register struct inpcb *inp;
27*4923Swnj 
28*4923Swnj 	for (inp = head->inp_next; inp != head; inp = inp->inp_next)
29*4923Swnj 		if (inp->inp_fhost->h_addr.s_addr == new->inp_fhost.s_addr &&
30*4923Swnj 		    inp->inp_fport == new->inp_fport &&
31*4923Swnj 		    inp->inp_lhost->h_addr.s_addr = new->inp_fhost.s_addr &&
32*4923Swnj 		    inp->inp_lport == new->inp_lport)
33*4923Swnj 			return (EADDRINUSE);
34*4923Swnj 	insque(new, head);
35*4923Swnj 	return (0);
36*4923Swnj }
37*4923Swnj 
384905Swnj in_pcbfree(inp)
394905Swnj 	struct inpcb *inp;
404905Swnj {
414905Swnj 	struct socket *so = inp->inp_socket;
424905Swnj 
434905Swnj 	if (so->so_isfilerefd == 0)
444905Swnj 		sofree(so);
454905Swnj 	else
464905Swnj 		so->so_pcb = 0;
474905Swnj 	if (inp->inp_lhost)
484907Swnj 		in_hostfree(inp->inp_lhost);
494905Swnj 	if (inp->inp_fhost)
504907Swnj 		in_hostfree(inp->inp_fhost);
514907Swnj 	(void) m_free(dtom(inp));
524905Swnj }
534905Swnj 
544907Swnj struct inpcb *
554907Swnj in_pcblookup(head, fhost, fport, lhost, lport)
564905Swnj 	struct inpcb *head;
57*4923Swnj 	struct in_addr *fhost, *lhost;
584905Swnj 	u_short fport, lport;
594905Swnj {
604905Swnj 	register struct inpcb *inp;
614905Swnj 
624907Swnj 	for (inp = head->inp_next; inp != head; inp = inp->inp_next)
634907Swnj 		if (inp->inp_fhost->h_addr.s_addr == fhost->s_addr &&
644905Swnj 		    inp->inp_fport == fport &&
654907Swnj 		    inp->inp_lhost->h_addr.s_addr == lhost->s_addr &&
664905Swnj 		    inp->inp_lport == lport)
674905Swnj 			return (inp);
684907Swnj 	for (inp = head->inp_next; inp != head; inp = inp->inp_next)
694907Swnj 		if ((inp->inp_fhost->h_addr.s_addr == fhost->s_addr ||
704905Swnj 		     inp->inp_fhost == 0) &&
714905Swnj 		    (inp->inp_fport == fport || inp->inp_fport == 0) &&
724907Swnj 		     inp->inp_lhost->h_addr.s_addr == lhost->s_addr &&
734905Swnj 		    (inp->inp_lport == lport || inp->inp_lport == 0))
744905Swnj 			return (inp);
754905Swnj 	return (0);
764905Swnj }
774905Swnj 
784907Swnj in_pcbgenport(head)
794907Swnj 	struct inpcb *head;
804905Swnj {
814905Swnj 	register struct inpcb *inp;
824905Swnj 
834905Swnj again:
844907Swnj 	if (head->inp_lport++ < 1024)
854907Swnj 		head->inp_lport = 1024;
864905Swnj 	for (inp = head->inp_next; inp != head; inp = inp->inp_next)
874907Swnj 		if (inp->inp_lport == head->inp_lport)
884905Swnj 			goto again;
894907Swnj 	return (head->inp_lport);
904905Swnj }
91