---
name: "rc_avpair_gen"
section: "3"
platform: "linux"
package: "radcli"
version: "2.0.1-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/rc_avpair_gen"
---

# rc\_avpair\_gen(3)

Decode a raw RADIUS attribute buffer into a VALUE\_PAIR list.

## NAME

rc\_avpair\_gen - Decode a raw RADIUS attribute buffer into a VALUE\_PAIR list.

## SYNOPSIS

```
#include <radcli/>

VALUE_PAIR * rc_avpair_gen(
    rc_handle const      *rh,
    VALUE_PAIR           *pair,
    unsigned char const  *ptr,
    int                   length,
    uint32_t              vendorspec
);
```

## DESCRIPTION

This is a low-level function retained for ABI compatibility with freeradius-client and radiusclient-ng. Application code should not call it directly; build requests with rc\_avpair\_add() and send them with rc\_auth() or rc\_acct(), which handle wire encoding and decoding internally.

Decodes the attribute/value region of a received RADIUS packet (the bytes that follow the 20-byte fixed header) into a linked list of VALUE\_PAIR structures. Unknown attributes are logged and skipped; they are not a hard error.

## PARAMETERS

- **rh**

  a handle to parsed configuration (used for dictionary lookups).

- **pair**

  optional existing VALUE\_PAIR list to append decoded attributes to; pass NULL to start a fresh list.

- **ptr**

  pointer to the start of the attribute data region.

- **length**

  number of bytes in the attribute region.

- **vendorspec**

  vendor PEN when decoding a vendor-specific sub-attribute block; pass 0 for top-level packet attributes.

## RETURN VALUE

head of the (possibly extended) VALUE\_PAIR list, or NULL on a hard decode error (malformed length field, allocation failure).

## SEE ALSO

[*rc\_aaa*(3)](/rc_aaa/3.md), [*rc\_aaa\_ctx*(3)](/rc_aaa_ctx/3.md), [*rc\_aaa\_ctx\_free*(3)](/rc_aaa_ctx_free/3.md), [*rc\_aaa\_ctx\_get\_secret*(3)](/rc_aaa_ctx_get_secret/3.md), [*rc\_aaa\_ctx\_get\_vector*(3)](/rc_aaa_ctx_get_vector/3.md), [*rc\_aaa\_ctx\_server*(3)](/rc_aaa_ctx_server/3.md), [*rc\_acct*(3)](/rc_acct/3.md), [*rc\_acct\_async*(3)](/rc_acct_async/3.md), [*rc\_acct\_proxy*(3)](/rc_acct_proxy/3.md), [*rc\_auth*(3)](/rc_auth/3.md), [*rc\_auth\_proxy*(3)](/rc_auth_proxy/3.md), [*rc\_avpair\_add*(3)](/rc_avpair_add/3.md), [*rc\_avpair\_assign*(3)](/rc_avpair_assign/3.md), [*rc\_avpair\_copy*(3)](/rc_avpair_copy/3.md), [*rc\_avpair\_free*(3)](/rc_avpair_free/3.md), [*rc\_avpair\_get*(3)](/rc_avpair_get/3.md), [*rc\_avpair\_get\_attr*(3)](/rc_avpair_get_attr/3.md), [*rc\_avpair\_get\_in6*(3)](/rc_avpair_get_in6/3.md), [*rc\_avpair\_get\_raw*(3)](/rc_avpair_get_raw/3.md), [*rc\_avpair\_get\_uint32*(3)](/rc_avpair_get_uint32/3.md), [*rc\_avpair\_insert*(3)](/rc_avpair_insert/3.md), [*rc\_avpair\_log*(3)](/rc_avpair_log/3.md), [*rc\_avpair\_new*(3)](/rc_avpair_new/3.md), [*rc\_avpair\_next*(3)](/rc_avpair_next/3.md), [*rc\_avpair\_parse*(3)](/rc_avpair_parse/3.md), [*rc\_avpair\_remove*(3)](/rc_avpair_remove/3.md), [*rc\_avpair\_tostr*(3)](/rc_avpair_tostr/3.md), [*rc\_buildreq*(3)](/rc_buildreq/3.md), [*rc\_check*(3)](/rc_check/3.md), [*rc\_dict\_addattr*(3)](/rc_dict_addattr/3.md), [*rc\_dict\_addval*(3)](/rc_dict_addval/3.md), [*rc\_dict\_addvend*(3)](/rc_dict_addvend/3.md), [*rc\_dict\_findattr*(3)](/rc_dict_findattr/3.md), [*rc\_dict\_findval*(3)](/rc_dict_findval/3.md), [*rc\_dict\_findvend*(3)](/rc_dict_findvend/3.md), [*rc\_dict\_getattr*(3)](/rc_dict_getattr/3.md), [*rc\_dict\_getval*(3)](/rc_dict_getval/3.md), [*rc\_dict\_getvend*(3)](/rc_dict_getvend/3.md), [*rc\_send\_server*(3)](/rc_send_server/3.md)
