nuclearcat Posted December 22, 2008 Posted December 22, 2008 Написал патчик. Бо задолбало, что юзеры могут "переюзать" за 2 Гига, и не устраивает идея обрывать им сессию через 2(integer) или 4(unsigned integer) Гб. Работает конечно не идеально, т.к. сьем данных из системы все равно идет 32-bit, и если "упустить" момент переворота - то посчитает неправильно. Переделывать больше - смысла на данный момент мало. Чтоб "не упустить" - для скорости скажем 128 Mbit/s interim period должен быть не более 5 минут. 64Mbit - 10 минут И т.д. Ссылка на патчик http://www.nuclearcat.com/files/gigawords-v3.patch На vanilla pppd не проверял, у меня патченый гентушный. Если патч нормально не накладывается (2.4.4 pppd) - сообщите. Вставить ник Quote
sirmax Posted December 22, 2008 Posted December 22, 2008 Я понимаю что вопрос не совсем в тему, но нужен ли вам VPN? Сам иду по пути отказа от оного ... Хотелось бы услыщать Ваши агрументы... Вставить ник Quote
disappointed Posted December 22, 2008 Posted December 22, 2008 Я это обработал в биллинге уже. Суть та же. Вставить ник Quote
AlKov Posted December 22, 2008 Posted December 22, 2008 Я это обработал в биллинге уже. Суть та же. А каким образом? "Костылем", или код биллинга патчили? Вставить ник Quote
disappointed Posted December 22, 2008 Posted December 22, 2008 Биллинг свой, сразу принималось во внимание обнуление счетчиков софтового наса. Вставить ник Quote
nuclearcat Posted December 22, 2008 Author Posted December 22, 2008 У меня PPPoE, отказываться смысла нет. Сети доступа не мои, а во многих местах от "реселлеров". Железо у них предельно дешевое, и соответственно тупое. Схема работы у меня не очень привычная для российских реселлеров, но эффективная для моей страны. Костыль в биллинг поставить можно, но правильнее подправить NAS. Потому как пакеты от NAS с неактуальными данными - это зло. Неправильность надо убивать на самом возможно раннем этапе. Вставить ник Quote
sfstudio Posted December 23, 2008 Posted December 23, 2008 У меня PPPoE, отказываться смысла нет. Сети доступа не мои, а во многих местах от "реселлеров". Железо у них предельно дешевое, и соответственно тупое.Схема работы у меня не очень привычная для российских реселлеров, но эффективная для моей страны. Костыль в биллинг поставить можно, но правильнее подправить NAS. Потому как пакеты от NAS с неактуальными данными - это зло. Неправильность надо убивать на самом возможно раннем этапе. А закоммитить авторам? Да и pppd 2.4.5 уже на дворе. Ы? Вставить ник Quote
nuclearcat Posted December 23, 2008 Author Posted December 23, 2008 Примут ли... Кроме того можно сделать более clean. Вместо long счетчиков - просто считать сколько раз счетчик переполнился, и это будет значением гигавордсов. Выигрыш конечно невелик, но может и есть толк. Более правильная реализация... Кстати info_print в pppd кривой, %llu он не умеет например. А хотелось бы в syslog получить реальные значения траффика, а не unsigned integer. Переписывать влом... Кроме того запрос счетчиков идет по ioctl, что есмь прошлый век, вроде давно можно netlink поюзать. Вставить ник Quote
nuclearcat Posted December 23, 2008 Author Posted December 23, 2008 А, ну и что вспомнил - long long не кроссплатформенно. Хотя очевидных багов не будет, но некрасиво. Надо какой-нить uint64_t Вставить ник Quote
sfstudio Posted December 24, 2008 Posted December 24, 2008 Ну дык ноги в руки и подключаться к девелоперам pppd их сейчас мало, я им закидывал мелочёвку на предмет правки опций и мультилинка, но пока тишина, подождём. Вставить ник Quote
Ivantey Posted December 24, 2008 Posted December 24, 2008 А закоммитить авторам? Да и pppd 2.4.5 уже на дворе. Ы? А где ppp 2.4.5 брали ? На офсайте тишина. Вставить ник Quote
nuclearcat Posted December 24, 2008 Author Posted December 24, 2008 Форкнуть pppd и сделать его GPL (вроде BSD это позволяет) Вони будет на всю планету :-) Вставить ник Quote
sfstudio Posted December 28, 2008 Posted December 28, 2008 >А где ppp 2.4.5 брали ? На офсайте тишина. http://git.ozlabs.org/?p=ppp.git;a=summary Кстати ссылка с официального сайта. >Форкнуть pppd и сделать его GPL (вроде BSD это позволяет) pppd под dual license насколько я помню. Вставить ник Quote
disappointed Posted February 18, 2009 Posted February 18, 2009 Заюзал, убрал костыль, спасибо. Вставить ник Quote
shaytan Posted March 11, 2009 Posted March 11, 2009 Написал патчик. ... Этот патч смотрел, до того как создал новый? Примут ли... Кроме того можно сделать более clean. Вместо long счетчиков - просто считать сколько раз счетчик переполнился, и это будет значением гигавордсов. Выигрыш конечно невелик, но может и есть толк. Более правильная реализация... Кстати info_print в pppd кривой, %llu он не умеет например. А хотелось бы в syslog получить реальные значения траффика, а не unsigned integer. Переписывать влом... Кроме того запрос счетчиков идет по ioctl, что есмь прошлый век, вроде давно можно netlink поюзать. Толк хотя бы в том, что каждый процесс pppd занимал бы меньше памяти. Вставить ник Quote
nuclearcat Posted March 11, 2009 Author Posted March 11, 2009 Написал патчик. ... Этот патч смотрел, до того как создал новый? Примут ли... Кроме того можно сделать более clean. Вместо long счетчиков - просто считать сколько раз счетчик переполнился, и это будет значением гигавордсов. Выигрыш конечно невелик, но может и есть толк. Более правильная реализация... Кстати info_print в pppd кривой, %llu он не умеет например. А хотелось бы в syslog получить реальные значения траффика, а не unsigned integer. Переписывать влом... Кроме того запрос счетчиков идет по ioctl, что есмь прошлый век, вроде давно можно netlink поюзать. Толк хотя бы в том, что каждый процесс pppd занимал бы меньше памяти. Ну памяти там ненамного больше используется :-) Тот патч во первых имеет бОльший overhead, во вторых затрагивает кучу вещей не относящихся к делу. В pppd неспроста не используют sprintf напрямую (есть враппер slprintf, в котором нед поддерки %llu), думаю это связано с портабельностью. Поэтому я не затрагивал эту часть. Кроме того автор делает поддержку vendor-specific атрибута - для примера Acct-Output-Packets-64, который посылает 64-бит значение как текстовую строку. Этот атрибут нафиг не нужен имхо. Вставить ник Quote
shaytan Posted March 11, 2009 Posted March 11, 2009 (edited) Это понятно что там есть лишнее, я имел ввиду ту часть кода которая отностится именно к вычислению GIGAWORDS. Спрашиваю потому, что мне сейсас надо вставить в pppd 2.4.4 поддержку GIGAWORDS, и думаю какой код взять за основу вычисления счётчика переполнений, путём записи предыдущих значений и сравнением с текущим, если меньше то счётчик увеличивать на единицу и пихать значение этого счётчика в GIGAWORDS. Т.о. long long int уже не нужен. Ну вычисления делать только при ACCT-UPDATE и ACCT-STOP и не забываем про частоту обновлений. ps. Надеялся счётчик переполнений есть в структуре pppstat, но увы :( Edited March 11, 2009 by shaytan Вставить ник Quote
SokolovS Posted March 11, 2009 Posted March 11, 2009 Я как раз считаю сколько раз счетчик переполнился и храню это значение как атрибут сеанса связи. Т.е. в одном поле количество переполнений в другом актуальное значение от NAS. Итого трафик это 4 Гб * кол-во переполнений + текущее значение. Вставить ник Quote
shaytan Posted March 11, 2009 Posted March 11, 2009 Считаешь на стороне радиус сервера? Вставить ник Quote
nuclearcat Posted March 11, 2009 Author Posted March 11, 2009 Да, еще вот долго меня мучала мысль, т.к. не люблю очень цифры с потолка. Хотя сам когда тороплюсь - ставлю цифры от балды :-) + static char bigint[64]; достаточно 21 т.к. 2^64 = 18446744073709551616 , 20 цифр + NULL Еще одна из вероятных ошибок(или скорее некрасивостей), и у меня и в том патче - скажется на 64-бит архитектурах, unsigned long long. На 32-бит архитектуры это 64 бита, а на 64-бит будет 128 бит. Т.е. нужно нечто u64. Плюс я еще не уверен в правильности работы на big-endian архитектуре. Вставить ник Quote
SokolovS Posted March 11, 2009 Posted March 11, 2009 Считаешь на стороне радиус сервера? Ну вобщем-то да, freeradius + rlm_perl, при запросе на обновление. Вставить ник Quote
sfstudio Posted March 11, 2009 Posted March 11, 2009 Плюс я еще не уверен в правильности работы на big-endian архитектуре. Работает корректно, тут я уже оттестил ;) Вставить ник Quote
nuclearcat Posted March 12, 2009 Author Posted March 12, 2009 Можно еще через триггеры в MySQL, без всяких perl Это самый простенький. Не обрабатывается момент rollover, его надо дописать... DROP TRIGGER IF EXISTS `pi`.`radacct_update`; DELIMITER // CREATE TRIGGER `pi`.`radacct_update` AFTER UPDATE ON `pi`.`radacct` FOR EACH ROW BEGIN DECLARE user_num INTEGER; SELECT id INTO user_num FROM userinfo WHERE username = NEW.username; IF NEW.AcctOutputOctets > OLD.AcctOutputOctets THEN INSERT INTO traffstat (userid,hour,date,rx,tx) VALUES (user_num,HOUR(NOW()),CURDATE(),NEW.AcctInputOctets-OLD.AcctInputOctets,NEW.AcctOutputOctets-OLD.AcctOutputOctets) ON DUPLICATE KEY UPDATE rx=rx+NEW.AcctInputOctets-OLD.AcctInputOctets,tx=tx+NEW.AcctOutputOctets-OLD.AcctOutputOctets,updates=updates+1; END IF; END Вставить ник Quote
SokolovS Posted March 12, 2009 Posted March 12, 2009 Можно и так :) У меня все равно за 1 запрос на обновление это делается. Вставить ник Quote
NiTr0 Posted March 20, 2009 Posted March 20, 2009 Этот патч смотрел, до того как создал новый? Спасибо за патч, работает. С патчем в шапке - на CentOS с пересобранным патченным pppd наблюдалась проблемка - по алив-пакету падал туннель... Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.