1b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt/* 2b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt * From FreeBSD 2.2.7: Fundamental constants relating to ethernet. 3b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt * 438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Copyright (C) 1999-2013, Broadcom Corporation 538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 66dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * Permission to use, copy, modify, and/or distribute this software for any 76dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * purpose with or without fee is hereby granted, provided that the above 86dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * copyright notice and this permission notice appear in all copies. 96dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * 106dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 116dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 126dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 136dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 146dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 156dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 166dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt * 1838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * $Id: ethernet.h 384540 2013-02-12 04:28:58Z $ 19b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt */ 20b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 2138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#ifndef _NET_ETHERNET_H_ /* use native BSD ethernet.h when available */ 22b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define _NET_ETHERNET_H_ 23b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 24b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifndef _TYPEDEFS_H_ 25b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#include "typedefs.h" 26b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#endif 27b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 2838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* This marks the start of a packed structure section. */ 29b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#include <packed_section_start.h> 30b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 31b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 3238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 3338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The number of bytes in an ethernet (MAC) address. 3438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 35b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_ADDR_LEN 6 36b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 3738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 3838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The number of bytes in the type field. 3938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 40b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_TYPE_LEN 2 41b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 4238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 4338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The number of bytes in the trailing CRC field. 4438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 45b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_CRC_LEN 4 46b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 4738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 4838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The length of the combined header. 4938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 50b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_HDR_LEN (ETHER_ADDR_LEN * 2 + ETHER_TYPE_LEN) 51b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 5238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 5338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The minimum packet length. 5438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 55b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_MIN_LEN 64 56b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 5738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 5838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The minimum packet user data length. 5938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 60b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_MIN_DATA 46 61b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 6238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 6338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The maximum packet length. 6438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 65b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_MAX_LEN 1518 66b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 6738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 6838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The maximum packet user data length. 6938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 70b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_MAX_DATA 1500 71b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 7238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* ether types */ 7338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_MIN 0x0600 /* Anything less than MIN is a length */ 7438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_IP 0x0800 /* IP */ 7538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_ARP 0x0806 /* ARP */ 7638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_8021Q 0x8100 /* 802.1Q */ 7738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_IPV6 0x86dd /* IPv6 */ 7838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_BRCM 0x886c /* Broadcom Corp. */ 7938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_802_1X 0x888e /* 802.1x */ 8038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#ifdef PLC 8138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_88E1 0x88e1 /* GIGLE */ 8238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_8912 0x8912 /* GIGLE */ 8338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_GIGLED 0xffff /* GIGLE */ 8438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* PLC */ 8538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_802_1X_PREAUTH 0x88c7 /* 802.1x preauthentication */ 8638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_WAI 0x88b4 /* WAI */ 8738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_89_0D 0x890d /* 89-0d frame for TDLS */ 8838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 8938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_PPP_SES 0x8864 /* PPPoE Session */ 9038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 9138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Broadcom subtype follows ethertype; First 2 bytes are reserved; Next 2 are subtype; */ 9238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_BRCM_SUBTYPE_LEN 4 /* Broadcom 4 byte subtype */ 9338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 9438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* ether header */ 9538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_DEST_OFFSET (0 * ETHER_ADDR_LEN) /* dest address offset */ 9638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_SRC_OFFSET (1 * ETHER_ADDR_LEN) /* src address offset */ 9738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_TYPE_OFFSET (2 * ETHER_ADDR_LEN) /* ether type offset */ 98b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 9938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 10038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * A macro to validate a length with 10138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 102b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_IS_VALID_LEN(foo) \ 103b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt ((foo) >= ETHER_MIN_LEN && (foo) <= ETHER_MAX_LEN) 104b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 105b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_FILL_MCAST_ADDR_FROM_IP(ea, mgrp_ip) { \ 106b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt ((uint8 *)ea)[0] = 0x01; \ 107b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt ((uint8 *)ea)[1] = 0x00; \ 108b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt ((uint8 *)ea)[2] = 0x5e; \ 109b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt ((uint8 *)ea)[3] = ((mgrp_ip) >> 16) & 0x7f; \ 110b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt ((uint8 *)ea)[4] = ((mgrp_ip) >> 8) & 0xff; \ 111b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt ((uint8 *)ea)[5] = ((mgrp_ip) >> 0) & 0xff; \ 112b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} 113b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 11438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#ifndef __INCif_etherh /* Quick and ugly hack for VxWorks */ 11538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 11638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Structure of a 10Mb/s Ethernet header. 11738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 118b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry ShmidtBWL_PRE_PACKED_STRUCT struct ether_header { 119b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt uint8 ether_dhost[ETHER_ADDR_LEN]; 120b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt uint8 ether_shost[ETHER_ADDR_LEN]; 121b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt uint16 ether_type; 122b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} BWL_POST_PACKED_STRUCT; 123b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 12438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 12538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Structure of a 48-bit Ethernet address. 12638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 127b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry ShmidtBWL_PRE_PACKED_STRUCT struct ether_addr { 128b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt uint8 octet[ETHER_ADDR_LEN]; 129b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} BWL_POST_PACKED_STRUCT; 13038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* !__INCif_etherh Quick and ugly hack for VxWorks */ 131b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 13238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 13338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Takes a pointer, set, test, clear, toggle locally admininistered 13438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * address bit in the 48-bit Ethernet address. 13538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 136b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_SET_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] | 2)) 137b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_IS_LOCALADDR(ea) (((uint8 *)(ea))[0] & 2) 138ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define ETHER_CLR_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] & 0xfd)) 139b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_TOGGLE_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] ^ 2)) 140b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 14138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Takes a pointer, marks unicast address bit in the MAC address */ 142b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_SET_UNICAST(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] & ~1)) 143b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 14438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 14538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Takes a pointer, returns true if a 48-bit multicast address 14638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * (including broadcast, since it is all ones) 14738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 148b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_ISMULTI(ea) (((const uint8 *)(ea))[0] & 1) 149b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 150b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 15138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* compare two ethernet addresses - assumes the pointers can be referenced as shorts */ 15238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define eacmp(a, b) ((((const uint16 *)(a))[0] ^ ((const uint16 *)(b))[0]) | \ 15338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt (((const uint16 *)(a))[1] ^ ((const uint16 *)(b))[1]) | \ 15438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt (((const uint16 *)(a))[2] ^ ((const uint16 *)(b))[2])) 15538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 15638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ether_cmp(a, b) eacmp(a, b) 15738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 15838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* copy an ethernet address - assumes the pointers can be referenced as shorts */ 15938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define eacopy(s, d) \ 16038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtdo { \ 16138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((uint16 *)(d))[0] = ((const uint16 *)(s))[0]; \ 16238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((uint16 *)(d))[1] = ((const uint16 *)(s))[1]; \ 16338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((uint16 *)(d))[2] = ((const uint16 *)(s))[2]; \ 16438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt} while (0) 165b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 16638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ether_copy(s, d) eacopy(s, d) 167b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 16838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Copy an ethernet address in reverse order */ 16938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ether_rcopy(s, d) \ 17038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtdo { \ 17138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((uint16 *)(d))[2] = ((uint16 *)(s))[2]; \ 17238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((uint16 *)(d))[1] = ((uint16 *)(s))[1]; \ 17338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((uint16 *)(d))[0] = ((uint16 *)(s))[0]; \ 17438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt} while (0) 175b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 176b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 177b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 178b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtstatic const struct ether_addr ether_bcast = {{255, 255, 255, 255, 255, 255}}; 179b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtstatic const struct ether_addr ether_null = {{0, 0, 0, 0, 0, 0}}; 18038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtstatic const struct ether_addr ether_ipv6_mcast = {{0x33, 0x33, 0x00, 0x00, 0x00, 0x01}}; 18138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 18238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_ISBCAST(ea) ((((const uint8 *)(ea))[0] & \ 18338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint8 *)(ea))[1] & \ 18438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint8 *)(ea))[2] & \ 18538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint8 *)(ea))[3] & \ 18638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint8 *)(ea))[4] & \ 18738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint8 *)(ea))[5]) == 0xff) 18838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_ISNULLADDR(ea) ((((const uint8 *)(ea))[0] | \ 18938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint8 *)(ea))[1] | \ 19038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint8 *)(ea))[2] | \ 19138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint8 *)(ea))[3] | \ 19238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint8 *)(ea))[4] | \ 19338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint8 *)(ea))[5]) == 0) 19438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 19538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_ISNULLDEST(da) ((((const uint16 *)(da))[0] | \ 19638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint16 *)(da))[1] | \ 19738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((const uint16 *)(da))[2]) == 0) 19838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_ISNULLSRC(sa) ETHER_ISNULLDEST(sa) 199b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 200b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ETHER_MOVE_HDR(d, s) \ 201b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtdo { \ 202b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt struct ether_header t; \ 203b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt t = *(struct ether_header *)(s); \ 204b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt *(struct ether_header *)(d) = t; \ 205b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} while (0) 206b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 20738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_ISUCAST(ea) ((((uint8 *)(ea))[0] & 0x01) == 0) 208b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 20938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* This marks the end of a packed structure section. */ 210b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#include <packed_section_end.h> 211b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt 21238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* _NET_ETHERNET_H_ */ 213