Accounting more than 4G without GigaWord

Sylvain Munaut s.munaut at whatever-company.com
Thu Apr 28 10:39:06 CEST 2016


Hi,


I've been recently faced with a crappy NAS that didn't properly
support sending GigaWord and would just wrap the
Acct-{Input,Output}-Octets after 4G, but I still wanted to record the
proper value.

My work around was to use a custom SQL function :

CREATE OR REPLACE FUNCTION BYTE_UPDATE(bigint, bigint) RETURNS bigint
  AS 'SELECT CASE WHEN $1 IS NULL OR $2 IS NULL THEN COALESCE($1,$2)
WHEN $2 >= (1::bigint << 32) THEN $2 WHEN $2 < ($1 & ((1::bigint <<
32) - 1)) THEN ((($1 & ~((1::bigint << 32) - 1)) | $2) + (1::bigint <<
32)) ELSE (($1 & ~((1::bigint << 32) - 1)) | $2) END;'
  LANGUAGE SQL
  IMMUTABLE;


And in queries.conf, change to call it using old_value, new_value as argument :

AcctInputOctets = BYTE_UPDATE(AcctInputOctets,
(('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) +
'%{%{Acct-Input-Octets}:-0}'::bigint)),


The function basically just detects wrap around and assumes that the
4G point was reached and increments value appropriately. If your NAS
properly sends Gigawords, then the function does nothing.
I've been running this on postgres for a while now and it seems to work nicely.

I just thought I'd share that here in case someone else had the same issue ...


Cheers,

    Sylvain


More information about the Freeradius-Users mailing list