Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/netinet/udp_usrreq.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/netinet/udp_usrreq.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.107 retrieving revision 1.114 diff -u -p -r1.107 -r1.114 --- src/sys/netinet/udp_usrreq.c 2003/08/22 21:53:06 1.107 +++ src/sys/netinet/udp_usrreq.c 2003/12/04 19:38:24 1.114 @@ -1,4 +1,4 @@ -/* $NetBSD: udp_usrreq.c,v 1.107 2003/08/22 21:53:06 itojun Exp $ */ +/* $NetBSD: udp_usrreq.c,v 1.114 2003/12/04 19:38:24 atatat Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.107 2003/08/22 21:53:06 itojun Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.114 2003/12/04 19:38:24 atatat Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -195,9 +195,7 @@ void udp_init() { -#ifdef INET in_pcbinit(&udbtable, udbhashsize, udbhashsize); -#endif #ifdef UDP_CSUM_COUNTERS evcnt_attach_static(&udp_hwcsum_bad); @@ -272,8 +270,8 @@ udp_input(m, va_alist) */ if (uh->uh_sum) { switch (m->m_pkthdr.csum_flags & - ((m->m_pkthdr.rcvif->if_csum_flags_rx & M_CSUM_UDPv4) | - M_CSUM_TCP_UDP_BAD | M_CSUM_DATA)) { + ((m->m_pkthdr.rcvif->if_csum_flags_rx & M_CSUM_UDPv4) | + M_CSUM_TCP_UDP_BAD | M_CSUM_DATA)) { case M_CSUM_UDPv4|M_CSUM_TCP_UDP_BAD: UDP_CSUM_COUNTER_INCR(&udp_hwcsum_bad); goto badcsum; @@ -282,8 +280,10 @@ udp_input(m, va_alist) u_int32_t hw_csum = m->m_pkthdr.csum_data; UDP_CSUM_COUNTER_INCR(&udp_hwcsum_data); if (m->m_pkthdr.csum_flags & M_CSUM_NO_PSEUDOHDR) - hw_csum = in_cksum_phdr(ip->ip_src.s_addr, ip->ip_dst.s_addr, - htonl(hw_csum + ntohs(ip->ip_len) + IPPROTO_UDP)); + hw_csum = in_cksum_phdr(ip->ip_src.s_addr, + ip->ip_dst.s_addr, + htonl(hw_csum + ntohs(ip->ip_len) + + IPPROTO_UDP)); if ((hw_csum ^ 0xffff) != 0) goto badcsum; break; @@ -502,6 +502,9 @@ udp4_sendup(m, off, src, so) /* check AH/ESP integrity. */ if (so != NULL && ipsec4_in_reject_so(m, so)) { ipsecstat.in_polvio++; + if ((n = m_copy(m, 0, M_COPYALL)) != NULL) + icmp_error(n, ICMP_UNREACH, ICMP_UNREACH_ADMIN_PROHIBIT, + 0, 0); return; } #endif /*IPSEC*/ @@ -548,6 +551,9 @@ udp6_sendup(m, off, src, so) /* check AH/ESP integrity. */ if (so != NULL && ipsec6_in_reject_so(m, so)) { ipsec6stat.in_polvio++; + if ((n = m_copy(m, 0, M_COPYALL)) != NULL) + icmp6_error(n, ICMP6_DST_UNREACH, + ICMP6_DST_UNREACH_ADMIN, 0); return; } #endif /*IPSEC*/ @@ -582,6 +588,7 @@ udp4_realinput(src, dst, m, off) u_int16_t *sport, *dport; int rcvcnt; struct in_addr *src4, *dst4; + struct inpcb_hdr *inph; struct inpcb *inp; rcvcnt = 0; @@ -620,7 +627,11 @@ udp4_realinput(src, dst, m, off) /* * Locate pcb(s) for datagram. */ - CIRCLEQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) { + CIRCLEQ_FOREACH(inph, &udbtable.inpt_queue, inph_queue) { + inp = (struct inpcb *)inph; + if (inp->inp_af != AF_INET) + continue; + if (inp->inp_lport != *dport) continue; if (!in_nullhost(inp->inp_laddr)) { @@ -683,6 +694,7 @@ udp6_realinput(af, src, dst, m, off) int rcvcnt; struct in6_addr src6, dst6; const struct in_addr *dst4; + struct inpcb_hdr *inph; struct in6pcb *in6p; rcvcnt = 0; @@ -724,8 +736,11 @@ udp6_realinput(af, src, dst, m, off) /* * Locate pcb(s) for datagram. */ - for (in6p = udb6.in6p_next; in6p != &udb6; - in6p = in6p->in6p_next) { + CIRCLEQ_FOREACH(inph, &udbtable.inpt_queue, inph_queue) { + in6p = (struct in6pcb *)inph; + if (in6p->in6p_af != AF_INET6) + continue; + if (in6p->in6p_lport != dport) continue; if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) { @@ -766,11 +781,11 @@ udp6_realinput(af, src, dst, m, off) /* * Locate pcb for datagram. */ - in6p = in6_pcblookup_connect(&udb6, &src6, sport, + in6p = in6_pcblookup_connect(&udbtable, &src6, sport, &dst6, dport, 0); if (in6p == 0) { ++udpstat.udps_pcbhashmiss; - in6p = in6_pcblookup_bind(&udb6, &dst6, dport, 0); + in6p = in6_pcblookup_bind(&udbtable, &dst6, dport, 0); if (in6p == 0) return rcvcnt; } @@ -906,13 +921,6 @@ udp_output(m, va_alist) ((struct ip *)ui)->ip_tos = inp->inp_ip.ip_tos; /* XXX */ udpstat.udps_opackets++; -#ifdef IPSEC - if (ipsec_setsocket(m, inp->inp_socket) != 0) { - error = ENOBUFS; - goto release; - } -#endif /*IPSEC*/ - return (ip_output(m, inp->inp_options, &inp->inp_route, inp->inp_socket->so_options & (SO_DONTROUTE | SO_BROADCAST), inp->inp_moptions, inp->inp_socket)); @@ -1016,11 +1024,6 @@ udp_usrreq(so, req, m, nam, control, p) so->so_state &= ~SS_ISCONNECTED; /* XXX */ in_pcbdisconnect(inp); inp->inp_laddr = zeroin_addr; /* XXX */ - if (inp->inp_ia != NULL) { - LIST_REMOVE(inp, inp_ialink); - IFAFREE(&inp->inp_ia->ia_ifa); - inp->inp_ia = NULL; - } in_pcbstate(inp, INP_BOUND); /* XXX */ break; @@ -1065,11 +1068,6 @@ udp_usrreq(so, req, m, nam, control, p) in_pcbstate(inp, INP_BOUND); /* XXX */ } die: - if (inp->inp_ia != NULL && in_nullhost(inp->inp_laddr)) { - LIST_REMOVE(inp, inp_ialink); - IFAFREE(&inp->inp_ia->ia_ifa); - inp->inp_ia = NULL; - } if (m) m_freem(m); } @@ -1112,31 +1110,36 @@ release: /* * Sysctl for udp variables. */ -int -udp_sysctl(name, namelen, oldp, oldlenp, newp, newlen) - int *name; - u_int namelen; - void *oldp; - size_t *oldlenp; - void *newp; - size_t newlen; +SYSCTL_SETUP(sysctl_net_inet_udp_setup, "sysctl net.inet.udp subtree setup") { - /* All sysctl names at this level are terminal. */ - if (namelen != 1) - return (ENOTDIR); - - switch (name[0]) { - case UDPCTL_CHECKSUM: - return (sysctl_int(oldp, oldlenp, newp, newlen, &udpcksum)); - case UDPCTL_SENDSPACE: - return (sysctl_int(oldp, oldlenp, newp, newlen, - &udp_sendspace)); - case UDPCTL_RECVSPACE: - return (sysctl_int(oldp, oldlenp, newp, newlen, - &udp_recvspace)); - default: - return (ENOPROTOOPT); - } - /* NOTREACHED */ + + sysctl_createv(SYSCTL_PERMANENT, + CTLTYPE_NODE, "net", NULL, + NULL, 0, NULL, 0, + CTL_NET, CTL_EOL); + sysctl_createv(SYSCTL_PERMANENT, + CTLTYPE_NODE, "inet", NULL, + NULL, 0, NULL, 0, + CTL_NET, PF_INET, CTL_EOL); + sysctl_createv(SYSCTL_PERMANENT, + CTLTYPE_NODE, "udp", NULL, + NULL, 0, NULL, 0, + CTL_NET, PF_INET, IPPROTO_UDP, CTL_EOL); + + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "checksum", NULL, + NULL, 0, &udpcksum, 0, + CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_CHECKSUM, + CTL_EOL); + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "sendspace", NULL, + NULL, 0, &udp_sendspace, 0, + CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_SENDSPACE, + CTL_EOL); + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "recvspace", NULL, + NULL, 0, &udp_recvspace, 0, + CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_RECVSPACE, + CTL_EOL); } #endif