| version 1.33, 1996/05/23 17:05:45 |
version 1.34, 1996/09/09 14:51:23 |
| Line 74 int udpcksum = 1; |
|
| Line 74 int udpcksum = 1; |
|
| int udpcksum = 0; /* XXX */ |
int udpcksum = 0; /* XXX */ |
| #endif |
#endif |
| |
|
| struct sockaddr_in udp_in = { sizeof(udp_in), AF_INET }; |
|
| |
|
| static void udp_notify __P((struct inpcb *, int)); |
static void udp_notify __P((struct inpcb *, int)); |
| static struct mbuf *udp_saveopt __P((caddr_t, int, int)); |
static struct mbuf *udp_saveopt __P((caddr_t, int, int)); |
| |
|
| Line 108 udp_input(m, va_alist) |
|
| Line 106 udp_input(m, va_alist) |
|
| struct ip save_ip; |
struct ip save_ip; |
| int iphlen; |
int iphlen; |
| va_list ap; |
va_list ap; |
| |
struct sockaddr_in udpsrc; |
| |
|
| va_start(ap, m); |
va_start(ap, m); |
| iphlen = va_arg(ap, int); |
iphlen = va_arg(ap, int); |
| Line 194 udp_input(m, va_alist) |
|
| Line 193 udp_input(m, va_alist) |
|
| /* |
/* |
| * Construct sockaddr format source address. |
* Construct sockaddr format source address. |
| */ |
*/ |
| udp_in.sin_port = uh->uh_sport; |
udpsrc.sin_family = AF_INET; |
| udp_in.sin_addr = ip->ip_src; |
udpsrc.sin_len = sizeof(struct sockaddr_in); |
| |
udpsrc.sin_port = uh->uh_sport; |
| |
udpsrc.sin_addr = ip->ip_src; |
| |
|
| m->m_len -= sizeof (struct udpiphdr); |
m->m_len -= sizeof (struct udpiphdr); |
| m->m_data += sizeof (struct udpiphdr); |
m->m_data += sizeof (struct udpiphdr); |
| /* |
/* |
| Line 208 udp_input(m, va_alist) |
|
| Line 210 udp_input(m, va_alist) |
|
| inp = inp->inp_queue.cqe_next) { |
inp = inp->inp_queue.cqe_next) { |
| if (inp->inp_lport != uh->uh_dport) |
if (inp->inp_lport != uh->uh_dport) |
| continue; |
continue; |
| if (inp->inp_laddr.s_addr != INADDR_ANY) { |
if (!in_nullhost(inp->inp_laddr)) { |
| if (inp->inp_laddr.s_addr != |
if (!in_hosteq(inp->inp_laddr, ip->ip_dst)) |
| ip->ip_dst.s_addr) |
|
| continue; |
continue; |
| } |
} |
| if (inp->inp_faddr.s_addr != INADDR_ANY) { |
if (!in_nullhost(inp->inp_faddr)) { |
| if (inp->inp_faddr.s_addr != |
if (!in_hosteq(inp->inp_faddr, ip->ip_src) || |
| ip->ip_src.s_addr || |
|
| inp->inp_fport != uh->uh_sport) |
inp->inp_fport != uh->uh_sport) |
| continue; |
continue; |
| } |
} |
| Line 225 udp_input(m, va_alist) |
|
| Line 225 udp_input(m, va_alist) |
|
| |
|
| if ((n = m_copy(m, 0, M_COPYALL)) != NULL) { |
if ((n = m_copy(m, 0, M_COPYALL)) != NULL) { |
| if (sbappendaddr(&last->so_rcv, |
if (sbappendaddr(&last->so_rcv, |
| sintosa(&udp_in), n, |
sintosa(&udpsrc), n, |
| (struct mbuf *)0) == 0) { |
(struct mbuf *)0) == 0) { |
| m_freem(n); |
m_freem(n); |
| udpstat.udps_fullsock++; |
udpstat.udps_fullsock++; |
| Line 255 udp_input(m, va_alist) |
|
| Line 255 udp_input(m, va_alist) |
|
| udpstat.udps_noportbcast++; |
udpstat.udps_noportbcast++; |
| goto bad; |
goto bad; |
| } |
} |
| if (sbappendaddr(&last->so_rcv, sintosa(&udp_in), m, |
if (sbappendaddr(&last->so_rcv, sintosa(&udpsrc), m, |
| (struct mbuf *)0) == 0) { |
(struct mbuf *)0) == 0) { |
| udpstat.udps_fullsock++; |
udpstat.udps_fullsock++; |
| goto bad; |
goto bad; |
| Line 289 udp_input(m, va_alist) |
|
| Line 289 udp_input(m, va_alist) |
|
| * Construct sockaddr format source address. |
* Construct sockaddr format source address. |
| * Stuff source address and datagram in user buffer. |
* Stuff source address and datagram in user buffer. |
| */ |
*/ |
| udp_in.sin_port = uh->uh_sport; |
udpsrc.sin_family = AF_INET; |
| udp_in.sin_addr = ip->ip_src; |
udpsrc.sin_len = sizeof(struct sockaddr_in); |
| |
udpsrc.sin_port = uh->uh_sport; |
| |
udpsrc.sin_addr = ip->ip_src; |
| |
|
| if (inp->inp_flags & INP_CONTROLOPTS) { |
if (inp->inp_flags & INP_CONTROLOPTS) { |
| struct mbuf **mp = &opts; |
struct mbuf **mp = &opts; |
| |
|
| Line 321 udp_input(m, va_alist) |
|
| Line 324 udp_input(m, va_alist) |
|
| m->m_len -= iphlen; |
m->m_len -= iphlen; |
| m->m_pkthdr.len -= iphlen; |
m->m_pkthdr.len -= iphlen; |
| m->m_data += iphlen; |
m->m_data += iphlen; |
| if (sbappendaddr(&inp->inp_socket->so_rcv, sintosa(&udp_in), m, |
if (sbappendaddr(&inp->inp_socket->so_rcv, sintosa(&udpsrc), m, |
| opts) == 0) { |
opts) == 0) { |
| udpstat.udps_fullsock++; |
udpstat.udps_fullsock++; |
| goto bad; |
goto bad; |
| Line 368 udp_notify(inp, errno) |
|
| Line 371 udp_notify(inp, errno) |
|
| register struct inpcb *inp; |
register struct inpcb *inp; |
| int errno; |
int errno; |
| { |
{ |
| |
|
| inp->inp_socket->so_error = errno; |
inp->inp_socket->so_error = errno; |
| sorwakeup(inp->inp_socket); |
sorwakeup(inp->inp_socket); |
| sowwakeup(inp->inp_socket); |
sowwakeup(inp->inp_socket); |
| Line 396 udp_ctlinput(cmd, sa, v) |
|
| Line 400 udp_ctlinput(cmd, sa, v) |
|
| return NULL; |
return NULL; |
| if (ip) { |
if (ip) { |
| uh = (struct udphdr *)((caddr_t)ip + (ip->ip_hl << 2)); |
uh = (struct udphdr *)((caddr_t)ip + (ip->ip_hl << 2)); |
| in_pcbnotify(&udbtable, sa, uh->uh_dport, ip->ip_src, |
in_pcbnotify(&udbtable, satosin(sa)->sin_addr, uh->uh_dport, |
| uh->uh_sport, errno, notify); |
ip->ip_src, uh->uh_sport, errno, notify); |
| } else |
} else |
| in_pcbnotifyall(&udbtable, sa, errno, notify); |
in_pcbnotifyall(&udbtable, satosin(sa)->sin_addr, errno, |
| |
notify); |
| return NULL; |
return NULL; |
| } |
} |
| |
|
| Line 548 udp_usrreq(so, req, m, nam, control, p) |
|
| Line 553 udp_usrreq(so, req, m, nam, control, p) |
|
| /*soisdisconnected(so);*/ |
/*soisdisconnected(so);*/ |
| so->so_state &= ~SS_ISCONNECTED; /* XXX */ |
so->so_state &= ~SS_ISCONNECTED; /* XXX */ |
| in_pcbdisconnect(inp); |
in_pcbdisconnect(inp); |
| inp->inp_laddr.s_addr = INADDR_ANY; /* XXX */ |
inp->inp_laddr = zeroin_addr; /* XXX */ |
| break; |
break; |
| |
|
| case PRU_SHUTDOWN: |
case PRU_SHUTDOWN: |