import struct


def calc_checksum(data):
    """
    Calcula o checksum complemento-de-um (formato do TCP e do UDP) para os
    dados fornecidos.
    """
    if len(data) % 2 == 1:
        # se for ímpar, faz padding à direita
        data += b'\x00'
    checksum = 0
    for i in range(0, len(data), 2):
        x, = struct.unpack('!H', data[i:i+2])
        checksum += x
        while checksum > 0xffff:
            checksum = (checksum & 0xffff) + 1
    checksum = ~checksum
    return checksum & 0xffff