bpf: sk_msg, sock{map|hash} redirect through ULP
[linux-2.6-block.git] / net / tls / tls_sw.c
index d4ecc66464e6cac3f431004f0f575f549fa334cb..5aee9ae5ca535669128299b6940182338b3680c3 100644 (file)
@@ -686,12 +686,13 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk,
        struct sk_psock *psock;
        struct sock *sk_redir;
        struct tls_rec *rec;
+       bool enospc, policy;
        int err = 0, send;
        u32 delta = 0;
-       bool enospc;
 
+       policy = !(flags & MSG_SENDPAGE_NOPOLICY);
        psock = sk_psock_get(sk);
-       if (!psock)
+       if (!psock || !policy)
                return tls_push_record(sk, flags, record_type);
 more_data:
        enospc = sk_msg_full(msg);
@@ -1017,8 +1018,8 @@ send_end:
        return copied ? copied : ret;
 }
 
-int tls_sw_sendpage(struct sock *sk, struct page *page,
-                   int offset, size_t size, int flags)
+int tls_sw_do_sendpage(struct sock *sk, struct page *page,
+                      int offset, size_t size, int flags)
 {
        long timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
        struct tls_context *tls_ctx = tls_get_ctx(sk);
@@ -1033,15 +1034,7 @@ int tls_sw_sendpage(struct sock *sk, struct page *page,
        int ret = 0;
        bool eor;
 
-       if (flags & ~(MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL |
-                     MSG_SENDPAGE_NOTLAST))
-               return -ENOTSUPP;
-
-       /* No MSG_EOR from splice, only look at MSG_MORE */
        eor = !(flags & (MSG_MORE | MSG_SENDPAGE_NOTLAST));
-
-       lock_sock(sk);
-
        sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk);
 
        /* Wait till there is any pending write on socket */
@@ -1145,10 +1138,34 @@ wait_for_memory:
        }
 sendpage_end:
        ret = sk_stream_error(sk, flags, ret);
-       release_sock(sk);
        return copied ? copied : ret;
 }
 
+int tls_sw_sendpage_locked(struct sock *sk, struct page *page,
+                          int offset, size_t size, int flags)
+{
+       if (flags & ~(MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL |
+                     MSG_SENDPAGE_NOTLAST | MSG_SENDPAGE_NOPOLICY))
+               return -ENOTSUPP;
+
+       return tls_sw_do_sendpage(sk, page, offset, size, flags);
+}
+
+int tls_sw_sendpage(struct sock *sk, struct page *page,
+                   int offset, size_t size, int flags)
+{
+       int ret;
+
+       if (flags & ~(MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL |
+                     MSG_SENDPAGE_NOTLAST | MSG_SENDPAGE_NOPOLICY))
+               return -ENOTSUPP;
+
+       lock_sock(sk);
+       ret = tls_sw_do_sendpage(sk, page, offset, size, flags);
+       release_sock(sk);
+       return ret;
+}
+
 static struct sk_buff *tls_wait_data(struct sock *sk, struct sk_psock *psock,
                                     int flags, long timeo, int *err)
 {