The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/bsd/net/if_disc.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
    3  *
    4  * @APPLE_LICENSE_HEADER_START@
    5  * 
    6  * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
    7  * 
    8  * This file contains Original Code and/or Modifications of Original Code
    9  * as defined in and that are subject to the Apple Public Source License
   10  * Version 2.0 (the 'License'). You may not use this file except in
   11  * compliance with the License. Please obtain a copy of the License at
   12  * http://www.opensource.apple.com/apsl/ and read it before using this
   13  * file.
   14  * 
   15  * The Original Code and all software distributed under the License are
   16  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
   17  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
   18  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
   19  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
   20  * Please see the License for the specific language governing rights and
   21  * limitations under the License.
   22  * 
   23  * @APPLE_LICENSE_HEADER_END@
   24  */
   25 /*
   26  * Copyright (c) 1982, 1986, 1993
   27  *      The Regents of the University of California.  All rights reserved.
   28  *
   29  * Redistribution and use in source and binary forms, with or without
   30  * modification, are permitted provided that the following conditions
   31  * are met:
   32  * 1. Redistributions of source code must retain the above copyright
   33  *    notice, this list of conditions and the following disclaimer.
   34  * 2. Redistributions in binary form must reproduce the above copyright
   35  *    notice, this list of conditions and the following disclaimer in the
   36  *    documentation and/or other materials provided with the distribution.
   37  * 3. All advertising materials mentioning features or use of this software
   38  *    must display the following acknowledgement:
   39  *      This product includes software developed by the University of
   40  *      California, Berkeley and its contributors.
   41  * 4. Neither the name of the University nor the names of its contributors
   42  *    may be used to endorse or promote products derived from this software
   43  *    without specific prior written permission.
   44  *
   45  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   46  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   47  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   48  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   49  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   50  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   51  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   52  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   53  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   54  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   55  * SUCH DAMAGE.
   56  *
   57  *      From: @(#)if_loop.c     8.1 (Berkeley) 6/10/93
   58  * $FreeBSD: src/sys/net/if_disc.c,v 1.26.2.1 2001/03/06 00:32:09 obrien Exp $
   59  */
   60 
   61 /*
   62  * Discard interface driver for protocol testing and timing.
   63  * (Based on the loopback.)
   64  */
   65 
   66 #include <sys/param.h>
   67 #include <sys/systm.h>
   68 #include <sys/kernel.h>
   69 #include <sys/mbuf.h>
   70 #include <sys/socket.h>
   71 #include <sys/sockio.h>
   72 
   73 #include <net/if.h>
   74 #include <net/if_types.h>
   75 #include <net/route.h>
   76 #include <net/bpf.h>
   77 
   78 #ifdef TINY_DSMTU
   79 #define DSMTU   (1024+512)
   80 #else
   81 #define DSMTU   65532
   82 #endif
   83 
   84 static void discattach __P((void));
   85 
   86 static struct   ifnet discif;
   87 static int discoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
   88                     struct rtentry *);
   89 static void discrtrequest(int cmd, struct rtentry *rt, struct sockaddr *sa);
   90 static int discioctl(struct ifnet *, u_long, caddr_t);
   91 
   92 /* ARGSUSED */
   93 static void
   94 discattach()
   95 {
   96         register struct ifnet *ifp = &discif;
   97 
   98         ifp->if_name = "ds";
   99         ifp->if_family = APPLE_IF_FAM_DISC;
  100         ifp->if_mtu = DSMTU;
  101         ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST;
  102         ifp->if_ioctl = discioctl;
  103         ifp->if_output = discoutput;
  104         ifp->if_type = IFT_LOOP;
  105         ifp->if_hdrlen = 0;
  106         ifp->if_addrlen = 0;
  107         if_attach(ifp);
  108         bpfattach(ifp, DLT_NULL, sizeof(u_int));
  109 }
  110 
  111 #ifndef __APPLE__
  112 static int
  113 disc_modevent(module_t mod, int type, void *data) 
  114 { 
  115         switch (type) { 
  116         case MOD_LOAD: 
  117                 discattach();
  118                 break; 
  119         case MOD_UNLOAD: 
  120                 printf("if_disc module unload - not possible for this module type\n"); 
  121                 return EINVAL; 
  122         } 
  123         return 0; 
  124 } 
  125 
  126 static moduledata_t disc_mod = { 
  127         "if_disc", 
  128         disc_modevent, 
  129         NULL
  130 }; 
  131 
  132 DECLARE_MODULE(if_disc, disc_mod, SI_SUB_PSEUDO, SI_ORDER_ANY);
  133 #endif
  134 
  135 static int
  136 discoutput(ifp, m, dst, rt)
  137         struct ifnet *ifp;
  138         register struct mbuf *m;
  139         struct sockaddr *dst;
  140         register struct rtentry *rt;
  141 {
  142         if ((m->m_flags & M_PKTHDR) == 0)
  143                 panic("discoutput no HDR");
  144         /* BPF write needs to be handled specially */
  145         if (dst->sa_family == AF_UNSPEC) {
  146                 dst->sa_family = *(mtod(m, int *));
  147                 m->m_len -= sizeof(int);
  148                 m->m_pkthdr.len -= sizeof(int);
  149                 m->m_data += sizeof(int);
  150         }
  151 
  152         if (discif.if_bpf) {
  153                 /*
  154                  * We need to prepend the address family as
  155                  * a four byte field.  Cons up a dummy header
  156                  * to pacify bpf.  This is safe because bpf
  157                  * will only read from the mbuf (i.e., it won't
  158                  * try to free it or keep a pointer a to it).
  159                  */
  160                 struct mbuf m0;
  161                 u_int af = dst->sa_family;
  162 
  163                 m0.m_next = m;
  164                 m0.m_len = 4;
  165                 m0.m_data = (char *)&af;
  166 
  167                 bpf_mtap(&discif, &m0);
  168         }
  169         m->m_pkthdr.rcvif = ifp;
  170 
  171         ifp->if_opackets++;
  172         ifp->if_obytes += m->m_pkthdr.len;
  173 
  174         m_freem(m);
  175         return 0;
  176 }
  177 
  178 /* ARGSUSED */
  179 static void
  180 discrtrequest(cmd, rt, sa)
  181         int cmd;
  182         struct rtentry *rt;
  183         struct sockaddr *sa;
  184 {
  185         if (rt)
  186                 rt->rt_rmx.rmx_mtu = DSMTU;
  187 }
  188 
  189 /*
  190  * Process an ioctl request.
  191  */
  192 /* ARGSUSED */
  193 static int
  194 discioctl(ifp, cmd, data)
  195         register struct ifnet *ifp;
  196         u_long cmd;
  197         caddr_t data;
  198 {
  199         register struct ifaddr *ifa;
  200         register struct ifreq *ifr = (struct ifreq *)data;
  201         register int error = 0;
  202 
  203         switch (cmd) {
  204 
  205         case SIOCSIFADDR:
  206                 ifp->if_flags |= IFF_UP;
  207                 ifa = (struct ifaddr *)data;
  208                 if (ifa != 0)
  209                         ifa->ifa_rtrequest = discrtrequest;
  210                 /*
  211                  * Everything else is done at a higher level.
  212                  */
  213                 break;
  214 
  215         case SIOCADDMULTI:
  216         case SIOCDELMULTI:
  217                 if (ifr == 0) {
  218                         error = EAFNOSUPPORT;           /* XXX */
  219                         break;
  220                 }
  221                 switch (ifr->ifr_addr.sa_family) {
  222 
  223 #if INET
  224                 case AF_INET:
  225                         break;
  226 #endif
  227 #if INET6
  228                 case AF_INET6:
  229                         break;
  230 #endif
  231 
  232                 default:
  233                         error = EAFNOSUPPORT;
  234                         break;
  235                 }
  236                 break;
  237 
  238         case SIOCSIFMTU:
  239                 ifp->if_mtu = ifr->ifr_mtu;
  240                 break;
  241 
  242         default:
  243                 error = EINVAL;
  244         }
  245         return (error);
  246 }

Cache object: 6394a71bdcd82cfc5fc6afcb9fb237ed


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.