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/net/if_ether.h

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: if_ether.h,v 1.34 2003/08/07 16:32:51 agc Exp $        */
    2 
    3 /*
    4  * Copyright (c) 1982, 1986, 1993
    5  *      The Regents of the University of California.  All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. Neither the name of the University nor the names of its contributors
   16  *    may be used to endorse or promote products derived from this software
   17  *    without specific prior written permission.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   29  * SUCH DAMAGE.
   30  *
   31  *      @(#)if_ether.h  8.1 (Berkeley) 6/10/93
   32  */
   33 
   34 #ifndef _NET_IF_ETHER_H_
   35 #define _NET_IF_ETHER_H_
   36 
   37 #ifdef _KERNEL
   38 #ifdef _KERNEL_OPT
   39 #include "opt_mbuftrace.h"
   40 #endif
   41 #include <sys/mbuf.h>
   42 #endif
   43 
   44 /*
   45  * Some basic Ethernet constants.
   46  */
   47 #define ETHER_ADDR_LEN  6       /* length of an Ethernet address */
   48 #define ETHER_TYPE_LEN  2       /* length of the Ethernet type field */
   49 #define ETHER_CRC_LEN   4       /* length of the Ethernet CRC */
   50 #define ETHER_HDR_LEN   ((ETHER_ADDR_LEN * 2) + ETHER_TYPE_LEN)
   51 #define ETHER_MIN_LEN   64      /* minimum frame length, including CRC */
   52 #define ETHER_MAX_LEN   1518    /* maximum frame length, including CRC */
   53 #define ETHER_MAX_LEN_JUMBO 9018 /* maximum jumbo frame len, including CRC */
   54 
   55 /*
   56  * Some Ethernet extensions.
   57  */
   58 #define ETHER_VLAN_ENCAP_LEN 4  /* length of 802.1Q VLAN encapsulation */
   59 
   60 /*
   61  * Ethernet address - 6 octets
   62  * this is only used by the ethers(3) functions.
   63  */
   64 struct ether_addr {
   65         u_int8_t ether_addr_octet[ETHER_ADDR_LEN];
   66 } __attribute__((__packed__));
   67 
   68 /*
   69  * Structure of a 10Mb/s Ethernet header.
   70  */
   71 struct  ether_header {
   72         u_int8_t  ether_dhost[ETHER_ADDR_LEN];
   73         u_int8_t  ether_shost[ETHER_ADDR_LEN];
   74         u_int16_t ether_type;
   75 } __attribute__((__packed__));
   76 
   77 #include <net/ethertypes.h>
   78 
   79 #define ETHER_IS_MULTICAST(addr) (*(addr) & 0x01) /* is address mcast/bcast? */
   80 
   81 #define ETHERMTU_JUMBO  (ETHER_MAX_LEN_JUMBO - ETHER_HDR_LEN - ETHER_CRC_LEN)
   82 #define ETHERMTU        (ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
   83 #define ETHERMIN        (ETHER_MIN_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
   84 
   85 /*
   86  * Compute the maximum frame size based on ethertype (i.e. possible
   87  * encapsulation) and whether or not an FCS is present.
   88  */
   89 #define ETHER_MAX_FRAME(ifp, etype, hasfcs)                             \
   90         ((ifp)->if_mtu + ETHER_HDR_LEN +                                \
   91          ((hasfcs) ? ETHER_CRC_LEN : 0) +                               \
   92          (((etype) == ETHERTYPE_VLAN) ? ETHER_VLAN_ENCAP_LEN : 0))
   93 
   94 /*
   95  * Ethernet CRC32 polynomials (big- and little-endian verions).
   96  */
   97 #define ETHER_CRC_POLY_LE       0xedb88320
   98 #define ETHER_CRC_POLY_BE       0x04c11db6
   99 
  100 #ifndef _STANDALONE
  101 
  102 /*
  103  * Ethernet-specific mbuf flags.
  104  */
  105 #define M_HASFCS        M_LINK0 /* FCS included at end of frame */
  106 #define M_PROMISC       M_LINK1 /* this packet is not for us */
  107 
  108 #ifdef _KERNEL
  109 /*
  110  * Macro to map an IP multicast address to an Ethernet multicast address.
  111  * The high-order 25 bits of the Ethernet address are statically assigned,
  112  * and the low-order 23 bits are taken from the low end of the IP address.
  113  */
  114 #define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr)                          \
  115         /* struct in_addr *ipaddr; */                                   \
  116         /* u_int8_t enaddr[ETHER_ADDR_LEN]; */                          \
  117 {                                                                       \
  118         (enaddr)[0] = 0x01;                                             \
  119         (enaddr)[1] = 0x00;                                             \
  120         (enaddr)[2] = 0x5e;                                             \
  121         (enaddr)[3] = ((u_int8_t *)ipaddr)[1] & 0x7f;                   \
  122         (enaddr)[4] = ((u_int8_t *)ipaddr)[2];                          \
  123         (enaddr)[5] = ((u_int8_t *)ipaddr)[3];                          \
  124 }
  125 /*
  126  * Macro to map an IP6 multicast address to an Ethernet multicast address.
  127  * The high-order 16 bits of the Ethernet address are statically assigned,
  128  * and the low-order 32 bits are taken from the low end of the IP6 address.
  129  */
  130 #define ETHER_MAP_IPV6_MULTICAST(ip6addr, enaddr)                       \
  131         /* struct in6_addr *ip6addr; */                                 \
  132         /* u_int8_t enaddr[ETHER_ADDR_LEN]; */                          \
  133 {                                                                       \
  134         (enaddr)[0] = 0x33;                                             \
  135         (enaddr)[1] = 0x33;                                             \
  136         (enaddr)[2] = ((u_int8_t *)ip6addr)[12];                        \
  137         (enaddr)[3] = ((u_int8_t *)ip6addr)[13];                        \
  138         (enaddr)[4] = ((u_int8_t *)ip6addr)[14];                        \
  139         (enaddr)[5] = ((u_int8_t *)ip6addr)[15];                        \
  140 }
  141 #endif
  142 
  143 /*
  144  * Structure shared between the ethernet driver modules and
  145  * the multicast list code.  For example, each ec_softc or il_softc
  146  * begins with this structure.
  147  */
  148 struct  ethercom {
  149         struct  ifnet ec_if;                    /* network-visible interface */
  150         LIST_HEAD(, ether_multi) ec_multiaddrs; /* list of ether multicast
  151                                                    addrs */
  152         int     ec_multicnt;                    /* length of ec_multiaddrs
  153                                                    list */
  154         int     ec_capabilities;                /* capabilities, provided by
  155                                                    driver */
  156         int     ec_capenable;                   /* tells hardware which
  157                                                    capabilities to enable */
  158 
  159         int     ec_nvlans;                      /* # VLANs on this interface */
  160 #ifdef MBUFTRACE
  161         struct  mowner ec_rx_mowner;            /* mbufs received */
  162         struct  mowner ec_tx_mowner;            /* mbufs transmitted */
  163 #endif
  164 };
  165 
  166 #define ETHERCAP_VLAN_MTU       0x00000001      /* VLAN-compatible MTU */
  167 #define ETHERCAP_VLAN_HWTAGGING 0x00000002      /* hardware VLAN tag support */
  168 #define ETHERCAP_JUMBO_MTU      0x00000004      /* 9000 byte MTU supported */
  169 
  170 #ifdef  _KERNEL
  171 extern u_int8_t etherbroadcastaddr[ETHER_ADDR_LEN];
  172 extern u_int8_t ether_ipmulticast_min[ETHER_ADDR_LEN];
  173 extern u_int8_t ether_ipmulticast_max[ETHER_ADDR_LEN];
  174 
  175 int     ether_ioctl(struct ifnet *, u_long, caddr_t);
  176 int     ether_addmulti (struct ifreq *, struct ethercom *);
  177 int     ether_delmulti (struct ifreq *, struct ethercom *);
  178 int     ether_changeaddr (struct ifreq *, struct ethercom *);
  179 int     ether_multiaddr(struct sockaddr *, u_int8_t[], u_int8_t[]);
  180 #endif /* _KERNEL */
  181 
  182 /*
  183  * Ethernet multicast address structure.  There is one of these for each
  184  * multicast address or range of multicast addresses that we are supposed
  185  * to listen to on a particular interface.  They are kept in a linked list,
  186  * rooted in the interface's ethercom structure.
  187  */
  188 struct ether_multi {
  189         u_int8_t enm_addrlo[ETHER_ADDR_LEN]; /* low  or only address of range */
  190         u_int8_t enm_addrhi[ETHER_ADDR_LEN]; /* high or only address of range */
  191         struct   ethercom *enm_ec;      /* back pointer to ethercom */
  192         u_int    enm_refcount;          /* no. claims to this addr/range */
  193         LIST_ENTRY(ether_multi) enm_list;
  194 };
  195 
  196 /*
  197  * Structure used by macros below to remember position when stepping through
  198  * all of the ether_multi records.
  199  */
  200 struct ether_multistep {
  201         struct ether_multi  *e_enm;
  202 };
  203 
  204 /*
  205  * Macro for looking up the ether_multi record for a given range of Ethernet
  206  * multicast addresses connected to a given ethercom structure.  If no matching
  207  * record is found, "enm" returns NULL.
  208  */
  209 #define ETHER_LOOKUP_MULTI(addrlo, addrhi, ec, enm)                     \
  210         /* u_int8_t addrlo[ETHER_ADDR_LEN]; */                          \
  211         /* u_int8_t addrhi[ETHER_ADDR_LEN]; */                          \
  212         /* struct ethercom *ec; */                                      \
  213         /* struct ether_multi *enm; */                                  \
  214 {                                                                       \
  215         for ((enm) = LIST_FIRST(&(ec)->ec_multiaddrs);                  \
  216             (enm) != NULL &&                                            \
  217             (bcmp((enm)->enm_addrlo, (addrlo), ETHER_ADDR_LEN) != 0 ||  \
  218              bcmp((enm)->enm_addrhi, (addrhi), ETHER_ADDR_LEN) != 0);   \
  219                 (enm) = LIST_NEXT((enm), enm_list));                    \
  220 }
  221 
  222 /*
  223  * Macro to step through all of the ether_multi records, one at a time.
  224  * The current position is remembered in "step", which the caller must
  225  * provide.  ETHER_FIRST_MULTI(), below, must be called to initialize "step"
  226  * and get the first record.  Both macros return a NULL "enm" when there
  227  * are no remaining records.
  228  */
  229 #define ETHER_NEXT_MULTI(step, enm) \
  230         /* struct ether_multistep step; */  \
  231         /* struct ether_multi *enm; */  \
  232 { \
  233         if (((enm) = (step).e_enm) != NULL) \
  234                 (step).e_enm = LIST_NEXT((enm), enm_list); \
  235 }
  236 
  237 #define ETHER_FIRST_MULTI(step, ec, enm) \
  238         /* struct ether_multistep step; */ \
  239         /* struct ethercom *ec; */ \
  240         /* struct ether_multi *enm; */ \
  241 { \
  242         (step).e_enm = LIST_FIRST(&(ec)->ec_multiaddrs); \
  243         ETHER_NEXT_MULTI((step), (enm)); \
  244 }
  245 
  246 #ifdef _KERNEL
  247 void    ether_ifattach(struct ifnet *, const u_int8_t *);
  248 void    ether_ifdetach(struct ifnet *);
  249 
  250 char    *ether_sprintf(const u_int8_t *);
  251 
  252 u_int32_t ether_crc32_le(const u_int8_t *, size_t);
  253 u_int32_t ether_crc32_be(const u_int8_t *, size_t);
  254 
  255 #else
  256 /*
  257  * Prototype ethers(3) functions.
  258  */
  259 #include <sys/cdefs.h>
  260 __BEGIN_DECLS
  261 char *  ether_ntoa __P((const struct ether_addr *));
  262 struct ether_addr *
  263         ether_aton __P((const char *));
  264 int     ether_ntohost __P((char *, const struct ether_addr *));
  265 int     ether_hostton __P((const char *, struct ether_addr *));
  266 int     ether_line __P((const char *, struct ether_addr *, char *));
  267 __END_DECLS
  268 #endif
  269 
  270 #endif /* _STANDALONE */
  271 
  272 #endif /* _NET_IF_ETHER_H_ */

Cache object: 9b8fd31d5f1ddf84e2988bb660aae5e2


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