xref: /src/sys/compat/linuxkpi/common/include/linux/etherdevice.h (revision cc792250acadd29e80a69501ad326d1340c0c1c6)
12c6eb461SHans Petter Selasky /*-
2d8571d3eSHans Petter Selasky  * Copyright (c) 2015-2016 Mellanox Technologies, Ltd. All rights reserved.
3c7818b48SHans Petter Selasky  *
429a2e474SHans Petter Selasky  * Redistribution and use in source and binary forms, with or without
529a2e474SHans Petter Selasky  * modification, are permitted provided that the following conditions
629a2e474SHans Petter Selasky  * are met:
729a2e474SHans Petter Selasky  * 1. Redistributions of source code must retain the above copyright
829a2e474SHans Petter Selasky  *    notice unmodified, this list of conditions, and the following
9c7818b48SHans Petter Selasky  *    disclaimer.
1029a2e474SHans Petter Selasky  * 2. Redistributions in binary form must reproduce the above copyright
1129a2e474SHans Petter Selasky  *    notice, this list of conditions and the following disclaimer in the
1229a2e474SHans Petter Selasky  *    documentation and/or other materials provided with the distribution.
13c7818b48SHans Petter Selasky  *
1429a2e474SHans Petter Selasky  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1529a2e474SHans Petter Selasky  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1629a2e474SHans Petter Selasky  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1729a2e474SHans Petter Selasky  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1829a2e474SHans Petter Selasky  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
1929a2e474SHans Petter Selasky  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2029a2e474SHans Petter Selasky  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2129a2e474SHans Petter Selasky  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2229a2e474SHans Petter Selasky  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2329a2e474SHans Petter Selasky  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24c7818b48SHans Petter Selasky  */
25307f78f3SVladimir Kondratyev #ifndef _LINUXKPI_LINUX_ETHERDEVICE_H_
26307f78f3SVladimir Kondratyev #define	_LINUXKPI_LINUX_ETHERDEVICE_H_
27c7818b48SHans Petter Selasky 
28c7818b48SHans Petter Selasky #include <linux/types.h>
293cd6d6ffSBjoern A. Zeeb #include <linux/device.h>
30cc792250SBjoern A. Zeeb #include <linux/skbuff.h>
31cc792250SBjoern A. Zeeb #include <linux/netdevice.h>
32c7818b48SHans Petter Selasky 
33e6ef991eSHans Petter Selasky #include <sys/random.h>
34e6ef991eSHans Petter Selasky #include <sys/libkern.h>
35e6ef991eSHans Petter Selasky 
36f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8079		1
37f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8079_LEN		256
38f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8472		2
39f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8472_LEN		512
40f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8636		3
41f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8636_LEN		256
42f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8436		4
43f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8436_LEN		256
44f837e46dSHans Petter Selasky 
45f837e46dSHans Petter Selasky struct ethtool_eeprom {
46f837e46dSHans Petter Selasky 	u32	offset;
47f837e46dSHans Petter Selasky 	u32	len;
48f837e46dSHans Petter Selasky };
49f837e46dSHans Petter Selasky 
50f837e46dSHans Petter Selasky struct ethtool_modinfo {
51f837e46dSHans Petter Selasky 	u32	type;
52f837e46dSHans Petter Selasky 	u32	eeprom_len;
53f837e46dSHans Petter Selasky };
54f837e46dSHans Petter Selasky 
5529a2e474SHans Petter Selasky static inline bool
is_zero_ether_addr(const u8 * addr)5629a2e474SHans Petter Selasky is_zero_ether_addr(const u8 * addr)
57c7818b48SHans Petter Selasky {
58a1295b24SEd Maste 	return ((addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]) ==
59a1295b24SEd Maste 	    0x00);
60c7818b48SHans Petter Selasky }
61c7818b48SHans Petter Selasky 
6229a2e474SHans Petter Selasky static inline bool
is_unicast_ether_addr(const u8 * addr)63a4618caaSBjoern A. Zeeb is_unicast_ether_addr(const u8 * addr)
64a4618caaSBjoern A. Zeeb {
65a4618caaSBjoern A. Zeeb 	return ((addr[0] & 0x01) == 0x00);
66a4618caaSBjoern A. Zeeb }
67a4618caaSBjoern A. Zeeb 
68a4618caaSBjoern A. Zeeb static inline bool
is_multicast_ether_addr(const u8 * addr)6929a2e474SHans Petter Selasky is_multicast_ether_addr(const u8 * addr)
70c7818b48SHans Petter Selasky {
71a4618caaSBjoern A. Zeeb 	return ((addr[0] & 0x01) == 0x01);
72c7818b48SHans Petter Selasky }
73c7818b48SHans Petter Selasky 
7429a2e474SHans Petter Selasky static inline bool
is_broadcast_ether_addr(const u8 * addr)7529a2e474SHans Petter Selasky is_broadcast_ether_addr(const u8 * addr)
76c7818b48SHans Petter Selasky {
77a1295b24SEd Maste 	return ((addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) ==
78a1295b24SEd Maste 	    0xff);
79c7818b48SHans Petter Selasky }
80c7818b48SHans Petter Selasky 
8129a2e474SHans Petter Selasky static inline bool
is_valid_ether_addr(const u8 * addr)8229a2e474SHans Petter Selasky is_valid_ether_addr(const u8 * addr)
83c7818b48SHans Petter Selasky {
84c7818b48SHans Petter Selasky 	return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr);
85c7818b48SHans Petter Selasky }
86c7818b48SHans Petter Selasky 
8729a2e474SHans Petter Selasky static inline void
ether_addr_copy(u8 * dst,const u8 * src)8829a2e474SHans Petter Selasky ether_addr_copy(u8 * dst, const u8 * src)
897c3892fcSHans Petter Selasky {
907c3892fcSHans Petter Selasky 	memcpy(dst, src, 6);
917c3892fcSHans Petter Selasky }
92c7818b48SHans Petter Selasky 
93e6ef991eSHans Petter Selasky static inline bool
ether_addr_equal_unaligned(const u8 * pa,const u8 * pb)94834227baSBjoern A. Zeeb ether_addr_equal_unaligned(const u8 *pa, const u8 *pb)
95e6ef991eSHans Petter Selasky {
96e6ef991eSHans Petter Selasky 	return (memcmp(pa, pb, 6) == 0);
97e6ef991eSHans Petter Selasky }
98834227baSBjoern A. Zeeb #define	ether_addr_equal(_pa, _pb)	ether_addr_equal_unaligned(_pa, _pb)
99e6ef991eSHans Petter Selasky 
100e6ef991eSHans Petter Selasky static inline bool
ether_addr_equal_64bits(const u8 * pa,const u8 * pb)101e6ef991eSHans Petter Selasky ether_addr_equal_64bits(const u8 *pa, const u8 *pb)
102e6ef991eSHans Petter Selasky {
103e6ef991eSHans Petter Selasky 	return (memcmp(pa, pb, 6) == 0);
104e6ef991eSHans Petter Selasky }
105e6ef991eSHans Petter Selasky 
106e6ef991eSHans Petter Selasky static inline void
eth_broadcast_addr(u8 * pa)107510ebed7SHans Petter Selasky eth_broadcast_addr(u8 *pa)
108510ebed7SHans Petter Selasky {
109510ebed7SHans Petter Selasky 	memset(pa, 0xff, 6);
110510ebed7SHans Petter Selasky }
111510ebed7SHans Petter Selasky 
112510ebed7SHans Petter Selasky static inline void
eth_zero_addr(u8 * pa)1130e3bbe91SHans Petter Selasky eth_zero_addr(u8 *pa)
1140e3bbe91SHans Petter Selasky {
1150e3bbe91SHans Petter Selasky 	memset(pa, 0, 6);
1160e3bbe91SHans Petter Selasky }
1170e3bbe91SHans Petter Selasky 
1180e3bbe91SHans Petter Selasky static inline void
random_ether_addr(u8 * dst)119e6ef991eSHans Petter Selasky random_ether_addr(u8 *dst)
120e6ef991eSHans Petter Selasky {
121a8a16c71SConrad Meyer 	arc4random_buf(dst, 6);
122e6ef991eSHans Petter Selasky 
123e6ef991eSHans Petter Selasky 	dst[0] &= 0xfe;
124e6ef991eSHans Petter Selasky 	dst[0] |= 0x02;
125e6ef991eSHans Petter Selasky }
126e6ef991eSHans Petter Selasky 
1273cd6d6ffSBjoern A. Zeeb static inline void
eth_random_addr(u8 * dst)1283cd6d6ffSBjoern A. Zeeb eth_random_addr(u8 *dst)
1293cd6d6ffSBjoern A. Zeeb {
1303cd6d6ffSBjoern A. Zeeb 
1313cd6d6ffSBjoern A. Zeeb 	random_ether_addr(dst);
1323cd6d6ffSBjoern A. Zeeb }
1333cd6d6ffSBjoern A. Zeeb 
1343cd6d6ffSBjoern A. Zeeb static inline int
device_get_mac_address(struct device * dev,char * dst)1353cd6d6ffSBjoern A. Zeeb device_get_mac_address(struct device *dev, char *dst)
1363cd6d6ffSBjoern A. Zeeb {
1373cd6d6ffSBjoern A. Zeeb 
1383cd6d6ffSBjoern A. Zeeb 	/* XXX get mac address from FDT? */
1393cd6d6ffSBjoern A. Zeeb 	return (-ENOENT);
1403cd6d6ffSBjoern A. Zeeb }
1413cd6d6ffSBjoern A. Zeeb 
142cc792250SBjoern A. Zeeb /* Returns network byte order. */
143cc792250SBjoern A. Zeeb static inline uint16_t
eth_type_trans(struct sk_buff * skb,struct net_device * dev)144cc792250SBjoern A. Zeeb eth_type_trans(struct sk_buff *skb, struct net_device *dev)
145cc792250SBjoern A. Zeeb {
146cc792250SBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
147cc792250SBjoern A. Zeeb 	return (htons(ETHERTYPE_8023));
148cc792250SBjoern A. Zeeb }
149cc792250SBjoern A. Zeeb 
150cc792250SBjoern A. Zeeb static inline void
eth_hw_addr_set(struct net_device * dev,const u8 * addr)151cc792250SBjoern A. Zeeb eth_hw_addr_set(struct net_device *dev, const u8 *addr)
152cc792250SBjoern A. Zeeb {
153cc792250SBjoern A. Zeeb 	pr_debug("%s: TODO (if we want to)\n", __func__);
154cc792250SBjoern A. Zeeb }
155cc792250SBjoern A. Zeeb 
156cc792250SBjoern A. Zeeb static inline int
eth_platform_get_mac_address(struct device * dev __unused,u8 * addr __unused)157cc792250SBjoern A. Zeeb eth_platform_get_mac_address(struct device *dev __unused, u8 *addr __unused)
158cc792250SBjoern A. Zeeb {
159cc792250SBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
160cc792250SBjoern A. Zeeb 	return (-ENODEV);
161cc792250SBjoern A. Zeeb }
162cc792250SBjoern A. Zeeb 
163307f78f3SVladimir Kondratyev #endif					/* _LINUXKPI_LINUX_ETHERDEVICE_H_ */
164