xref: /csrg-svn/sys/netinet/in_pcb.c (revision 4905)
1*4905Swnj /* in_pcb.c 4.1 81/11/15 */
2*4905Swnj 
3*4905Swnj #include "../h/param.h"
4*4905Swnj #include "../h/mbuf.h"
5*4905Swnj #include "../h/socket.h"
6*4905Swnj #include "../h/socketvar.h"
7*4905Swnj #include "../net/inet.h"
8*4905Swnj #include "../net/inet_systm.h"
9*4905Swnj 
10*4905Swnj struct inpcb *
11*4905Swnj in_pcballoc()
12*4905Swnj {
13*4905Swnj 
14*4905Swnj 	struct mbuf *m;
15*4905Swnj 
16*4905Swnj 	m = m_getclr(M_WAIT);
17*4905Swnj 	m->m_off = MMINOFF;
18*4905Swnj 	return (mtod(m, struct inpcb *));
19*4905Swnj }
20*4905Swnj 
21*4905Swnj in_pcbfree(inp)
22*4905Swnj 	struct inpcb *inp;
23*4905Swnj {
24*4905Swnj 	struct socket *so = inp->inp_socket;
25*4905Swnj 
26*4905Swnj 	if (so->so_isfilerefd == 0)
27*4905Swnj 		sofree(so);
28*4905Swnj 	else
29*4905Swnj 		so->so_pcb = 0;
30*4905Swnj 	if (inp->inp_lhost)
31*4905Swnj 		h_free(inp->inp_lhost);
32*4905Swnj 	if (inp->inp_fhost)
33*4905Swnj 		h_free(inp->inp_fhost);
34*4905Swnj 	m_free(dtom(inp));
35*4905Swnj }
36*4905Swnj 
37*4905Swnj in_plookup(head, fhost, fport, lhost, lport)
38*4905Swnj 	struct inpcb *head;
39*4905Swnj 	struct ip_addr *fhost, *lhost;
40*4905Swnj 	u_short fport, lport;
41*4905Swnj {
42*4905Swnj 	register struct inpcb *inp;
43*4905Swnj 
44*4905Swnj 	for (inp = head->inp_next; inp != head; inp = inp->inp_next) {
45*4905Swnj 		if (inp->inp_fhost->s_addr == fhost->s_addr &&
46*4905Swnj 		    inp->inp_fport == fport &&
47*4905Swnj 		    inp->inp_lhost->s_addr == lhost->s_addr &&
48*4905Swnj 		    inp->inp_lport == lport)
49*4905Swnj 			return (inp);
50*4905Swnj 	for (inp = head->inp_next; inp != head; inp = inp->inp_next) {
51*4905Swnj 		if ((inp->inp_fhost->s_addr == fhost->s_addr ||
52*4905Swnj 		     inp->inp_fhost == 0) &&
53*4905Swnj 		    (inp->inp_fport == fport || inp->inp_fport == 0) &&
54*4905Swnj 		     inp->inp_lhost->s_addr == lhost->s_addr &&
55*4905Swnj 		    (inp->inp_lport == lport || inp->inp_lport == 0))
56*4905Swnj 			return (inp);
57*4905Swnj 	return (0);
58*4905Swnj }
59*4905Swnj 
60*4905Swnj in_pcbgenport(head, ent)
61*4905Swnj 	struct inpcb *head, *ent;
62*4905Swnj {
63*4905Swnj 	register struct inpcb *inp;
64*4905Swnj 
65*4905Swnj again:
66*4905Swnj 	if (head->lport++ < 1024)
67*4905Swnj 		head->lport = 1024;
68*4905Swnj 	for (inp = head->inp_next; inp != head; inp = inp->inp_next)
69*4905Swnj 		if (inp->inp_lport == head->lport)
70*4905Swnj 			goto again;
71*4905Swnj 	return (head->lport);
72*4905Swnj }
73