11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* $NetBSD: if_ether.h,v 1.43 2006/11/24 01:04:30 rpaulo Exp $ */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1982, 1986, 1993 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The Regents of the University of California. All rights reserved. 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * documentation and/or other materials provided with the distribution. 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * may be used to endorse or promote products derived from this software 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * without specific prior written permission. 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * @(#)if_ether.h 8.1 (Berkeley) 6/10/93 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _NET_IF_ETHER_H_ 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _NET_IF_ETHER_H_ 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3741e533af4a2720c1dc228ba40b6582ca53085c3aSzymon Jakubczak#include <sys/types.h> 3841e533af4a2720c1dc228ba40b6582ca53085c3aSzymon Jakubczak 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef _KERNEL 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef _KERNEL_OPT 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "opt_mbuftrace.h" 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/mbuf.h> 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Some basic Ethernet constants. 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_ADDR_LEN 6 /* length of an Ethernet address */ 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_TYPE_LEN 2 /* length of the Ethernet type field */ 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_CRC_LEN 4 /* length of the Ethernet CRC */ 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_HDR_LEN ((ETHER_ADDR_LEN * 2) + ETHER_TYPE_LEN) 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_MIN_LEN 64 /* minimum frame length, including CRC */ 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_MAX_LEN 1518 /* maximum frame length, including CRC */ 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_MAX_LEN_JUMBO 9018 /* maximum jumbo frame len, including CRC */ 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Some Ethernet extensions. 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_VLAN_ENCAP_LEN 4 /* length of 802.1Q VLAN encapsulation */ 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Ethernet address - 6 octets 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * this is only used by the ethers(3) functions. 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct ether_addr { 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t ether_addr_octet[ETHER_ADDR_LEN]; 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} __attribute__((__packed__)); 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Structure of a 10Mb/s Ethernet header. 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct ether_header { 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t ether_dhost[ETHER_ADDR_LEN]; 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t ether_shost[ETHER_ADDR_LEN]; 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int16_t ether_type; 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} __attribute__((__packed__)); 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <net/ethertypes.h> 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_IS_MULTICAST(addr) (*(addr) & 0x01) /* is address mcast/bcast? */ 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHERMTU_JUMBO (ETHER_MAX_LEN_JUMBO - ETHER_HDR_LEN - ETHER_CRC_LEN) 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHERMTU (ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN) 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHERMIN (ETHER_MIN_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN) 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Compute the maximum frame size based on ethertype (i.e. possible 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * encapsulation) and whether or not an FCS is present. 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_MAX_FRAME(ifp, etype, hasfcs) \ 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ((ifp)->if_mtu + ETHER_HDR_LEN + \ 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ((hasfcs) ? ETHER_CRC_LEN : 0) + \ 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (((etype) == ETHERTYPE_VLAN) ? ETHER_VLAN_ENCAP_LEN : 0)) 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Ethernet CRC32 polynomials (big- and little-endian verions). 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_CRC_POLY_LE 0xedb88320 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_CRC_POLY_BE 0x04c11db6 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _STANDALONE 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Ethernet-specific mbuf flags. 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define M_HASFCS M_LINK0 /* FCS included at end of frame */ 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define M_PROMISC M_LINK1 /* this packet is not for us */ 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef _KERNEL 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Macro to map an IP multicast address to an Ethernet multicast address. 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The high-order 25 bits of the Ethernet address are statically assigned, 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * and the low-order 23 bits are taken from the low end of the IP address. 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \ 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* struct in_addr *ipaddr; */ \ 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* u_int8_t enaddr[ETHER_ADDR_LEN]; */ \ 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ \ 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[0] = 0x01; \ 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[1] = 0x00; \ 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[2] = 0x5e; \ 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[3] = ((u_int8_t *)ipaddr)[1] & 0x7f; \ 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[4] = ((u_int8_t *)ipaddr)[2]; \ 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[5] = ((u_int8_t *)ipaddr)[3]; \ 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Macro to map an IP6 multicast address to an Ethernet multicast address. 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The high-order 16 bits of the Ethernet address are statically assigned, 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * and the low-order 32 bits are taken from the low end of the IP6 address. 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHER_MAP_IPV6_MULTICAST(ip6addr, enaddr) \ 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* struct in6_addr *ip6addr; */ \ 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* u_int8_t enaddr[ETHER_ADDR_LEN]; */ \ 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ \ 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[0] = 0x33; \ 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[1] = 0x33; \ 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[2] = ((u_int8_t *)ip6addr)[12]; \ 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[3] = ((u_int8_t *)ip6addr)[13]; \ 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[4] = ((u_int8_t *)ip6addr)[14]; \ 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (enaddr)[5] = ((u_int8_t *)ip6addr)[15]; \ 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHERCAP_VLAN_MTU 0x00000001 /* VLAN-compatible MTU */ 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHERCAP_VLAN_HWTAGGING 0x00000002 /* hardware VLAN tag support */ 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ETHERCAP_JUMBO_MTU 0x00000004 /* 9000 byte MTU supported */ 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef _KERNEL 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern const uint8_t etherbroadcastaddr[ETHER_ADDR_LEN]; 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern const uint8_t ethermulticastaddr_slowprotocols[ETHER_ADDR_LEN]; 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern const uint8_t ether_ipmulticast_min[ETHER_ADDR_LEN]; 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern const uint8_t ether_ipmulticast_max[ETHER_ADDR_LEN]; 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ether_ioctl(struct ifnet *, u_long, caddr_t); 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ether_addmulti (struct ifreq *, struct ethercom *); 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ether_delmulti (struct ifreq *, struct ethercom *); 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ether_changeaddr (struct ifreq *, struct ethercom *); 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ether_multiaddr(struct sockaddr *, u_int8_t[], u_int8_t[]); 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Ethernet 802.1Q VLAN structures. 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* add VLAN tag to input/received packet */ 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define VLAN_INPUT_TAG(ifp, m, vlanid, _errcase) \ 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do { \ 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct m_tag *mtag = \ 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project m_tag_get(PACKET_TAG_VLAN, sizeof(u_int), M_NOWAIT);\ 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (mtag == NULL) { \ 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ifp->if_ierrors++; \ 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf("%s: unable to allocate VLAN tag\n", \ 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ifp->if_xname); \ 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project m_freem(m); \ 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _errcase; \ 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } \ 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *(u_int *)(mtag + 1) = vlanid; \ 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project m_tag_prepend(m, mtag); \ 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } while(0) 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* extract VLAN tag from output/trasmit packet */ 1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define VLAN_OUTPUT_TAG(ec, m0) \ 1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project VLAN_ATTACHED(ec) ? m_tag_find((m0), PACKET_TAG_VLAN, NULL) : NULL 1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* extract VLAN ID value from a VLAN tag */ 1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define VLAN_TAG_VALUE(mtag) \ 1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ((*(u_int *)(mtag + 1)) & 4095) 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* test if any VLAN is configured for this interface */ 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define VLAN_ATTACHED(ec) ((ec)->ec_nvlans > 0) 1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid ether_ifattach(struct ifnet *, const u_int8_t *); 1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid ether_ifdetach(struct ifnet *); 1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar *ether_sprintf(const u_int8_t *); 1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar *ether_snprintf(char *, size_t, const u_int8_t *); 1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int32_t ether_crc32_le(const u_int8_t *, size_t); 1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int32_t ether_crc32_be(const u_int8_t *, size_t); 2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ether_nonstatic_aton(u_char *, char *); 2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Prototype ethers(3) functions. 2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS 2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar * ether_ntoa __P((const struct ether_addr *)); 2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct ether_addr * 2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ether_aton __P((const char *)); 2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ether_ntohost __P((char *, const struct ether_addr *)); 2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ether_hostton __P((const char *, struct ether_addr *)); 2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ether_line __P((const char *, struct ether_addr *, char *)); 2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS 2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _STANDALONE */ 2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !_NET_IF_ETHER_H_ */ 220