Change bpf_sock_ops_enable_tx_tstamp() kfunc to only set SKBTX_BPF flag, so that it can be used also for non-TCP skbs. Do not set TCP-specific fields if the socket is not TCP. *** Doing it this way requires a valid tskey is set by the socket family, before BPF_SOCK_OPS_TSTAMP_SENDMSG_CB. Alternatively, it maybe could be hardcoded per socket type here, or some new proto_ops added. --- net/core/filter.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/net/core/filter.c b/net/core/filter.c index 46ae8eb7a03c..1300b0ef3620 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -12127,6 +12127,7 @@ __bpf_kfunc int bpf_sk_assign_tcp_reqsk(struct __sk_buff *s, struct sock *sk, __bpf_kfunc int bpf_sock_ops_enable_tx_tstamp(struct bpf_sock_ops_kern *skops, u64 flags) { + struct sock *sk; struct sk_buff *skb; if (skops->op != BPF_SOCK_OPS_TSTAMP_SENDMSG_CB) @@ -12135,10 +12136,17 @@ __bpf_kfunc int bpf_sock_ops_enable_tx_tstamp(struct bpf_sock_ops_kern *skops, if (flags) return -EINVAL; + sk = skops->sk; + if (!sk) + return -EINVAL; + skb = skops->skb; skb_shinfo(skb)->tx_flags |= SKBTX_BPF; - TCP_SKB_CB(skb)->txstamp_ack |= TSTAMP_ACK_BPF; - skb_shinfo(skb)->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1; + + if (sk_is_tcp(sk)) { + TCP_SKB_CB(skb)->txstamp_ack |= TSTAMP_ACK_BPF; + skb_shinfo(skb)->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1; + } return 0; } -- 2.49.0