aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2020-04-22 02:04:22 -0600
committerJason A. Donenfeld <Jason@zx2c4.com>2020-04-22 02:04:22 -0600
commit5ac387260b81e1b8b4ed00cc9de0c14ec403d8b0 (patch)
tree6b8ef9201cda4b7b34f85c983d808f5996b93f9f
parentwireguard: move symmetric crypto into standalone file (diff)
downloadwireguard-linux-5ac387260b81e1b8b4ed00cc9de0c14ec403d8b0.tar.xz
wireguard-linux-5ac387260b81e1b8b4ed00cc9de0c14ec403d8b0.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.h11
-rw-r--r--drivers/net/wireguard/receive.c7
-rw-r--r--drivers/net/wireguard/send.c7
-rw-r--r--drivers/net/wireguard/symmetric.c4
4 files changed, 17 insertions, 12 deletions
diff --git a/drivers/net/wireguard/queueing.h b/drivers/net/wireguard/queueing.h
index 3432232afe06..fb927d76b80a 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 4daa1b7d6b50..dd80650abb94 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 df070928d569..c7d5c3643403 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 be81ba5c882e..6e16fec7c25e 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);
}
}