Cisco-AVPair regex

Alan DeKok aland at
Fri Jul 14 15:35:24 CEST 2017

On Jul 14, 2017, at 9:22 AM, Kylián Martin <kylianm at> wrote:
> I'm trying to save some of the Cisco-AVPair attributes into sql while acounting. Specifically, I'm interested in the dhcp-options and http-tlv attributes. WLC describes the connected device in these.
> Unfortunately, Freeradius 3.12 expands these values unregexable way.
> (With_cisco_vsa_hack = yes in preprocess the result is the same)
> Correctly expanded is just Cisco-AVPair = "audit-session-id=1ef1a8c000014809cba76859"

  That's just text.  There shouldn't be a problem.

> Policy file:
> device_regex = '^((dhcp-option=)|(http-tlv=)){1}([\\].{2,5})([\\].{2,5})([\\].{3})([\\].{3})?(.*)'

  That seems much too complicated.  And doesn't match the Cisco-AVPair you have above.

> (98)   Cisco-AVPair = "dhcp-option=\000\014\000\0056spMK"
> (98)   Cisco-AVPair = "http-tlv=\000\001\000\030iPhone8,2/10.3.2 (14F89)"
> How to regex these ?

  Use a regex library which can handle embedded NUL bytes.

  Regexes normally work on strings.  i.e. printable data. The attributes above are binary, not printable data.

> Both attributes are expanded till first whitespace char

  No, they stop on the first NUL character.  i.e. embedded zero.

> (98)           if ("%{Foreach-Variable-0}" =~ /^((dhcp-option=)|(http-tlv=)){1}([\\].{2,5})([\\].{2,5})([\\].{3})([\\].{3})?(.*)/i)  -> FALSE
> (98)         } # foreach &Cisco-AVPair = updated
> (98)       } # if (&Cisco-AVPair)  = updated
> How to get  text values following whitespaces? 
> I've  already tried                        if ("unescape:%{Foreach-Variable-0}" =~ /${policy.device_regex}/i)  with no luck

  Install pcre, and use it as the regex engine.  It can handle embedded NUL bytes.

  Or, use another method to parse the Cisco-AVPairs.  e.g. rlm_perl.

  Or, use the "unpack" module to unpack binary data.  See raddb/mods-available/unpack for documentation.

  Alan DeKok.

More information about the Freeradius-Users mailing list