Because of packet reordering that can occur in the network, in the hardware, or in the networking stack, a follow up message can appear to arrive in the application before the matching sync message. As this is a normal occurrence, and the sequenceID message field ensures proper matching, the ptp4l program accepts out of order packets. This patch adds an additional check using the software time stamps from the networking stack to verify that the sync message did arrive first. This check is only useful if the sequence IDs generated by the master might possibly be incorrect. Signed-off-by: Richard Cochran <richardcochran@gmail.com>
118 lines
3.2 KiB
C
118 lines
3.2 KiB
C
/**
|
|
* @file transport.h
|
|
* @brief Defines an abstract transport layer.
|
|
* @note Copyright (C) 2011 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_TRANSPORT_H
|
|
#define HAVE_TRANSPORT_H
|
|
|
|
#include <time.h>
|
|
#include <inttypes.h>
|
|
|
|
#include "fd.h"
|
|
|
|
/* Values from networkProtocol enumeration 7.4.1 Table 3 */
|
|
enum transport_type {
|
|
/* 0 is Reserved in spec. Use it for UDS */
|
|
TRANS_UDS = 0,
|
|
TRANS_UDP_IPV4 = 1,
|
|
TRANS_UDP_IPV6,
|
|
TRANS_IEEE_802_3,
|
|
TRANS_DEVICENET,
|
|
TRANS_CONTROLNET,
|
|
TRANS_PROFINET,
|
|
};
|
|
|
|
/**
|
|
* Values for the 'event' parameter in transport_send() and
|
|
* transport_peer().
|
|
*/
|
|
enum transport_event {
|
|
TRANS_GENERAL,
|
|
TRANS_EVENT,
|
|
TRANS_ONESTEP,
|
|
};
|
|
|
|
enum timestamp_type {
|
|
TS_SOFTWARE,
|
|
TS_HARDWARE,
|
|
TS_LEGACY_HW,
|
|
TS_ONESTEP,
|
|
};
|
|
|
|
struct hw_timestamp {
|
|
enum timestamp_type type;
|
|
struct timespec ts;
|
|
struct timespec sw;
|
|
};
|
|
|
|
struct transport;
|
|
|
|
int transport_close(struct transport *t, struct fdarray *fda);
|
|
|
|
int transport_open(struct transport *t, char *name,
|
|
struct fdarray *fda, enum timestamp_type tt);
|
|
|
|
int transport_recv(struct transport *t, int fd,
|
|
void *buf, int buflen, struct hw_timestamp *hwts);
|
|
|
|
int transport_send(struct transport *t, struct fdarray *fda, int event,
|
|
void *buf, int buflen, struct hw_timestamp *hwts);
|
|
|
|
int transport_peer(struct transport *t, struct fdarray *fda, int event,
|
|
void *buf, int buflen, struct hw_timestamp *hwts);
|
|
|
|
/**
|
|
* Returns the transport's type.
|
|
*/
|
|
enum transport_type transport_type(struct transport *t);
|
|
|
|
#define TRANSPORT_ADDR_LEN 16
|
|
|
|
/**
|
|
* Gets the transport's physical address.
|
|
* @param t The transport.
|
|
* @param addr The address will be written to this buffer.
|
|
* @return The number of bytes written to the buffer. Will be 0-16
|
|
* bytes
|
|
*/
|
|
int transport_physical_addr(struct transport *t, uint8_t *addr);
|
|
|
|
/**
|
|
* Gets the transport's protocol address.
|
|
* @param t The transport.
|
|
* @param addr The address will be written to this buffer.
|
|
* @return The number of bytes written to the buffer. Will be 0-16
|
|
* bytes
|
|
*/
|
|
int transport_protocol_addr(struct transport *t, uint8_t *addr);
|
|
|
|
/**
|
|
* Allocate an instance of the specified transport.
|
|
* @param type Which transport to obtain.
|
|
* @return Pointer to a transport instance on success, NULL otherwise.
|
|
*/
|
|
struct transport *transport_create(enum transport_type type);
|
|
|
|
/**
|
|
* Free an instance of a transport.
|
|
* @param t Pointer obtained by calling transport_create().
|
|
*/
|
|
void transport_destroy(struct transport *t);
|
|
|
|
#endif
|