2012-03-18 00:21:25 +08:00
|
|
|
/**
|
|
|
|
* @file ether.h
|
|
|
|
* @brief Provides definitions useful when working with Ethernet packets.
|
|
|
|
* @note Copyright (C) 2012 Richard Cochran <richardcochran@gmail.com>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
*/
|
|
|
|
#ifndef HAVE_ETHER_H
|
|
|
|
#define HAVE_ETHER_H
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
ptp4l: Add IPoIB interface support for ptp4l
The current implementation of ptp4l always assumes 6 octets MAC
address, which is correct for Ethernet interfaces but not for IPoIB
interfaces (that have 20 octets MAC), therefore running ptp4l over
IPoIB interface does not function correctly.
In Infiniband, every interface has three identifiers:
GUID, GID, and LID.
The GUID is similar in concept to a MAC address. From RFC4392:
The EUI-64 portion of a GID is referred to as the Global Unique
Identifier (GUID) and is the only persistent identifier of a port.
Therefore, to support IPoIB interfaces, the GUID of the port should
be used instead of the MAC.
This patch checks the interface type before creating the clock identity,
for Infiniband ports, it retrieves the GUID of the port using sysfs
and use it to create the clock identity.
sysfs method was chosen since the GUID is the 6 lsb bytes of
the 20 byte device address, and SIOCGIFHWADDR ioctl call returns
the 14 msb bytes of the device address, so it is not possible to
get the GUID using SIOCGIFHWADDR ioctl call.
[ RC: fixed trivial coding style error, space after switch keyword. ]
Signed-off-by: Feras Daoud <ferasda@mellanox.com>
Reviewed-by: Alex Vesker <valex@mellanox.com>
2017-08-09 23:27:32 +08:00
|
|
|
#define EUI48 6
|
|
|
|
#define EUI64 8
|
|
|
|
|
|
|
|
#define MAC_LEN EUI48
|
|
|
|
#define GUID_LEN EUI64
|
|
|
|
|
|
|
|
#define GUID_OFFSET 36
|
2012-03-18 00:21:25 +08:00
|
|
|
|
2014-04-11 18:25:52 +08:00
|
|
|
typedef uint8_t eth_addr[MAC_LEN];
|
2012-03-18 00:21:25 +08:00
|
|
|
|
|
|
|
struct eth_hdr {
|
2014-04-11 18:25:52 +08:00
|
|
|
eth_addr dst;
|
|
|
|
eth_addr src;
|
2012-03-18 00:21:25 +08:00
|
|
|
uint16_t type;
|
|
|
|
} __attribute__((packed));
|
|
|
|
|
2012-08-15 03:17:10 +08:00
|
|
|
#define VLAN_HLEN 4
|
|
|
|
|
|
|
|
struct vlan_hdr {
|
2014-04-11 18:25:52 +08:00
|
|
|
eth_addr dst;
|
|
|
|
eth_addr src;
|
2012-08-15 03:17:10 +08:00
|
|
|
uint16_t tpid;
|
|
|
|
uint16_t tci;
|
|
|
|
uint16_t type;
|
|
|
|
} __attribute__((packed));
|
|
|
|
|
2014-04-11 18:25:52 +08:00
|
|
|
#define OFF_ETYPE (2 * sizeof(eth_addr))
|
2012-03-18 00:21:25 +08:00
|
|
|
|
|
|
|
#endif
|