Encoders and Decoders
These functions perform encoding and decoding of data for the networking protocols. These expansions can be used to manually encode and decode raw data.
In general, however, we recommend updating the dictionaries to automatically handle the information. The dictionaries support structures, bit fields, and many many more features than previous versions of FreeRADIUS. There are few situations where manual encoding and decoding is necessary.
That being said, the main use of these expansions is for the "internal" protocol. This is a virtual protocol which can encode and decode any attribute from any protocol.
If you need to store attributes in an external database, then it is
possible to encode them via %internal.encode(…)
. The result will
be an opaque hex string which can be treated as an opaque blob, and
stored externally. Then, when the data is needed again, it can be
turned back into attributes via %internal.decode(…)
.
%PROTO.decode(octets)
Decodes the input octers as the named protocol. The input can also be an attribute reference, which is usually a reference to an attribute of type `octets.
Each PROTO.decode
function is automatically registered for every
protocol which is used by the server.
Note that the output attributes must come from the same dictionary
as the request
they are being added to. For example, you cannot use
dhcpv4.decode
inside of a virtual server which has namespace =
radius
. Doing so would result in DHCPv4 attributes being inside of a
RADIUS virtual server, which is not allowed.
It returns the number of attributes which were decoded.
%dhcpv4.decode(0x520d0103abcdef0206010203040506)
%radius.decode(0x010641424344)
&Relay-Agent-Information.Circuit-Id = 0xabcdef, &Relay-Agent-Information.Remote-Id = 0x010203040506
&User-Name = "ABCD"
%PROTO.encode(list)
Encodes list as the named protocol. The list can also be a series of attributes.
The PROTO.encode
expansion is automatically registered for every
protocol which is used by the server.
It returns the raw encoded data
%dhcpv4.encode("&Relay-Agent-Information.Circuit-Id = 0xabcdef, &Relay-Agent-Information.Remote-Id = 0x010203040506")
%radius.encode("&User-Name = 'ABCD'")
&Tmp-Octets-1 := %dhcpv4.encode(&request.Relay-Agent-Information.[*])
0x520d0103abcdef0206010203040506
0x010641424344