| version 1.34, 1996/09/09 14:51:23 |
version 1.35, 1996/09/15 18:11:11 |
|
|
| udp_init() |
udp_init() |
| { |
{ |
| |
|
| in_pcbinit(&udbtable, udbhashsize); |
in_pcbinit(&udbtable, udbhashsize, udbhashsize); |
| } |
} |
| |
|
| void |
void |
| Line 266 udp_input(m, va_alist) |
|
| Line 266 udp_input(m, va_alist) |
|
| /* |
/* |
| * Locate pcb for datagram. |
* Locate pcb for datagram. |
| */ |
*/ |
| inp = in_pcbhashlookup(&udbtable, ip->ip_src, uh->uh_sport, |
inp = in_pcblookup_connect(&udbtable, ip->ip_src, uh->uh_sport, |
| ip->ip_dst, uh->uh_dport); |
ip->ip_dst, uh->uh_dport); |
| if (inp == 0) { |
if (inp == 0) { |
| ++udpstat.udps_pcbhashmiss; |
++udpstat.udps_pcbhashmiss; |
| inp = in_pcblookup(&udbtable, ip->ip_src, uh->uh_sport, |
inp = in_pcblookup_bind(&udbtable, ip->ip_dst, uh->uh_dport); |
| ip->ip_dst, uh->uh_dport, INPLOOKUP_WILDCARD); |
|
| if (inp == 0) { |
if (inp == 0) { |
| udpstat.udps_noport++; |
udpstat.udps_noport++; |
| if (m->m_flags & (M_BCAST | M_MCAST)) { |
if (m->m_flags & (M_BCAST | M_MCAST)) { |
| Line 554 udp_usrreq(so, req, m, nam, control, p) |
|
| Line 553 udp_usrreq(so, req, m, nam, control, p) |
|
| so->so_state &= ~SS_ISCONNECTED; /* XXX */ |
so->so_state &= ~SS_ISCONNECTED; /* XXX */ |
| in_pcbdisconnect(inp); |
in_pcbdisconnect(inp); |
| inp->inp_laddr = zeroin_addr; /* XXX */ |
inp->inp_laddr = zeroin_addr; /* XXX */ |
| |
in_pcbstate(inp, INP_BOUND); /* XXX */ |
| break; |
break; |
| |
|
| case PRU_SHUTDOWN: |
case PRU_SHUTDOWN: |
| Line 572 udp_usrreq(so, req, m, nam, control, p) |
|
| Line 572 udp_usrreq(so, req, m, nam, control, p) |
|
| break; |
break; |
| } |
} |
| { |
{ |
| struct in_addr laddr; |
struct in_addr laddr; /* XXX */ |
| |
|
| if (nam) { |
if (nam) { |
| laddr = inp->inp_laddr; |
laddr = inp->inp_laddr; /* XXX */ |
| if ((so->so_state & SS_ISCONNECTED) != 0) { |
if ((so->so_state & SS_ISCONNECTED) != 0) { |
| error = EISCONN; |
error = EISCONN; |
| goto die; |
goto die; |
| Line 595 udp_usrreq(so, req, m, nam, control, p) |
|
| Line 595 udp_usrreq(so, req, m, nam, control, p) |
|
| error = udp_output(m, inp); |
error = udp_output(m, inp); |
| if (nam) { |
if (nam) { |
| in_pcbdisconnect(inp); |
in_pcbdisconnect(inp); |
| inp->inp_laddr = laddr; |
inp->inp_laddr = laddr; /* XXX */ |
| |
in_pcbstate(inp, INP_BOUND); /* XXX */ |
| } |
} |
| } |
} |
| break; |
break; |