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.38 2005/02/20 15:41:48 jdolecek 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 const uint8_t etherbroadcastaddr[ETHER_ADDR_LEN];
  172 extern const uint8_t ether_ipmulticast_min[ETHER_ADDR_LEN];
  173 extern const uint8_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         u_int    enm_refcount;          /* no. claims to this addr/range */
  192         LIST_ENTRY(ether_multi) enm_list;
  193 };
  194 
  195 /*
  196  * Structure used by macros below to remember position when stepping through
  197  * all of the ether_multi records.
  198  */
  199 struct ether_multistep {
  200         struct ether_multi  *e_enm;
  201 };
  202 
  203 /*
  204  * Macro for looking up the ether_multi record for a given range of Ethernet
  205  * multicast addresses connected to a given ethercom structure.  If no matching
  206  * record is found, "enm" returns NULL.
  207  */
  208 #define ETHER_LOOKUP_MULTI(addrlo, addrhi, ec, enm)                     \
  209         /* u_int8_t addrlo[ETHER_ADDR_LEN]; */                          \
  210         /* u_int8_t addrhi[ETHER_ADDR_LEN]; */                          \
  211         /* struct ethercom *ec; */                                      \
  212         /* struct ether_multi *enm; */                                  \
  213 {                                                                       \
  214         for ((enm) = LIST_FIRST(&(ec)->ec_multiaddrs);                  \
  215             (enm) != NULL &&                                            \
  216             (bcmp((enm)->enm_addrlo, (addrlo), ETHER_ADDR_LEN) != 0 ||  \
  217              bcmp((enm)->enm_addrhi, (addrhi), ETHER_ADDR_LEN) != 0);   \
  218                 (enm) = LIST_NEXT((enm), enm_list));                    \
  219 }
  220 
  221 /*
  222  * Macro to step through all of the ether_multi records, one at a time.
  223  * The current position is remembered in "step", which the caller must
  224  * provide.  ETHER_FIRST_MULTI(), below, must be called to initialize "step"
  225  * and get the first record.  Both macros return a NULL "enm" when there
  226  * are no remaining records.
  227  */
  228 #define ETHER_NEXT_MULTI(step, enm) \
  229         /* struct ether_multistep step; */  \
  230         /* struct ether_multi *enm; */  \
  231 { \
  232         if (((enm) = (step).e_enm) != NULL) \
  233                 (step).e_enm = LIST_NEXT((enm), enm_list); \
  234 }
  235 
  236 #define ETHER_FIRST_MULTI(step, ec, enm) \
  237         /* struct ether_multistep step; */ \
  238         /* struct ethercom *ec; */ \
  239         /* struct ether_multi *enm; */ \
  240 { \
  241         (step).e_enm = LIST_FIRST(&(ec)->ec_multiaddrs); \
  242         ETHER_NEXT_MULTI((step), (enm)); \
  243 }
  244 
  245 #ifdef _KERNEL
  246 
  247 /*
  248  * Ethernet 802.1Q VLAN structures.
  249  */
  250 
  251 /* add VLAN tag to input/received packet */
  252 #define VLAN_INPUT_TAG(ifp, m, vlanid, _errcase)        \
  253         do {                                                            \
  254                 struct m_tag *mtag =                                    \
  255                     m_tag_get(PACKET_TAG_VLAN, sizeof(u_int), M_NOWAIT);\
  256                 if (mtag == NULL) {                                     \
  257                         ifp->if_ierrors++;                              \
  258                         printf("%s: unable to allocate VLAN tag\n",     \
  259                             ifp->if_xname);                             \
  260                         m_freem(m);                                     \
  261                         _errcase;                                       \
  262                 }                                                       \
  263                 *(u_int *)(mtag + 1) = vlanid;                          \
  264                 m_tag_prepend(m, mtag);                                 \
  265         } while(0)
  266 
  267 /* extract VLAN tag from output/trasmit packet */
  268 #define VLAN_OUTPUT_TAG(ec, m0)                 \
  269         VLAN_ATTACHED(ec) ? m_tag_find((m0), PACKET_TAG_VLAN, NULL) : NULL
  270 
  271 /* extract VLAN ID value from a VLAN tag */
  272 #define VLAN_TAG_VALUE(mtag)    \
  273         ((*(u_int *)(mtag + 1)) & 4095)
  274 
  275 /* test if any VLAN is configured for this interface */
  276 #define VLAN_ATTACHED(ec)       (&(ec)->ec_nvlans > 0)
  277 
  278 void    ether_ifattach(struct ifnet *, const u_int8_t *);
  279 void    ether_ifdetach(struct ifnet *);
  280 
  281 char    *ether_sprintf(const u_int8_t *);
  282 
  283 u_int32_t ether_crc32_le(const u_int8_t *, size_t);
  284 u_int32_t ether_crc32_be(const u_int8_t *, size_t);
  285 
  286 #else
  287 /*
  288  * Prototype ethers(3) functions.
  289  */
  290 #include <sys/cdefs.h>
  291 __BEGIN_DECLS
  292 char *  ether_ntoa __P((const struct ether_addr *));
  293 struct ether_addr *
  294         ether_aton __P((const char *));
  295 int     ether_ntohost __P((char *, const struct ether_addr *));
  296 int     ether_hostton __P((const char *, struct ether_addr *));
  297 int     ether_line __P((const char *, struct ether_addr *, char *));
  298 __END_DECLS
  299 #endif
  300 
  301 #endif /* _STANDALONE */
  302 
  303 #endif /* _NET_IF_ETHER_H_ */

Cache object: 3582f348be7d6f4afbcf61cfaf55d358


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