aboutsummaryrefslogtreecommitdiffstats
path: root/driver
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-08-06 14:04:11 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2021-08-08 22:57:27 +0200
commitd42fbe8c7ed613aceba3076b7e59a81d5388b58f (patch)
treed26b2b0197d3aebd81c31e81e076498257e576be /driver
parentdriver: logging: pass timestamp back to userspace (diff)
downloadwireguard-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.c6
-rw-r--r--driver/socket.c16
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))