[BACK]Return to udp_usrreq.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / netinet

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/netinet/udp_usrreq.c between version 1.108 and 1.116

version 1.108, 2003/08/22 22:00:38 version 1.116, 2004/03/24 15:34:54
Line 195  void
Line 195  void
 udp_init()  udp_init()
 {  {
   
 #ifdef INET  
         in_pcbinit(&udbtable, udbhashsize, udbhashsize);          in_pcbinit(&udbtable, udbhashsize, udbhashsize);
 #endif  
   
 #ifdef UDP_CSUM_COUNTERS  #ifdef UDP_CSUM_COUNTERS
         evcnt_attach_static(&udp_hwcsum_bad);          evcnt_attach_static(&udp_hwcsum_bad);
Line 272  udp_input(m, va_alist)
Line 270  udp_input(m, va_alist)
          */           */
         if (uh->uh_sum) {          if (uh->uh_sum) {
                 switch (m->m_pkthdr.csum_flags &                  switch (m->m_pkthdr.csum_flags &
                         ((m->m_pkthdr.rcvif->if_csum_flags_rx & M_CSUM_UDPv4) |                      ((m->m_pkthdr.rcvif->if_csum_flags_rx & M_CSUM_UDPv4) |
                          M_CSUM_TCP_UDP_BAD | M_CSUM_DATA)) {                      M_CSUM_TCP_UDP_BAD | M_CSUM_DATA)) {
                 case M_CSUM_UDPv4|M_CSUM_TCP_UDP_BAD:                  case M_CSUM_UDPv4|M_CSUM_TCP_UDP_BAD:
                         UDP_CSUM_COUNTER_INCR(&udp_hwcsum_bad);                          UDP_CSUM_COUNTER_INCR(&udp_hwcsum_bad);
                         goto badcsum;                          goto badcsum;
Line 282  udp_input(m, va_alist)
Line 280  udp_input(m, va_alist)
                         u_int32_t hw_csum = m->m_pkthdr.csum_data;                          u_int32_t hw_csum = m->m_pkthdr.csum_data;
                         UDP_CSUM_COUNTER_INCR(&udp_hwcsum_data);                          UDP_CSUM_COUNTER_INCR(&udp_hwcsum_data);
                         if (m->m_pkthdr.csum_flags & M_CSUM_NO_PSEUDOHDR)                          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,                                  hw_csum = in_cksum_phdr(ip->ip_src.s_addr,
                                 htonl(hw_csum + ntohs(ip->ip_len) + IPPROTO_UDP));                                      ip->ip_dst.s_addr,
                                       htons(hw_csum + len + IPPROTO_UDP));
                         if ((hw_csum ^ 0xffff) != 0)                          if ((hw_csum ^ 0xffff) != 0)
                                 goto badcsum;                                  goto badcsum;
                         break;                          break;
Line 502  udp4_sendup(m, off, src, so)
Line 501  udp4_sendup(m, off, src, so)
         /* check AH/ESP integrity. */          /* check AH/ESP integrity. */
         if (so != NULL && ipsec4_in_reject_so(m, so)) {          if (so != NULL && ipsec4_in_reject_so(m, so)) {
                 ipsecstat.in_polvio++;                  ipsecstat.in_polvio++;
                   if ((n = m_copy(m, 0, M_COPYALL)) != NULL)
                           icmp_error(n, ICMP_UNREACH, ICMP_UNREACH_ADMIN_PROHIBIT,
                               0, 0);
                 return;                  return;
         }          }
 #endif /*IPSEC*/  #endif /*IPSEC*/
Line 548  udp6_sendup(m, off, src, so)
Line 550  udp6_sendup(m, off, src, so)
         /* check AH/ESP integrity. */          /* check AH/ESP integrity. */
         if (so != NULL && ipsec6_in_reject_so(m, so)) {          if (so != NULL && ipsec6_in_reject_so(m, so)) {
                 ipsec6stat.in_polvio++;                  ipsec6stat.in_polvio++;
                   if ((n = m_copy(m, 0, M_COPYALL)) != NULL)
                           icmp6_error(n, ICMP6_DST_UNREACH,
                               ICMP6_DST_UNREACH_ADMIN, 0);
                 return;                  return;
         }          }
 #endif /*IPSEC*/  #endif /*IPSEC*/
Line 582  udp4_realinput(src, dst, m, off)
Line 587  udp4_realinput(src, dst, m, off)
         u_int16_t *sport, *dport;          u_int16_t *sport, *dport;
         int rcvcnt;          int rcvcnt;
         struct in_addr *src4, *dst4;          struct in_addr *src4, *dst4;
           struct inpcb_hdr *inph;
         struct inpcb *inp;          struct inpcb *inp;
   
         rcvcnt = 0;          rcvcnt = 0;
Line 620  udp4_realinput(src, dst, m, off)
Line 626  udp4_realinput(src, dst, m, off)
                 /*                  /*
                  * Locate pcb(s) for datagram.                   * 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)                          if (inp->inp_lport != *dport)
                                 continue;                                  continue;
                         if (!in_nullhost(inp->inp_laddr)) {                          if (!in_nullhost(inp->inp_laddr)) {
Line 683  udp6_realinput(af, src, dst, m, off)
Line 693  udp6_realinput(af, src, dst, m, off)
         int rcvcnt;          int rcvcnt;
         struct in6_addr src6, dst6;          struct in6_addr src6, dst6;
         const struct in_addr *dst4;          const struct in_addr *dst4;
           struct inpcb_hdr *inph;
         struct in6pcb *in6p;          struct in6pcb *in6p;
   
         rcvcnt = 0;          rcvcnt = 0;
Line 724  udp6_realinput(af, src, dst, m, off)
Line 735  udp6_realinput(af, src, dst, m, off)
                 /*                  /*
                  * Locate pcb(s) for datagram.                   * Locate pcb(s) for datagram.
                  */                   */
                 for (in6p = udb6.in6p_next; in6p != &udb6;                  CIRCLEQ_FOREACH(inph, &udbtable.inpt_queue, inph_queue) {
                      in6p = in6p->in6p_next) {                          in6p = (struct in6pcb *)inph;
                           if (in6p->in6p_af != AF_INET6)
                                   continue;
   
                         if (in6p->in6p_lport != dport)                          if (in6p->in6p_lport != dport)
                                 continue;                                  continue;
                         if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) {                          if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) {
Line 766  udp6_realinput(af, src, dst, m, off)
Line 780  udp6_realinput(af, src, dst, m, off)
                 /*                  /*
                  * Locate pcb for datagram.                   * Locate pcb for datagram.
                  */                   */
                 in6p = in6_pcblookup_connect(&udb6, &src6, sport,                  in6p = in6_pcblookup_connect(&udbtable, &src6, sport,
                     &dst6, dport, 0);                      &dst6, dport, 0);
                 if (in6p == 0) {                  if (in6p == 0) {
                         ++udpstat.udps_pcbhashmiss;                          ++udpstat.udps_pcbhashmiss;
                         in6p = in6_pcblookup_bind(&udb6, &dst6, dport, 0);                          in6p = in6_pcblookup_bind(&udbtable, &dst6, dport, 0);
                         if (in6p == 0)                          if (in6p == 0)
                                 return rcvcnt;                                  return rcvcnt;
                 }                  }
Line 1009  udp_usrreq(so, req, m, nam, control, p)
Line 1023  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 */
                 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 */                  in_pcbstate(inp, INP_BOUND);            /* XXX */
                 break;                  break;
   
Line 1058  udp_usrreq(so, req, m, nam, control, p)
Line 1067  udp_usrreq(so, req, m, nam, control, p)
                         in_pcbstate(inp, INP_BOUND);    /* XXX */                          in_pcbstate(inp, INP_BOUND);    /* XXX */
                 }                  }
           die:            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)                  if (m)
                         m_freem(m);                          m_freem(m);
         }          }
Line 1105  release:
Line 1109  release:
 /*  /*
  * Sysctl for udp variables.   * Sysctl for udp variables.
  */   */
 int  SYSCTL_SETUP(sysctl_net_inet_udp_setup, "sysctl net.inet.udp subtree setup")
 udp_sysctl(name, namelen, oldp, oldlenp, newp, newlen)  {
         int *name;  
         u_int namelen;          sysctl_createv(clog, 0, NULL, NULL,
         void *oldp;                         CTLFLAG_PERMANENT,
         size_t *oldlenp;                         CTLTYPE_NODE, "net", NULL,
         void *newp;                         NULL, 0, NULL, 0,
         size_t newlen;                         CTL_NET, CTL_EOL);
 {          sysctl_createv(clog, 0, NULL, NULL,
         /* All sysctl names at this level are terminal. */                         CTLFLAG_PERMANENT,
         if (namelen != 1)                         CTLTYPE_NODE, "inet", NULL,
                 return (ENOTDIR);                         NULL, 0, NULL, 0,
                          CTL_NET, PF_INET, CTL_EOL);
         switch (name[0]) {          sysctl_createv(clog, 0, NULL, NULL,
         case UDPCTL_CHECKSUM:                         CTLFLAG_PERMANENT,
                 return (sysctl_int(oldp, oldlenp, newp, newlen, &udpcksum));                         CTLTYPE_NODE, "udp", NULL,
         case UDPCTL_SENDSPACE:                         NULL, 0, NULL, 0,
                 return (sysctl_int(oldp, oldlenp, newp, newlen,                         CTL_NET, PF_INET, IPPROTO_UDP, CTL_EOL);
                     &udp_sendspace));  
         case UDPCTL_RECVSPACE:          sysctl_createv(clog, 0, NULL, NULL,
                 return (sysctl_int(oldp, oldlenp, newp, newlen,                         CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
                     &udp_recvspace));                         CTLTYPE_INT, "checksum", NULL,
         default:                         NULL, 0, &udpcksum, 0,
                 return (ENOPROTOOPT);                         CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_CHECKSUM,
         }                         CTL_EOL);
         /* NOTREACHED */          sysctl_createv(clog, 0, NULL, NULL,
                          CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
                          CTLTYPE_INT, "sendspace", NULL,
                          NULL, 0, &udp_sendspace, 0,
                          CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_SENDSPACE,
                          CTL_EOL);
           sysctl_createv(clog, 0, NULL, NULL,
                          CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
                          CTLTYPE_INT, "recvspace", NULL,
                          NULL, 0, &udp_recvspace, 0,
                          CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_RECVSPACE,
                          CTL_EOL);
 }  }
 #endif  #endif

Legend:
Removed from v.1.108  
changed lines
  Added in v.1.116

CVSweb <webmaster@jp.NetBSD.org>