cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

eth.c (17569B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * INET		An implementation of the TCP/IP protocol suite for the LINUX
      4 *		operating system.  INET is implemented using the  BSD Socket
      5 *		interface as the means of communication with the user level.
      6 *
      7 *		Ethernet-type device handling.
      8 *
      9 * Version:	@(#)eth.c	1.0.7	05/25/93
     10 *
     11 * Authors:	Ross Biro
     12 *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
     13 *		Mark Evans, <evansmp@uhura.aston.ac.uk>
     14 *		Florian  La Roche, <rzsfl@rz.uni-sb.de>
     15 *		Alan Cox, <gw4pts@gw4pts.ampr.org>
     16 *
     17 * Fixes:
     18 *		Mr Linux	: Arp problems
     19 *		Alan Cox	: Generic queue tidyup (very tiny here)
     20 *		Alan Cox	: eth_header ntohs should be htons
     21 *		Alan Cox	: eth_rebuild_header missing an htons and
     22 *				  minor other things.
     23 *		Tegge		: Arp bug fixes.
     24 *		Florian		: Removed many unnecessary functions, code cleanup
     25 *				  and changes for new arp and skbuff.
     26 *		Alan Cox	: Redid header building to reflect new format.
     27 *		Alan Cox	: ARP only when compiled with CONFIG_INET
     28 *		Greg Page	: 802.2 and SNAP stuff.
     29 *		Alan Cox	: MAC layer pointers/new format.
     30 *		Paul Gortmaker	: eth_copy_and_sum shouldn't csum padding.
     31 *		Alan Cox	: Protect against forwarding explosions with
     32 *				  older network drivers and IFF_ALLMULTI.
     33 *	Christer Weinigel	: Better rebuild header message.
     34 *             Andrew Morton    : 26Feb01: kill ether_setup() - use netdev_boot_setup().
     35 */
     36#include <linux/module.h>
     37#include <linux/types.h>
     38#include <linux/kernel.h>
     39#include <linux/string.h>
     40#include <linux/mm.h>
     41#include <linux/socket.h>
     42#include <linux/in.h>
     43#include <linux/inet.h>
     44#include <linux/ip.h>
     45#include <linux/netdevice.h>
     46#include <linux/nvmem-consumer.h>
     47#include <linux/etherdevice.h>
     48#include <linux/skbuff.h>
     49#include <linux/errno.h>
     50#include <linux/init.h>
     51#include <linux/if_ether.h>
     52#include <linux/of_net.h>
     53#include <linux/pci.h>
     54#include <linux/property.h>
     55#include <net/dst.h>
     56#include <net/arp.h>
     57#include <net/sock.h>
     58#include <net/ipv6.h>
     59#include <net/ip.h>
     60#include <net/dsa.h>
     61#include <net/flow_dissector.h>
     62#include <net/gro.h>
     63#include <linux/uaccess.h>
     64#include <net/pkt_sched.h>
     65
     66/**
     67 * eth_header - create the Ethernet header
     68 * @skb:	buffer to alter
     69 * @dev:	source device
     70 * @type:	Ethernet type field
     71 * @daddr: destination address (NULL leave destination address)
     72 * @saddr: source address (NULL use device source address)
     73 * @len:   packet length (<= skb->len)
     74 *
     75 *
     76 * Set the protocol type. For a packet of type ETH_P_802_3/2 we put the length
     77 * in here instead.
     78 */
     79int eth_header(struct sk_buff *skb, struct net_device *dev,
     80	       unsigned short type,
     81	       const void *daddr, const void *saddr, unsigned int len)
     82{
     83	struct ethhdr *eth = skb_push(skb, ETH_HLEN);
     84
     85	if (type != ETH_P_802_3 && type != ETH_P_802_2)
     86		eth->h_proto = htons(type);
     87	else
     88		eth->h_proto = htons(len);
     89
     90	/*
     91	 *      Set the source hardware address.
     92	 */
     93
     94	if (!saddr)
     95		saddr = dev->dev_addr;
     96	memcpy(eth->h_source, saddr, ETH_ALEN);
     97
     98	if (daddr) {
     99		memcpy(eth->h_dest, daddr, ETH_ALEN);
    100		return ETH_HLEN;
    101	}
    102
    103	/*
    104	 *      Anyway, the loopback-device should never use this function...
    105	 */
    106
    107	if (dev->flags & (IFF_LOOPBACK | IFF_NOARP)) {
    108		eth_zero_addr(eth->h_dest);
    109		return ETH_HLEN;
    110	}
    111
    112	return -ETH_HLEN;
    113}
    114EXPORT_SYMBOL(eth_header);
    115
    116/**
    117 * eth_get_headlen - determine the length of header for an ethernet frame
    118 * @dev: pointer to network device
    119 * @data: pointer to start of frame
    120 * @len: total length of frame
    121 *
    122 * Make a best effort attempt to pull the length for all of the headers for
    123 * a given frame in a linear buffer.
    124 */
    125u32 eth_get_headlen(const struct net_device *dev, const void *data, u32 len)
    126{
    127	const unsigned int flags = FLOW_DISSECTOR_F_PARSE_1ST_FRAG;
    128	const struct ethhdr *eth = (const struct ethhdr *)data;
    129	struct flow_keys_basic keys;
    130
    131	/* this should never happen, but better safe than sorry */
    132	if (unlikely(len < sizeof(*eth)))
    133		return len;
    134
    135	/* parse any remaining L2/L3 headers, check for L4 */
    136	if (!skb_flow_dissect_flow_keys_basic(dev_net(dev), NULL, &keys, data,
    137					      eth->h_proto, sizeof(*eth),
    138					      len, flags))
    139		return max_t(u32, keys.control.thoff, sizeof(*eth));
    140
    141	/* parse for any L4 headers */
    142	return min_t(u32, __skb_get_poff(NULL, data, &keys, len), len);
    143}
    144EXPORT_SYMBOL(eth_get_headlen);
    145
    146/**
    147 * eth_type_trans - determine the packet's protocol ID.
    148 * @skb: received socket data
    149 * @dev: receiving network device
    150 *
    151 * The rule here is that we
    152 * assume 802.3 if the type field is short enough to be a length.
    153 * This is normal practice and works for any 'now in use' protocol.
    154 */
    155__be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
    156{
    157	unsigned short _service_access_point;
    158	const unsigned short *sap;
    159	const struct ethhdr *eth;
    160
    161	skb->dev = dev;
    162	skb_reset_mac_header(skb);
    163
    164	eth = (struct ethhdr *)skb->data;
    165	skb_pull_inline(skb, ETH_HLEN);
    166
    167	if (unlikely(!ether_addr_equal_64bits(eth->h_dest,
    168					      dev->dev_addr))) {
    169		if (unlikely(is_multicast_ether_addr_64bits(eth->h_dest))) {
    170			if (ether_addr_equal_64bits(eth->h_dest, dev->broadcast))
    171				skb->pkt_type = PACKET_BROADCAST;
    172			else
    173				skb->pkt_type = PACKET_MULTICAST;
    174		} else {
    175			skb->pkt_type = PACKET_OTHERHOST;
    176		}
    177	}
    178
    179	/*
    180	 * Some variants of DSA tagging don't have an ethertype field
    181	 * at all, so we check here whether one of those tagging
    182	 * variants has been configured on the receiving interface,
    183	 * and if so, set skb->protocol without looking at the packet.
    184	 */
    185	if (unlikely(netdev_uses_dsa(dev)))
    186		return htons(ETH_P_XDSA);
    187
    188	if (likely(eth_proto_is_802_3(eth->h_proto)))
    189		return eth->h_proto;
    190
    191	/*
    192	 *      This is a magic hack to spot IPX packets. Older Novell breaks
    193	 *      the protocol design and runs IPX over 802.3 without an 802.2 LLC
    194	 *      layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This
    195	 *      won't work for fault tolerant netware but does for the rest.
    196	 */
    197	sap = skb_header_pointer(skb, 0, sizeof(*sap), &_service_access_point);
    198	if (sap && *sap == 0xFFFF)
    199		return htons(ETH_P_802_3);
    200
    201	/*
    202	 *      Real 802.2 LLC
    203	 */
    204	return htons(ETH_P_802_2);
    205}
    206EXPORT_SYMBOL(eth_type_trans);
    207
    208/**
    209 * eth_header_parse - extract hardware address from packet
    210 * @skb: packet to extract header from
    211 * @haddr: destination buffer
    212 */
    213int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr)
    214{
    215	const struct ethhdr *eth = eth_hdr(skb);
    216	memcpy(haddr, eth->h_source, ETH_ALEN);
    217	return ETH_ALEN;
    218}
    219EXPORT_SYMBOL(eth_header_parse);
    220
    221/**
    222 * eth_header_cache - fill cache entry from neighbour
    223 * @neigh: source neighbour
    224 * @hh: destination cache entry
    225 * @type: Ethernet type field
    226 *
    227 * Create an Ethernet header template from the neighbour.
    228 */
    229int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh, __be16 type)
    230{
    231	struct ethhdr *eth;
    232	const struct net_device *dev = neigh->dev;
    233
    234	eth = (struct ethhdr *)
    235	    (((u8 *) hh->hh_data) + (HH_DATA_OFF(sizeof(*eth))));
    236
    237	if (type == htons(ETH_P_802_3))
    238		return -1;
    239
    240	eth->h_proto = type;
    241	memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
    242	memcpy(eth->h_dest, neigh->ha, ETH_ALEN);
    243
    244	/* Pairs with READ_ONCE() in neigh_resolve_output(),
    245	 * neigh_hh_output() and neigh_update_hhs().
    246	 */
    247	smp_store_release(&hh->hh_len, ETH_HLEN);
    248
    249	return 0;
    250}
    251EXPORT_SYMBOL(eth_header_cache);
    252
    253/**
    254 * eth_header_cache_update - update cache entry
    255 * @hh: destination cache entry
    256 * @dev: network device
    257 * @haddr: new hardware address
    258 *
    259 * Called by Address Resolution module to notify changes in address.
    260 */
    261void eth_header_cache_update(struct hh_cache *hh,
    262			     const struct net_device *dev,
    263			     const unsigned char *haddr)
    264{
    265	memcpy(((u8 *) hh->hh_data) + HH_DATA_OFF(sizeof(struct ethhdr)),
    266	       haddr, ETH_ALEN);
    267}
    268EXPORT_SYMBOL(eth_header_cache_update);
    269
    270/**
    271 * eth_header_parse_protocol - extract protocol from L2 header
    272 * @skb: packet to extract protocol from
    273 */
    274__be16 eth_header_parse_protocol(const struct sk_buff *skb)
    275{
    276	const struct ethhdr *eth = eth_hdr(skb);
    277
    278	return eth->h_proto;
    279}
    280EXPORT_SYMBOL(eth_header_parse_protocol);
    281
    282/**
    283 * eth_prepare_mac_addr_change - prepare for mac change
    284 * @dev: network device
    285 * @p: socket address
    286 */
    287int eth_prepare_mac_addr_change(struct net_device *dev, void *p)
    288{
    289	struct sockaddr *addr = p;
    290
    291	if (!(dev->priv_flags & IFF_LIVE_ADDR_CHANGE) && netif_running(dev))
    292		return -EBUSY;
    293	if (!is_valid_ether_addr(addr->sa_data))
    294		return -EADDRNOTAVAIL;
    295	return 0;
    296}
    297EXPORT_SYMBOL(eth_prepare_mac_addr_change);
    298
    299/**
    300 * eth_commit_mac_addr_change - commit mac change
    301 * @dev: network device
    302 * @p: socket address
    303 */
    304void eth_commit_mac_addr_change(struct net_device *dev, void *p)
    305{
    306	struct sockaddr *addr = p;
    307
    308	eth_hw_addr_set(dev, addr->sa_data);
    309}
    310EXPORT_SYMBOL(eth_commit_mac_addr_change);
    311
    312/**
    313 * eth_mac_addr - set new Ethernet hardware address
    314 * @dev: network device
    315 * @p: socket address
    316 *
    317 * Change hardware address of device.
    318 *
    319 * This doesn't change hardware matching, so needs to be overridden
    320 * for most real devices.
    321 */
    322int eth_mac_addr(struct net_device *dev, void *p)
    323{
    324	int ret;
    325
    326	ret = eth_prepare_mac_addr_change(dev, p);
    327	if (ret < 0)
    328		return ret;
    329	eth_commit_mac_addr_change(dev, p);
    330	return 0;
    331}
    332EXPORT_SYMBOL(eth_mac_addr);
    333
    334int eth_validate_addr(struct net_device *dev)
    335{
    336	if (!is_valid_ether_addr(dev->dev_addr))
    337		return -EADDRNOTAVAIL;
    338
    339	return 0;
    340}
    341EXPORT_SYMBOL(eth_validate_addr);
    342
    343const struct header_ops eth_header_ops ____cacheline_aligned = {
    344	.create		= eth_header,
    345	.parse		= eth_header_parse,
    346	.cache		= eth_header_cache,
    347	.cache_update	= eth_header_cache_update,
    348	.parse_protocol	= eth_header_parse_protocol,
    349};
    350
    351/**
    352 * ether_setup - setup Ethernet network device
    353 * @dev: network device
    354 *
    355 * Fill in the fields of the device structure with Ethernet-generic values.
    356 */
    357void ether_setup(struct net_device *dev)
    358{
    359	dev->header_ops		= &eth_header_ops;
    360	dev->type		= ARPHRD_ETHER;
    361	dev->hard_header_len 	= ETH_HLEN;
    362	dev->min_header_len	= ETH_HLEN;
    363	dev->mtu		= ETH_DATA_LEN;
    364	dev->min_mtu		= ETH_MIN_MTU;
    365	dev->max_mtu		= ETH_DATA_LEN;
    366	dev->addr_len		= ETH_ALEN;
    367	dev->tx_queue_len	= DEFAULT_TX_QUEUE_LEN;
    368	dev->flags		= IFF_BROADCAST|IFF_MULTICAST;
    369	dev->priv_flags		|= IFF_TX_SKB_SHARING;
    370
    371	eth_broadcast_addr(dev->broadcast);
    372
    373}
    374EXPORT_SYMBOL(ether_setup);
    375
    376/**
    377 * alloc_etherdev_mqs - Allocates and sets up an Ethernet device
    378 * @sizeof_priv: Size of additional driver-private structure to be allocated
    379 *	for this Ethernet device
    380 * @txqs: The number of TX queues this device has.
    381 * @rxqs: The number of RX queues this device has.
    382 *
    383 * Fill in the fields of the device structure with Ethernet-generic
    384 * values. Basically does everything except registering the device.
    385 *
    386 * Constructs a new net device, complete with a private data area of
    387 * size (sizeof_priv).  A 32-byte (not bit) alignment is enforced for
    388 * this private data area.
    389 */
    390
    391struct net_device *alloc_etherdev_mqs(int sizeof_priv, unsigned int txqs,
    392				      unsigned int rxqs)
    393{
    394	return alloc_netdev_mqs(sizeof_priv, "eth%d", NET_NAME_ENUM,
    395				ether_setup, txqs, rxqs);
    396}
    397EXPORT_SYMBOL(alloc_etherdev_mqs);
    398
    399ssize_t sysfs_format_mac(char *buf, const unsigned char *addr, int len)
    400{
    401	return scnprintf(buf, PAGE_SIZE, "%*phC\n", len, addr);
    402}
    403EXPORT_SYMBOL(sysfs_format_mac);
    404
    405struct sk_buff *eth_gro_receive(struct list_head *head, struct sk_buff *skb)
    406{
    407	const struct packet_offload *ptype;
    408	unsigned int hlen, off_eth;
    409	struct sk_buff *pp = NULL;
    410	struct ethhdr *eh, *eh2;
    411	struct sk_buff *p;
    412	__be16 type;
    413	int flush = 1;
    414
    415	off_eth = skb_gro_offset(skb);
    416	hlen = off_eth + sizeof(*eh);
    417	eh = skb_gro_header_fast(skb, off_eth);
    418	if (skb_gro_header_hard(skb, hlen)) {
    419		eh = skb_gro_header_slow(skb, hlen, off_eth);
    420		if (unlikely(!eh))
    421			goto out;
    422	}
    423
    424	flush = 0;
    425
    426	list_for_each_entry(p, head, list) {
    427		if (!NAPI_GRO_CB(p)->same_flow)
    428			continue;
    429
    430		eh2 = (struct ethhdr *)(p->data + off_eth);
    431		if (compare_ether_header(eh, eh2)) {
    432			NAPI_GRO_CB(p)->same_flow = 0;
    433			continue;
    434		}
    435	}
    436
    437	type = eh->h_proto;
    438
    439	ptype = gro_find_receive_by_type(type);
    440	if (ptype == NULL) {
    441		flush = 1;
    442		goto out;
    443	}
    444
    445	skb_gro_pull(skb, sizeof(*eh));
    446	skb_gro_postpull_rcsum(skb, eh, sizeof(*eh));
    447
    448	pp = indirect_call_gro_receive_inet(ptype->callbacks.gro_receive,
    449					    ipv6_gro_receive, inet_gro_receive,
    450					    head, skb);
    451
    452out:
    453	skb_gro_flush_final(skb, pp, flush);
    454
    455	return pp;
    456}
    457EXPORT_SYMBOL(eth_gro_receive);
    458
    459int eth_gro_complete(struct sk_buff *skb, int nhoff)
    460{
    461	struct ethhdr *eh = (struct ethhdr *)(skb->data + nhoff);
    462	__be16 type = eh->h_proto;
    463	struct packet_offload *ptype;
    464	int err = -ENOSYS;
    465
    466	if (skb->encapsulation)
    467		skb_set_inner_mac_header(skb, nhoff);
    468
    469	ptype = gro_find_complete_by_type(type);
    470	if (ptype != NULL)
    471		err = INDIRECT_CALL_INET(ptype->callbacks.gro_complete,
    472					 ipv6_gro_complete, inet_gro_complete,
    473					 skb, nhoff + sizeof(*eh));
    474
    475	return err;
    476}
    477EXPORT_SYMBOL(eth_gro_complete);
    478
    479static struct packet_offload eth_packet_offload __read_mostly = {
    480	.type = cpu_to_be16(ETH_P_TEB),
    481	.priority = 10,
    482	.callbacks = {
    483		.gro_receive = eth_gro_receive,
    484		.gro_complete = eth_gro_complete,
    485	},
    486};
    487
    488static int __init eth_offload_init(void)
    489{
    490	dev_add_offload(&eth_packet_offload);
    491
    492	return 0;
    493}
    494
    495fs_initcall(eth_offload_init);
    496
    497unsigned char * __weak arch_get_platform_mac_address(void)
    498{
    499	return NULL;
    500}
    501
    502int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr)
    503{
    504	unsigned char *addr;
    505	int ret;
    506
    507	ret = of_get_mac_address(dev->of_node, mac_addr);
    508	if (!ret)
    509		return 0;
    510
    511	addr = arch_get_platform_mac_address();
    512	if (!addr)
    513		return -ENODEV;
    514
    515	ether_addr_copy(mac_addr, addr);
    516
    517	return 0;
    518}
    519EXPORT_SYMBOL(eth_platform_get_mac_address);
    520
    521/**
    522 * platform_get_ethdev_address - Set netdev's MAC address from a given device
    523 * @dev:	Pointer to the device
    524 * @netdev:	Pointer to netdev to write the address to
    525 *
    526 * Wrapper around eth_platform_get_mac_address() which writes the address
    527 * directly to netdev->dev_addr.
    528 */
    529int platform_get_ethdev_address(struct device *dev, struct net_device *netdev)
    530{
    531	u8 addr[ETH_ALEN] __aligned(2);
    532	int ret;
    533
    534	ret = eth_platform_get_mac_address(dev, addr);
    535	if (!ret)
    536		eth_hw_addr_set(netdev, addr);
    537	return ret;
    538}
    539EXPORT_SYMBOL(platform_get_ethdev_address);
    540
    541/**
    542 * nvmem_get_mac_address - Obtain the MAC address from an nvmem cell named
    543 * 'mac-address' associated with given device.
    544 *
    545 * @dev:	Device with which the mac-address cell is associated.
    546 * @addrbuf:	Buffer to which the MAC address will be copied on success.
    547 *
    548 * Returns 0 on success or a negative error number on failure.
    549 */
    550int nvmem_get_mac_address(struct device *dev, void *addrbuf)
    551{
    552	struct nvmem_cell *cell;
    553	const void *mac;
    554	size_t len;
    555
    556	cell = nvmem_cell_get(dev, "mac-address");
    557	if (IS_ERR(cell))
    558		return PTR_ERR(cell);
    559
    560	mac = nvmem_cell_read(cell, &len);
    561	nvmem_cell_put(cell);
    562
    563	if (IS_ERR(mac))
    564		return PTR_ERR(mac);
    565
    566	if (len != ETH_ALEN || !is_valid_ether_addr(mac)) {
    567		kfree(mac);
    568		return -EINVAL;
    569	}
    570
    571	ether_addr_copy(addrbuf, mac);
    572	kfree(mac);
    573
    574	return 0;
    575}
    576
    577static int fwnode_get_mac_addr(struct fwnode_handle *fwnode,
    578			       const char *name, char *addr)
    579{
    580	int ret;
    581
    582	ret = fwnode_property_read_u8_array(fwnode, name, addr, ETH_ALEN);
    583	if (ret)
    584		return ret;
    585
    586	if (!is_valid_ether_addr(addr))
    587		return -EINVAL;
    588	return 0;
    589}
    590
    591/**
    592 * fwnode_get_mac_address - Get the MAC from the firmware node
    593 * @fwnode:	Pointer to the firmware node
    594 * @addr:	Address of buffer to store the MAC in
    595 *
    596 * Search the firmware node for the best MAC address to use.  'mac-address' is
    597 * checked first, because that is supposed to contain to "most recent" MAC
    598 * address. If that isn't set, then 'local-mac-address' is checked next,
    599 * because that is the default address.  If that isn't set, then the obsolete
    600 * 'address' is checked, just in case we're using an old device tree.
    601 *
    602 * Note that the 'address' property is supposed to contain a virtual address of
    603 * the register set, but some DTS files have redefined that property to be the
    604 * MAC address.
    605 *
    606 * All-zero MAC addresses are rejected, because those could be properties that
    607 * exist in the firmware tables, but were not updated by the firmware.  For
    608 * example, the DTS could define 'mac-address' and 'local-mac-address', with
    609 * zero MAC addresses.  Some older U-Boots only initialized 'local-mac-address'.
    610 * In this case, the real MAC is in 'local-mac-address', and 'mac-address'
    611 * exists but is all zeros.
    612 */
    613int fwnode_get_mac_address(struct fwnode_handle *fwnode, char *addr)
    614{
    615	if (!fwnode_get_mac_addr(fwnode, "mac-address", addr) ||
    616	    !fwnode_get_mac_addr(fwnode, "local-mac-address", addr) ||
    617	    !fwnode_get_mac_addr(fwnode, "address", addr))
    618		return 0;
    619
    620	return -ENOENT;
    621}
    622EXPORT_SYMBOL(fwnode_get_mac_address);
    623
    624/**
    625 * device_get_mac_address - Get the MAC for a given device
    626 * @dev:	Pointer to the device
    627 * @addr:	Address of buffer to store the MAC in
    628 */
    629int device_get_mac_address(struct device *dev, char *addr)
    630{
    631	return fwnode_get_mac_address(dev_fwnode(dev), addr);
    632}
    633EXPORT_SYMBOL(device_get_mac_address);
    634
    635/**
    636 * device_get_ethdev_address - Set netdev's MAC address from a given device
    637 * @dev:	Pointer to the device
    638 * @netdev:	Pointer to netdev to write the address to
    639 *
    640 * Wrapper around device_get_mac_address() which writes the address
    641 * directly to netdev->dev_addr.
    642 */
    643int device_get_ethdev_address(struct device *dev, struct net_device *netdev)
    644{
    645	u8 addr[ETH_ALEN];
    646	int ret;
    647
    648	ret = device_get_mac_address(dev, addr);
    649	if (!ret)
    650		eth_hw_addr_set(netdev, addr);
    651	return ret;
    652}
    653EXPORT_SYMBOL(device_get_ethdev_address);