Оба пула заведены с приоритетом по умолчанию 0, может быть из-за этого? Не нашел в доках.2008-10-30 22:37:49 LOG_WARNING: AUTH [foo] NAS: 5 Rejected! There is no free IPs in address pools (USED: 64) CID:
xxx.xxx.xxx
Пулы адресов не учитываются
Пулы адресов не учитываются
У NAS есть два пула адресов (2х32). Но когда 32 юзера в онлайне и хочет войти еще один, то не пускает:
В функции get_ip() нашел странность:
Прежде всего в начале функции:
Второе, гораздо важнее: Если свободный ip не нашелся в одном пуле по $attr->{TP_IPPOOL}, то делается попытка найти его более глобально по $nas_num, для чего ближе к концу совершается рекурсивный вызов к себе же:
И еще: откуда взялся $attr->{TP_POOLS} ? Что в нем? Чувствуется, что вариант, когда у наса несколько пулов - недоработан. Предлагаю заменить последнее выражение на:
Прежде всего в начале функции:
ORDER BY... абсолютно не нужно т.к. выборка идет по primary key и по определению запись будет одна.if ($attr->{TP_IPPOOL}) {
$self->query($db, "SELECT ippools.ip, ippools.counts, ippools.id FROM ippools
WHERE ippools.id='$attr->{TP_IPPOOL}'
ORDER BY ippools.priority;");
}
Второе, гораздо важнее: Если свободный ip не нашелся в одном пуле по $attr->{TP_IPPOOL}, то делается попытка найти его более глобально по $nas_num, для чего ближе к концу совершается рекурсивный вызов к себе же:
Но где return? должно бытьif ($attr->{TP_POOLS}) {
$self->get_ip($nas_num, $nas_ip);
}
Иначе забудется возвращаемое ей значение и вернется последнее return 0; в конце get_ip(). В перле всегда возвращается последнее вычисленное значение или undef, если не было явного return.if ($attr->{TP_POOLS}) {
return $self->get_ip($nas_num, $nas_ip);
}
И еще: откуда взялся $attr->{TP_POOLS} ? Что в нем? Чувствуется, что вариант, когда у наса несколько пулов - недоработан. Предлагаю заменить последнее выражение на:
Защита от бесконечной рекурсии если адрес не был найден по насу тоже.unless (defined $attr->{TP_POOLS}) {
return $self->get_ip($nas_num, $nas_ip, { TP_POOLS => 1 });
}
-
- Site Admin
- Сообщения: 5749
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
Так уж и быть:
Запрос некорректен т.к. в dv_calls есть только nas_id, там нет pool_id. Таким образом, если у nas_id=5 есть 2 пула адресов и в dv_calls сидит например 12 человек с nas_id=5, то ваш запрос вернет 12*2 = 24 сидящих.$self->query($db, "SELECT c.framed_ip_address
FROM (dv_calls c, nas_ippools np)
WHERE c.nas_id=np.nas_id AND np.pool_id in ( $used_pools ) AND (status=1 or status>=3);");
Приоритетность мне была не нужна и поэтому не реализована. В принципе будь это необходимо мне было бы несложно сделать раскидав пулы по разным хешам, в конце пройтись по ним в цикле в порядке убывания приоритета и выделить случайный ip на первом свободном пуле.вы теряете приоритетность пулов