Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net/tls: enable sk_msg redirect to tls socket egress

Bring back tls_sw_sendpage_locked. sk_msg redirection into a socket
with TLS_TX takes the following path:

tcp_bpf_sendmsg_redir
tcp_bpf_push_locked
tcp_bpf_push
kernel_sendpage_locked
sock->ops->sendpage_locked

Also update the flags test in tls_sw_sendpage_locked to allow flag
MSG_NO_SHARED_FRAGS. bpf_tcp_sendmsg sets this.

Link: https://lore.kernel.org/netdev/CA+FuTSdaAawmZ2N8nfDDKu3XLpXBbMtcCT0q4FntDD2gn8ASUw@mail.gmail.com/T/#t
Link: https://github.com/wdebruij/kerneltools/commits/icept.2
Fixes: 0608c69c9a80 ("bpf: sk_msg, sock{map|hash} redirect through ULP")
Fixes: f3de19af0f5b ("Revert \"net/tls: remove unused function tls_sw_sendpage_locked\"")
Signed-off-by: Willem de Bruijn <willemb@google.com>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Willem de Bruijn and committed by
David S. Miller
d4ffb02d db96c2cb

+14
+2
include/net/tls.h
··· 356 356 void tls_sw_strparser_arm(struct sock *sk, struct tls_context *ctx); 357 357 void tls_sw_strparser_done(struct tls_context *tls_ctx); 358 358 int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size); 359 + int tls_sw_sendpage_locked(struct sock *sk, struct page *page, 360 + int offset, size_t size, int flags); 359 361 int tls_sw_sendpage(struct sock *sk, struct page *page, 360 362 int offset, size_t size, int flags); 361 363 void tls_sw_cancel_work_tx(struct tls_context *tls_ctx);
+1
net/tls/tls_main.c
··· 908 908 { 909 909 tls_sw_proto_ops = inet_stream_ops; 910 910 tls_sw_proto_ops.splice_read = tls_sw_splice_read; 911 + tls_sw_proto_ops.sendpage_locked = tls_sw_sendpage_locked, 911 912 912 913 tls_device_init(); 913 914 tcp_register_ulp(&tcp_tls_ulp_ops);
+11
net/tls/tls_sw.c
··· 1204 1204 return copied ? copied : ret; 1205 1205 } 1206 1206 1207 + int tls_sw_sendpage_locked(struct sock *sk, struct page *page, 1208 + int offset, size_t size, int flags) 1209 + { 1210 + if (flags & ~(MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL | 1211 + MSG_SENDPAGE_NOTLAST | MSG_SENDPAGE_NOPOLICY | 1212 + MSG_NO_SHARED_FRAGS)) 1213 + return -ENOTSUPP; 1214 + 1215 + return tls_sw_do_sendpage(sk, page, offset, size, flags); 1216 + } 1217 + 1207 1218 int tls_sw_sendpage(struct sock *sk, struct page *page, 1208 1219 int offset, size_t size, int flags) 1209 1220 {