A child dbuff operates on a portion of the buffer, starting where the
parent left off. The creator can control two things about the child:
-* The space available to the child (`FR_DBUFF_MAX()` gives a child
+* The space available to the child (`FR_DBUFF_MAX_BIND_CURRENT()` gives a child
dbuff with no more than a specified number of bytes available).
* Whether the child's advances propagate up to its parents
- (`FR_DBUFF_NO_ADVANCE()` gives a child dbuff whose advances don't
+ (`FR_DBUFF()` gives a child dbuff whose advances don't
propagate).
[IMPORTANT]
====
-`FR_DBUFF_MAX()` cannot fail. It is like an ad promising "up to one
+`FR_DBUFF_MAX_BIND_CURRENT()` cannot fail. It is like an ad promising "up to one
million dollars!" where "up to" includes zero, so the child may have
less space than the specified maximum.
====
-`FR_DBUFF_MAX()` typically shows up when a caller limits a callee to
-what will fit in a TLV in some context. `FR_DBUFF_NO_ADVANCE()` came
+`FR_DBUFF_MAX_BIND_CURRENT()` typically shows up when a caller limits a callee to
+what will fit in a TLV in some context. `FR_DBUFF()` came
into existence to let an encoding function write a header and then
take it back if it proved useless, but it can also be used to let one
fill in a header when a length is finally known, and this schema has
----
ssize_t encode_foo(fr_dbuff_t *dbuff, ...)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
/* encode, operating on work_dbuff, returning on error */
{
fr_aka_sim_ctx_t *packet_ctx = encode_ctx;
uint32_t iv[4];
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
/*
* One IV per packet
uint8_t const *in, size_t inlen, void *encode_ctx)
{
size_t total_len, pad_len, encr_len, len = 0;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
uint8_t *encr = NULL;
fr_aka_sim_ctx_t *packet_ctx = encode_ctx;
EVP_CIPHER_CTX *evp_ctx;
fr_da_stack_t *da_stack, int depth,
fr_dcursor_t *cursor, void *encode_ctx)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_pair_t const *vp = fr_dcursor_current(cursor);
fr_dict_attr_t const *da = da_stack->da[depth];
fr_aka_sim_ctx_t *packet_ctx = encode_ctx;
size_t pad_len;
size_t element_len;
size_t actual_len;
- fr_dbuff_t len_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t len_dbuff = FR_DBUFF(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dict_attr_t const *da = da_stack->da[depth];
fr_assert(da->flags.array);
size_t pad_len;
fr_dict_attr_t const *da;
ssize_t slen;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
- fr_dbuff_t hdr_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
+ fr_dbuff_t hdr_dbuff = FR_DBUFF(dbuff);
FR_PROTO_STACK_PRINT(da_stack, depth);
fr_dbuff_advance(&work_dbuff, 2);
if (da->flags.array) {
- slen = encode_array(&FR_DBUFF_MAX(&work_dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN - 2),
+ slen = encode_array(&FR_DBUFF_MAX_BIND_CURRENT(&work_dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN - 2),
da_stack, depth, cursor, encode_ctx);
} else {
- slen = encode_value(&FR_DBUFF_MAX(&work_dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN - 2),
+ slen = encode_value(&FR_DBUFF_MAX_BIND_CURRENT(&work_dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN - 2),
da_stack, depth, cursor, encode_ctx);
}
if (slen <= 0) return slen;
fr_dcursor_t *cursor, void *encode_ctx)
{
ssize_t slen;
- fr_dbuff_t work_dbuff = FR_DBUFF_MAX_NO_ADVANCE(dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN);
+ fr_dbuff_t work_dbuff = FR_DBUFF_MAX(dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN);
fr_dbuff_t value_dbuff;
fr_dbuff_marker_t value_start;
fr_pair_t const *vp = fr_dcursor_current(cursor);
FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, 0x00, 0x00);
- value_dbuff = FR_DBUFF_NO_ADVANCE(&work_dbuff);
+ value_dbuff = FR_DBUFF(&work_dbuff);
fr_dbuff_marker(&value_start, &value_dbuff);
for (;;) {
ssize_t len;
fr_dict_attr_t const *da;
fr_dbuff_t tl_dbuff;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
VP_VERIFY(fr_dcursor_current(cursor));
FR_PROTO_STACK_PRINT(da_stack, depth);
len = encode_iv(&work_dbuff, encode_ctx);
if (len < 0) return len;
}
- tl_dbuff = FR_DBUFF_NO_ADVANCE(&work_dbuff);
+ tl_dbuff = FR_DBUFF(&work_dbuff);
FR_DBUFF_EXTEND_LOWAT_OR_RETURN(&work_dbuff, 2);
fr_dbuff_advance(&work_dbuff, 2);
da = da_stack->da[depth];
- len = encode_tlv_internal(&FR_DBUFF_MAX(&work_dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN - 2),
+ len = encode_tlv_internal(&FR_DBUFF_MAX_BIND_CURRENT(&work_dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN - 2),
da_stack, depth, cursor, encode_ctx);
if (len <= 0) return len;
ssize_t fr_aka_sim_encode_pair(fr_dbuff_t *dbuff, fr_dcursor_t *cursor, void *encode_ctx)
{
fr_pair_t const *vp;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_marker_t m;
ssize_t slen;
da_stack.da[1] = NULL;
da_stack.depth = 1;
FR_PROTO_STACK_PRINT(&da_stack, 0);
- return encode_rfc_hdr(&FR_DBUFF_MAX(dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN + 2),
+ return encode_rfc_hdr(&FR_DBUFF_MAX_BIND_CURRENT(dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN + 2),
&da_stack, 0, cursor, encode_ctx);
}
* Supported types
*/
default:
- slen = encode_rfc_hdr(&FR_DBUFF_MAX(&work_dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN + 2),
+ slen = encode_rfc_hdr(&FR_DBUFF_MAX_BIND_CURRENT(&work_dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN + 2),
&da_stack, 0, cursor, encode_ctx);
if (slen < 0) return slen;
break;
case FR_TYPE_TLV:
- slen = encode_tlv_hdr(&FR_DBUFF_MAX(&work_dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN + 2),
+ slen = encode_tlv_hdr(&FR_DBUFF_MAX_BIND_CURRENT(&work_dbuff, SIM_MAX_ATTRIBUTE_VALUE_LEN + 2),
&da_stack, 0, cursor, encode_ctx);
if (slen < 0) return slen;
break;
ssize_t fr_base16_encode_nstd(fr_sbuff_t *out, fr_dbuff_t *in, char const alphabet[static UINT8_MAX])
{
fr_sbuff_t our_out = FR_SBUFF_NO_ADVANCE(out);
- fr_dbuff_t our_in = FR_DBUFF_NO_ADVANCE(in);
+ fr_dbuff_t our_in = FR_DBUFF(in);
while (fr_dbuff_extend(&our_in)) {
uint8_t a = *fr_dbuff_current(&our_in);
bool no_trailing, uint8_t const alphabet[static UINT8_MAX])
{
fr_sbuff_t our_in = FR_SBUFF_NO_ADVANCE(in);
- fr_dbuff_t our_out = FR_DBUFF_NO_ADVANCE(out);
+ fr_dbuff_t our_out = FR_DBUFF(out);
while (fr_sbuff_extend_lowat(NULL, &our_in, 2) >= 2) {
char *p = fr_sbuff_current(&our_in);
bool add_padding, char const alphabet[static UINT8_MAX])
{
fr_sbuff_t our_out = FR_SBUFF_NO_ADVANCE(out);
- fr_dbuff_t our_in = FR_DBUFF_NO_ADVANCE(in);
+ fr_dbuff_t our_in = FR_DBUFF(in);
fr_strerror_const("Insufficient buffer space");
bool expect_padding, bool no_trailing, uint8_t const alphabet[static UINT8_MAX])
{
fr_sbuff_t our_in = FR_SBUFF_NO_ADVANCE(in);
- fr_dbuff_t our_out = FR_DBUFF_NO_ADVANCE(out);
+ fr_dbuff_t our_out = FR_DBUFF(out);
fr_sbuff_marker_t m_final;
size_t len;
uint8_t pad;
bool add_padding, char const alphabet[static UINT8_MAX])
{
fr_sbuff_t our_out = FR_SBUFF_NO_ADVANCE(out);
- fr_dbuff_t our_in = FR_DBUFF_NO_ADVANCE(in);
+ fr_dbuff_t our_in = FR_DBUFF(in);
fr_strerror_const("Insufficient buffer space");
bool expect_padding, bool no_trailing, uint8_t const alphabet[static UINT8_MAX])
{
fr_sbuff_t our_in = FR_SBUFF_NO_ADVANCE(in);
- fr_dbuff_t our_out = FR_DBUFF_NO_ADVANCE(out);
+ fr_dbuff_t our_out = FR_DBUFF(out);
fr_sbuff_marker_t m_final;
uint8_t pad;
* dbuffs are intended to be organised into hierarchies, with one dbuff per stack
* frame, initialised from a parent in a higher stack frame.
*
- * Each time a dbuff is copied (using one of the provided FR_DBUFF_COPY_* macros),
+ * Each time a dbuff is copied (using one of the provided FR_DBUFF_BIND_CURRENT_* macros),
* the copy's 'start' position is updated to be the 'current' position of its
* parent. This ensures length macros report only spaced used/available in the
* new dbuff and not its parent.
fr_dbuff_t *parent; //!< Owner of the marker.
};
+#define FR_DBUFF_ADV_PARENT_CURRENT 0x01 //!< Advance current position of parent.
+ //!< Useful for nested encoders/decoders.
+#define FR_DBUFF_ADV_PARENT_END 0x02 //!< Advance end pointer of parent.
+ ///< Useful for producer/consumer
+
/** A dbuff
* @private
*/
uint8_t *p; //!< Mutable 'current' pointer.
};
- uint8_t is_const:1; //!< The buffer this dbuff wraps is const.
- uint8_t adv_parent:1; //!< Whether we advance the parent
+ uint8_t is_const:1; //!< The buffer this dbuff wraps is const.
+ uint8_t adv_parent:2; //!< Whether we advance the parent
///< of this dbuff.
size_t shifted; //!< How many bytes this sbuff has been
*
* @private
*/
-#define _FR_DBUFF_COPY(_dbuff_or_marker, _start, _adv_parent) \
+#define _FR_DBUFF(_dbuff_or_marker, _start, _adv_parent) \
((fr_dbuff_t){ \
.buff = fr_dbuff_buff(_dbuff_or_marker), \
.start = (_start), \
})
/* @endcond */
-/** Prevent an dbuff being advanced by operations on its child
+/** Create a new dbuff pointing to the same underlying buffer
*
- * @private
+ * - Parent will _NOT_ be advanced by operations on its child.
+ * - Child will have its `start` pointer set to the `p` pointer of the parent.
*
* @param[in] _dbuff_or_marker to make an ephemeral copy of.
*/
-#define FR_DBUFF_NO_ADVANCE(_dbuff_or_marker) _FR_DBUFF_COPY(_dbuff_or_marker, fr_dbuff_current(_dbuff_or_marker), false)
+#define FR_DBUFF(_dbuff_or_marker) _FR_DBUFF(_dbuff_or_marker, fr_dbuff_current(_dbuff_or_marker), 0x00)
-/** Prevent an dbuff being advanced by operations on its child
+/** Create a new dbuff pointing to the same underlying buffer
*
- * Does not change the start pointer of the new dbuff.
+ * - Parent will _NOT_ be advanced by operations on its child.
+ * - Child will have its `start` pointer set to the `start` pointer of the parent.
*
* @param[in] _dbuff_or_marker to make an ephemeral copy of.
*/
-#define FR_DBUFF_NO_ADVANCE_ABS(_dbuff_or_marker) _FR_DBUFF_COPY(_dbuff_or_marker, fr_dbuff_start(_dbuff_or_marker), false)
+#define FR_DBUFF_ABS(_dbuff_or_marker) _FR_DBUFF(_dbuff_or_marker, fr_dbuff_start(_dbuff_or_marker), 0x00)
-/** Let the dbuff be advanced by operations on its child
+/** Create a new dbuff pointing to the same underlying buffer
+ *
+ * - Parent `p` pointer will be advanced with child's `p` pointer.
+ * - Child will have its `start` pointer set to the `p` pointer of the parent.
*
* @param[in] _dbuff_or_marker to make an ephemeral copy of.
*/
-#define FR_DBUFF_COPY(_dbuff_or_marker) _FR_DBUFF_COPY(_dbuff_or_marker, fr_dbuff_current(_dbuff_or_marker), true)
+#define FR_DBUFF_BIND_CURRENT(_dbuff_or_marker) _FR_DBUFF(_dbuff_or_marker, fr_dbuff_current(_dbuff_or_marker), FR_DBUFF_ADV_PARENT_CURRENT)
-/** Let the dbuff be advanced by operations on its child
+/** Create a new dbuff pointing to the same underlying buffer
+ *
+ * - Parent `p` pointer will be advanced with child's `p` pointer.
+ * - Child will have its `start` pointer set to the `start` pointer of the parent.
+ *
+ * @param[in] _dbuff_or_marker to make an ephemeral copy of.
+ */
+#define FR_DBUFF_BIND_CURRENT_ABS(_dbuff_or_marker) FR_DBUFF_ABS(_dbuff_or_marker, fr_dbuff_start(_dbuff_or_marker), FR_DBUFF_ADV_PARENT_CURRENT)
+
+/** Create a new dbuff pointing to the same underlying buffer
+ *
+ * This is used to create the producer of a producer/consumer pairs of dbuffs.
*
- * Does not change the start pointer of the new dbuff.
+ * - Parent `end` pointer will be advanced with child's `p` pointer.
+ * - Child will have its `start` pointer set to the `start` pointer of the parent.
*
* @param[in] _dbuff_or_marker to make an ephemeral copy of.
*/
-#define FR_DBUFF_COPY_ABS(_dbuff_or_marker) _FR_DBUFF_COPY_ABS(_dbuff_or_marker, fr_dbuff_start(_dbuff_or_marker), true)
+#define FR_DBUFF_BIND_END_ABS(_dbuff_or_marker) _FR_DBUFF(_dbuff_or_marker, fr_dbuff_start(_dbuff_or_marker), FR_DBUFF_ADV_PARENT_END)
/** @cond */
-/** Limit available bytes in the dbufft to _max when passing it to another function
+/** Limit available bytes in the dbuff to _max when passing it to another function
*
* @private
*/
/** Limit the maximum number of bytes available in the dbuff when passing it to another function
*
@code{.c}
- my_child_encoder(&FR_DBUFF_MAX(dbuff, 253), vp);
+ fr_dbuff_t tlv = FR_DBUFF_MAX(dbuff, UINT8_MAX);
+
+ if (my_child_encoder(&tlv, vp) < 0) return -1;
+
+ return fr_dbuff_advance(dbuff, fr_dbuff_used(tlv))
@endcode
*
* @note Do not use to re-initialise the contents of _dbuff, i.e. to
* @param[in] _dbuff_or_marker to reserve bytes in.
* @param[in] _max The maximum number of bytes the caller is allowed to write to.
*/
-#define FR_DBUFF_MAX(_dbuff_or_marker, _max) _FR_DBUFF_MAX(_dbuff_or_marker, _max, true)
+#define FR_DBUFF_MAX(_dbuff_or_marker, _max) _FR_DBUFF_MAX(_dbuff_or_marker, _max, 0x00)
/** Limit the maximum number of bytes available in the dbuff when passing it to another function
*
@code{.c}
- fr_dbuff_t tlv = FR_DBUFF_MAX_NO_ADVANCE(dbuff, UINT8_MAX);
-
- if (my_child_encoder(&tlv, vp) < 0) return -1;
-
- return fr_dbuff_advance(dbuff, fr_dbuff_used(tlv))
+ my_child_encoder(&FR_DBUFF_MAX_BIND_CURRENT(dbuff, 253), vp);
@endcode
*
* @note Do not use to re-initialise the contents of _dbuff, i.e. to
* @param[in] _dbuff_or_marker to reserve bytes in.
* @param[in] _max The maximum number of bytes the caller is allowed to write to.
*/
-#define FR_DBUFF_MAX_NO_ADVANCE(_dbuff_or_marker, _max) _FR_DBUFF_MAX(_dbuff_or_marker, _max, false)
+#define FR_DBUFF_MAX_BIND_CURRENT(_dbuff_or_marker, _max) _FR_DBUFF_MAX(_dbuff_or_marker, _max, FR_DBUFF_ADV_PARENT_CURRENT)
/** Does the actual work of initialising a dbuff
* @private
/** Set a new 'current' position in a dbuff or marker
* @private
*/
-static inline void _fr_dbuff_set_recurse(fr_dbuff_t *dbuff, uint8_t const *p)
+static inline void _fr_dbuff_set_recurse(fr_dbuff_t *dbuff, uint8_t adv_parent_flags, uint8_t const *p)
{
- dbuff->p_i = p;
- if (dbuff->adv_parent && dbuff->parent) _fr_dbuff_set_recurse(dbuff->parent, p);
+ if (adv_parent_flags & FR_DBUFF_ADV_PARENT_CURRENT) dbuff->p_i = p;
+ if (adv_parent_flags & FR_DBUFF_ADV_PARENT_END) dbuff->end_i = p;
+
+ if (dbuff->adv_parent && dbuff->parent) _fr_dbuff_set_recurse(dbuff->parent, dbuff->adv_parent, p);
}
/** Set a new 'current' position in a dbuff or marker
if (unlikely(p < dbuff->start)) return 0;
c = *pos_p;
- if (dbuff->adv_parent && dbuff->parent) _fr_dbuff_set_recurse(dbuff->parent, p);
+ if (dbuff->adv_parent && dbuff->parent) _fr_dbuff_set_recurse(dbuff->parent, dbuff->adv_parent, p);
*pos_p = UNCONST(uint8_t *, p);
return p - c;
*pos_p += len;
}
- if (dbuff->adv_parent && dbuff->parent) _fr_dbuff_set_recurse(dbuff->parent, *pos_p);
+ if (dbuff->adv_parent && dbuff->parent) _fr_dbuff_set_recurse(dbuff->parent, dbuff->adv_parent, *pos_p);
return len;
}
int : (size_t)(_len) \
)))
-#define FR_DBUFF_ADVANCE_EXTEND_RETURN(_dbuff_or_marker, _len) FR_DBUFF_RETURN(fr_dbuff_advance_extend, _dbuff_or_marker, _len)
+#define FR_DBUFF_BIND_EXTEND_RETURN(_dbuff_or_marker, _len) FR_DBUFF_RETURN(fr_dbuff_advance_extend, _dbuff_or_marker, _len)
/** Reset the 'current' position of the dbuff or marker to the 'start' of the buffer
*
TEST_CASE("Confirm max constrains available space");
fr_dbuff_init(&dbuff, in, sizeof(in));
- max_dbuff = FR_DBUFF_MAX(&dbuff, 4);
+ max_dbuff = FR_DBUFF_MAX_BIND_CURRENT(&dbuff, 4);
TEST_CHECK(fr_dbuff_remaining(&max_dbuff) == 4);
- max_dbuff = FR_DBUFF_MAX(&dbuff, 2 * sizeof(in));
+ max_dbuff = FR_DBUFF_MAX_BIND_CURRENT(&dbuff, 2 * sizeof(in));
TEST_CHECK(fr_dbuff_remaining(&max_dbuff) == sizeof(in));
}
TEST_CASE("Confirm no-advance dbuff operations don't affect ancestors' position");
fr_dbuff_init(&dbuff, in, sizeof(in));
- no_advance_dbuff = FR_DBUFF_NO_ADVANCE(&dbuff);
+ no_advance_dbuff = FR_DBUFF(&dbuff);
init_remaining = fr_dbuff_remaining(&dbuff);
fr_dbuff_in_bytes(&no_advance_dbuff, 0x11, 0x12, 0x13);
TEST_CHECK(init_remaining == fr_dbuff_remaining(&dbuff));
TEST_CHECK(fr_dbuff_used(&dbuff1) == 0);
TEST_CHECK(fr_dbuff_remaining(&dbuff1) == 0);
- dbuff2 = FR_DBUFF_NO_ADVANCE(&dbuff1);
+ dbuff2 = FR_DBUFF(&dbuff1);
TEST_CASE("Check that dbuff2 inherits extend fields");
TEST_CHECK(dbuff2.extend == dbuff1.extend);
TEST_CHECK(dbuff2.uctx == dbuff1.uctx);
TEST_CHECK(fr_dbuff_used(&dbuff2) == 0);
TEST_CHECK(fr_dbuff_remaining(&dbuff2) == 0);
- dbuff2 = FR_DBUFF_MAX(&dbuff1, 8);
- TEST_CASE("Check that FR_DBUFF_MAX() is not extensible");
+ dbuff2 = FR_DBUFF_MAX_BIND_CURRENT(&dbuff1, 8);
+ TEST_CASE("Check that FR_DBUFF_MAX_BIND_CURRENT() is not extensible");
TEST_CHECK(dbuff2.extend == NULL);
TEST_CHECK(dbuff2.uctx == NULL);
TEST_CHECK(fr_dbuff_used(&dbuff2) == 0);
fr_dcursor_t *parent_cursor, void *encode_ctx,
fr_encode_dbuff_t encode_value, fr_encode_dbuff_t encode_tlv)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
- fr_dbuff_t hdr_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
+ fr_dbuff_t hdr_dbuff = FR_DBUFF(dbuff);
int offset = 0;
unsigned int child_num = 1;
bool do_length = false;
ssize_t fr_value_box_to_network(fr_dbuff_t *dbuff, fr_value_box_t const *value)
{
size_t min, max;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
/*
* Variable length types
bool tainted)
{
size_t min, max;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
min = network_min_size(type);
max = network_max_size(type);
fr_arp_packet_t *arp;
fr_dcursor_t cursor;
fr_da_stack_t da_stack;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
if (fr_pair_list_empty(vps)) {
fr_strerror_const("Cannot encode empty packet");
fr_dcursor_t cursor;
fr_pair_t *vp;
ssize_t len;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
/*
* @todo: Make this work again.
fr_dcursor_t *cursor, UNUSED fr_dhcpv4_ctx_t *encode_ctx)
{
fr_pair_t *vp = fr_dcursor_current(cursor);
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
ssize_t slen;
FR_PROTO_STACK_PRINT(da_stack, depth);
fr_dbuff_marker_t hdr, hdr_io;
fr_dict_attr_t const *da = da_stack->da[depth];
fr_pair_t *vp = fr_dcursor_current(cursor);
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
FR_PROTO_STACK_PRINT(da_stack, depth);
do_child:
fr_dcursor_init(&child_cursor, &vp->vp_group);
- work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ work_dbuff = FR_DBUFF(dbuff);
while ((vp = fr_dcursor_current(&child_cursor)) != NULL) {
fr_proto_da_stack_build(da_stack, vp->da);
fr_dcursor_t *cursor, fr_dhcpv4_ctx_t *encode_ctx)
{
ssize_t len;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_marker_t hdr, next_hdr, dest, hdr_io;
fr_pair_t const *vp = fr_dcursor_current(cursor);
fr_dict_attr_t const *da = da_stack->da[depth];
fr_da_stack_t *da_stack, unsigned int depth,
fr_dcursor_t *cursor, void *encode_ctx)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_MAX_NO_ADVANCE(dbuff, 255 - 4 - 1 - 2);
+ fr_dbuff_t work_dbuff = FR_DBUFF_MAX(dbuff, 255 - 4 - 1 - 2);
fr_dbuff_marker_t hdr;
fr_dict_attr_t const *da = da_stack->da[depth];
fr_dict_attr_t const *dv;
unsigned int depth = 0;
fr_da_stack_t da_stack;
ssize_t len;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
vp = fr_dcursor_current(cursor);
if (!vp) return -1;
*/
ssize_t fr_dhcpv6_encode(fr_dbuff_t *dbuff, uint8_t const *original, size_t length, int msg_type, fr_pair_list_t *vps)
{
- fr_dbuff_t frame_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t frame_dbuff = FR_DBUFF(dbuff);
fr_pair_t *vp;
fr_dict_attr_t const *root;
ssize_t slen;
fr_dcursor_t *cursor, void *encode_ctx)
{
ssize_t slen;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_pair_t const *vp = fr_dcursor_current(cursor);
fr_dict_attr_t const *da = da_stack->da[depth];
{
ssize_t slen;
size_t element_len;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_pair_t *vp;
fr_dict_attr_t const *da = da_stack->da[depth];
while (fr_dbuff_extend(&work_dbuff)) {
bool len_field = false;
- fr_dbuff_t element_dbuff = FR_DBUFF_NO_ADVANCE(&work_dbuff);
+ fr_dbuff_t element_dbuff = FR_DBUFF(&work_dbuff);
element_len = fr_dhcpv6_option_len(fr_dcursor_current(cursor));
do_child:
fr_dcursor_init(&child_cursor, &vp->vp_group);
- work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ work_dbuff = FR_DBUFF(dbuff);
while ((vp = fr_dcursor_current(&child_cursor)) != NULL) {
fr_proto_da_stack_build(da_stack, vp->da);
fr_da_stack_t *da_stack, unsigned int depth,
fr_dcursor_t *cursor, void *encode_ctx)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_pair_t const *vp = fr_dcursor_current(cursor);
fr_dict_attr_t const *da = da_stack->da[depth];
ssize_t len;
fr_da_stack_t *da_stack, unsigned int depth,
fr_dcursor_t *cursor, void *encode_ctx)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_marker_t hdr;
fr_dict_attr_t const *da = da_stack->da[depth];
ssize_t len;
fr_da_stack_t *da_stack, unsigned int depth,
fr_dcursor_t *cursor, void *encode_ctx)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_marker_t hdr;
fr_dict_attr_t const *da = da_stack->da[depth];
ssize_t len;
fr_da_stack_t *da_stack, unsigned int depth,
fr_dcursor_t *cursor, void *encode_ctx)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_marker_t hdr;
fr_dict_attr_t const *da = da_stack->da[depth];
fr_dict_attr_t const *dv;
fr_pair_t *vp;
unsigned int depth = 0;
fr_da_stack_t da_stack;
- fr_dbuff_t work_dbuff = FR_DBUFF_MAX_NO_ADVANCE(dbuff, DHCPV6_OPT_HDR_LEN + UINT16_MAX);
+ fr_dbuff_t work_dbuff = FR_DBUFF_MAX(dbuff, DHCPV6_OPT_HDR_LEN + UINT16_MAX);
ssize_t len;
vp = fr_dcursor_current(cursor);
{
fr_pair_t *vp;
ssize_t slen;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
vp = fr_pair_afrom_da(ctx, parent_da);
if (!vp) return PAIR_DECODE_OOM;
ssize_t slen;
fr_pair_list_t children;
fr_dcursor_t cursor;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
FR_PROTO_TRACE("Decoding TLV - %s (%zu bytes)", parent_da->name, fr_dbuff_len(&work_dbuff));
{
fr_pair_t *vp;
ssize_t slen;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
FR_PROTO_TRACE("Decoding group - %s", parent_da->name);
uint64_t len = 0, type = 0;
size_t remaining, needed;
bool tainted, extended, unknown = false, internal = false;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
/*
* The first byte of each attribute describes the encoding format.
fr_pair_list_t list;
fr_dcursor_t tmp_cursor;
ssize_t slen;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_pair_list_init(&list);
fr_da_stack_t *da_stack, unsigned int depth,
fr_dcursor_t *cursor, void *encode_ctx)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_marker_t enc_field, len_field, value_field;
fr_dbuff_t value_dbuff;
fr_dict_attr_t const *da = da_stack->da[depth];
* if the length field needs more than one byte will guard
* against insufficient space.
*/
- value_dbuff = FR_DBUFF_COPY(&work_dbuff);
+ value_dbuff = FR_DBUFF_BIND_CURRENT(&work_dbuff);
fr_dbuff_marker(&value_field, &value_dbuff);
switch (da->type) {
fr_md5_ctx_t *md5_ctx;
size_t i;
uint8_t digest[MD5_DIGEST_LENGTH];
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
FR_DBUFF_EXTEND_LOWAT_OR_RETURN(&work_dbuff, sizeof(digest));
/*
* The RADIUS header can't do more than 64K of data.
*/
- work_dbuff = FR_DBUFF_MAX_NO_ADVANCE(dbuff, 65535);
+ work_dbuff = FR_DBUFF_MAX(dbuff, 65535);
FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, code, id);
- length_dbuff = FR_DBUFF_NO_ADVANCE(&work_dbuff);
+ length_dbuff = FR_DBUFF(&work_dbuff);
FR_DBUFF_IN_RETURN(&work_dbuff, (uint16_t) RADIUS_HEADER_LENGTH);
switch (code) {
uint32_t r;
size_t len;
ssize_t slen;
- fr_dbuff_t work_dbuff = FR_DBUFF_MAX_NO_ADVANCE(dbuff, RADIUS_MAX_STRING_LENGTH);
+ fr_dbuff_t work_dbuff = FR_DBUFF_MAX(dbuff, RADIUS_MAX_STRING_LENGTH);
/*
* Limit the maximum size of the in password. 2 bytes
ssize_t slen;
fr_pair_t const *vp = fr_dcursor_current(cursor);
fr_dict_attr_t const *da = da_stack->da[depth];
- fr_dbuff_t work_dbuff = FR_DBUFF_MAX_NO_ADVANCE(dbuff, RADIUS_MAX_STRING_LENGTH);
+ fr_dbuff_t work_dbuff = FR_DBUFF_MAX(dbuff, RADIUS_MAX_STRING_LENGTH);
for (;;) {
FR_PROTO_STACK_PRINT(da_stack, depth);
fr_pair_t const *vp = fr_dcursor_current(cursor);
fr_dict_attr_t const *da = da_stack->da[depth];
fr_radius_ctx_t *packet_ctx = encode_ctx;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_t value_dbuff;
fr_dbuff_marker_t value_start, src, dest;
bool encrypted = false;
/*
* Starting here is a value that may require encryption.
*/
- value_dbuff = FR_DBUFF_NO_ADVANCE(&work_dbuff);
+ value_dbuff = FR_DBUFF(&work_dbuff);
fr_dbuff_marker(&value_start, &value_dbuff);
fr_dbuff_marker(&src, &value_dbuff);
fr_dbuff_marker(&dest, &value_dbuff);
{
unsigned int num_fragments, i = 0;
size_t max_frag_data = UINT8_MAX - hdr_len;
- fr_dbuff_t frag_data = FR_DBUFF_NO_ADVANCE_ABS(hdr);
+ fr_dbuff_t frag_data = FR_DBUFF_ABS(hdr);
fr_dbuff_marker_t frag_hdr, frag_hdr_p;
if (unlikely(!data_len)) return 0; /* Shouldn't have been called */
/*
* Shift remaining data by hdr_len.
*/
- FR_DBUFF_IN_MEMCPY_RETURN(&FR_DBUFF_NO_ADVANCE(&frag_data), &frag_hdr, data_len - (i * max_frag_data));
- fr_dbuff_in_memcpy(&FR_DBUFF_NO_ADVANCE(&frag_hdr), hdr, hdr_len); /* Copy the old header over */
+ FR_DBUFF_IN_MEMCPY_RETURN(&FR_DBUFF(&frag_data), &frag_hdr, data_len - (i * max_frag_data));
+ fr_dbuff_in_memcpy(&FR_DBUFF(&frag_hdr), hdr, hdr_len); /* Copy the old header over */
}
return fr_dbuff_set(data, &frag_data);
* "long" extended type.
*/
if (extra) {
- work_dbuff = FR_DBUFF_COPY(dbuff);
+ work_dbuff = FR_DBUFF_BIND_CURRENT(dbuff);
} else {
- work_dbuff = FR_DBUFF_MAX(dbuff, UINT8_MAX);
+ work_dbuff = FR_DBUFF_MAX_BIND_CURRENT(dbuff, UINT8_MAX);
}
fr_dbuff_marker(&hdr, &work_dbuff);
uint8_t const *p;
size_t data_len;
fr_pair_t const *vp = fr_dcursor_current(cursor);
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_marker_t hdr;
FR_PROTO_STACK_PRINT(da_stack, depth);
ssize_t slen;
uint8_t hlen;
fr_dbuff_marker_t hdr;
- fr_dbuff_t work_dbuff = FR_DBUFF_MAX_NO_ADVANCE(dbuff, UINT8_MAX);
+ fr_dbuff_t work_dbuff = FR_DBUFF_MAX(dbuff, UINT8_MAX);
FR_PROTO_STACK_PRINT(da_stack, depth);
fr_dbuff_marker(&hdr, &work_dbuff);
size_t hdr_len;
fr_dbuff_marker_t hdr, length_field, vsa_length_field;
fr_dict_attr_t const *da, *dv;
- fr_dbuff_t work_dbuff = FR_DBUFF_MAX_NO_ADVANCE(dbuff, UINT8_MAX);
+ fr_dbuff_t work_dbuff = FR_DBUFF_MAX(dbuff, UINT8_MAX);
FR_PROTO_STACK_PRINT(da_stack, depth);
fr_dcursor_t *cursor, void *encode_ctx)
{
ssize_t slen;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_marker_t hdr, length_field, vsa_length_field;
fr_dict_attr_t const *dv;
fr_pair_t const *vp = fr_dcursor_current(cursor);
*/
vp = fr_dcursor_current(cursor);
fr_assert(vp->da == da);
- work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ work_dbuff = FR_DBUFF(dbuff);
fr_dcursor_init(&child_cursor, &vp->vp_group);
while ((vp = fr_dcursor_current(&child_cursor)) != NULL) {
return encode_vendor(dbuff, da_stack, depth + 1, cursor, encode_ctx);
}
- work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ work_dbuff = FR_DBUFF(dbuff);
vp = fr_dcursor_current(cursor);
if (vp->da != da_stack->da[depth]) {
fr_da_stack_t *da_stack, NDEBUG_UNUSED unsigned int depth,
fr_dcursor_t *cursor, UNUSED void *encode_ctx)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_marker_t hdr, frag_hdr;
fr_pair_t *vp = fr_dcursor_current(cursor);
size_t attr_len = 2;
fr_dcursor_t *cursor, void *encode_ctx)
{
fr_pair_t const *vp = fr_dcursor_current(cursor);
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_marker_t start;
fr_dbuff_marker(&start, &work_dbuff);
{
fr_pair_t const *vp;
ssize_t slen;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_da_stack_t da_stack;
fr_dict_attr_t const *da = NULL;
{
uint8_t arg_cnt = 0;
fr_pair_t *vp;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
for (vp = fr_pair_list_head(vps);
vp;
{
fr_pair_t *vp;
uint8_t arg_cnt = 0;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
for (vp = fr_pair_list_head(vps);
vp;
static ssize_t tacacs_encode_field(fr_dbuff_t *dbuff, fr_pair_list_t *vps, fr_dict_attr_t const *da, size_t max_len)
{
fr_pair_t *vp;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
vp = fr_pair_find_by_da(vps, da, 0);
if (!vp || !vp->vp_length || (vp->vp_length > max_len)) return 0;
fr_da_stack_t da_stack;
ssize_t len = 0;
size_t body_len, packet_len;
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_dbuff_marker_t hdr, body, hdr_io;
uint8_t version_byte = 0;
ssize_t fr_tftp_encode(fr_dbuff_t *dbuff, fr_pair_list_t *vps)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_MAX_NO_ADVANCE(dbuff, FR_TFTP_BLOCK_MAX_SIZE);
+ fr_dbuff_t work_dbuff = FR_DBUFF_MAX(dbuff, FR_TFTP_BLOCK_MAX_SIZE);
fr_pair_t *vp;
uint16_t opcode;
char const *buf;
ssize_t fr_vmps_encode(fr_dbuff_t *dbuff, uint8_t const *original,
int code, uint32_t seq_no, fr_dcursor_t *cursor)
{
- fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
fr_pair_t *vp;
fr_dbuff_marker_t hdr, io;
uint8_t data_count = 0;