New feature in v3: cast!

Alan DeKok aland at
Sun May 12 14:40:14 CEST 2013

Brian Candler wrote:
> 1. Why is <ipaddr> necessary before the literal? Surely an unquoted
> can't be parsed as anything else.

  See my other example for why it's necessary.

  In *some* cases, you know the data type of an expression.  In those
cases, you can easily do type-specific comparisons.  That's what unlang
does today:

	if (Framed-IP-Address == {

  The type is "ipaddr", because of Framed-IP-Address.  The RHS is in
fact parsed into a second Framed-IP-Address attribute, and the two are

  However... you can't currently do a type-safe comparison like:

	if ( < {

  The interpretor does *string* comparisons.  Which is wrong for IP
addresses.  Adding a cast allows you to do:

	if (<ipaddr> < {

  Which does type-safe checks as with Framed-IP-Address, above.

> 2. What does the & in front of Framed-IP-Address do?

$ man unlang  :)

  It's a reference.

	if (&User-Name == &Filter-Id) {

  Does type-safe comparisons on the *values* of the two attributes.  The
v2 unlang code would require you to do:

	if (User-Name == "%{Filter-Id}") {

  Which converts Filter-Id to a string, parses the string into a
temporary User-Name attribute, and then compares the two User-Name

  Using a reference means you can skip 2 out of 3 of those steps.

  Alan DeKok.

More information about the Freeradius-Devel mailing list