1 1.91 andvar /* $NetBSD: if_ether.h,v 1.91 2024/02/05 21:46:06 andvar Exp $ */ 2 1.2 is 3 1.2 is /* 4 1.2 is * Copyright (c) 1982, 1986, 1993 5 1.2 is * The Regents of the University of California. All rights reserved. 6 1.2 is * 7 1.2 is * Redistribution and use in source and binary forms, with or without 8 1.2 is * modification, are permitted provided that the following conditions 9 1.2 is * are met: 10 1.2 is * 1. Redistributions of source code must retain the above copyright 11 1.2 is * notice, this list of conditions and the following disclaimer. 12 1.2 is * 2. Redistributions in binary form must reproduce the above copyright 13 1.2 is * notice, this list of conditions and the following disclaimer in the 14 1.2 is * documentation and/or other materials provided with the distribution. 15 1.34 agc * 3. Neither the name of the University nor the names of its contributors 16 1.2 is * may be used to endorse or promote products derived from this software 17 1.2 is * without specific prior written permission. 18 1.2 is * 19 1.2 is * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.2 is * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.2 is * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.2 is * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.2 is * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.2 is * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.2 is * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.2 is * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.2 is * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.2 is * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.2 is * SUCH DAMAGE. 30 1.2 is * 31 1.2 is * @(#)if_ether.h 8.1 (Berkeley) 6/10/93 32 1.2 is */ 33 1.2 is 34 1.4 perry #ifndef _NET_IF_ETHER_H_ 35 1.4 perry #define _NET_IF_ETHER_H_ 36 1.4 perry 37 1.29 matt #ifdef _KERNEL 38 1.33 tron #ifdef _KERNEL_OPT 39 1.31 martin #include "opt_mbuftrace.h" 40 1.32 tron #endif 41 1.29 matt #include <sys/mbuf.h> 42 1.29 matt #endif 43 1.29 matt 44 1.59 dholland #ifndef _STANDALONE 45 1.59 dholland #include <net/if.h> 46 1.59 dholland #endif 47 1.59 dholland 48 1.2 is /* 49 1.7 thorpej * Some basic Ethernet constants. 50 1.7 thorpej */ 51 1.7 thorpej #define ETHER_ADDR_LEN 6 /* length of an Ethernet address */ 52 1.7 thorpej #define ETHER_TYPE_LEN 2 /* length of the Ethernet type field */ 53 1.7 thorpej #define ETHER_CRC_LEN 4 /* length of the Ethernet CRC */ 54 1.7 thorpej #define ETHER_HDR_LEN ((ETHER_ADDR_LEN * 2) + ETHER_TYPE_LEN) 55 1.7 thorpej #define ETHER_MIN_LEN 64 /* minimum frame length, including CRC */ 56 1.7 thorpej #define ETHER_MAX_LEN 1518 /* maximum frame length, including CRC */ 57 1.24 thorpej #define ETHER_MAX_LEN_JUMBO 9018 /* maximum jumbo frame len, including CRC */ 58 1.7 thorpej 59 1.7 thorpej /* 60 1.19 thorpej * Some Ethernet extensions. 61 1.19 thorpej */ 62 1.80 msaitoh #define ETHER_VLAN_ENCAP_LEN 4 /* length of 802.1Q VLAN encapsulation */ 63 1.69 msaitoh #define EVL_VLANOFTAG(tag) ((tag) & 4095) /* VLAN ID */ 64 1.69 msaitoh #define EVL_PRIOFTAG(tag) (((tag) >> 13) & 7) /* Priority */ 65 1.69 msaitoh #define EVL_CFIOFTAG(tag) (((tag) >> 12) & 1) /* CFI */ 66 1.69 msaitoh #define ETHER_PPPOE_ENCAP_LEN 8 /* length of PPPoE encapsulation */ 67 1.19 thorpej 68 1.19 thorpej /* 69 1.77 msaitoh * Mbuf adjust factor to force 32-bit alignment of IP header. 70 1.77 msaitoh * Drivers should do m_adj(m, ETHER_ALIGN) when setting up a 71 1.77 msaitoh * receive so the upper layers get the IP header properly aligned 72 1.77 msaitoh * past the 14-byte Ethernet header. 73 1.77 msaitoh */ 74 1.77 msaitoh #define ETHER_ALIGN 2 /* driver adjust for IP hdr alignment */ 75 1.77 msaitoh 76 1.77 msaitoh /* 77 1.2 is * Ethernet address - 6 octets 78 1.2 is * this is only used by the ethers(3) functions. 79 1.2 is */ 80 1.2 is struct ether_addr { 81 1.49 matt uint8_t ether_addr_octet[ETHER_ADDR_LEN]; 82 1.82 roy }; 83 1.2 is 84 1.2 is /* 85 1.2 is * Structure of a 10Mb/s Ethernet header. 86 1.2 is */ 87 1.49 matt struct ether_header { 88 1.49 matt uint8_t ether_dhost[ETHER_ADDR_LEN]; 89 1.49 matt uint8_t ether_shost[ETHER_ADDR_LEN]; 90 1.49 matt uint16_t ether_type; 91 1.82 roy }; 92 1.83 roy 93 1.2 is #include <net/ethertypes.h> 94 1.2 is 95 1.2 is #define ETHER_IS_MULTICAST(addr) (*(addr) & 0x01) /* is address mcast/bcast? */ 96 1.51 dyoung #define ETHER_IS_LOCAL(addr) (*(addr) & 0x02) /* is address local? */ 97 1.2 is 98 1.24 thorpej #define ETHERMTU_JUMBO (ETHER_MAX_LEN_JUMBO - ETHER_HDR_LEN - ETHER_CRC_LEN) 99 1.7 thorpej #define ETHERMTU (ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN) 100 1.7 thorpej #define ETHERMIN (ETHER_MIN_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN) 101 1.2 is 102 1.14 thorpej /* 103 1.19 thorpej * Compute the maximum frame size based on ethertype (i.e. possible 104 1.19 thorpej * encapsulation) and whether or not an FCS is present. 105 1.19 thorpej */ 106 1.25 thorpej #define ETHER_MAX_FRAME(ifp, etype, hasfcs) \ 107 1.25 thorpej ((ifp)->if_mtu + ETHER_HDR_LEN + \ 108 1.19 thorpej ((hasfcs) ? ETHER_CRC_LEN : 0) + \ 109 1.52 christos (((etype) == ETHERTYPE_VLAN) ? ETHER_VLAN_ENCAP_LEN : 0) + \ 110 1.52 christos (((etype) == ETHERTYPE_PPPOE) ? ETHER_PPPOE_ENCAP_LEN : 0)) 111 1.19 thorpej 112 1.19 thorpej /* 113 1.91 andvar * Ethernet CRC32 polynomials (big- and little-endian versions). 114 1.14 thorpej */ 115 1.14 thorpej #define ETHER_CRC_POLY_LE 0xedb88320 116 1.14 thorpej #define ETHER_CRC_POLY_BE 0x04c11db6 117 1.14 thorpej 118 1.8 drochner #ifndef _STANDALONE 119 1.10 thorpej 120 1.10 thorpej /* 121 1.10 thorpej * Ethernet-specific mbuf flags. 122 1.10 thorpej */ 123 1.30 bouyer #define M_HASFCS M_LINK0 /* FCS included at end of frame */ 124 1.30 bouyer #define M_PROMISC M_LINK1 /* this packet is not for us */ 125 1.8 drochner 126 1.2 is #ifdef _KERNEL 127 1.2 is /* 128 1.2 is * Macro to map an IP multicast address to an Ethernet multicast address. 129 1.2 is * The high-order 25 bits of the Ethernet address are statically assigned, 130 1.2 is * and the low-order 23 bits are taken from the low end of the IP address. 131 1.2 is */ 132 1.2 is #define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \ 133 1.44 dyoung /* const struct in_addr *ipaddr; */ \ 134 1.49 matt /* uint8_t enaddr[ETHER_ADDR_LEN]; */ \ 135 1.44 dyoung do { \ 136 1.2 is (enaddr)[0] = 0x01; \ 137 1.2 is (enaddr)[1] = 0x00; \ 138 1.2 is (enaddr)[2] = 0x5e; \ 139 1.49 matt (enaddr)[3] = ((const uint8_t *)ipaddr)[1] & 0x7f; \ 140 1.49 matt (enaddr)[4] = ((const uint8_t *)ipaddr)[2]; \ 141 1.49 matt (enaddr)[5] = ((const uint8_t *)ipaddr)[3]; \ 142 1.44 dyoung } while (/*CONSTCOND*/0) 143 1.9 itojun /* 144 1.9 itojun * Macro to map an IP6 multicast address to an Ethernet multicast address. 145 1.9 itojun * The high-order 16 bits of the Ethernet address are statically assigned, 146 1.9 itojun * and the low-order 32 bits are taken from the low end of the IP6 address. 147 1.9 itojun */ 148 1.9 itojun #define ETHER_MAP_IPV6_MULTICAST(ip6addr, enaddr) \ 149 1.9 itojun /* struct in6_addr *ip6addr; */ \ 150 1.49 matt /* uint8_t enaddr[ETHER_ADDR_LEN]; */ \ 151 1.9 itojun { \ 152 1.9 itojun (enaddr)[0] = 0x33; \ 153 1.9 itojun (enaddr)[1] = 0x33; \ 154 1.44 dyoung (enaddr)[2] = ((const uint8_t *)ip6addr)[12]; \ 155 1.44 dyoung (enaddr)[3] = ((const uint8_t *)ip6addr)[13]; \ 156 1.44 dyoung (enaddr)[4] = ((const uint8_t *)ip6addr)[14]; \ 157 1.44 dyoung (enaddr)[5] = ((const uint8_t *)ip6addr)[15]; \ 158 1.2 is } 159 1.2 is #endif 160 1.2 is 161 1.48 dyoung struct mii_data; 162 1.48 dyoung 163 1.54 dyoung struct ethercom; 164 1.54 dyoung 165 1.54 dyoung typedef int (*ether_cb_t)(struct ethercom *); 166 1.81 msaitoh typedef int (*ether_vlancb_t)(struct ethercom *, uint16_t, bool); 167 1.54 dyoung 168 1.2 is /* 169 1.2 is * Structure shared between the ethernet driver modules and 170 1.2 is * the multicast list code. For example, each ec_softc or il_softc 171 1.2 is * begins with this structure. 172 1.2 is */ 173 1.50 rtr struct ethercom { 174 1.29 matt struct ifnet ec_if; /* network-visible interface */ 175 1.19 thorpej LIST_HEAD(, ether_multi) ec_multiaddrs; /* list of ether multicast 176 1.19 thorpej addrs */ 177 1.29 matt int ec_multicnt; /* length of ec_multiaddrs 178 1.19 thorpej list */ 179 1.29 matt int ec_capabilities; /* capabilities, provided by 180 1.19 thorpej driver */ 181 1.29 matt int ec_capenable; /* tells hardware which 182 1.19 thorpej capabilities to enable */ 183 1.19 thorpej 184 1.29 matt int ec_nvlans; /* # VLANs on this interface */ 185 1.81 msaitoh SIMPLEQ_HEAD(, vlanid_list) ec_vids; /* list of VLAN IDs */ 186 1.48 dyoung /* The device handle for the MII bus child device. */ 187 1.48 dyoung struct mii_data *ec_mii; 188 1.79 msaitoh struct ifmedia *ec_ifmedia; 189 1.80 msaitoh /* 190 1.80 msaitoh * Called after a change to ec_if.if_flags. Returns 191 1.54 dyoung * ENETRESET if the device should be reinitialized with 192 1.54 dyoung * ec_if.if_init, 0 on success, not 0 on failure. 193 1.54 dyoung */ 194 1.54 dyoung ether_cb_t ec_ifflags_cb; 195 1.81 msaitoh /* 196 1.81 msaitoh * Called whenever a vlan interface is configured or unconfigured. 197 1.81 msaitoh * Args include the vlan tag and a flag indicating whether the tag is 198 1.81 msaitoh * being added or removed. 199 1.81 msaitoh */ 200 1.81 msaitoh ether_vlancb_t ec_vlan_cb; 201 1.87 yamaguch /* Hooks called at the beginning of detach of this interface */ 202 1.87 yamaguch khook_list_t *ec_ifdetach_hooks; 203 1.66 ozaki kmutex_t *ec_lock; 204 1.78 ozaki /* Flags used only by the kernel */ 205 1.78 ozaki int ec_flags; 206 1.29 matt #ifdef MBUFTRACE 207 1.29 matt struct mowner ec_rx_mowner; /* mbufs received */ 208 1.29 matt struct mowner ec_tx_mowner; /* mbufs transmitted */ 209 1.29 matt #endif 210 1.2 is }; 211 1.19 thorpej 212 1.76 msaitoh #define ETHERCAP_VLAN_MTU 0x00000001 /* VLAN-compatible MTU */ 213 1.76 msaitoh #define ETHERCAP_VLAN_HWTAGGING 0x00000002 /* hardware VLAN tag support */ 214 1.76 msaitoh #define ETHERCAP_JUMBO_MTU 0x00000004 /* 9000 byte MTU supported */ 215 1.76 msaitoh #define ETHERCAP_VLAN_HWFILTER 0x00000008 /* iface hw can filter vlan tag */ 216 1.76 msaitoh #define ETHERCAP_EEE 0x00000010 /* Energy Efficiency Ethernet */ 217 1.76 msaitoh #define ETHERCAP_MASK 0x0000001f 218 1.2 is 219 1.61 msaitoh #define ECCAPBITS \ 220 1.61 msaitoh "\020" \ 221 1.61 msaitoh "\1VLAN_MTU" \ 222 1.61 msaitoh "\2VLAN_HWTAGGING" \ 223 1.76 msaitoh "\3JUMBO_MTU" \ 224 1.76 msaitoh "\4VLAN_HWFILTER" \ 225 1.76 msaitoh "\5EEE" 226 1.61 msaitoh 227 1.61 msaitoh /* ioctl() for Ethernet capabilities */ 228 1.61 msaitoh struct eccapreq { 229 1.61 msaitoh char eccr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 230 1.61 msaitoh int eccr_capabilities; /* supported capabiliites */ 231 1.61 msaitoh int eccr_capenable; /* capabilities enabled */ 232 1.61 msaitoh }; 233 1.61 msaitoh 234 1.73 yamaguch /* sysctl for Ethernet multicast addresses */ 235 1.73 yamaguch struct ether_multi_sysctl { 236 1.73 yamaguch u_int enm_refcount; 237 1.73 yamaguch uint8_t enm_addrlo[ETHER_ADDR_LEN]; 238 1.73 yamaguch uint8_t enm_addrhi[ETHER_ADDR_LEN]; 239 1.73 yamaguch }; 240 1.73 yamaguch 241 1.2 is #ifdef _KERNEL 242 1.78 ozaki /* 243 1.78 ozaki * Flags for ec_flags 244 1.78 ozaki */ 245 1.78 ozaki /* Store IFF_ALLMULTI in ec_flags instead of if_flags to avoid data races. */ 246 1.78 ozaki #define ETHER_F_ALLMULTI __BIT(0) 247 1.78 ozaki 248 1.36 yamt extern const uint8_t etherbroadcastaddr[ETHER_ADDR_LEN]; 249 1.39 yamt extern const uint8_t ethermulticastaddr_slowprotocols[ETHER_ADDR_LEN]; 250 1.36 yamt extern const uint8_t ether_ipmulticast_min[ETHER_ADDR_LEN]; 251 1.36 yamt extern const uint8_t ether_ipmulticast_max[ETHER_ADDR_LEN]; 252 1.2 is 253 1.54 dyoung void ether_set_ifflags_cb(struct ethercom *, ether_cb_t); 254 1.81 msaitoh void ether_set_vlan_cb(struct ethercom *, ether_vlancb_t); 255 1.45 christos int ether_ioctl(struct ifnet *, u_long, void *); 256 1.46 dyoung int ether_addmulti(const struct sockaddr *, struct ethercom *); 257 1.46 dyoung int ether_delmulti(const struct sockaddr *, struct ethercom *); 258 1.90 mrg int ether_multiaddr(const struct sockaddr *, uint8_t[ETHER_ADDR_LEN], 259 1.90 mrg uint8_t[ETHER_ADDR_LEN]); 260 1.60 msaitoh void ether_input(struct ifnet *, struct mbuf *); 261 1.2 is 262 1.2 is /* 263 1.2 is * Ethernet multicast address structure. There is one of these for each 264 1.2 is * multicast address or range of multicast addresses that we are supposed 265 1.2 is * to listen to on a particular interface. They are kept in a linked list, 266 1.5 is * rooted in the interface's ethercom structure. 267 1.2 is */ 268 1.2 is struct ether_multi { 269 1.49 matt uint8_t enm_addrlo[ETHER_ADDR_LEN]; /* low or only address of range */ 270 1.49 matt uint8_t enm_addrhi[ETHER_ADDR_LEN]; /* high or only address of range */ 271 1.80 msaitoh u_int enm_refcount; /* no. claims to this addr/range */ 272 1.2 is LIST_ENTRY(ether_multi) enm_list; 273 1.2 is }; 274 1.2 is 275 1.2 is /* 276 1.2 is * Structure used by macros below to remember position when stepping through 277 1.2 is * all of the ether_multi records. 278 1.2 is */ 279 1.2 is struct ether_multistep { 280 1.2 is struct ether_multi *e_enm; 281 1.2 is }; 282 1.2 is 283 1.2 is /* 284 1.74 yamaguch * lookup the ether_multi record for a given range of Ethernet 285 1.74 yamaguch * multicast addresses connected to a given ethercom structure. 286 1.74 yamaguch * If no matching record is found, NULL is returned. 287 1.74 yamaguch */ 288 1.74 yamaguch static __inline struct ether_multi * 289 1.74 yamaguch ether_lookup_multi(const uint8_t *addrlo, const uint8_t *addrhi, 290 1.74 yamaguch const struct ethercom *ec) 291 1.74 yamaguch { 292 1.74 yamaguch struct ether_multi *enm; 293 1.74 yamaguch 294 1.74 yamaguch LIST_FOREACH(enm, &ec->ec_multiaddrs, enm_list) { 295 1.74 yamaguch if (memcmp(enm->enm_addrlo, addrlo, ETHER_ADDR_LEN) != 0) 296 1.74 yamaguch continue; 297 1.74 yamaguch if (memcmp(enm->enm_addrhi, addrhi, ETHER_ADDR_LEN) != 0) 298 1.74 yamaguch continue; 299 1.74 yamaguch 300 1.74 yamaguch break; 301 1.74 yamaguch } 302 1.74 yamaguch 303 1.74 yamaguch return enm; 304 1.74 yamaguch } 305 1.2 is 306 1.2 is /* 307 1.74 yamaguch * step through all of the ether_multi records, one at a time. 308 1.2 is * The current position is remembered in "step", which the caller must 309 1.74 yamaguch * provide. ether_first_multi(), below, must be called to initialize "step" 310 1.74 yamaguch * and get the first record. Both functions return a NULL when there 311 1.2 is * are no remaining records. 312 1.2 is */ 313 1.74 yamaguch static __inline struct ether_multi * 314 1.74 yamaguch ether_next_multi(struct ether_multistep *step) 315 1.74 yamaguch { 316 1.74 yamaguch struct ether_multi *enm; 317 1.74 yamaguch 318 1.74 yamaguch enm = step->e_enm; 319 1.74 yamaguch if (enm != NULL) 320 1.74 yamaguch step->e_enm = LIST_NEXT(enm, enm_list); 321 1.74 yamaguch 322 1.74 yamaguch return enm; 323 1.74 yamaguch } 324 1.80 msaitoh #define ETHER_NEXT_MULTI(step, enm) \ 325 1.80 msaitoh /* struct ether_multistep step; */ \ 326 1.80 msaitoh /* struct ether_multi *enm; */ \ 327 1.74 yamaguch (enm) = ether_next_multi(&(step)) 328 1.74 yamaguch 329 1.74 yamaguch static __inline struct ether_multi * 330 1.74 yamaguch ether_first_multi(struct ether_multistep *step, const struct ethercom *ec) 331 1.74 yamaguch { 332 1.74 yamaguch 333 1.74 yamaguch step->e_enm = LIST_FIRST(&ec->ec_multiaddrs); 334 1.74 yamaguch 335 1.74 yamaguch return ether_next_multi(step); 336 1.2 is } 337 1.2 is 338 1.80 msaitoh #define ETHER_FIRST_MULTI(step, ec, enm) \ 339 1.80 msaitoh /* struct ether_multistep step; */ \ 340 1.80 msaitoh /* struct ethercom *ec; */ \ 341 1.80 msaitoh /* struct ether_multi *enm; */ \ 342 1.74 yamaguch (enm) = ether_first_multi(&(step), (ec)) 343 1.2 is 344 1.66 ozaki #define ETHER_LOCK(ec) mutex_enter((ec)->ec_lock) 345 1.66 ozaki #define ETHER_UNLOCK(ec) mutex_exit((ec)->ec_lock) 346 1.66 ozaki 347 1.37 jdolecek /* 348 1.37 jdolecek * Ethernet 802.1Q VLAN structures. 349 1.37 jdolecek */ 350 1.37 jdolecek 351 1.81 msaitoh /* for ethercom */ 352 1.81 msaitoh struct vlanid_list { 353 1.81 msaitoh uint16_t vid; 354 1.81 msaitoh SIMPLEQ_ENTRY(vlanid_list) vid_list; 355 1.81 msaitoh }; 356 1.81 msaitoh 357 1.37 jdolecek /* add VLAN tag to input/received packet */ 358 1.72 christos static __inline void 359 1.70 msaitoh vlan_set_tag(struct mbuf *m, uint16_t vlantag) 360 1.53 dsl { 361 1.69 msaitoh /* VLAN tag contains priority, CFI and VLAN ID */ 362 1.71 maxv KASSERT((m->m_flags & M_PKTHDR) != 0); 363 1.69 msaitoh m->m_pkthdr.ether_vtag = vlantag; 364 1.67 knakahar m->m_flags |= M_VLANTAG; 365 1.67 knakahar return; 366 1.53 dsl } 367 1.53 dsl 368 1.89 yamaguch /* extract VLAN ID value from a VLAN tag */ 369 1.89 yamaguch static __inline uint16_t 370 1.89 yamaguch vlan_get_tag(struct mbuf *m) 371 1.89 yamaguch { 372 1.89 yamaguch KASSERT((m->m_flags & M_PKTHDR) != 0); 373 1.89 yamaguch KASSERT(m->m_flags & M_VLANTAG); 374 1.89 yamaguch return m->m_pkthdr.ether_vtag; 375 1.89 yamaguch } 376 1.89 yamaguch 377 1.72 christos static __inline bool 378 1.67 knakahar vlan_has_tag(struct mbuf *m) 379 1.67 knakahar { 380 1.67 knakahar return (m->m_flags & M_VLANTAG) != 0; 381 1.67 knakahar } 382 1.37 jdolecek 383 1.89 yamaguch static __inline bool 384 1.89 yamaguch vlan_is_hwtag_enabled(struct ifnet *_ifp) 385 1.67 knakahar { 386 1.89 yamaguch struct ethercom *ec = (void *)_ifp; 387 1.89 yamaguch 388 1.89 yamaguch if (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING) 389 1.89 yamaguch return true; 390 1.89 yamaguch 391 1.89 yamaguch return false; 392 1.67 knakahar } 393 1.37 jdolecek 394 1.37 jdolecek /* test if any VLAN is configured for this interface */ 395 1.41 jdolecek #define VLAN_ATTACHED(ec) ((ec)->ec_nvlans > 0) 396 1.37 jdolecek 397 1.64 ozaki void etherinit(void); 398 1.49 matt void ether_ifattach(struct ifnet *, const uint8_t *); 399 1.22 thorpej void ether_ifdetach(struct ifnet *); 400 1.48 dyoung int ether_mediachange(struct ifnet *); 401 1.48 dyoung void ether_mediastatus(struct ifnet *, struct ifmediareq *); 402 1.87 yamaguch void * ether_ifdetachhook_establish(struct ifnet *, 403 1.87 yamaguch void (*)(void *), void *arg); 404 1.87 yamaguch void ether_ifdetachhook_disestablish(struct ifnet *, 405 1.87 yamaguch void *, kmutex_t *); 406 1.22 thorpej 407 1.49 matt char *ether_sprintf(const uint8_t *); 408 1.49 matt char *ether_snprintf(char *, size_t, const uint8_t *); 409 1.22 thorpej 410 1.49 matt uint32_t ether_crc32_le(const uint8_t *, size_t); 411 1.49 matt uint32_t ether_crc32_be(const uint8_t *, size_t); 412 1.23 thorpej 413 1.58 christos int ether_aton_r(u_char *, size_t, const char *); 414 1.65 christos int ether_enable_vlan_mtu(struct ifnet *); 415 1.65 christos int ether_disable_vlan_mtu(struct ifnet *); 416 1.88 yamaguch int ether_add_vlantag(struct ifnet *, uint16_t, bool *); 417 1.88 yamaguch int ether_del_vlantag(struct ifnet *, uint16_t); 418 1.89 yamaguch int ether_inject_vlantag(struct mbuf **, uint16_t, uint16_t); 419 1.89 yamaguch struct mbuf * 420 1.89 yamaguch ether_strip_vlantag(struct mbuf *); 421 1.14 thorpej #else 422 1.2 is /* 423 1.2 is * Prototype ethers(3) functions. 424 1.2 is */ 425 1.2 is #include <sys/cdefs.h> 426 1.2 is __BEGIN_DECLS 427 1.55 dsl char * ether_ntoa(const struct ether_addr *); 428 1.2 is struct ether_addr * 429 1.55 dsl ether_aton(const char *); 430 1.55 dsl int ether_ntohost(char *, const struct ether_addr *); 431 1.55 dsl int ether_hostton(const char *, struct ether_addr *); 432 1.55 dsl int ether_line(const char *, struct ether_addr *, char *); 433 1.2 is __END_DECLS 434 1.2 is #endif 435 1.8 drochner 436 1.8 drochner #endif /* _STANDALONE */ 437 1.4 perry 438 1.40 elad #endif /* !_NET_IF_ETHER_H_ */ 439