force windivert to recalc IP checksum

pull/2076/head
Thomas Winget 2 years ago
parent 133cee0fd9
commit 5238c3f1a0

@ -23,6 +23,7 @@ namespace llarp::win32
decltype(::WinDivertOpen)* open = nullptr;
decltype(::WinDivertClose)* close = nullptr;
decltype(::WinDivertShutdown)* shutdown = nullptr;
decltype(::WinDivertHelperCalcChecksums)* calc_checksum = nullptr;
decltype(::WinDivertSend)* send = nullptr;
decltype(::WinDivertRecv)* recv = nullptr;
decltype(::WinDivertHelperFormatIPv4Address)* format_ip4 = nullptr;
@ -41,6 +42,7 @@ namespace llarp::win32
"WinDivertOpen", open,
"WinDivertClose", close,
"WinDivertShutdown", shutdown,
"WinDivertHelperCalcChecksums", calc_checksum,
"WinDivertSend", send,
"WinDivertRecv", recv,
"WinDivertHelperFormatIPv4Address", format_ip4,
@ -199,14 +201,18 @@ namespace llarp::win32
}
void
send_packet(const Packet& w_pkt) const
send_packet(Packet&& w_pkt) const
{
const auto& pkt = w_pkt.pkt;
const auto* addr = &w_pkt.addr;
auto& pkt = w_pkt.pkt;
auto* addr = &w_pkt.addr;
log::trace(logcat, "send dns packet of size {}B", pkt.size());
log_windivert_addr(w_pkt.addr);
UINT sz{};
// recalc IP packet checksum in case it needs it
wd::calc_checksum(pkt.data(), pkt.size(), addr, 0);
if (!wd::send(m_Handle, pkt.data(), pkt.size(), &sz, addr))
throw win32::error{"windivert send failed"};
}

Loading…
Cancel
Save