Радиус не дает детализацию трафика, поэтому эта фича не используется. С другой стороны, если детализация трафика пофик, то можно обновлять по radupdate. Только учтите, что radupdate посылает общий трафик за сессию, поэтому нужно за каждую итерацию получать разницу и добавлять ее к текущим показаниям. В проекте ПБ я это сделал через промежуточную таблицу radcounts. Даю пример, только учтите, что он несовместим с NoDeny напрямую, его стоит взять тока за основу
DROP PROCEDURE IF EXISTS `radupdate`;
DELIMITER $$
CREATE PROCEDURE `radupdate` (
IN login VARCHAR(64),
IN ses_id VARCHAR(32),
IN ses_time INT,
IN ses_traf_in BIGINT(20),
IN ses_traf_out BIGINT(20),
IN ip VARCHAR(16),
IN Calling_Station_Id VARCHAR(32),
IN Called_Station_Id VARCHAR(32)
)
BEGIN
CheckBlock:BEGIN
DECLARE usr_id INT;
DECLARE tm INT;
DECLARE t_in, t_out BIGINT(20);
SELECT parent_id INTO usr_id FROM dopdata WHERE field_alias='_login' AND field_value=login LIMIT 1;
IF( usr_id IS NULL ) THEN LEAVE CheckBlock; END IF;
SELECT traf_in, traf_out, time INTO t_in, t_out, tm FROM radcounts WHERE session=ses_id LIMIT 1;
IF( t_in is NULL ) THEN
SET t_in = 0;
SET t_out = 0;
SET tm = 0;
INSERT INTO radcounts SET session=ses_id;
END IF;
SET t_in = ses_traf_in - t_in;
SET t_out = ses_traf_out - t_out;
SET tm = ses_time - tm;
UPDATE radcounts SET traf_in=ses_traf_in, traf_out=ses_traf_out, time=ses_time WHERE session=ses_id LIMIT 1;
INSERT dopvalues SET parent_id=usr_id, field_value=t_in, dopfield_id=
(SELECT id FROM dopfields WHERE field_alias='_traf_in' LIMIT 1)
ON DUPLICATE KEY UPDATE field_value=field_value+t_in;
INSERT dopvalues SET parent_id=usr_id, field_value=t_out, dopfield_id=
(SELECT id FROM dopfields WHERE field_alias='_traf_out' LIMIT 1)
ON DUPLICATE KEY UPDATE field_value=field_value+t_out;
INSERT dopvalues SET parent_id=usr_id, field_value=tm, dopfield_id=
(SELECT id FROM dopfields WHERE field_alias='_work_time' LIMIT 1)
ON DUPLICATE KEY UPDATE field_value=field_value+tm;
INSERT into login_query SET
uid = usr_id,
act = 0,
time = unix_timestamp(),
ip = INET_ATON(ip),
session = ses_id,
router = Called_Station_Id,
properties = CONCAT('|client:' , Calling_Station_Id, '|');
END;
END$$
DELIMITER ;
в конфиге радиуса:
accounting_update_query = "call radupdate( \
'%{SQL-User-Name}','%{Acct-Session-Id}',%{Acct-Session-Time},%{Acct-Output-Octets},%{Acct-Input-Octets}, \
'%{Framed-IP-Address}','%{Calling-Station-Id}','%{Called-Station-Id}')"