idofront / PacketBuilder

MIT License
1 stars 0 forks source link

UDP Checksum を計算する関数を提供する #14

Open idofront opened 2 months ago

idofront commented 2 months ago

copilot より

#include <cstdint>
#include <Packet/Udp.hpp>
#include <Packet/Binary.hpp>

namespace Packet {

uint16_t CalculateUdpChecksum(UdpPtr udp) {
    if (!udp) {
        throw std::invalid_argument("udp instance is null");
    }

    // Assuming udp has a method to get the binary stack
    auto binary = std::dynamic_pointer_cast<Binary>(udp->GetStack());
    if (!binary) {
        throw std::invalid_argument("binary stack is null");
    }

    // Retrieve the UDP header and payload
    const uint8_t* data = binary->Data();
    size_t length = binary->Size();

    // Calculate checksum
    uint32_t sum = 0;
    for (size_t i = 0; i < length; i += 2) {
        uint16_t word = data[i] << 8;
        if (i + 1 < length) {
            word |= data[i + 1];
        }
        sum += word;
    }

    // Add carry
    while (sum >> 16) {
        sum = (sum & 0xFFFF) + (sum >> 16);
    }

    // One's complement
    return ~sum;
}

}

big-endian で返る。