1/* 2 * Copyright (c) 2000-2010 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* 29 * Fundamental constants relating to ethernet. 30 * 31 */ 32 33#ifndef _NET_ETHERNET_H_ 34#define _NET_ETHERNET_H_ 35#include <sys/appleapiopts.h> 36#include <sys/types.h> /* u_ types */ 37 38/* 39 * The number of bytes in an ethernet (MAC) address. 40 */ 41#define ETHER_ADDR_LEN 6 42 43/* 44 * The number of bytes in the type field. 45 */ 46#define ETHER_TYPE_LEN 2 47 48/* 49 * The number of bytes in the trailing CRC field. 50 */ 51#define ETHER_CRC_LEN 4 52 53/* 54 * The length of the combined header. 55 */ 56#define ETHER_HDR_LEN (ETHER_ADDR_LEN*2+ETHER_TYPE_LEN) 57 58/* 59 * The minimum packet length. 60 */ 61#define ETHER_MIN_LEN 64 62 63/* 64 * The maximum packet length. 65 */ 66#define ETHER_MAX_LEN 1518 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 * A macro to validate a length with 78 */ 79#define ETHER_IS_VALID_LEN(foo) \ 80 ((foo) >= ETHER_MIN_LEN && (foo) <= ETHER_MAX_LEN) 81 82/* 83 * Structure of a 10Mb/s Ethernet header. 84 */ 85struct ether_header { 86 u_char ether_dhost[ETHER_ADDR_LEN]; 87 u_char ether_shost[ETHER_ADDR_LEN]; 88 u_short ether_type; 89}; 90 91/* 92 * Structure of a 48-bit Ethernet address. 93 */ 94struct ether_addr { 95 u_char octet[ETHER_ADDR_LEN]; 96}; 97 98#define ether_addr_octet octet 99 100#define ETHERTYPE_PUP 0x0200 /* PUP protocol */ 101#define ETHERTYPE_IP 0x0800 /* IP protocol */ 102#define ETHERTYPE_ARP 0x0806 /* Addr. resolution protocol */ 103#define ETHERTYPE_REVARP 0x8035 /* reverse Addr. resolution protocol */ 104#define ETHERTYPE_VLAN 0x8100 /* IEEE 802.1Q VLAN tagging */ 105#define ETHERTYPE_IPV6 0x86dd /* IPv6 */ 106#define ETHERTYPE_PAE 0x888e /* EAPOL PAE/802.1x */ 107#define ETHERTYPE_RSN_PREAUTH 0x88c7 /* 802.11i / RSN Pre-Authentication */ 108#define ETHERTYPE_LOOPBACK 0x9000 /* used to test interfaces */ 109/* XXX - add more useful types here */ 110 111/* 112 * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have 113 * (type-ETHERTYPE_TRAIL)*512 bytes of data followed 114 * by an ETHER type (as given above) and then the (variable-length) header. 115 */ 116#define ETHERTYPE_TRAIL 0x1000 /* Trailer packet */ 117#define ETHERTYPE_NTRAILER 16 118 119#define ETHERMTU (ETHER_MAX_LEN-ETHER_HDR_LEN-ETHER_CRC_LEN) 120#define ETHERMIN (ETHER_MIN_LEN-ETHER_HDR_LEN-ETHER_CRC_LEN) 121 122#ifdef KERNEL_PRIVATE 123/* 124 * The following are used by ethernet interfaces. 125 */ 126 127struct ether_addr *ether_aton(const char *); 128 129#ifdef BSD_KERNEL_PRIVATE 130extern u_char etherbroadcastaddr[ETHER_ADDR_LEN]; 131 132 133static __inline__ int 134_ether_cmp(const void * a, const void * b) 135{ 136 const u_int16_t * a_s = (const u_int16_t *)a; 137 const u_int16_t * b_s = (const u_int16_t *)b; 138 139 if (a_s[0] != b_s[0] 140 || a_s[1] != b_s[1] 141 || a_s[2] != b_s[2]) { 142 return (1); 143 } 144 return (0); 145} 146 147#endif /* BSD_KERNEL_PRIVATE */ 148 149#define ETHER_IS_MULTICAST(addr) (*(addr) & 0x01) /* is address mcast/bcast? */ 150 151#endif /* KERNEL_PRIVATE */ 152 153#ifndef KERNEL 154#include <sys/cdefs.h> 155 156/* 157 * Ethernet address conversion/parsing routines. 158 */ 159__BEGIN_DECLS 160 161int ether_hostton(const char *, struct ether_addr *); 162int ether_line(const char *, struct ether_addr *, char *); 163char *ether_ntoa(const struct ether_addr *); 164struct ether_addr *ether_aton(const char *); 165int ether_ntohost(char *, const struct ether_addr *); 166__END_DECLS 167#endif /* !KERNEL */ 168 169#endif /* !_NET_ETHERNET_H_ */ 170