1c618db2aSJakub Kicinski // SPDX-License-Identifier: GPL-2.0-only 2c618db2aSJakub Kicinski 3c618db2aSJakub Kicinski #include <linux/skbuff.h> 4c618db2aSJakub Kicinski 5c618db2aSJakub Kicinski #include "tls.h" 6c618db2aSJakub Kicinski 7d4e5db64SJakub Kicinski struct sk_buff *tls_strp_msg_detach(struct tls_sw_context_rx *ctx) 8d4e5db64SJakub Kicinski { 9d4e5db64SJakub Kicinski struct sk_buff *skb; 10d4e5db64SJakub Kicinski 11d4e5db64SJakub Kicinski skb = ctx->recv_pkt; 12d4e5db64SJakub Kicinski ctx->recv_pkt = NULL; 13d4e5db64SJakub Kicinski return skb; 14d4e5db64SJakub Kicinski } 15d4e5db64SJakub Kicinski 16*8b3c59a7SJakub Kicinski int tls_strp_msg_cow(struct tls_sw_context_rx *ctx) 17*8b3c59a7SJakub Kicinski { 18*8b3c59a7SJakub Kicinski struct sk_buff *unused; 19*8b3c59a7SJakub Kicinski int nsg; 20*8b3c59a7SJakub Kicinski 21*8b3c59a7SJakub Kicinski nsg = skb_cow_data(ctx->recv_pkt, 0, &unused); 22*8b3c59a7SJakub Kicinski if (nsg < 0) 23*8b3c59a7SJakub Kicinski return nsg; 24*8b3c59a7SJakub Kicinski return 0; 25*8b3c59a7SJakub Kicinski } 26*8b3c59a7SJakub Kicinski 27c618db2aSJakub Kicinski int tls_strp_msg_hold(struct sock *sk, struct sk_buff *skb, 28c618db2aSJakub Kicinski struct sk_buff_head *dst) 29c618db2aSJakub Kicinski { 30c618db2aSJakub Kicinski struct sk_buff *clone; 31c618db2aSJakub Kicinski 32c618db2aSJakub Kicinski clone = skb_clone(skb, sk->sk_allocation); 33c618db2aSJakub Kicinski if (!clone) 34c618db2aSJakub Kicinski return -ENOMEM; 35c618db2aSJakub Kicinski __skb_queue_tail(dst, clone); 36c618db2aSJakub Kicinski return 0; 37c618db2aSJakub Kicinski } 38