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