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.89 2022/06/20 08:14:48 yamaguchi 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 #ifndef _STANDALONE
   45 #include <net/if.h>
   46 #endif
   47 
   48 /*
   49  * Some basic Ethernet constants.
   50  */
   51 #define ETHER_ADDR_LEN  6       /* length of an Ethernet address */
   52 #define ETHER_TYPE_LEN  2       /* length of the Ethernet type field */
   53 #define ETHER_CRC_LEN   4       /* length of the Ethernet CRC */
   54 #define ETHER_HDR_LEN   ((ETHER_ADDR_LEN * 2) + ETHER_TYPE_LEN)
   55 #define ETHER_MIN_LEN   64      /* minimum frame length, including CRC */
   56 #define ETHER_MAX_LEN   1518    /* maximum frame length, including CRC */
   57 #define ETHER_MAX_LEN_JUMBO 9018 /* maximum jumbo frame len, including CRC */
   58 
   59 /*
   60  * Some Ethernet extensions.
   61  */
   62 #define ETHER_VLAN_ENCAP_LEN    4     /* length of 802.1Q VLAN encapsulation */
   63 #define EVL_VLANOFTAG(tag)      ((tag) & 4095)          /* VLAN ID */
   64 #define EVL_PRIOFTAG(tag)       (((tag) >> 13) & 7)     /* Priority */
   65 #define EVL_CFIOFTAG(tag)       (((tag) >> 12) & 1)     /* CFI */
   66 #define ETHER_PPPOE_ENCAP_LEN   8       /* length of PPPoE encapsulation */
   67 
   68 /*
   69  * Mbuf adjust factor to force 32-bit alignment of IP header.
   70  * Drivers should do m_adj(m, ETHER_ALIGN) when setting up a
   71  * receive so the upper layers get the IP header properly aligned
   72  * past the 14-byte Ethernet header.
   73  */
   74 #define ETHER_ALIGN     2       /* driver adjust for IP hdr alignment */
   75 
   76 /*
   77  * Ethernet address - 6 octets
   78  * this is only used by the ethers(3) functions.
   79  */
   80 struct ether_addr {
   81         uint8_t ether_addr_octet[ETHER_ADDR_LEN];
   82 };
   83 
   84 /*
   85  * Structure of a 10Mb/s Ethernet header.
   86  */
   87 struct ether_header {
   88         uint8_t  ether_dhost[ETHER_ADDR_LEN];
   89         uint8_t  ether_shost[ETHER_ADDR_LEN];
   90         uint16_t ether_type;
   91 };
   92 
   93 #include <net/ethertypes.h>
   94 
   95 #define ETHER_IS_MULTICAST(addr) (*(addr) & 0x01) /* is address mcast/bcast? */
   96 #define ETHER_IS_LOCAL(addr) (*(addr) & 0x02) /* is address local? */
   97 
   98 #define ETHERMTU_JUMBO  (ETHER_MAX_LEN_JUMBO - ETHER_HDR_LEN - ETHER_CRC_LEN)
   99 #define ETHERMTU        (ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
  100 #define ETHERMIN        (ETHER_MIN_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
  101 
  102 /*
  103  * Compute the maximum frame size based on ethertype (i.e. possible
  104  * encapsulation) and whether or not an FCS is present.
  105  */
  106 #define ETHER_MAX_FRAME(ifp, etype, hasfcs)                             \
  107         ((ifp)->if_mtu + ETHER_HDR_LEN +                                \
  108          ((hasfcs) ? ETHER_CRC_LEN : 0) +                               \
  109          (((etype) == ETHERTYPE_VLAN) ? ETHER_VLAN_ENCAP_LEN : 0) +     \
  110          (((etype) == ETHERTYPE_PPPOE) ? ETHER_PPPOE_ENCAP_LEN : 0))
  111 
  112 /*
  113  * Ethernet CRC32 polynomials (big- and little-endian verions).
  114  */
  115 #define ETHER_CRC_POLY_LE       0xedb88320
  116 #define ETHER_CRC_POLY_BE       0x04c11db6
  117 
  118 #ifndef _STANDALONE
  119 
  120 /*
  121  * Ethernet-specific mbuf flags.
  122  */
  123 #define M_HASFCS        M_LINK0 /* FCS included at end of frame */
  124 #define M_PROMISC       M_LINK1 /* this packet is not for us */
  125 
  126 #ifdef _KERNEL
  127 /*
  128  * Macro to map an IP multicast address to an Ethernet multicast address.
  129  * The high-order 25 bits of the Ethernet address are statically assigned,
  130  * and the low-order 23 bits are taken from the low end of the IP address.
  131  */
  132 #define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr)                          \
  133         /* const struct in_addr *ipaddr; */                             \
  134         /* uint8_t enaddr[ETHER_ADDR_LEN]; */                           \
  135 do {                                                                    \
  136         (enaddr)[0] = 0x01;                                             \
  137         (enaddr)[1] = 0x00;                                             \
  138         (enaddr)[2] = 0x5e;                                             \
  139         (enaddr)[3] = ((const uint8_t *)ipaddr)[1] & 0x7f;              \
  140         (enaddr)[4] = ((const uint8_t *)ipaddr)[2];                     \
  141         (enaddr)[5] = ((const uint8_t *)ipaddr)[3];                     \
  142 } while (/*CONSTCOND*/0)
  143 /*
  144  * Macro to map an IP6 multicast address to an Ethernet multicast address.
  145  * The high-order 16 bits of the Ethernet address are statically assigned,
  146  * and the low-order 32 bits are taken from the low end of the IP6 address.
  147  */
  148 #define ETHER_MAP_IPV6_MULTICAST(ip6addr, enaddr)                       \
  149         /* struct in6_addr *ip6addr; */                                 \
  150         /* uint8_t enaddr[ETHER_ADDR_LEN]; */                           \
  151 {                                                                       \
  152         (enaddr)[0] = 0x33;                                             \
  153         (enaddr)[1] = 0x33;                                             \
  154         (enaddr)[2] = ((const uint8_t *)ip6addr)[12];                   \
  155         (enaddr)[3] = ((const uint8_t *)ip6addr)[13];                   \
  156         (enaddr)[4] = ((const uint8_t *)ip6addr)[14];                   \
  157         (enaddr)[5] = ((const uint8_t *)ip6addr)[15];                   \
  158 }
  159 #endif
  160 
  161 struct mii_data;
  162 
  163 struct ethercom;
  164 
  165 typedef int (*ether_cb_t)(struct ethercom *);
  166 typedef int (*ether_vlancb_t)(struct ethercom *, uint16_t, bool);
  167 
  168 /*
  169  * Structure shared between the ethernet driver modules and
  170  * the multicast list code.  For example, each ec_softc or il_softc
  171  * begins with this structure.
  172  */
  173 struct ethercom {
  174         struct  ifnet ec_if;                    /* network-visible interface */
  175         LIST_HEAD(, ether_multi) ec_multiaddrs; /* list of ether multicast
  176                                                    addrs */
  177         int     ec_multicnt;                    /* length of ec_multiaddrs
  178                                                    list */
  179         int     ec_capabilities;                /* capabilities, provided by
  180                                                    driver */
  181         int     ec_capenable;                   /* tells hardware which
  182                                                    capabilities to enable */
  183 
  184         int     ec_nvlans;                      /* # VLANs on this interface */
  185         SIMPLEQ_HEAD(, vlanid_list) ec_vids;    /* list of VLAN IDs */
  186         /* The device handle for the MII bus child device. */
  187         struct mii_data                         *ec_mii;
  188         struct ifmedia                          *ec_ifmedia;
  189         /*
  190          * Called after a change to ec_if.if_flags.  Returns
  191          * ENETRESET if the device should be reinitialized with
  192          * ec_if.if_init, 0 on success, not 0 on failure.
  193          */
  194         ether_cb_t                              ec_ifflags_cb;
  195         /*
  196          * Called whenever a vlan interface is configured or unconfigured.
  197          * Args include the vlan tag and a flag indicating whether the tag is
  198          * being added or removed.
  199          */
  200         ether_vlancb_t                          ec_vlan_cb;
  201         /* Hooks called at the beginning of detach of this interface */
  202         khook_list_t                            *ec_ifdetach_hooks;
  203         kmutex_t                                *ec_lock;
  204         /* Flags used only by the kernel */
  205         int                                     ec_flags;
  206 #ifdef MBUFTRACE
  207         struct  mowner ec_rx_mowner;            /* mbufs received */
  208         struct  mowner ec_tx_mowner;            /* mbufs transmitted */
  209 #endif
  210 };
  211 
  212 #define ETHERCAP_VLAN_MTU       0x00000001 /* VLAN-compatible MTU */
  213 #define ETHERCAP_VLAN_HWTAGGING 0x00000002 /* hardware VLAN tag support */
  214 #define ETHERCAP_JUMBO_MTU      0x00000004 /* 9000 byte MTU supported */
  215 #define ETHERCAP_VLAN_HWFILTER  0x00000008 /* iface hw can filter vlan tag */
  216 #define ETHERCAP_EEE            0x00000010 /* Energy Efficiency Ethernet */
  217 #define ETHERCAP_MASK           0x0000001f
  218 
  219 #define ECCAPBITS               \
  220         "\020"                  \
  221         "\1VLAN_MTU"            \
  222         "\2VLAN_HWTAGGING"      \
  223         "\3JUMBO_MTU"           \
  224         "\4VLAN_HWFILTER"       \
  225         "\5EEE"
  226 
  227 /* ioctl() for Ethernet capabilities */
  228 struct eccapreq {
  229         char            eccr_name[IFNAMSIZ];    /* if name, e.g. "en0" */
  230         int             eccr_capabilities;      /* supported capabiliites */
  231         int             eccr_capenable;         /* capabilities enabled */
  232 };
  233 
  234 /* sysctl for Ethernet multicast addresses */
  235 struct ether_multi_sysctl {
  236         u_int   enm_refcount;
  237         uint8_t enm_addrlo[ETHER_ADDR_LEN];
  238         uint8_t enm_addrhi[ETHER_ADDR_LEN];
  239 };
  240 
  241 #ifdef  _KERNEL
  242 /*
  243  * Flags for ec_flags
  244  */
  245 /* Store IFF_ALLMULTI in ec_flags instead of if_flags to avoid data races. */
  246 #define ETHER_F_ALLMULTI        __BIT(0)
  247 
  248 extern const uint8_t etherbroadcastaddr[ETHER_ADDR_LEN];
  249 extern const uint8_t ethermulticastaddr_slowprotocols[ETHER_ADDR_LEN];
  250 extern const uint8_t ether_ipmulticast_min[ETHER_ADDR_LEN];
  251 extern const uint8_t ether_ipmulticast_max[ETHER_ADDR_LEN];
  252 
  253 void    ether_set_ifflags_cb(struct ethercom *, ether_cb_t);
  254 void    ether_set_vlan_cb(struct ethercom *, ether_vlancb_t);
  255 int     ether_ioctl(struct ifnet *, u_long, void *);
  256 int     ether_addmulti(const struct sockaddr *, struct ethercom *);
  257 int     ether_delmulti(const struct sockaddr *, struct ethercom *);
  258 int     ether_multiaddr(const struct sockaddr *, uint8_t[], uint8_t[]);
  259 void    ether_input(struct ifnet *, struct mbuf *);
  260 
  261 /*
  262  * Ethernet multicast address structure.  There is one of these for each
  263  * multicast address or range of multicast addresses that we are supposed
  264  * to listen to on a particular interface.  They are kept in a linked list,
  265  * rooted in the interface's ethercom structure.
  266  */
  267 struct ether_multi {
  268         uint8_t enm_addrlo[ETHER_ADDR_LEN]; /* low  or only address of range */
  269         uint8_t enm_addrhi[ETHER_ADDR_LEN]; /* high or only address of range */
  270         u_int   enm_refcount;           /* no. claims to this addr/range */
  271         LIST_ENTRY(ether_multi) enm_list;
  272 };
  273 
  274 /*
  275  * Structure used by macros below to remember position when stepping through
  276  * all of the ether_multi records.
  277  */
  278 struct ether_multistep {
  279         struct ether_multi  *e_enm;
  280 };
  281 
  282 /*
  283  * lookup the ether_multi record for a given range of Ethernet
  284  * multicast addresses connected to a given ethercom structure.
  285  * If no matching record is found, NULL is returned.
  286  */
  287 static __inline struct ether_multi *
  288 ether_lookup_multi(const uint8_t *addrlo, const uint8_t *addrhi,
  289     const struct ethercom *ec)
  290 {
  291         struct ether_multi *enm;
  292 
  293         LIST_FOREACH(enm, &ec->ec_multiaddrs, enm_list) {
  294                 if (memcmp(enm->enm_addrlo, addrlo, ETHER_ADDR_LEN) != 0)
  295                         continue;
  296                 if (memcmp(enm->enm_addrhi, addrhi, ETHER_ADDR_LEN) != 0)
  297                         continue;
  298 
  299                 break;
  300         }
  301 
  302         return enm;
  303 }
  304 
  305 /*
  306  * step through all of the ether_multi records, one at a time.
  307  * The current position is remembered in "step", which the caller must
  308  * provide.  ether_first_multi(), below, must be called to initialize "step"
  309  * and get the first record.  Both functions return a NULL when there
  310  * are no remaining records.
  311  */
  312 static __inline struct ether_multi *
  313 ether_next_multi(struct ether_multistep *step)
  314 {
  315         struct ether_multi *enm;
  316 
  317         enm = step->e_enm;
  318         if (enm != NULL)
  319                 step->e_enm = LIST_NEXT(enm, enm_list);
  320 
  321         return enm;
  322 }
  323 #define ETHER_NEXT_MULTI(step, enm)             \
  324         /* struct ether_multistep step; */      \
  325         /* struct ether_multi *enm; */          \
  326         (enm) = ether_next_multi(&(step))
  327 
  328 static __inline struct ether_multi *
  329 ether_first_multi(struct ether_multistep *step, const struct ethercom *ec)
  330 {
  331 
  332         step->e_enm = LIST_FIRST(&ec->ec_multiaddrs);
  333 
  334         return ether_next_multi(step);
  335 }
  336 
  337 #define ETHER_FIRST_MULTI(step, ec, enm)                \
  338         /* struct ether_multistep step; */              \
  339         /* struct ethercom *ec; */                      \
  340         /* struct ether_multi *enm; */                  \
  341         (enm) = ether_first_multi(&(step), (ec))
  342 
  343 #define ETHER_LOCK(ec)          mutex_enter((ec)->ec_lock)
  344 #define ETHER_UNLOCK(ec)        mutex_exit((ec)->ec_lock)
  345 
  346 /*
  347  * Ethernet 802.1Q VLAN structures.
  348  */
  349 
  350 /* for ethercom */
  351 struct vlanid_list {
  352         uint16_t vid;
  353         SIMPLEQ_ENTRY(vlanid_list) vid_list;
  354 };
  355 
  356 /* add VLAN tag to input/received packet */
  357 static __inline void
  358 vlan_set_tag(struct mbuf *m, uint16_t vlantag)
  359 {
  360         /* VLAN tag contains priority, CFI and VLAN ID */
  361         KASSERT((m->m_flags & M_PKTHDR) != 0);
  362         m->m_pkthdr.ether_vtag = vlantag;
  363         m->m_flags |= M_VLANTAG;
  364         return;
  365 }
  366 
  367 /* extract VLAN ID value from a VLAN tag */
  368 static __inline uint16_t
  369 vlan_get_tag(struct mbuf *m)
  370 {
  371         KASSERT((m->m_flags & M_PKTHDR) != 0);
  372         KASSERT(m->m_flags & M_VLANTAG);
  373         return m->m_pkthdr.ether_vtag;
  374 }
  375 
  376 static __inline bool
  377 vlan_has_tag(struct mbuf *m)
  378 {
  379         return (m->m_flags & M_VLANTAG) != 0;
  380 }
  381 
  382 static __inline bool
  383 vlan_is_hwtag_enabled(struct ifnet *_ifp)
  384 {
  385         struct ethercom *ec = (void *)_ifp;
  386 
  387         if (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING)
  388                 return true;
  389 
  390         return false;
  391 }
  392 
  393 /* test if any VLAN is configured for this interface */
  394 #define VLAN_ATTACHED(ec)       ((ec)->ec_nvlans > 0)
  395 
  396 void    etherinit(void);
  397 void    ether_ifattach(struct ifnet *, const uint8_t *);
  398 void    ether_ifdetach(struct ifnet *);
  399 int     ether_mediachange(struct ifnet *);
  400 void    ether_mediastatus(struct ifnet *, struct ifmediareq *);
  401 void *  ether_ifdetachhook_establish(struct ifnet *,
  402             void (*)(void *), void *arg);
  403 void    ether_ifdetachhook_disestablish(struct ifnet *,
  404             void *, kmutex_t *);
  405 
  406 char    *ether_sprintf(const uint8_t *);
  407 char    *ether_snprintf(char *, size_t, const uint8_t *);
  408 
  409 uint32_t ether_crc32_le(const uint8_t *, size_t);
  410 uint32_t ether_crc32_be(const uint8_t *, size_t);
  411 
  412 int     ether_aton_r(u_char *, size_t, const char *);
  413 int     ether_enable_vlan_mtu(struct ifnet *);
  414 int     ether_disable_vlan_mtu(struct ifnet *);
  415 int     ether_add_vlantag(struct ifnet *, uint16_t, bool *);
  416 int     ether_del_vlantag(struct ifnet *, uint16_t);
  417 int     ether_inject_vlantag(struct mbuf **, uint16_t, uint16_t);
  418 struct mbuf *
  419         ether_strip_vlantag(struct mbuf *);
  420 #else
  421 /*
  422  * Prototype ethers(3) functions.
  423  */
  424 #include <sys/cdefs.h>
  425 __BEGIN_DECLS
  426 char *  ether_ntoa(const struct ether_addr *);
  427 struct ether_addr *
  428         ether_aton(const char *);
  429 int     ether_ntohost(char *, const struct ether_addr *);
  430 int     ether_hostton(const char *, struct ether_addr *);
  431 int     ether_line(const char *, struct ether_addr *, char *);
  432 __END_DECLS
  433 #endif
  434 
  435 #endif /* _STANDALONE */
  436 
  437 #endif /* !_NET_IF_ETHER_H_ */

Cache object: 88dcf30c9913361b5540f77b691b8c27


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