[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.36 and 1.42.4.2

version 1.36, 1997/01/11 05:21:13 version 1.42.4.2, 1999/08/02 22:34:59
Line 1 
Line 1 
 /*      $NetBSD$        */  /*      $NetBSD$        */
   
 /*  /*
    * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
    * All rights reserved.
    *
    * Redistribution and use in source and binary forms, with or without
    * modification, are permitted provided that the following conditions
    * are met:
    * 1. Redistributions of source code must retain the above copyright
    *    notice, this list of conditions and the following disclaimer.
    * 2. Redistributions in binary form must reproduce the above copyright
    *    notice, this list of conditions and the following disclaimer in the
    *    documentation and/or other materials provided with the distribution.
    * 3. Neither the name of the project nor the names of its contributors
    *    may be used to endorse or promote products derived from this software
    *    without specific prior written permission.
    *
    * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
    * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
    * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    * SUCH DAMAGE.
    */
   
   /*
  * Copyright (c) 1982, 1986, 1988, 1993   * Copyright (c) 1982, 1986, 1988, 1993
  *      The Regents of the University of California.  All rights reserved.   *      The Regents of the University of California.  All rights reserved.
  *   *
Line 32 
Line 61 
  * 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_ipsec.h"
   #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 53 
Line 85 
 #include <netinet/ip.h>  #include <netinet/ip.h>
 #include <netinet/ip_var.h>  #include <netinet/ip_var.h>
 #include <netinet/ip_mroute.h>  #include <netinet/ip_mroute.h>
   #include <netinet/ip_icmp.h>
 #include <netinet/in_pcb.h>  #include <netinet/in_pcb.h>
 #include <netinet/in_var.h>  #include <netinet/in_var.h>
   
 #include <machine/stdarg.h>  #include <machine/stdarg.h>
   
   #ifdef IPSEC
   #include <netinet6/ipsec.h>
   #endif /*IPSEC*/
   
   extern u_char ip_protox[];
   extern struct  protosw inetsw[];
 struct inpcbtable rawcbtable;  struct inpcbtable rawcbtable;
   
 int      rip_bind __P((struct inpcb *, struct mbuf *));  int      rip_bind __P((struct inpcb *, struct mbuf *));
Line 84  rip_init()
Line 123  rip_init()
         in_pcbinit(&rawcbtable, 1, 1);          in_pcbinit(&rawcbtable, 1, 1);
 }  }
   
   static struct   sockaddr_in ripsrc = { sizeof(ripsrc), AF_INET };
   
 /*  /*
  * Setup generic address and protocol structures   * Setup generic address and protocol structures
  * for raw_input routine, then pass them along with   * for raw_input routine, then pass them along with
Line 98  rip_input(m, va_alist)
Line 139  rip_input(m, va_alist)
         va_dcl          va_dcl
 #endif  #endif
 {  {
           int off, proto;
         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 inpcb *last = 0;          struct inpcb *last = 0;
         struct mbuf *opts = 0;          struct mbuf *opts = 0;
         struct sockaddr_in ripsrc;          struct sockaddr_in ripsrc;
           va_list ap;
   
           va_start(ap, m);
           off = va_arg(ap, int);
           proto = va_arg(ap, int);
           va_end(ap);
   
         ripsrc.sin_family = AF_INET;          ripsrc.sin_family = AF_INET;
         ripsrc.sin_len = sizeof(struct sockaddr_in);          ripsrc.sin_len = sizeof(struct sockaddr_in);
Line 110  rip_input(m, va_alist)
Line 158  rip_input(m, va_alist)
         ripsrc.sin_port = 0;          ripsrc.sin_port = 0;
         bzero((caddr_t)ripsrc.sin_zero, sizeof(ripsrc.sin_zero));          bzero((caddr_t)ripsrc.sin_zero, sizeof(ripsrc.sin_zero));
   
           /*
            * XXX Compatibility: programs using raw IP expect ip_len
            * XXX to have the header length subtracted.
            */
           ip->ip_len -= ip->ip_hl << 2;
   
         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;
             inp = inp->inp_queue.cqe_next) {              inp = inp->inp_queue.cqe_next) {
                 if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != ip->ip_p)                  if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != proto)
                         continue;                          continue;
                 if (!in_nullhost(inp->inp_laddr) &&                  if (!in_nullhost(inp->inp_laddr) &&
                     !in_hosteq(inp->inp_laddr, ip->ip_dst))                      !in_hosteq(inp->inp_laddr, ip->ip_dst))
Line 135  rip_input(m, va_alist)
Line 189  rip_input(m, va_alist)
                                                 m_freem(opts);                                                  m_freem(opts);
                                 } else                                  } else
                                         sorwakeup(last->inp_socket);                                          sorwakeup(last->inp_socket);
                                   opts = NULL;
                         }                          }
                 }                  }
                 last = inp;                  last = inp;
Line 151  rip_input(m, va_alist)
Line 206  rip_input(m, va_alist)
                 } else                  } else
                         sorwakeup(last->inp_socket);                          sorwakeup(last->inp_socket);
         } else {          } else {
                 m_freem(m);                  if (inetsw[ip_protox[ip->ip_p]].pr_input == rip_input) {
                 ipstat.ips_noproto++;                          icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_PROTOCOL,0,0);
                 ipstat.ips_delivered--;                          ipstat.ips_noproto++;
                           ipstat.ips_delivered--;
                   } else
                           m_freem(m);
         }          }
           return;
 }  }
   
 /*  /*
Line 181  rip_output(m, va_alist)
Line 240  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.
Line 208  rip_output(m, va_alist)
Line 268  rip_output(m, va_alist)
                         return (EMSGSIZE);                          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 215  rip_output(m, va_alist)
Line 279  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));  #ifdef IPSEC
           m->m_pkthdr.rcvif = (struct ifnet *)inp->inp_socket;    /*XXX*/
   #endif /*IPSEC*/
           return (ip_output(m, opts, &inp->inp_route, flags, inp->inp_moptions, &inp->inp_errormtu));
 }  }
   
 /*  /*
Line 395  rip_usrreq(so, req, m, nam, control, p)
Line 462  rip_usrreq(so, req, m, nam, control, p)
                         break;                          break;
                 inp = sotoinpcb(so);                  inp = sotoinpcb(so);
                 inp->inp_ip.ip_p = (long)nam;                  inp->inp_ip.ip_p = (long)nam;
   #ifdef IPSEC
                   error = ipsec_init_policy(&inp->inp_sp);
   #endif /*IPSEC*/
                 break;                  break;
   
         case PRU_DETACH:          case PRU_DETACH:

Legend:
Removed from v.1.36  
changed lines
  Added in v.1.42.4.2

CVSweb <webmaster@jp.NetBSD.org>