|
24 | 24 | #include <linux/filter.h> |
25 | 25 | #include <linux/ptr_ring.h> |
26 | 26 | #include <linux/bpf_trace.h> |
| 27 | +#include <linux/net_tstamp.h> |
27 | 28 |
|
28 | 29 | #define DRV_NAME "veth" |
29 | 30 | #define DRV_VERSION "1.0" |
@@ -114,13 +115,26 @@ static void veth_get_ethtool_stats(struct net_device *dev, |
114 | 115 | data[0] = peer ? peer->ifindex : 0; |
115 | 116 | } |
116 | 117 |
|
| 118 | +static int veth_get_ts_info(struct net_device *dev, |
| 119 | + struct ethtool_ts_info *info) |
| 120 | +{ |
| 121 | + info->so_timestamping = |
| 122 | + SOF_TIMESTAMPING_TX_SOFTWARE | |
| 123 | + SOF_TIMESTAMPING_RX_SOFTWARE | |
| 124 | + SOF_TIMESTAMPING_SOFTWARE; |
| 125 | + info->phc_index = -1; |
| 126 | + |
| 127 | + return 0; |
| 128 | +} |
| 129 | + |
117 | 130 | static const struct ethtool_ops veth_ethtool_ops = { |
118 | 131 | .get_drvinfo = veth_get_drvinfo, |
119 | 132 | .get_link = ethtool_op_get_link, |
120 | 133 | .get_strings = veth_get_strings, |
121 | 134 | .get_sset_count = veth_get_sset_count, |
122 | 135 | .get_ethtool_stats = veth_get_ethtool_stats, |
123 | 136 | .get_link_ksettings = veth_get_link_ksettings, |
| 137 | + .get_ts_info = veth_get_ts_info, |
124 | 138 | }; |
125 | 139 |
|
126 | 140 | /* general routines */ |
@@ -201,6 +215,7 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev) |
201 | 215 | skb_record_rx_queue(skb, rxq); |
202 | 216 | } |
203 | 217 |
|
| 218 | + skb_tx_timestamp(skb); |
204 | 219 | if (likely(veth_forward_skb(rcv, skb, rq, rcv_xdp) == NET_RX_SUCCESS)) { |
205 | 220 | struct pcpu_vstats *stats = this_cpu_ptr(dev->vstats); |
206 | 221 |
|
|
0 commit comments