aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/net/wireguard/symmetric.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireguard/symmetric.c')
-rw-r--r--drivers/net/wireguard/symmetric.c51
1 files changed, 24 insertions, 27 deletions
diff --git a/drivers/net/wireguard/symmetric.c b/drivers/net/wireguard/symmetric.c
index 6e16fec7c25e..a1fd39452821 100644
--- a/drivers/net/wireguard/symmetric.c
+++ b/drivers/net/wireguard/symmetric.c
@@ -134,40 +134,37 @@ static bool decrypt_packet(struct sk_buff *skb, struct noise_symmetric_key *key)
return true;
}
-void wg_packet_encrypt_worker(struct work_struct *work)
+void wg_packet_crypt_worker(struct work_struct *work)
{
struct crypt_queue *queue = container_of(work, struct multicore_worker,
work)->ptr;
struct sk_buff *first, *skb, *next;
while ((first = ptr_ring_consume_bh(&queue->ring)) != NULL) {
- enum packet_state state = PACKET_STATE_ENCRYPTED;
-
- skb_list_walk_safe(first, skb, next) {
- if (likely(encrypt_packet(skb,
- PACKET_CB(first)->keypair))) {
- wg_reset_packet(skb);
- } else {
- state = PACKET_STATE_DEAD;
- break;
+ switch (atomic_read_acquire(&PACKET_CB(first)->state)) {
+ case PACKET_STATE_NOT_ENCRYPTED: {
+ enum packet_state state = PACKET_STATE_ENCRYPTED;
+
+ skb_list_walk_safe(first, skb, next) {
+ if (likely(encrypt_packet(skb,
+ PACKET_CB(first)->keypair))) {
+ wg_reset_packet(skb);
+ } else {
+ state = PACKET_STATE_DEAD;
+ break;
+ }
}
+ wg_queue_enqueue_per_peer(&PACKET_PEER(first)->tx_queue,
+ first, state);
+ break;
+ }
+ case PACKET_STATE_NOT_DECRYPTED: {
+ enum packet_state state = likely(decrypt_packet(first,
+ &PACKET_CB(first)->keypair->receiving)) ?
+ PACKET_STATE_DECRYPTED : PACKET_STATE_DEAD;
+ wg_queue_enqueue_per_peer_napi(first, state);
+ break;
+ }
}
- wg_queue_enqueue_per_peer(&PACKET_PEER(first)->tx_queue, first,
- state);
- }
-}
-
-void wg_packet_decrypt_worker(struct work_struct *work)
-{
- struct crypt_queue *queue = container_of(work, struct multicore_worker,
- work)->ptr;
- struct sk_buff *skb;
-
- while ((skb = ptr_ring_consume_bh(&queue->ring)) != NULL) {
- enum packet_state state = likely(decrypt_packet(skb,
- &PACKET_CB(skb)->keypair->receiving)) ?
- PACKET_STATE_DECRYPTED : PACKET_STATE_DEAD;
- wg_queue_enqueue_per_peer_napi(skb, state);
}
}
-