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.43.2.1 2009/03/31 18:02:32 bouyer 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 #define ETHER_PPPOE_ENCAP_LEN 8 /* length of PPPoE encapsulation */
   60 
   61 /*
   62  * Ethernet address - 6 octets
   63  * this is only used by the ethers(3) functions.
   64  */
   65 struct ether_addr {
   66         u_int8_t ether_addr_octet[ETHER_ADDR_LEN];
   67 } __attribute__((__packed__));
   68 
   69 /*
   70  * Structure of a 10Mb/s Ethernet header.
   71  */
   72 struct  ether_header {
   73         u_int8_t  ether_dhost[ETHER_ADDR_LEN];
   74         u_int8_t  ether_shost[ETHER_ADDR_LEN];
   75         u_int16_t ether_type;
   76 } __attribute__((__packed__));
   77 
   78 #include <net/ethertypes.h>
   79 
   80 #define ETHER_IS_MULTICAST(addr) (*(addr) & 0x01) /* is address mcast/bcast? */
   81 
   82 #define ETHERMTU_JUMBO  (ETHER_MAX_LEN_JUMBO - ETHER_HDR_LEN - ETHER_CRC_LEN)
   83 #define ETHERMTU        (ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
   84 #define ETHERMIN        (ETHER_MIN_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
   85 
   86 /*
   87  * Compute the maximum frame size based on ethertype (i.e. possible
   88  * encapsulation) and whether or not an FCS is present.
   89  */
   90 #define ETHER_MAX_FRAME(ifp, etype, hasfcs)                             \
   91         ((ifp)->if_mtu + ETHER_HDR_LEN +                                \
   92          ((hasfcs) ? ETHER_CRC_LEN : 0) +                               \
   93          (((etype) == ETHERTYPE_VLAN) ? ETHER_VLAN_ENCAP_LEN : 0) +     \
   94          (((etype) == ETHERTYPE_PPPOE) ? ETHER_PPPOE_ENCAP_LEN : 0))
   95 
   96 /*
   97  * Ethernet CRC32 polynomials (big- and little-endian verions).
   98  */
   99 #define ETHER_CRC_POLY_LE       0xedb88320
  100 #define ETHER_CRC_POLY_BE       0x04c11db6
  101 
  102 #ifndef _STANDALONE
  103 
  104 /*
  105  * Ethernet-specific mbuf flags.
  106  */
  107 #define M_HASFCS        M_LINK0 /* FCS included at end of frame */
  108 #define M_PROMISC       M_LINK1 /* this packet is not for us */
  109 
  110 #ifdef _KERNEL
  111 /*
  112  * Macro to map an IP multicast address to an Ethernet multicast address.
  113  * The high-order 25 bits of the Ethernet address are statically assigned,
  114  * and the low-order 23 bits are taken from the low end of the IP address.
  115  */
  116 #define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr)                          \
  117         /* struct in_addr *ipaddr; */                                   \
  118         /* u_int8_t enaddr[ETHER_ADDR_LEN]; */                          \
  119 {                                                                       \
  120         (enaddr)[0] = 0x01;                                             \
  121         (enaddr)[1] = 0x00;                                             \
  122         (enaddr)[2] = 0x5e;                                             \
  123         (enaddr)[3] = ((u_int8_t *)ipaddr)[1] & 0x7f;                   \
  124         (enaddr)[4] = ((u_int8_t *)ipaddr)[2];                          \
  125         (enaddr)[5] = ((u_int8_t *)ipaddr)[3];                          \
  126 }
  127 /*
  128  * Macro to map an IP6 multicast address to an Ethernet multicast address.
  129  * The high-order 16 bits of the Ethernet address are statically assigned,
  130  * and the low-order 32 bits are taken from the low end of the IP6 address.
  131  */
  132 #define ETHER_MAP_IPV6_MULTICAST(ip6addr, enaddr)                       \
  133         /* struct in6_addr *ip6addr; */                                 \
  134         /* u_int8_t enaddr[ETHER_ADDR_LEN]; */                          \
  135 {                                                                       \
  136         (enaddr)[0] = 0x33;                                             \
  137         (enaddr)[1] = 0x33;                                             \
  138         (enaddr)[2] = ((u_int8_t *)ip6addr)[12];                        \
  139         (enaddr)[3] = ((u_int8_t *)ip6addr)[13];                        \
  140         (enaddr)[4] = ((u_int8_t *)ip6addr)[14];                        \
  141         (enaddr)[5] = ((u_int8_t *)ip6addr)[15];                        \
  142 }
  143 #endif
  144 
  145 /*
  146  * Structure shared between the ethernet driver modules and
  147  * the multicast list code.  For example, each ec_softc or il_softc
  148  * begins with this structure.
  149  */
  150 struct  ethercom {
  151         struct  ifnet ec_if;                    /* network-visible interface */
  152         LIST_HEAD(, ether_multi) ec_multiaddrs; /* list of ether multicast
  153                                                    addrs */
  154         int     ec_multicnt;                    /* length of ec_multiaddrs
  155                                                    list */
  156         int     ec_capabilities;                /* capabilities, provided by
  157                                                    driver */
  158         int     ec_capenable;                   /* tells hardware which
  159                                                    capabilities to enable */
  160 
  161         int     ec_nvlans;                      /* # VLANs on this interface */
  162 #ifdef MBUFTRACE
  163         struct  mowner ec_rx_mowner;            /* mbufs received */
  164         struct  mowner ec_tx_mowner;            /* mbufs transmitted */
  165 #endif
  166 };
  167 
  168 #define ETHERCAP_VLAN_MTU       0x00000001      /* VLAN-compatible MTU */
  169 #define ETHERCAP_VLAN_HWTAGGING 0x00000002      /* hardware VLAN tag support */
  170 #define ETHERCAP_JUMBO_MTU      0x00000004      /* 9000 byte MTU supported */
  171 
  172 #ifdef  _KERNEL
  173 extern const uint8_t etherbroadcastaddr[ETHER_ADDR_LEN];
  174 extern const uint8_t ethermulticastaddr_slowprotocols[ETHER_ADDR_LEN];
  175 extern const uint8_t ether_ipmulticast_min[ETHER_ADDR_LEN];
  176 extern const uint8_t ether_ipmulticast_max[ETHER_ADDR_LEN];
  177 
  178 int     ether_ioctl(struct ifnet *, u_long, caddr_t);
  179 int     ether_addmulti (struct ifreq *, struct ethercom *);
  180 int     ether_delmulti (struct ifreq *, struct ethercom *);
  181 int     ether_changeaddr (struct ifreq *, struct ethercom *);
  182 int     ether_multiaddr(struct sockaddr *, u_int8_t[], u_int8_t[]);
  183 #endif /* _KERNEL */
  184 
  185 /*
  186  * Ethernet multicast address structure.  There is one of these for each
  187  * multicast address or range of multicast addresses that we are supposed
  188  * to listen to on a particular interface.  They are kept in a linked list,
  189  * rooted in the interface's ethercom structure.
  190  */
  191 struct ether_multi {
  192         u_int8_t enm_addrlo[ETHER_ADDR_LEN]; /* low  or only address of range */
  193         u_int8_t enm_addrhi[ETHER_ADDR_LEN]; /* high or only address of range */
  194         u_int    enm_refcount;          /* no. claims to this addr/range */
  195         LIST_ENTRY(ether_multi) enm_list;
  196 };
  197 
  198 /*
  199  * Structure used by macros below to remember position when stepping through
  200  * all of the ether_multi records.
  201  */
  202 struct ether_multistep {
  203         struct ether_multi  *e_enm;
  204 };
  205 
  206 /*
  207  * Macro for looking up the ether_multi record for a given range of Ethernet
  208  * multicast addresses connected to a given ethercom structure.  If no matching
  209  * record is found, "enm" returns NULL.
  210  */
  211 #define ETHER_LOOKUP_MULTI(addrlo, addrhi, ec, enm)                     \
  212         /* u_int8_t addrlo[ETHER_ADDR_LEN]; */                          \
  213         /* u_int8_t addrhi[ETHER_ADDR_LEN]; */                          \
  214         /* struct ethercom *ec; */                                      \
  215         /* struct ether_multi *enm; */                                  \
  216 {                                                                       \
  217         for ((enm) = LIST_FIRST(&(ec)->ec_multiaddrs);                  \
  218             (enm) != NULL &&                                            \
  219             (bcmp((enm)->enm_addrlo, (addrlo), ETHER_ADDR_LEN) != 0 ||  \
  220              bcmp((enm)->enm_addrhi, (addrhi), ETHER_ADDR_LEN) != 0);   \
  221                 (enm) = LIST_NEXT((enm), enm_list));                    \
  222 }
  223 
  224 /*
  225  * Macro to step through all of the ether_multi records, one at a time.
  226  * The current position is remembered in "step", which the caller must
  227  * provide.  ETHER_FIRST_MULTI(), below, must be called to initialize "step"
  228  * and get the first record.  Both macros return a NULL "enm" when there
  229  * are no remaining records.
  230  */
  231 #define ETHER_NEXT_MULTI(step, enm) \
  232         /* struct ether_multistep step; */  \
  233         /* struct ether_multi *enm; */  \
  234 { \
  235         if (((enm) = (step).e_enm) != NULL) \
  236                 (step).e_enm = LIST_NEXT((enm), enm_list); \
  237 }
  238 
  239 #define ETHER_FIRST_MULTI(step, ec, enm) \
  240         /* struct ether_multistep step; */ \
  241         /* struct ethercom *ec; */ \
  242         /* struct ether_multi *enm; */ \
  243 { \
  244         (step).e_enm = LIST_FIRST(&(ec)->ec_multiaddrs); \
  245         ETHER_NEXT_MULTI((step), (enm)); \
  246 }
  247 
  248 #ifdef _KERNEL
  249 
  250 /*
  251  * Ethernet 802.1Q VLAN structures.
  252  */
  253 
  254 /* add VLAN tag to input/received packet */
  255 #define VLAN_INPUT_TAG(ifp, m, vlanid, _errcase)        \
  256         do {                                                            \
  257                 struct m_tag *mtag =                                    \
  258                     m_tag_get(PACKET_TAG_VLAN, sizeof(u_int), M_NOWAIT);\
  259                 if (mtag == NULL) {                                     \
  260                         ifp->if_ierrors++;                              \
  261                         printf("%s: unable to allocate VLAN tag\n",     \
  262                             ifp->if_xname);                             \
  263                         m_freem(m);                                     \
  264                         _errcase;                                       \
  265                 }                                                       \
  266                 *(u_int *)(mtag + 1) = vlanid;                          \
  267                 m_tag_prepend(m, mtag);                                 \
  268         } while(0)
  269 
  270 /* extract VLAN tag from output/trasmit packet */
  271 #define VLAN_OUTPUT_TAG(ec, m0)                 \
  272         VLAN_ATTACHED(ec) ? m_tag_find((m0), PACKET_TAG_VLAN, NULL) : NULL
  273 
  274 /* extract VLAN ID value from a VLAN tag */
  275 #define VLAN_TAG_VALUE(mtag)    \
  276         ((*(u_int *)(mtag + 1)) & 4095)
  277 
  278 /* test if any VLAN is configured for this interface */
  279 #define VLAN_ATTACHED(ec)       ((ec)->ec_nvlans > 0)
  280 
  281 void    ether_ifattach(struct ifnet *, const u_int8_t *);
  282 void    ether_ifdetach(struct ifnet *);
  283 
  284 char    *ether_sprintf(const u_int8_t *);
  285 char    *ether_snprintf(char *, size_t, const u_int8_t *);
  286 
  287 u_int32_t ether_crc32_le(const u_int8_t *, size_t);
  288 u_int32_t ether_crc32_be(const u_int8_t *, size_t);
  289 
  290 int     ether_nonstatic_aton(u_char *, char *);
  291 #else
  292 /*
  293  * Prototype ethers(3) functions.
  294  */
  295 #include <sys/cdefs.h>
  296 __BEGIN_DECLS
  297 char *  ether_ntoa __P((const struct ether_addr *));
  298 struct ether_addr *
  299         ether_aton __P((const char *));
  300 int     ether_ntohost __P((char *, const struct ether_addr *));
  301 int     ether_hostton __P((const char *, struct ether_addr *));
  302 int     ether_line __P((const char *, struct ether_addr *, char *));
  303 __END_DECLS
  304 #endif
  305 
  306 #endif /* _STANDALONE */
  307 
  308 #endif /* !_NET_IF_ETHER_H_ */

Cache object: 2e8b18e50ebdf84da922f94dfdea061b


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