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/lib/libsa/ether.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 /*      $NetBSD: ether.c,v 1.18 2003/08/31 22:40:48 fvdl Exp $  */
    2 
    3 /*
    4  * Copyright (c) 1992 Regents of the University of California.
    5  * All rights reserved.
    6  *
    7  * This software was developed by the Computer Systems Engineering group
    8  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
    9  * contributed to Berkeley.
   10  *
   11  * Redistribution and use in source and binary forms, with or without
   12  * modification, are permitted provided that the following conditions
   13  * are met:
   14  * 1. Redistributions of source code must retain the above copyright
   15  *    notice, this list of conditions and the following disclaimer.
   16  * 2. Redistributions in binary form must reproduce the above copyright
   17  *    notice, this list of conditions and the following disclaimer in the
   18  *    documentation and/or other materials provided with the distribution.
   19  * 3. All advertising materials mentioning features or use of this software
   20  *    must display the following acknowledgement:
   21  *      This product includes software developed by the University of
   22  *      California, Lawrence Berkeley Laboratory and its contributors.
   23  * 4. Neither the name of the University nor the names of its contributors
   24  *    may be used to endorse or promote products derived from this software
   25  *    without specific prior written permission.
   26  *
   27  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   28  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   30  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   31  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   32  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   33  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   34  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   35  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   36  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   37  * SUCH DAMAGE.
   38  *
   39  * @(#) Header: net.c,v 1.9 93/08/06 19:32:15 leres Exp  (LBL)
   40  */
   41 
   42 #include <sys/param.h>
   43 #include <sys/socket.h>
   44 #ifdef _STANDALONE
   45 #include <lib/libkern/libkern.h>
   46 #else
   47 #include <string.h>
   48 #endif
   49 
   50 #include <net/if.h>
   51 #include <net/if_ether.h>
   52 
   53 #include <netinet/in.h>
   54 #include <netinet/in_systm.h>
   55 
   56 #include "stand.h"
   57 #include "net.h"
   58 
   59 /* Caller must leave room for ethernet header in front!! */
   60 ssize_t
   61 sendether(d, pkt, len, dea, etype)
   62         struct iodesc *d;
   63         void *pkt;
   64         size_t len;
   65         u_char *dea;
   66         int etype;
   67 {
   68         ssize_t n;
   69         struct ether_header *eh;
   70 
   71 #ifdef ETHER_DEBUG
   72         if (debug)
   73                 printf("sendether: called\n");
   74 #endif
   75 
   76         eh = (struct ether_header *)pkt - 1;
   77         len += sizeof(*eh);
   78 
   79         MACPY(d->myea, eh->ether_shost);                /* by byte */
   80         MACPY(dea, eh->ether_dhost);                    /* by byte */
   81         eh->ether_type = htons(etype);
   82 
   83         n = netif_put(d, eh, len);
   84         if (n == -1 || (size_t)n < sizeof(*eh))
   85                 return (-1);
   86 
   87         n -= sizeof(*eh);
   88         return (n);
   89 }
   90 
   91 /*
   92  * Get a packet of any Ethernet type, with our address or
   93  * the broadcast address.  Save the Ether type in arg 5.
   94  * NOTE: Caller must leave room for the Ether header.
   95  */
   96 ssize_t
   97 readether(d, pkt, len, tleft, etype)
   98         struct iodesc *d;
   99         void *pkt;
  100         size_t len;
  101         time_t tleft;
  102         u_int16_t *etype;
  103 {
  104         ssize_t n;
  105         struct ether_header *eh;
  106 
  107 #ifdef ETHER_DEBUG
  108         if (debug)
  109                 printf("readether: called\n");
  110 #endif
  111 
  112         eh = (struct ether_header *)pkt - 1;
  113         len += sizeof(*eh);
  114 
  115         n = netif_get(d, eh, len, tleft);
  116         if (n == -1 || (size_t)n < sizeof(*eh))
  117                 return (-1);
  118 
  119         /* Validate Ethernet address. */
  120         if (bcmp(d->myea, eh->ether_dhost, 6) != 0 &&
  121             bcmp(bcea, eh->ether_dhost, 6) != 0) {
  122 #ifdef ETHER_DEBUG
  123                 if (debug)
  124                         printf("readether: not ours (ea=%s)\n",
  125                             ether_sprintf(eh->ether_dhost));
  126 #endif
  127                 return (-1);
  128         }
  129         *etype = ntohs(eh->ether_type);
  130 
  131         n -= sizeof(*eh);
  132         return (n);
  133 }

Cache object: eee7d7bd6520744a583aa3439babbd54


[ 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.