Datagrams timestamped on transmission can coexist in the kernel stack and be reordered in packet scheduling. When reading looped datagrams from the socket error queue it is not always possible to unique correlate looped data with original send() call (for application level retransmits). Even if possible, it may be expensive and complex, requiring packet inspection. Introduce a data-independent ID mechanism to associate timestamps with send calls. Pass an ID alongside the timestamp in field ee_data of sock_extended_err. The ID is a simple 32 bit unsigned int that is associated with the socket and incremented on each send() call for which software tx timestamp generation is enabled. The feature is enabled only if SOF_TIMESTAMPING_OPT_ID is set, to avoid changing ee_data for existing applications that expect it 0. The counter is reset each time the flag is reenabled. Reenabling does not change the ID of already submitted data. It is possible to receive out of order IDs if the timestamp stream is not quiesced first. Signed-off-by: Willem de Bruijn <willemb@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
116 lines
3.4 KiB
C
116 lines
3.4 KiB
C
/*
|
|
* Userspace API for hardware time stamping of network packets
|
|
*
|
|
* Copyright (C) 2008,2009 Intel Corporation
|
|
* Author: Patrick Ohly <patrick.ohly@intel.com>
|
|
*
|
|
*/
|
|
|
|
#ifndef _NET_TIMESTAMPING_H
|
|
#define _NET_TIMESTAMPING_H
|
|
|
|
#include <linux/socket.h> /* for SO_TIMESTAMPING */
|
|
|
|
/* SO_TIMESTAMPING gets an integer bit field comprised of these values */
|
|
enum {
|
|
SOF_TIMESTAMPING_TX_HARDWARE = (1<<0),
|
|
SOF_TIMESTAMPING_TX_SOFTWARE = (1<<1),
|
|
SOF_TIMESTAMPING_RX_HARDWARE = (1<<2),
|
|
SOF_TIMESTAMPING_RX_SOFTWARE = (1<<3),
|
|
SOF_TIMESTAMPING_SOFTWARE = (1<<4),
|
|
SOF_TIMESTAMPING_SYS_HARDWARE = (1<<5),
|
|
SOF_TIMESTAMPING_RAW_HARDWARE = (1<<6),
|
|
SOF_TIMESTAMPING_OPT_ID = (1<<7),
|
|
|
|
SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_OPT_ID,
|
|
SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_LAST - 1) |
|
|
SOF_TIMESTAMPING_LAST
|
|
};
|
|
|
|
/**
|
|
* struct hwtstamp_config - %SIOCGHWTSTAMP and %SIOCSHWTSTAMP parameter
|
|
*
|
|
* @flags: no flags defined right now, must be zero for %SIOCSHWTSTAMP
|
|
* @tx_type: one of HWTSTAMP_TX_*
|
|
* @rx_filter: one of HWTSTAMP_FILTER_*
|
|
*
|
|
* %SIOCGHWTSTAMP and %SIOCSHWTSTAMP expect a &struct ifreq with a
|
|
* ifr_data pointer to this structure. For %SIOCSHWTSTAMP, if the
|
|
* driver or hardware does not support the requested @rx_filter value,
|
|
* the driver may use a more general filter mode. In this case
|
|
* @rx_filter will indicate the actual mode on return.
|
|
*/
|
|
struct hwtstamp_config {
|
|
int flags;
|
|
int tx_type;
|
|
int rx_filter;
|
|
};
|
|
|
|
/* possible values for hwtstamp_config->tx_type */
|
|
enum hwtstamp_tx_types {
|
|
/*
|
|
* No outgoing packet will need hardware time stamping;
|
|
* should a packet arrive which asks for it, no hardware
|
|
* time stamping will be done.
|
|
*/
|
|
HWTSTAMP_TX_OFF,
|
|
|
|
/*
|
|
* Enables hardware time stamping for outgoing packets;
|
|
* the sender of the packet decides which are to be
|
|
* time stamped by setting %SOF_TIMESTAMPING_TX_SOFTWARE
|
|
* before sending the packet.
|
|
*/
|
|
HWTSTAMP_TX_ON,
|
|
|
|
/*
|
|
* Enables time stamping for outgoing packets just as
|
|
* HWTSTAMP_TX_ON does, but also enables time stamp insertion
|
|
* directly into Sync packets. In this case, transmitted Sync
|
|
* packets will not received a time stamp via the socket error
|
|
* queue.
|
|
*/
|
|
HWTSTAMP_TX_ONESTEP_SYNC,
|
|
};
|
|
|
|
/* possible values for hwtstamp_config->rx_filter */
|
|
enum hwtstamp_rx_filters {
|
|
/* time stamp no incoming packet at all */
|
|
HWTSTAMP_FILTER_NONE,
|
|
|
|
/* time stamp any incoming packet */
|
|
HWTSTAMP_FILTER_ALL,
|
|
|
|
/* return value: time stamp all packets requested plus some others */
|
|
HWTSTAMP_FILTER_SOME,
|
|
|
|
/* PTP v1, UDP, any kind of event packet */
|
|
HWTSTAMP_FILTER_PTP_V1_L4_EVENT,
|
|
/* PTP v1, UDP, Sync packet */
|
|
HWTSTAMP_FILTER_PTP_V1_L4_SYNC,
|
|
/* PTP v1, UDP, Delay_req packet */
|
|
HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ,
|
|
/* PTP v2, UDP, any kind of event packet */
|
|
HWTSTAMP_FILTER_PTP_V2_L4_EVENT,
|
|
/* PTP v2, UDP, Sync packet */
|
|
HWTSTAMP_FILTER_PTP_V2_L4_SYNC,
|
|
/* PTP v2, UDP, Delay_req packet */
|
|
HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ,
|
|
|
|
/* 802.AS1, Ethernet, any kind of event packet */
|
|
HWTSTAMP_FILTER_PTP_V2_L2_EVENT,
|
|
/* 802.AS1, Ethernet, Sync packet */
|
|
HWTSTAMP_FILTER_PTP_V2_L2_SYNC,
|
|
/* 802.AS1, Ethernet, Delay_req packet */
|
|
HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ,
|
|
|
|
/* PTP v2/802.AS1, any layer, any kind of event packet */
|
|
HWTSTAMP_FILTER_PTP_V2_EVENT,
|
|
/* PTP v2/802.AS1, any layer, Sync packet */
|
|
HWTSTAMP_FILTER_PTP_V2_SYNC,
|
|
/* PTP v2/802.AS1, any layer, Delay_req packet */
|
|
HWTSTAMP_FILTER_PTP_V2_DELAY_REQ,
|
|
};
|
|
|
|
#endif /* _NET_TIMESTAMPING_H */
|