[BACK]Return to raw_ip.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/raw_ip.c between version 1.33 and 1.41

version 1.33, 1996/09/15 18:11:08 version 1.41, 1998/04/03 07:49:16
Line 32 
Line 32 
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.   * SUCH DAMAGE.
  *   *
  *      @(#)raw_ip.c    8.2 (Berkeley) 1/4/94   *      @(#)raw_ip.c    8.7 (Berkeley) 5/15/95
  */   */
   
   #include "opt_mrouting.h"
   
 #include <sys/param.h>  #include <sys/param.h>
 #include <sys/malloc.h>  #include <sys/malloc.h>
 #include <sys/mbuf.h>  #include <sys/mbuf.h>
Line 100  rip_input(m, va_alist)
Line 102  rip_input(m, va_alist)
 {  {
         register struct ip *ip = mtod(m, struct ip *);          register struct ip *ip = mtod(m, struct ip *);
         register struct inpcb *inp;          register struct inpcb *inp;
         struct socket *last = 0;          struct inpcb *last = 0;
           struct mbuf *opts = 0;
         struct sockaddr_in ripsrc;          struct sockaddr_in ripsrc;
   
         ripsrc.sin_family = AF_INET;          ripsrc.sin_family = AF_INET;
         ripsrc.sin_len = sizeof(struct sockaddr_in);          ripsrc.sin_len = sizeof(struct sockaddr_in);
         ripsrc.sin_addr = ip->ip_src;          ripsrc.sin_addr = ip->ip_src;
           ripsrc.sin_port = 0;
           bzero((caddr_t)ripsrc.sin_zero, sizeof(ripsrc.sin_zero));
   
         for (inp = rawcbtable.inpt_queue.cqh_first;          for (inp = rawcbtable.inpt_queue.cqh_first;
             inp != (struct inpcb *)&rawcbtable.inpt_queue;              inp != (struct inpcb *)&rawcbtable.inpt_queue;
Line 121  rip_input(m, va_alist)
Line 126  rip_input(m, va_alist)
                 if (last) {                  if (last) {
                         struct mbuf *n;                          struct mbuf *n;
                         if ((n = m_copy(m, 0, (int)M_COPYALL)) != NULL) {                          if ((n = m_copy(m, 0, (int)M_COPYALL)) != NULL) {
                                 if (sbappendaddr(&last->so_rcv,                                  if (last->inp_flags & INP_CONTROLOPTS ||
                                     sintosa(&ripsrc), n,                                      last->inp_socket->so_options & SO_TIMESTAMP)
                                     (struct mbuf *)0) == 0)                                          ip_savecontrol(last, &opts, ip, n);
                                   if (sbappendaddr(&last->inp_socket->so_rcv,
                                       sintosa(&ripsrc), n, opts) == 0) {
                                         /* should notify about lost packet */                                          /* should notify about lost packet */
                                         m_freem(n);                                          m_freem(n);
                                 else                                          if (opts)
                                         sorwakeup(last);                                                  m_freem(opts);
                                   } else
                                           sorwakeup(last->inp_socket);
                                   opts = NULL;
                         }                          }
                 }                  }
                 last = inp->inp_socket;                  last = inp;
         }          }
         if (last) {          if (last) {
                 if (sbappendaddr(&last->so_rcv, sintosa(&ripsrc), m,                  if (last->inp_flags & INP_CONTROLOPTS ||
                     (struct mbuf *)0) == 0)                      last->inp_socket->so_options & SO_TIMESTAMP)
                           ip_savecontrol(last, &opts, ip, m);
                   if (sbappendaddr(&last->inp_socket->so_rcv,
                       sintosa(&ripsrc), m, opts) == 0) {
                         m_freem(m);                          m_freem(m);
                 else                          if (opts)
                         sorwakeup(last);                                  m_freem(opts);
                   } else
                           sorwakeup(last->inp_socket);
         } else {          } else {
                 m_freem(m);                  m_freem(m);
                 ipstat.ips_noproto++;                  ipstat.ips_noproto++;
Line 169  rip_output(m, va_alist)
Line 184  rip_output(m, va_alist)
         va_end(ap);          va_end(ap);
   
         flags =          flags =
             (inp->inp_socket->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST;              (inp->inp_socket->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST
               | IP_RETURNMTU;
   
         /*          /*
          * If the user handed us a complete IP packet, use it.           * If the user handed us a complete IP packet, use it.
          * Otherwise, allocate an mbuf for a header and fill it in.           * Otherwise, allocate an mbuf for a header and fill it in.
          */           */
         if ((inp->inp_flags & INP_HDRINCL) == 0) {          if ((inp->inp_flags & INP_HDRINCL) == 0) {
                   if ((m->m_pkthdr.len + sizeof(struct ip)) > IP_MAXPACKET) {
                           m_freem(m);
                           return (EMSGSIZE);
                   }
                 M_PREPEND(m, sizeof(struct ip), M_WAIT);                  M_PREPEND(m, sizeof(struct ip), M_WAIT);
                 ip = mtod(m, struct ip *);                  ip = mtod(m, struct ip *);
                 ip->ip_tos = 0;                  ip->ip_tos = 0;
Line 187  rip_output(m, va_alist)
Line 207  rip_output(m, va_alist)
                 ip->ip_ttl = MAXTTL;                  ip->ip_ttl = MAXTTL;
                 opts = inp->inp_options;                  opts = inp->inp_options;
         } else {          } else {
                   if (m->m_pkthdr.len > IP_MAXPACKET) {
                           m_freem(m);
                           return (EMSGSIZE);
                   }
                 ip = mtod(m, struct ip *);                  ip = mtod(m, struct ip *);
                   if (m->m_pkthdr.len != ip->ip_len) {
                           m_freem(m);
                           return (EINVAL);
                   }
                 if (ip->ip_id == 0)                  if (ip->ip_id == 0)
                         ip->ip_id = htons(ip_id++);                          ip->ip_id = htons(ip_id++);
                 opts = NULL;                  opts = NULL;
Line 195  rip_output(m, va_alist)
Line 223  rip_output(m, va_alist)
                 flags |= IP_RAWOUTPUT;                  flags |= IP_RAWOUTPUT;
                 ipstat.ips_rawout++;                  ipstat.ips_rawout++;
         }          }
         return (ip_output(m, opts, &inp->inp_route, flags, inp->inp_moptions));          return (ip_output(m, opts, &inp->inp_route, flags, inp->inp_moptions, &inp->inp_errormtu));
 }  }
   
 /*  /*

Legend:
Removed from v.1.33  
changed lines
  Added in v.1.41

CVSweb <webmaster@jp.NetBSD.org>