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