ud3tn/include/bundle7/bundle7.h
Felix Walter 5660d27471 bundle7: Add flag to validate if there is no BIB and no primary CRC
See: #267

This adds a compile-time flag to reject such bundles, if needed.

Making this part of the validation routines all the time breaks our
interoperability with DTN7 (at least in the configuration we are using
in our interop. test).

Note that we cannot currently check the security targets, which is an
unordered CBOR array part of the BIB payload data. Thus, bundles without
CRC and with a BIB targeting *any* block, even if this excludes the
primary block, will be accepted when the option is turned on. See
follow-up issue #273.

Signed-off-by: Felix Walter <felix.walter@d3tn.com>
2026-03-19 18:58:07 +01:00

80 lines
2.3 KiB
C

// SPDX-License-Identifier: BSD-3-Clause OR Apache-2.0
#ifndef BUNDLE_V7_BUNDLE7_H_INCLUDED
#define BUNDLE_V7_BUNDLE7_H_INCLUDED
#include "ud3tn/bundle.h"
#include "ud3tn/eid.h"
#include "ud3tn/result.h"
#include <inttypes.h>
#include <stdbool.h>
#include <stddef.h>
// Default CRC type, see enum bundle_crc_type in bundle.h.
#ifndef DEFAULT_BPV7_CRC_TYPE
#define DEFAULT_BPV7_CRC_TYPE BUNDLE_CRC_TYPE_16
#endif // DEFAULT_CRC_TYPE
#ifndef BUNDLE7_ALLOW_NO_PRIMARY_CRC_NO_BIB
#define BUNDLE7_ALLOW_NO_PRIMARY_CRC_NO_BIB 1
#endif // BUNDLE7_ALLOW_NO_PRIMARY_CRC_NO_BIB
/**
* Perform basic validation of the provided bundle.
*
* This function asserts basic properties that are specified as mandatory by RFC 9171 and are
* not already asserted by the parser or bundle-creation functions provided in this component.
*/
bool bundle7_is_valid(const struct bundle *bundle);
/**
* Returns the number of bytes that will be required for the CBORepresentation
* of the passed unsigned integer.
*/
size_t bundle7_cbor_uint_sizeof(uint64_t num);
/**
* Returns the number of bytes that will be required for the CBORepresentation
* of the passed EID.
*/
size_t bundle7_eid_sizeof(const struct eid eid);
/**
* Returns the byte-length of the CBORepresentation of an extension block.
*/
size_t bundle7_block_get_size(struct bundle_block *block);
size_t bundle7_get_serialized_size(struct bundle *bundle);
size_t bundle7_get_serialized_size_without_payload(struct bundle *bundle);
/**
* Recalculates the length of the primary block stored in the
* "primary_block_length" field. You should call this function if you change
* something in the primary block.
*/
void bundle7_recalculate_primary_block_length(struct bundle *bundle);
/**
* Returns the minimal number of serialized bytes of the first fragment of the
* given bundle.
*
* The minimal fragment contains:
*
* - all extension blocks
* - minimal header for the payload block
*/
size_t bundle7_get_first_fragment_min_size(struct bundle *bundle);
/**
* Returns the minimal number of serialized bytes of the last fragment of the
* given bundle.
*
* The minimal fragment contains:
*
* - all extension blocks containing the "replicated in every fragment" flag
* - minimal header for the payload block
*/
size_t bundle7_get_last_fragment_min_size(struct bundle *bundle);
#endif // BUNDLE_V7_BUNDLE7_H_INCLUDED