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 */