1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 /*
  27  * ethernet.h header for common Ethernet declarations.
  28  */
  29 
  30 #ifndef _SYS_ETHERNET_H
  31 #define _SYS_ETHERNET_H
  32 
  33 #ifdef  __cplusplus
  34 extern "C" {
  35 #endif
  36 
  37 #define ETHERADDRL      (6)             /* ethernet address length in octets */
  38 #define ETHERFCSL       (4)             /* ethernet FCS length in octets */
  39 
  40 /*
  41  * Ethernet address - 6 octets
  42  */
  43 typedef uchar_t ether_addr_t[ETHERADDRL];
  44 
  45 /*
  46  * Ethernet address - 6 octets
  47  */
  48 struct  ether_addr {
  49         ether_addr_t    ether_addr_octet;
  50 };
  51 
  52 /*
  53  * Structure of a 10Mb/s Ethernet header.
  54  */
  55 struct  ether_header {
  56         struct  ether_addr      ether_dhost;
  57         struct  ether_addr      ether_shost;
  58         ushort_t                ether_type;
  59 };
  60 
  61 #define ETHER_CFI       0
  62 
  63 struct  ether_vlan_header {
  64         struct  ether_addr      ether_dhost;
  65         struct  ether_addr      ether_shost;
  66         ushort_t                ether_tpid;
  67         ushort_t                ether_tci;
  68         ushort_t                ether_type;
  69 };
  70 
  71 /*
  72  * The VLAN tag.  Available for applications that cannot make use of struct
  73  * ether_vlan_header because they assume Ethernet encapsulation.
  74  */
  75 struct ether_vlan_extinfo {
  76         ushort_t                ether_tci;
  77         ushort_t                ether_type;
  78 };
  79 
  80 #define ETHERTYPE_PUP           (0x0200)        /* PUP protocol */
  81 #define ETHERTYPE_802_MIN       (0x0600)        /* Min valid ethernet type */
  82                                                 /* under IEEE 802.3 rules */
  83 #define ETHERTYPE_IP            (0x0800)        /* IP protocol */
  84 #define ETHERTYPE_ARP           (0x0806)        /* Addr. resolution protocol */
  85 #define ETHERTYPE_REVARP        (0x8035)        /* Reverse ARP */
  86 #define ETHERTYPE_AT            (0x809b)        /* AppleTalk protocol */
  87 #define ETHERTYPE_AARP          (0x80f3)        /* AppleTalk ARP */
  88 #define ETHERTYPE_VLAN          (0x8100)        /* 802.1Q VLAN */
  89 #define ETHERTYPE_IPV6          (0x86dd)        /* IPv6 */
  90 #define ETHERTYPE_SLOW          (0x8809)        /* Slow Protocol */
  91 #define ETHERTYPE_PPPOED        (0x8863)        /* PPPoE Discovery Stage */
  92 #define ETHERTYPE_PPPOES        (0x8864)        /* PPPoE Session Stage */
  93 #define ETHERTYPE_EAPOL         (0x888e)        /* EAPOL protocol */
  94 #define ETHERTYPE_RSN_PREAUTH   (0x88c7)        /* RSN PRE-Authentication */
  95 #define ETHERTYPE_TRILL         (0x88c8)        /* TBD. TRILL frame */
  96 #define ETHERTYPE_FCOE          (0x8906)        /* FCoE */
  97 #define ETHERTYPE_MAX           (0xffff)        /* Max valid ethernet type */
  98 
  99 /*
 100  * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have
 101  * (type-ETHERTYPE_TRAIL)*512 bytes of data followed
 102  * by an ETHER type (as given above) and then the (variable-length) header.
 103  */
 104 #define ETHERTYPE_TRAIL         (0x1000)        /* Trailer packet */
 105 #define ETHERTYPE_NTRAILER      (16)
 106 
 107 #define ETHERMTU                (1500)  /* max frame w/o header or fcs */
 108 #define ETHERMIN                (60)    /* min frame w/header w/o fcs */
 109 #define ETHERMAX                (1514)  /* max frame w/header w/o fcs */
 110 
 111 /*
 112  * Compare two Ethernet addresses - assumes that the two given
 113  * pointers can be referenced as shorts.  On architectures
 114  * where this is not the case, use bcmp instead.  Note that like
 115  * bcmp, we return zero if they are the SAME.
 116  */
 117 
 118 #if defined(__sparc) || defined(__i386) || defined(__amd64)
 119 #define ether_cmp(a, b) (((short *)b)[2] != ((short *)a)[2] || \
 120         ((short *)b)[1] != ((short *)a)[1] || \
 121         ((short *)b)[0] != ((short *)a)[0])
 122 #else
 123 #define ether_cmp(a, b) (bcmp((caddr_t)a, (caddr_t)b, 6))
 124 #endif
 125 
 126 /*
 127  * Copy Ethernet addresses from a to b - assumes that the two given
 128  * pointers can be referenced as shorts.  On architectures
 129  * where this is not the case, use bcopy instead.
 130  */
 131 
 132 #if defined(__sparc) || defined(__i386) || defined(__amd64)
 133 #define ether_copy(a, b) { ((short *)b)[0] = ((short *)a)[0]; \
 134         ((short *)b)[1] = ((short *)a)[1]; ((short *)b)[2] = ((short *)a)[2]; }
 135 #else
 136 #define ether_copy(a, b) (bcopy((caddr_t)a, (caddr_t)b, 6))
 137 #endif
 138 
 139 #ifdef  _KERNEL
 140 extern int localetheraddr(struct ether_addr *, struct ether_addr *);
 141 extern char *ether_sprintf(struct ether_addr *);
 142 extern int ether_aton(char *, uchar_t *);
 143 #else   /* _KERNEL */
 144 #ifdef  __STDC__
 145 extern char *ether_ntoa(const struct ether_addr *);
 146 extern struct ether_addr *ether_aton(const char *);
 147 extern int ether_ntohost(char *, const struct ether_addr *);
 148 extern int ether_hostton(const char *, struct ether_addr *);
 149 extern int ether_line(const char *, struct ether_addr *, char *);
 150 #else   /* __STDC__ */
 151 extern char *ether_ntoa();
 152 extern struct ether_addr *ether_aton();
 153 extern int ether_ntohost();
 154 extern int ether_hostton();
 155 extern int ether_line();
 156 #endif  /* __STDC__ */
 157 #endif  /* _KERNEL */
 158 
 159 #ifdef  __cplusplus
 160 }
 161 #endif
 162 
 163 #endif  /* _SYS_ETHERNET_H */