diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-08-06 14:04:11 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-08-08 22:57:27 +0200 |
commit | d42fbe8c7ed613aceba3076b7e59a81d5388b58f (patch) | |
tree | d26b2b0197d3aebd81c31e81e076498257e576be /driver | |
parent | driver: logging: pass timestamp back to userspace (diff) | |
download | wireguard-nt-d42fbe8c7ed613aceba3076b7e59a81d5388b58f.tar.xz wireguard-nt-d42fbe8c7ed613aceba3076b7e59a81d5388b58f.zip |
driver: socket: allow loop routing
You can still create loops, but ever since we started making copies on
both RX and TX, and freeing TX buffers really early (after encryption),
we no longer have a stack chaining issue on free.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'driver')
-rw-r--r-- | driver/send.c | 6 | ||||
-rw-r--r-- | driver/socket.c | 16 |
2 files changed, 2 insertions, 20 deletions
diff --git a/driver/send.c b/driver/send.c index c712885..9fabf7f 100644 --- a/driver/send.c +++ b/driver/send.c @@ -336,14 +336,11 @@ PacketEncryptWorker(MULTICORE_WORKQUEUE *WorkQueue) { for (NET_BUFFER *NbIn = NET_BUFFER_LIST_FIRST_NB(Nbl->ParentNetBufferList), *NbOut = NET_BUFFER_LIST_FIRST_NB(Nbl); - NbIn && NbOut; + NbIn && NbOut && State == PACKET_STATE_CRYPTED; NbIn = NET_BUFFER_NEXT_NB(NbIn), NbOut = NET_BUFFER_NEXT_NB(NbOut)) { if (!EncryptPacket(&Simd, NbOut, NbIn, Keypair, Mtu)) - { State = PACKET_STATE_DEAD; - goto enqueue; - } } if (Nbl != Nbl->ParentNetBufferList) { @@ -351,7 +348,6 @@ PacketEncryptWorker(MULTICORE_WORKQUEUE *WorkQueue) Nbl->ParentNetBufferList = Nbl; } } - enqueue: _Analysis_assume_(First != NULL); QueueEnqueuePerPeer(&Peer->Device->TxQueue, &Peer->TxSerialEntry, First, State); ProcessPerPeerWork(&Wg->TxQueue); diff --git a/driver/socket.c b/driver/socket.c index 64d26f3..cdb0bba 100644 --- a/driver/socket.c +++ b/driver/socket.c @@ -285,21 +285,7 @@ retry: BestLuid = Table->Table[i].InterfaceLuid; } MemFree(If); - /* We disable wg-loop routing for now, to prevent stack overflow. TODO: revisit later. */ - Status = STATUS_SUCCESS; - MuAcquirePushLockShared(&DeviceListLock); - WG_DEVICE *Wg; - LIST_FOR_EACH_ENTRY (Wg, &DeviceList, WG_DEVICE, DeviceList) - { - if (Wg->InterfaceLuid.Value == BestLuid.Value) - { - LogInfoRatelimited(Peer->Device, "Dropping packet that would egress via interface %u", Wg->InterfaceIndex); - Status = STATUS_RECURSIVE_DISPATCH; - break; - } - } - MuReleasePushLockShared(&DeviceListLock); - if (NT_SUCCESS(Status) && Table->NumEntries && BestIndex) + if (Table->NumEntries && BestIndex) Status = GetBestRoute2(NULL, BestIndex, NULL, &Endpoint->Addr, 0, &Table->Table[0], &SrcAddr); FreeMibTable(Table); if (!NT_SUCCESS(Status)) |