[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.103.2.4 and 1.103.2.5

version 1.103.2.4, 2004/09/21 13:37:15 version 1.103.2.5, 2004/12/18 09:33:06
Line 141  int udpcksum = 1;
Line 141  int udpcksum = 1;
 #else  #else
 int     udpcksum = 0;           /* XXX */  int     udpcksum = 0;           /* XXX */
 #endif  #endif
   int     udp_do_loopback_cksum = 1;
   
 struct  inpcbtable udbtable;  struct  inpcbtable udbtable;
 struct  udpstat udpstat;  struct  udpstat udpstat;
Line 287  udp_input(struct mbuf *m, ...)
Line 288  udp_input(struct mbuf *m, ...)
                         break;                          break;
   
                 default:                  default:
                         /* Need to compute it ourselves. */                          /*
                         UDP_CSUM_COUNTER_INCR(&udp_swcsum);                           * Need to compute it ourselves.  Maybe skip checksum
                         if (in4_cksum(m, IPPROTO_UDP, iphlen, len) != 0)                           * on loopback interfaces.
                                 goto badcsum;                           */
                           if (__predict_true(!(m->m_pkthdr.rcvif->if_flags &
                                                IFF_LOOPBACK) ||
                                              udp_do_loopback_cksum)) {
                                   UDP_CSUM_COUNTER_INCR(&udp_swcsum);
                                   if (in4_cksum(m, IPPROTO_UDP, iphlen, len) != 0)
                                           goto badcsum;
                           }
                         break;                          break;
                 }                  }
         }          }
Line 419  udp6_input(struct mbuf **mp, int *offp, 
Line 427  udp6_input(struct mbuf **mp, int *offp, 
         }          }
   
         /*          /*
          * Checksum extended UDP header and data.           * Checksum extended UDP header and data.  Maybe skip checksum
            * on loopback interfaces.
          */           */
         if (uh->uh_sum == 0) {          if (__predict_true(!(m->m_pkthdr.rcvif->if_flags &
                 udp6stat.udp6s_nosum++;                               IFF_LOOPBACK) ||
                 goto bad;                             udp_do_loopback_cksum)) {
         }                  if (uh->uh_sum == 0) {
         if (in6_cksum(m, IPPROTO_UDP, off, ulen) != 0) {                          udp6stat.udp6s_nosum++;
                 udp6stat.udp6s_badsum++;                          goto bad;
                 goto bad;                  }
                   if (in6_cksum(m, IPPROTO_UDP, off, ulen) != 0) {
                           udp6stat.udp6s_badsum++;
                           goto bad;
                   }
         }          }
   
         /*          /*
Line 830  udp_output(struct mbuf *m, ...)
Line 843  udp_output(struct mbuf *m, ...)
 {  {
         struct inpcb *inp;          struct inpcb *inp;
         struct udpiphdr *ui;          struct udpiphdr *ui;
           struct route *ro;
         int len = m->m_pkthdr.len;          int len = m->m_pkthdr.len;
         int error = 0;          int error = 0;
         va_list ap;          va_list ap;
Line 870  udp_output(struct mbuf *m, ...)
Line 884  udp_output(struct mbuf *m, ...)
         ui->ui_dport = inp->inp_fport;          ui->ui_dport = inp->inp_fport;
         ui->ui_ulen = htons((u_int16_t)len + sizeof(struct udphdr));          ui->ui_ulen = htons((u_int16_t)len + sizeof(struct udphdr));
   
           ro = &inp->inp_route;
   
         /*          /*
          * Set up checksum and output datagram.           * Set up checksum and output datagram.
          */           */
Line 877  udp_output(struct mbuf *m, ...)
Line 893  udp_output(struct mbuf *m, ...)
                 /*                  /*
                  * XXX Cache pseudo-header checksum part for                   * XXX Cache pseudo-header checksum part for
                  * XXX "connected" UDP sockets.                   * XXX "connected" UDP sockets.
                    * Maybe skip checksums on loopback interfaces.
                  */                   */
                 ui->ui_sum = in_cksum_phdr(ui->ui_src.s_addr,                  ui->ui_sum = in_cksum_phdr(ui->ui_src.s_addr,
                     ui->ui_dst.s_addr, htons((u_int16_t)len +                      ui->ui_dst.s_addr, htons((u_int16_t)len +
                     sizeof(struct udphdr) + IPPROTO_UDP));                      sizeof(struct udphdr) + IPPROTO_UDP));
                 m->m_pkthdr.csum_flags = M_CSUM_UDPv4;                  if (__predict_true(ro->ro_rt == NULL ||
                                      !(ro->ro_rt->rt_ifp->if_flags &
                                        IFF_LOOPBACK) ||
                                      udp_do_loopback_cksum))
                           m->m_pkthdr.csum_flags = M_CSUM_UDPv4;
                   else
                           m->m_pkthdr.csum_flags = 0;
                 m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum);                  m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum);
         } else          } else
                 ui->ui_sum = 0;                  ui->ui_sum = 0;
Line 890  udp_output(struct mbuf *m, ...)
Line 913  udp_output(struct mbuf *m, ...)
         ((struct ip *)ui)->ip_tos = inp->inp_ip.ip_tos; /* XXX */          ((struct ip *)ui)->ip_tos = inp->inp_ip.ip_tos; /* XXX */
         udpstat.udps_opackets++;          udpstat.udps_opackets++;
   
         return (ip_output(m, inp->inp_options, &inp->inp_route,          return (ip_output(m, inp->inp_options, ro,
             inp->inp_socket->so_options & (SO_DONTROUTE | SO_BROADCAST),              inp->inp_socket->so_options & (SO_DONTROUTE | SO_BROADCAST),
             inp->inp_moptions, inp->inp_socket));              inp->inp_moptions, inp->inp_socket));
   
Line 1119  SYSCTL_SETUP(sysctl_net_inet_udp_setup, 
Line 1142  SYSCTL_SETUP(sysctl_net_inet_udp_setup, 
                        NULL, 0, &udp_recvspace, 0,                         NULL, 0, &udp_recvspace, 0,
                        CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_RECVSPACE,                         CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_RECVSPACE,
                        CTL_EOL);                         CTL_EOL);
           sysctl_createv(clog, 0, NULL, NULL,
                          CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
                          CTLTYPE_INT, "do_loopback_cksum",
                          SYSCTL_DESCR("Perform UDP checksum on loopback"),
                          NULL, 0, &udp_do_loopback_cksum, 0,
                          CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_LOOPBACKCKSUM,
                          CTL_EOL);
 }  }
 #endif  #endif

Legend:
Removed from v.1.103.2.4  
changed lines
  Added in v.1.103.2.5

CVSweb <webmaster@jp.NetBSD.org>