cc->tmpl_rules.dict_def ? cc->tmpl_rules.dict_def : cc->config->dict, fr_pair_t);
vp;
vp = fr_cursor_current(&cursor)) {
- slen = tp->func(enc_p, enc_end - enc_p, &cursor, encoder_ctx);
+ slen = tp->func(&FR_DBUFF_TMP(enc_p, enc_end), &cursor, encoder_ctx);
cc->last_ret = slen;
if (truncate) DEBUG("%s[%d]: Iteration %zu - Result %zd%s%s",
}
if (vp->da == attr_message_authenticator) goto next;
- slen = fr_radius_encode_pair(ptr, end - ptr, &cursor, NULL);
+ slen = fr_radius_encode_pair(&FR_DBUFF_TMP(ptr, end), &cursor, NULL);
if (slen < 0) {
if (slen == PAIR_ENCODE_SKIPPED) goto next;
/*
* encode.c
*/
-ssize_t fr_aka_sim_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx);
+ssize_t fr_aka_sim_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
ssize_t fr_aka_sim_encode(request_t *request, fr_pair_t *to_encode, void *encode_ctx);
return p - out; /* AT_IV + AT_*(TLV) - Can't use total_len, doesn't include IV */
}
-ssize_t fr_aka_sim_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx)
+ssize_t fr_aka_sim_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
{
- fr_pair_t const *vp;
+ fr_pair_t const *vp;
ssize_t slen;
size_t attr_len;
fr_dict_attr_t const *da = NULL;
fr_aka_sim_encode_ctx_t *packet_ctx = encoder_ctx;
+ uint8_t *out = fr_dbuff_start(dbuff);
+ size_t outlen = fr_dbuff_remaining(dbuff);
+
if (!cursor || !out) return PAIR_ENCODE_FATAL_ERROR;
CHECK_FREESPACE(outlen, 4); /* Attributes lengths are always multiples of 4 */
*/
(void)fr_cursor_head(&cursor);
while (fr_cursor_current(&cursor)) {
- slen = fr_aka_sim_encode_pair(p, end - p, &cursor, packet_ctx);
+ slen = fr_aka_sim_encode_pair(&FR_DBUFF_TMP(p, end), &cursor, packet_ctx);
if (slen < 0) {
error:
talloc_free(buff);
*
* The cursor is used to track how many pairs there are remaining.
*
- * @param[out] out Where to write encoded data. The encoding function should
- * not assume that this buffer has been initialised, and must
- * zero out any portions used for padding.
- * @param[in] outlen The length of the buffer provided.
+ * @param[out] out Where to write the encoded data.
* @param[in] cursor Cursor containing the list of attributes to process.
* @param[in] encoder_ctx Any encoder specific data such as secrets or configurables.
* @return
* integer that would be required to encode the attribute.
* - >0 - The number of bytes written to out.
*/
-typedef ssize_t (*fr_pair_encode_t)(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx);
+typedef ssize_t (*fr_pair_encode_t)(fr_dbuff_t *out, fr_cursor_t *cursor, void *encoder_ctx);
/** A generic interface for decoding fr_pair_ts
*
if (!fr_cursor_head(cursor)) return XLAT_ACTION_DONE; /* Nothing to encode */
while (fr_cursor_filter_current(cursor, fr_dhcpv4_is_encodable, NULL)) {
- len = fr_dhcpv4_encode_option(p, end - p, cursor,
+ len = fr_dhcpv4_encode_option(&FR_DBUFF_TMP(p, end), cursor,
&(fr_dhcpv4_ctx_t){ .root = fr_dict_root(dict_dhcpv4) });
if (len < 0) {
RPEDEBUG("DHCP option encoding failed");
continue;
}
- len = fr_dhcpv4_encode_option_dbuff(&work_dbuff,
+ len = fr_dhcpv4_encode_option(&work_dbuff,
&cursor, &(fr_dhcpv4_ctx_t){ .root = fr_dict_root(dict_dhcpv4) });
if (len <= 0) break;
};
/*
* encode.c
*/
-ssize_t fr_dhcpv4_encode_option(uint8_t *out, size_t outlen,
- fr_cursor_t *cursor, void *encoder_ctx);
-ssize_t fr_dhcpv4_encode_option_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
+ssize_t fr_dhcpv4_encode_option(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
/*
* packet.c
/** Encode a DHCP option and any sub-options.
*
- * @param[out] out Where to write encoded DHCP attributes.
- * @param[in] outlen Length of out buffer.
+ * @param[out] dbuff Where to write encoded DHCP attributes.
* @param[in] cursor with current VP set to the option to be encoded.
* Will be advanced to the next option to encode.
* @param[in] encoder_ctx Containing DHCPv4 dictionary.
* - < 0 error.
* - 0 not valid option for DHCP (skipping).
*/
-ssize_t fr_dhcpv4_encode_option(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx)
-{
- return fr_dhcpv4_encode_option_dbuff(&FR_DBUFF_TMP(out, outlen), cursor, encoder_ctx);
-}
-
-ssize_t fr_dhcpv4_encode_option_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
+ssize_t fr_dhcpv4_encode_option(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
{
fr_pair_t *vp;
unsigned int depth = 0;
fr_cursor_talloc_iter_init(&cursor, &vps, fr_dhcpv6_next_encodable, dict_dhcpv6, fr_pair_t);
while ((fr_dbuff_extend(dbuff) > 0) && (fr_cursor_current(&cursor) != NULL)) {
- slen = fr_dhcpv6_encode_option_dbuff(dbuff, &cursor, &packet_ctx);
+ slen = fr_dhcpv6_encode_option(dbuff, &cursor, &packet_ctx);
switch (slen) {
case PAIR_ENCODE_SKIPPED:
continue;
/*
* encode.c
*/
-ssize_t fr_dhcpv6_encode_option(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx);
-ssize_t fr_dhcpv6_encode_option_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void * encoder_ctx);
+ssize_t fr_dhcpv6_encode_option(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void * encoder_ctx);
/*
* decode.c
{
ssize_t slen;
fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
- fr_pair_t const *vp = fr_cursor_current(cursor);
+ fr_pair_t const *vp = fr_cursor_current(cursor);
fr_dict_attr_t const *da = da_stack->da[depth];
VP_VERIFY(vp);
if (vp->vp_length < (size_t)slen) {
FR_DBUFF_MEMCPY_IN_RETURN(&work_dbuff, (uint8_t const *)(vp->vp_ptr), vp->vp_length);
- FR_DBUFF_MEMSET_RETURN(&work_dbuff, 0, slen - vp->vp_length);
+ FR_DBUFF_MEMSET_RETURN(&work_dbuff, 0x00, slen - vp->vp_length);
} else {
FR_DBUFF_MEMCPY_IN_RETURN(&work_dbuff, (uint8_t const *)(vp->vp_ptr), (size_t) slen);
}
while (fr_cursor_current(&child_cursor) != NULL) {
child = fr_cursor_current(&child_cursor);
- slen = fr_dhcpv6_encode_option_dbuff(&work_dbuff, &child_cursor, encoder_ctx);
+ slen = fr_dhcpv6_encode_option(&work_dbuff, &child_cursor, encoder_ctx);
if (slen == PAIR_ENCODE_SKIPPED) continue;
if (slen < 0) return PAIR_ENCODE_FATAL_ERROR;
/** Encode a DHCPv6 option and any sub-options.
*
- * @param[out] out Where to write encoded DHCP attributes.
- * @param[in] outlen Length of out buffer.
+ * @param[out] dbuff Where to write encoded DHCP attributes.
* @param[in] cursor with current VP set to the option to be encoded.
* Will be advanced to the next option to encode.
* @param[in] encoder_ctx containing parameters for the encoder.
* - > 0 length of data written.
* - < 0 error.
*/
-ssize_t fr_dhcpv6_encode_option(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx)
-{
- return fr_dhcpv6_encode_option_dbuff(&FR_DBUFF_TMP(out, outlen), cursor, encoder_ctx);
-}
-
-ssize_t fr_dhcpv6_encode_option_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void * encoder_ctx)
+ssize_t fr_dhcpv6_encode_option(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void * encoder_ctx)
{
fr_pair_t *vp;
unsigned int depth = 0;
#include <talloc.h>
-static ssize_t fr_internal_encode_pair_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
-
/** We use the same header for all types
*
*/
vp = fr_cursor_current(&children)) {
FR_PROTO_TRACE("encode ctx changed %s -> %s", da->name, vp->da->name);
- slen = fr_internal_encode_pair_dbuff(&FR_DBUFF_RESERVE(dbuff, sizeof(uint64_t) - 1),
- &children, encoder_ctx);
+ slen = fr_internal_encode_pair(&FR_DBUFF_RESERVE(dbuff, sizeof(uint64_t) - 1),
+ &children, encoder_ctx);
if (slen < 0) return slen;
}
fr_cursor_next(cursor);
* - 0 Nothing to encode (or attribute skipped).
* - <0 an error occurred.
*/
-static ssize_t fr_internal_encode_pair_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
+ssize_t fr_internal_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
{
fr_pair_t *vp;
fr_da_stack_t da_stack;
return internal_encode(dbuff, &da_stack, 0, cursor, encoder_ctx);
}
-/** Encode a data structure into an internal attribute
- *
- * This is the main entry point into the encoder.
- *
- * @param[out] out Where to write encoded data.
- * @param[in] outlen Length of the out buffer.
- * @param[in] cursor Specifying attribute to encode.
- * @param[in] encoder_ctx Additional data such as the shared secret to use.
- * @return
- * - >0 The number of bytes written to out.
- * - 0 Nothing to encode (or attribute skipped).
- * - <0 an error occurred.
- */
-ssize_t fr_internal_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx)
-{
- return fr_internal_encode_pair_dbuff(&FR_DBUFF_TMP(out, outlen), cursor, encoder_ctx);
-}
-
/*
* Test points
*/
* @copyright 2020 The FreeRADIUS server project
*/
-ssize_t fr_internal_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx);
+ssize_t fr_internal_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
ssize_t fr_internal_decode_pair(TALLOC_CTX *ctx, fr_cursor_t *cursor, fr_dict_t const *dict,
uint8_t const *data, size_t data_len, void *decoder_ctx);
/*
* Encode an individual VP
*/
- slen = fr_radius_encode_pair_dbuff(&work_dbuff, &cursor, &packet_ctx);
+ slen = fr_radius_encode_pair(&work_dbuff, &cursor, &packet_ctx);
if (slen < 0) {
if (slen == PAIR_ENCODE_SKIPPED) continue;
return slen;
/*
* Encode an individual VP
*/
- slen = fr_radius_encode_pair_dbuff(dbuff, &cursor, encoder_ctx);
+ slen = fr_radius_encode_pair(dbuff, &cursor, encoder_ctx);
if (slen < 0) {
if (slen == PAIR_ENCODE_SKIPPED) continue;
return slen;
* we use for tracking our TLV/VSA nesting and then calls the appropriate
* dispatch function.
*
- * @param[out] out Where to write encoded data.
- * @param[in] outlen Length of the out buffer.
+ * @param[out] dbuff Where to write encoded data.
* @param[in] cursor Specifying attribute to encode.
* @param[in] encoder_ctx Additional data such as the shared secret to use.
* @return
* - 0 Nothing to encode (or attribute skipped).
* - <0 an error occurred.
*/
-ssize_t fr_radius_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx)
+ssize_t fr_radius_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
{
- return fr_radius_encode_pair_dbuff(&FR_DBUFF_TMP(out, outlen), cursor, encoder_ctx);
-}
-
-ssize_t fr_radius_encode_pair_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
-{
- fr_pair_t const *vp;
+ fr_pair_t const *vp;
ssize_t len;
fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
RADIUS_PACKET *packet, uint8_t id,
char const *password, size_t password_len) CC_HINT(nonnull(1,2,4));
-ssize_t fr_radius_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx);
-
-ssize_t fr_radius_encode_pair_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
+ssize_t fr_radius_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
/*
* protocols/radius/decode.c