UDP headers and checksum

UDP headers

Headers for computing checksum

The checksum computation is similar to the Internet checksum computation.

#include <bits/stdc++.h>
#define DBG(x) cerr << #x << " = " << x << endl

using namespace std;
typedef long long LL;

unsigned short checksum(const vector<unsigned short> &v) {
    unsigned int sum = 0;
    for (int i = 0; i < v.size(); i++) {
        sum += v[i];
    }
    while (sum > 0xFFFF) {
        sum = (sum & 0xFFFF) + (sum >> 16);
    }
    return ~sum;
}

int main(int argc, char **argv) {
    vector<unsigned short> vec{
            // UDP pseudo-header
            0x0a01, 0xbf44, // source IP address
            0x0a02, 0x0002, // destination IP address
            0x0011 /* 1 byte zero and 1 byte protocol number */, 0x0023, // UDP length

            // UDP header
            0xc183, 0x0035, // source port number and destination port number
            0x0000, 0x0023, // checksum and UDP length

            // data
            0x06b0, 0x0100,
            0x0001, 0x0000,
            0x0000, 0x0000,
            0x0562, 0x6169,
            0x6475, 0x0363,
            0x6f6d, 0x0000,
            0x0100, 0x0100, // the length of this UDP packet is odd and the last short is 0x01, so we should pad 1 byte zero.

    };
    unsigned short sum = checksum(vec);

    printf("checksum = 0x%X\n", sum);
    assert(sum == 0x22E4);

    vec[8] = sum;

    sum = checksum(vec);
    assert(sum == 0);
    printf("0x%X\n", sum);

    return 0;
}
posted @ 2020-04-27 14:03  ToRapture  阅读(319)  评论(0编辑  收藏  举报