diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-04-22 02:04:22 -0600 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-04-22 02:04:22 -0600 |
commit | 71a7269d778f9a131d1cecbfdb3cd00c248131a8 (patch) | |
tree | 6dde60392010d89898700b9a249f1aeaf629fdae | |
parent | d579bb2cd2db0117037686697fe23bb5da27d603 (diff) | |
download | wireguard-linux-trimmed-71a7269d778f9a131d1cecbfdb3cd00c248131a8.tar.gz wireguard-linux-trimmed-71a7269d778f9a131d1cecbfdb3cd00c248131a8.zip |
wireguard: split CRYPTED/UNCRYPTED into {EN,DE}CRYPTED/NOT_{EN,DE}CRYPTED
By splitting the enum into all possibilities, rather than having the
{EN,DE} prefix being implicit based on context, it allows us to later
merge processing of encryption and decryption into the same context.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | drivers/net/wireguard/queueing.h | 11 | ||||
-rw-r--r-- | drivers/net/wireguard/receive.c | 7 | ||||
-rw-r--r-- | drivers/net/wireguard/send.c | 7 | ||||
-rw-r--r-- | drivers/net/wireguard/symmetric.c | 4 |
4 files changed, 17 insertions, 12 deletions
diff --git a/drivers/net/wireguard/queueing.h b/drivers/net/wireguard/queueing.h index 3432232..fb927d7 100644 --- a/drivers/net/wireguard/queueing.h +++ b/drivers/net/wireguard/queueing.h @@ -49,8 +49,10 @@ void wg_packet_tx_worker(struct work_struct *work); void wg_packet_encrypt_worker(struct work_struct *work); enum packet_state { - PACKET_STATE_UNCRYPTED, - PACKET_STATE_CRYPTED, + PACKET_STATE_NOT_ENCRYPTED, + PACKET_STATE_NOT_DECRYPTED, + PACKET_STATE_ENCRYPTED, + PACKET_STATE_DECRYPTED, PACKET_STATE_DEAD }; @@ -144,11 +146,12 @@ static inline int wg_cpumask_next_online(int *next) static inline int wg_queue_enqueue_per_device_and_peer( struct crypt_queue *device_queue, struct crypt_queue *peer_queue, - struct sk_buff *skb, struct workqueue_struct *wq, int *next_cpu) + struct sk_buff *skb, struct workqueue_struct *wq, int *next_cpu, + enum packet_state state) { int cpu; - atomic_set_release(&PACKET_CB(skb)->state, PACKET_STATE_UNCRYPTED); + atomic_set_release(&PACKET_CB(skb)->state, state); /* We first queue this up for the peer ingestion, but the consumer * will wait for the state to change to CRYPTED or DEAD before. */ diff --git a/drivers/net/wireguard/receive.c b/drivers/net/wireguard/receive.c index 4daa1b7..dd80650 100644 --- a/drivers/net/wireguard/receive.c +++ b/drivers/net/wireguard/receive.c @@ -414,13 +414,13 @@ int wg_packet_rx_poll(struct napi_struct *napi, int budget) while ((skb = __ptr_ring_peek(&queue->ring)) != NULL && (state = atomic_read_acquire(&PACKET_CB(skb)->state)) != - PACKET_STATE_UNCRYPTED) { + PACKET_STATE_NOT_DECRYPTED) { __ptr_ring_discard_one(&queue->ring); peer = PACKET_PEER(skb); keypair = PACKET_CB(skb)->keypair; free = true; - if (unlikely(state != PACKET_STATE_CRYPTED)) + if (unlikely(state != PACKET_STATE_DECRYPTED)) goto next; if (unlikely(!counter_validate(&keypair->receiving.counter, @@ -475,7 +475,8 @@ static void wg_packet_consume_data(struct wg_device *wg, struct sk_buff *skb) ret = wg_queue_enqueue_per_device_and_peer(&wg->decrypt_queue, &peer->rx_queue, skb, wg->packet_crypt_wq, - &wg->decrypt_queue.last_cpu); + &wg->decrypt_queue.last_cpu, + PACKET_STATE_NOT_DECRYPTED); if (unlikely(ret == -EPIPE)) wg_queue_enqueue_per_peer_napi(skb, PACKET_STATE_DEAD); if (likely(!ret || ret == -EPIPE)) { diff --git a/drivers/net/wireguard/send.c b/drivers/net/wireguard/send.c index df07092..c7d5c36 100644 --- a/drivers/net/wireguard/send.c +++ b/drivers/net/wireguard/send.c @@ -194,12 +194,12 @@ void wg_packet_tx_worker(struct work_struct *work) while ((first = __ptr_ring_peek(&queue->ring)) != NULL && (state = atomic_read_acquire(&PACKET_CB(first)->state)) != - PACKET_STATE_UNCRYPTED) { + PACKET_STATE_NOT_ENCRYPTED) { __ptr_ring_discard_one(&queue->ring); peer = PACKET_PEER(first); keypair = PACKET_CB(first)->keypair; - if (likely(state == PACKET_STATE_CRYPTED)) + if (likely(state == PACKET_STATE_ENCRYPTED)) wg_packet_create_data_done(first, peer); else kfree_skb_list(first); @@ -222,7 +222,8 @@ static void wg_packet_create_data(struct sk_buff *first) ret = wg_queue_enqueue_per_device_and_peer(&wg->encrypt_queue, &peer->tx_queue, first, wg->packet_crypt_wq, - &wg->encrypt_queue.last_cpu); + &wg->encrypt_queue.last_cpu, + PACKET_STATE_NOT_ENCRYPTED); if (unlikely(ret == -EPIPE)) wg_queue_enqueue_per_peer(&peer->tx_queue, first, PACKET_STATE_DEAD); diff --git a/drivers/net/wireguard/symmetric.c b/drivers/net/wireguard/symmetric.c index be81ba5..6e16fec 100644 --- a/drivers/net/wireguard/symmetric.c +++ b/drivers/net/wireguard/symmetric.c @@ -141,7 +141,7 @@ void wg_packet_encrypt_worker(struct work_struct *work) struct sk_buff *first, *skb, *next; while ((first = ptr_ring_consume_bh(&queue->ring)) != NULL) { - enum packet_state state = PACKET_STATE_CRYPTED; + enum packet_state state = PACKET_STATE_ENCRYPTED; skb_list_walk_safe(first, skb, next) { if (likely(encrypt_packet(skb, @@ -166,7 +166,7 @@ void wg_packet_decrypt_worker(struct work_struct *work) while ((skb = ptr_ring_consume_bh(&queue->ring)) != NULL) { enum packet_state state = likely(decrypt_packet(skb, &PACKET_CB(skb)->keypair->receiving)) ? - PACKET_STATE_CRYPTED : PACKET_STATE_DEAD; + PACKET_STATE_DECRYPTED : PACKET_STATE_DEAD; wg_queue_enqueue_per_peer_napi(skb, state); } } |