Merge ra.kernel.org:/pub/scm/linux/kernel/git/netdev/net
This commit is contained in:
@@ -732,15 +732,19 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void tls_update(struct sock *sk, struct proto *p)
|
||||
static void tls_update(struct sock *sk, struct proto *p,
|
||||
void (*write_space)(struct sock *sk))
|
||||
{
|
||||
struct tls_context *ctx;
|
||||
|
||||
ctx = tls_get_ctx(sk);
|
||||
if (likely(ctx))
|
||||
if (likely(ctx)) {
|
||||
ctx->sk_write_space = write_space;
|
||||
ctx->sk_proto = p;
|
||||
else
|
||||
} else {
|
||||
sk->sk_prot = p;
|
||||
sk->sk_write_space = write_space;
|
||||
}
|
||||
}
|
||||
|
||||
static int tls_get_info(const struct sock *sk, struct sk_buff *skb)
|
||||
|
@@ -256,8 +256,6 @@ static int tls_do_decryption(struct sock *sk,
|
||||
return ret;
|
||||
|
||||
ret = crypto_wait_req(ret, &ctx->async_wait);
|
||||
} else if (ret == -EBADMSG) {
|
||||
TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSDECRYPTERROR);
|
||||
}
|
||||
|
||||
if (async)
|
||||
@@ -682,12 +680,32 @@ static int tls_push_record(struct sock *sk, int flags,
|
||||
|
||||
split_point = msg_pl->apply_bytes;
|
||||
split = split_point && split_point < msg_pl->sg.size;
|
||||
if (unlikely((!split &&
|
||||
msg_pl->sg.size +
|
||||
prot->overhead_size > msg_en->sg.size) ||
|
||||
(split &&
|
||||
split_point +
|
||||
prot->overhead_size > msg_en->sg.size))) {
|
||||
split = true;
|
||||
split_point = msg_en->sg.size;
|
||||
}
|
||||
if (split) {
|
||||
rc = tls_split_open_record(sk, rec, &tmp, msg_pl, msg_en,
|
||||
split_point, prot->overhead_size,
|
||||
&orig_end);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
/* This can happen if above tls_split_open_record allocates
|
||||
* a single large encryption buffer instead of two smaller
|
||||
* ones. In this case adjust pointers and continue without
|
||||
* split.
|
||||
*/
|
||||
if (!msg_pl->sg.size) {
|
||||
tls_merge_open_record(sk, rec, tmp, orig_end);
|
||||
msg_pl = &rec->msg_plaintext;
|
||||
msg_en = &rec->msg_encrypted;
|
||||
split = false;
|
||||
}
|
||||
sk_msg_trim(sk, msg_en, msg_pl->sg.size +
|
||||
prot->overhead_size);
|
||||
}
|
||||
@@ -709,6 +727,12 @@ static int tls_push_record(struct sock *sk, int flags,
|
||||
sg_mark_end(sk_msg_elem(msg_pl, i));
|
||||
}
|
||||
|
||||
if (msg_pl->sg.end < msg_pl->sg.start) {
|
||||
sg_chain(&msg_pl->sg.data[msg_pl->sg.start],
|
||||
MAX_SKB_FRAGS - msg_pl->sg.start + 1,
|
||||
msg_pl->sg.data);
|
||||
}
|
||||
|
||||
i = msg_pl->sg.start;
|
||||
sg_chain(rec->sg_aead_in, 2, &msg_pl->sg.data[i]);
|
||||
|
||||
@@ -772,7 +796,7 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk,
|
||||
psock = sk_psock_get(sk);
|
||||
if (!psock || !policy) {
|
||||
err = tls_push_record(sk, flags, record_type);
|
||||
if (err) {
|
||||
if (err && err != -EINPROGRESS) {
|
||||
*copied -= sk_msg_free(sk, msg);
|
||||
tls_free_open_rec(sk);
|
||||
}
|
||||
@@ -783,10 +807,7 @@ more_data:
|
||||
if (psock->eval == __SK_NONE) {
|
||||
delta = msg->sg.size;
|
||||
psock->eval = sk_psock_msg_verdict(sk, psock, msg);
|
||||
if (delta < msg->sg.size)
|
||||
delta -= msg->sg.size;
|
||||
else
|
||||
delta = 0;
|
||||
delta -= msg->sg.size;
|
||||
}
|
||||
if (msg->cork_bytes && msg->cork_bytes > msg->sg.size &&
|
||||
!enospc && !full_record) {
|
||||
@@ -801,7 +822,7 @@ more_data:
|
||||
switch (psock->eval) {
|
||||
case __SK_PASS:
|
||||
err = tls_push_record(sk, flags, record_type);
|
||||
if (err < 0) {
|
||||
if (err && err != -EINPROGRESS) {
|
||||
*copied -= sk_msg_free(sk, msg);
|
||||
tls_free_open_rec(sk);
|
||||
goto out_err;
|
||||
@@ -1515,7 +1536,9 @@ static int decrypt_skb_update(struct sock *sk, struct sk_buff *skb,
|
||||
if (err == -EINPROGRESS)
|
||||
tls_advance_record_sn(sk, prot,
|
||||
&tls_ctx->rx);
|
||||
|
||||
else if (err == -EBADMSG)
|
||||
TLS_INC_STATS(sock_net(sk),
|
||||
LINUX_MIB_TLSDECRYPTERROR);
|
||||
return err;
|
||||
}
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user