Diff for /src/sys/netinet/ip_demux.c between versions 1.8 and 1.9

version 1.8, 2004/03/14 08:21:53 version 1.9, 2004/03/22 06:38:17
Line 64  INP_MPORT_HASH(in_addr_t src, in_addr_t Line 64  INP_MPORT_HASH(in_addr_t src, in_addr_t
 lwkt_port_t  lwkt_port_t
 ip_mport(struct mbuf *m)  ip_mport(struct mbuf *m)
 {  {
        struct ip *ip = mtod(m, struct ip *);        struct ip *ip;
         int iphlen;          int iphlen;
         struct tcphdr *th;          struct tcphdr *th;
         struct udphdr *uh;          struct udphdr *uh;
        int off;        int thoff;                            /* TCP data offset */
         lwkt_port_t port;          lwkt_port_t port;
         int cpu;          int cpu;
   
         if (ip_mthread_enable == 0)          if (ip_mthread_enable == 0)
                 return (&netisr_cpu[0].td_msgport);                  return (&netisr_cpu[0].td_msgport);
   
           if (m->m_pkthdr.len < sizeof(struct ip)) {
                   ipstat.ips_tooshort++;
                   return (NULL);
           }
   
         if (m->m_len < sizeof(struct ip) &&          if (m->m_len < sizeof(struct ip) &&
             (m = m_pullup(m, sizeof(struct ip))) == NULL) {              (m = m_pullup(m, sizeof(struct ip))) == NULL) {
                 ipstat.ips_toosmall++;                  ipstat.ips_toosmall++;
                 return (NULL);                  return (NULL);
         }          }
   
           ip = mtod(m, struct ip *);
   
         /*          /*
          * XXX generic packet handling defrag on CPU 0 for now.           * XXX generic packet handling defrag on CPU 0 for now.
          */           */
Line 97  ip_mport(struct mbuf *m) Line 104  ip_mport(struct mbuf *m)
                         return (NULL);                          return (NULL);
                 }                  }
                 th = (struct tcphdr *)((caddr_t)ip + iphlen);                  th = (struct tcphdr *)((caddr_t)ip + iphlen);
                off = th->th_off << 2;                thoff = th->th_off << 2;
                if (off < sizeof(struct tcphdr) || off > ip->ip_len) {                if (thoff < sizeof(struct tcphdr) || thoff > ip->ip_len) {
                         tcpstat.tcps_rcvbadoff++;                          tcpstat.tcps_rcvbadoff++;
                         return (NULL);                          return (NULL);
                 }                  }
                if (m->m_len < sizeof(struct ip) + off) {                if (m->m_len < iphlen + thoff) {
                    m = m_pullup(m, sizeof(struct ip) + off);                        m = m_pullup(m, iphlen + thoff);
                    if (m == NULL) {                        if (m == NULL) {
                        tcpstat.tcps_rcvshort++;                                tcpstat.tcps_rcvshort++;
                        return (NULL);                                return (NULL);
                    }                        }
                    ip = mtod(m, struct ip *);                        ip = mtod(m, struct ip *);
                    th = (struct tcphdr *)((caddr_t)ip + iphlen);                        th = (struct tcphdr *)((caddr_t)ip + iphlen);
                 }                  }
   
                 cpu = INP_MPORT_HASH(ip->ip_src.s_addr, ip->ip_dst.s_addr,                  cpu = INP_MPORT_HASH(ip->ip_src.s_addr, ip->ip_dst.s_addr,
Line 117  ip_mport(struct mbuf *m) Line 124  ip_mport(struct mbuf *m)
                 port = &tcp_thread[cpu].td_msgport;                  port = &tcp_thread[cpu].td_msgport;
                 break;                  break;
         case IPPROTO_UDP:          case IPPROTO_UDP:
                if (m->m_len < iphlen + sizeof(struct udphdr) &&                if (m->m_len < iphlen + sizeof(struct udphdr)) {
                    (m = m_pullup(m, iphlen + sizeof(struct udphdr))) == NULL) {                        m = m_pullup(m, iphlen + sizeof(struct udphdr));
                        udpstat.udps_hdrops++;                        if (m == NULL) {
                        return (NULL);                                udpstat.udps_hdrops++;
                                 return (NULL);
                         }
                         ip = mtod(m, struct ip *);
                 }                  }
                 uh = (struct udphdr *)((caddr_t)ip + iphlen);                  uh = (struct udphdr *)((caddr_t)ip + iphlen);
   

Removed from v.1.8  
changed lines
  Added in v.1.9