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