1*1b481fc3SMaciej Żenczykowski /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*1b481fc3SMaciej Żenczykowski /* 3*1b481fc3SMaciej Żenczykowski * Userspace API for hardware time stamping of network packets 4*1b481fc3SMaciej Żenczykowski * 5*1b481fc3SMaciej Żenczykowski * Copyright (C) 2008,2009 Intel Corporation 6*1b481fc3SMaciej Żenczykowski * Author: Patrick Ohly <[email protected]> 7*1b481fc3SMaciej Żenczykowski * 8*1b481fc3SMaciej Żenczykowski */ 9*1b481fc3SMaciej Żenczykowski 10*1b481fc3SMaciej Żenczykowski #ifndef _NET_TIMESTAMPING_H 11*1b481fc3SMaciej Żenczykowski #define _NET_TIMESTAMPING_H 12*1b481fc3SMaciej Żenczykowski 13*1b481fc3SMaciej Żenczykowski #include <linux/types.h> 14*1b481fc3SMaciej Żenczykowski #include <linux/socket.h> /* for SO_TIMESTAMPING */ 15*1b481fc3SMaciej Żenczykowski 16*1b481fc3SMaciej Żenczykowski /* SO_TIMESTAMPING flags */ 17*1b481fc3SMaciej Żenczykowski enum { 18*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_TX_HARDWARE = (1<<0), 19*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_TX_SOFTWARE = (1<<1), 20*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_RX_HARDWARE = (1<<2), 21*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_RX_SOFTWARE = (1<<3), 22*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_SOFTWARE = (1<<4), 23*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_SYS_HARDWARE = (1<<5), 24*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_RAW_HARDWARE = (1<<6), 25*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_OPT_ID = (1<<7), 26*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_TX_SCHED = (1<<8), 27*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_TX_ACK = (1<<9), 28*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_OPT_CMSG = (1<<10), 29*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_OPT_TSONLY = (1<<11), 30*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_OPT_STATS = (1<<12), 31*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_OPT_PKTINFO = (1<<13), 32*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_OPT_TX_SWHW = (1<<14), 33*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_BIND_PHC = (1 << 15), 34*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_OPT_ID_TCP = (1 << 16), 35*1b481fc3SMaciej Żenczykowski 36*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_OPT_ID_TCP, 37*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_LAST - 1) | 38*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_LAST 39*1b481fc3SMaciej Żenczykowski }; 40*1b481fc3SMaciej Żenczykowski 41*1b481fc3SMaciej Żenczykowski /* 42*1b481fc3SMaciej Żenczykowski * SO_TIMESTAMPING flags are either for recording a packet timestamp or for 43*1b481fc3SMaciej Żenczykowski * reporting the timestamp to user space. 44*1b481fc3SMaciej Żenczykowski * Recording flags can be set both via socket options and control messages. 45*1b481fc3SMaciej Żenczykowski */ 46*1b481fc3SMaciej Żenczykowski #define SOF_TIMESTAMPING_TX_RECORD_MASK (SOF_TIMESTAMPING_TX_HARDWARE | \ 47*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_TX_SOFTWARE | \ 48*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_TX_SCHED | \ 49*1b481fc3SMaciej Żenczykowski SOF_TIMESTAMPING_TX_ACK) 50*1b481fc3SMaciej Żenczykowski 51*1b481fc3SMaciej Żenczykowski /** 52*1b481fc3SMaciej Żenczykowski * struct so_timestamping - SO_TIMESTAMPING parameter 53*1b481fc3SMaciej Żenczykowski * 54*1b481fc3SMaciej Żenczykowski * @flags: SO_TIMESTAMPING flags 55*1b481fc3SMaciej Żenczykowski * @bind_phc: Index of PTP virtual clock bound to sock. This is available 56*1b481fc3SMaciej Żenczykowski * if flag SOF_TIMESTAMPING_BIND_PHC is set. 57*1b481fc3SMaciej Żenczykowski */ 58*1b481fc3SMaciej Żenczykowski struct so_timestamping { 59*1b481fc3SMaciej Żenczykowski int flags; 60*1b481fc3SMaciej Żenczykowski int bind_phc; 61*1b481fc3SMaciej Żenczykowski }; 62*1b481fc3SMaciej Żenczykowski 63*1b481fc3SMaciej Żenczykowski /** 64*1b481fc3SMaciej Żenczykowski * struct hwtstamp_config - %SIOCGHWTSTAMP and %SIOCSHWTSTAMP parameter 65*1b481fc3SMaciej Żenczykowski * 66*1b481fc3SMaciej Żenczykowski * @flags: one of HWTSTAMP_FLAG_* 67*1b481fc3SMaciej Żenczykowski * @tx_type: one of HWTSTAMP_TX_* 68*1b481fc3SMaciej Żenczykowski * @rx_filter: one of HWTSTAMP_FILTER_* 69*1b481fc3SMaciej Żenczykowski * 70*1b481fc3SMaciej Żenczykowski * %SIOCGHWTSTAMP and %SIOCSHWTSTAMP expect a &struct ifreq with a 71*1b481fc3SMaciej Żenczykowski * ifr_data pointer to this structure. For %SIOCSHWTSTAMP, if the 72*1b481fc3SMaciej Żenczykowski * driver or hardware does not support the requested @rx_filter value, 73*1b481fc3SMaciej Żenczykowski * the driver may use a more general filter mode. In this case 74*1b481fc3SMaciej Żenczykowski * @rx_filter will indicate the actual mode on return. 75*1b481fc3SMaciej Żenczykowski */ 76*1b481fc3SMaciej Żenczykowski struct hwtstamp_config { 77*1b481fc3SMaciej Żenczykowski int flags; 78*1b481fc3SMaciej Żenczykowski int tx_type; 79*1b481fc3SMaciej Żenczykowski int rx_filter; 80*1b481fc3SMaciej Żenczykowski }; 81*1b481fc3SMaciej Żenczykowski 82*1b481fc3SMaciej Żenczykowski /* possible values for hwtstamp_config->flags */ 83*1b481fc3SMaciej Żenczykowski enum hwtstamp_flags { 84*1b481fc3SMaciej Żenczykowski /* 85*1b481fc3SMaciej Żenczykowski * With this flag, the user could get bond active interface's 86*1b481fc3SMaciej Żenczykowski * PHC index. Note this PHC index is not stable as when there 87*1b481fc3SMaciej Żenczykowski * is a failover, the bond active interface will be changed, so 88*1b481fc3SMaciej Żenczykowski * will be the PHC index. 89*1b481fc3SMaciej Żenczykowski */ 90*1b481fc3SMaciej Żenczykowski HWTSTAMP_FLAG_BONDED_PHC_INDEX = (1<<0), 91*1b481fc3SMaciej Żenczykowski #define HWTSTAMP_FLAG_BONDED_PHC_INDEX HWTSTAMP_FLAG_BONDED_PHC_INDEX 92*1b481fc3SMaciej Żenczykowski 93*1b481fc3SMaciej Żenczykowski HWTSTAMP_FLAG_LAST = HWTSTAMP_FLAG_BONDED_PHC_INDEX, 94*1b481fc3SMaciej Żenczykowski HWTSTAMP_FLAG_MASK = (HWTSTAMP_FLAG_LAST - 1) | HWTSTAMP_FLAG_LAST 95*1b481fc3SMaciej Żenczykowski }; 96*1b481fc3SMaciej Żenczykowski 97*1b481fc3SMaciej Żenczykowski /* possible values for hwtstamp_config->tx_type */ 98*1b481fc3SMaciej Żenczykowski enum hwtstamp_tx_types { 99*1b481fc3SMaciej Żenczykowski /* 100*1b481fc3SMaciej Żenczykowski * No outgoing packet will need hardware time stamping; 101*1b481fc3SMaciej Żenczykowski * should a packet arrive which asks for it, no hardware 102*1b481fc3SMaciej Żenczykowski * time stamping will be done. 103*1b481fc3SMaciej Żenczykowski */ 104*1b481fc3SMaciej Żenczykowski HWTSTAMP_TX_OFF, 105*1b481fc3SMaciej Żenczykowski 106*1b481fc3SMaciej Żenczykowski /* 107*1b481fc3SMaciej Żenczykowski * Enables hardware time stamping for outgoing packets; 108*1b481fc3SMaciej Żenczykowski * the sender of the packet decides which are to be 109*1b481fc3SMaciej Żenczykowski * time stamped by setting %SOF_TIMESTAMPING_TX_SOFTWARE 110*1b481fc3SMaciej Żenczykowski * before sending the packet. 111*1b481fc3SMaciej Żenczykowski */ 112*1b481fc3SMaciej Żenczykowski HWTSTAMP_TX_ON, 113*1b481fc3SMaciej Żenczykowski 114*1b481fc3SMaciej Żenczykowski /* 115*1b481fc3SMaciej Żenczykowski * Enables time stamping for outgoing packets just as 116*1b481fc3SMaciej Żenczykowski * HWTSTAMP_TX_ON does, but also enables time stamp insertion 117*1b481fc3SMaciej Żenczykowski * directly into Sync packets. In this case, transmitted Sync 118*1b481fc3SMaciej Żenczykowski * packets will not received a time stamp via the socket error 119*1b481fc3SMaciej Żenczykowski * queue. 120*1b481fc3SMaciej Żenczykowski */ 121*1b481fc3SMaciej Żenczykowski HWTSTAMP_TX_ONESTEP_SYNC, 122*1b481fc3SMaciej Żenczykowski 123*1b481fc3SMaciej Żenczykowski /* 124*1b481fc3SMaciej Żenczykowski * Same as HWTSTAMP_TX_ONESTEP_SYNC, but also enables time 125*1b481fc3SMaciej Żenczykowski * stamp insertion directly into PDelay_Resp packets. In this 126*1b481fc3SMaciej Żenczykowski * case, neither transmitted Sync nor PDelay_Resp packets will 127*1b481fc3SMaciej Żenczykowski * receive a time stamp via the socket error queue. 128*1b481fc3SMaciej Żenczykowski */ 129*1b481fc3SMaciej Żenczykowski HWTSTAMP_TX_ONESTEP_P2P, 130*1b481fc3SMaciej Żenczykowski 131*1b481fc3SMaciej Żenczykowski /* add new constants above here */ 132*1b481fc3SMaciej Żenczykowski __HWTSTAMP_TX_CNT 133*1b481fc3SMaciej Żenczykowski }; 134*1b481fc3SMaciej Żenczykowski 135*1b481fc3SMaciej Żenczykowski /* possible values for hwtstamp_config->rx_filter */ 136*1b481fc3SMaciej Żenczykowski enum hwtstamp_rx_filters { 137*1b481fc3SMaciej Żenczykowski /* time stamp no incoming packet at all */ 138*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_NONE, 139*1b481fc3SMaciej Żenczykowski 140*1b481fc3SMaciej Żenczykowski /* time stamp any incoming packet */ 141*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_ALL, 142*1b481fc3SMaciej Żenczykowski 143*1b481fc3SMaciej Żenczykowski /* return value: time stamp all packets requested plus some others */ 144*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_SOME, 145*1b481fc3SMaciej Żenczykowski 146*1b481fc3SMaciej Żenczykowski /* PTP v1, UDP, any kind of event packet */ 147*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V1_L4_EVENT, 148*1b481fc3SMaciej Żenczykowski /* PTP v1, UDP, Sync packet */ 149*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V1_L4_SYNC, 150*1b481fc3SMaciej Żenczykowski /* PTP v1, UDP, Delay_req packet */ 151*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ, 152*1b481fc3SMaciej Żenczykowski /* PTP v2, UDP, any kind of event packet */ 153*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V2_L4_EVENT, 154*1b481fc3SMaciej Żenczykowski /* PTP v2, UDP, Sync packet */ 155*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V2_L4_SYNC, 156*1b481fc3SMaciej Żenczykowski /* PTP v2, UDP, Delay_req packet */ 157*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ, 158*1b481fc3SMaciej Żenczykowski 159*1b481fc3SMaciej Żenczykowski /* 802.AS1, Ethernet, any kind of event packet */ 160*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V2_L2_EVENT, 161*1b481fc3SMaciej Żenczykowski /* 802.AS1, Ethernet, Sync packet */ 162*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V2_L2_SYNC, 163*1b481fc3SMaciej Żenczykowski /* 802.AS1, Ethernet, Delay_req packet */ 164*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ, 165*1b481fc3SMaciej Żenczykowski 166*1b481fc3SMaciej Żenczykowski /* PTP v2/802.AS1, any layer, any kind of event packet */ 167*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V2_EVENT, 168*1b481fc3SMaciej Żenczykowski /* PTP v2/802.AS1, any layer, Sync packet */ 169*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V2_SYNC, 170*1b481fc3SMaciej Żenczykowski /* PTP v2/802.AS1, any layer, Delay_req packet */ 171*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_PTP_V2_DELAY_REQ, 172*1b481fc3SMaciej Żenczykowski 173*1b481fc3SMaciej Żenczykowski /* NTP, UDP, all versions and packet modes */ 174*1b481fc3SMaciej Żenczykowski HWTSTAMP_FILTER_NTP_ALL, 175*1b481fc3SMaciej Żenczykowski 176*1b481fc3SMaciej Żenczykowski /* add new constants above here */ 177*1b481fc3SMaciej Żenczykowski __HWTSTAMP_FILTER_CNT 178*1b481fc3SMaciej Żenczykowski }; 179*1b481fc3SMaciej Żenczykowski 180*1b481fc3SMaciej Żenczykowski /* SCM_TIMESTAMPING_PKTINFO control message */ 181*1b481fc3SMaciej Żenczykowski struct scm_ts_pktinfo { 182*1b481fc3SMaciej Żenczykowski __u32 if_index; 183*1b481fc3SMaciej Żenczykowski __u32 pkt_length; 184*1b481fc3SMaciej Żenczykowski __u32 reserved[2]; 185*1b481fc3SMaciej Żenczykowski }; 186*1b481fc3SMaciej Żenczykowski 187*1b481fc3SMaciej Żenczykowski /* 188*1b481fc3SMaciej Żenczykowski * SO_TXTIME gets a struct sock_txtime with flags being an integer bit 189*1b481fc3SMaciej Żenczykowski * field comprised of these values. 190*1b481fc3SMaciej Żenczykowski */ 191*1b481fc3SMaciej Żenczykowski enum txtime_flags { 192*1b481fc3SMaciej Żenczykowski SOF_TXTIME_DEADLINE_MODE = (1 << 0), 193*1b481fc3SMaciej Żenczykowski SOF_TXTIME_REPORT_ERRORS = (1 << 1), 194*1b481fc3SMaciej Żenczykowski 195*1b481fc3SMaciej Żenczykowski SOF_TXTIME_FLAGS_LAST = SOF_TXTIME_REPORT_ERRORS, 196*1b481fc3SMaciej Żenczykowski SOF_TXTIME_FLAGS_MASK = (SOF_TXTIME_FLAGS_LAST - 1) | 197*1b481fc3SMaciej Żenczykowski SOF_TXTIME_FLAGS_LAST 198*1b481fc3SMaciej Żenczykowski }; 199*1b481fc3SMaciej Żenczykowski 200*1b481fc3SMaciej Żenczykowski struct sock_txtime { 201*1b481fc3SMaciej Żenczykowski __kernel_clockid_t clockid;/* reference clockid */ 202*1b481fc3SMaciej Żenczykowski __u32 flags; /* as defined by enum txtime_flags */ 203*1b481fc3SMaciej Żenczykowski }; 204*1b481fc3SMaciej Żenczykowski 205*1b481fc3SMaciej Żenczykowski #endif /* _NET_TIMESTAMPING_H */ 206