Откровенно говоря я так и не понял ситуацию с giaddr и двумя вланами на коммутаторе.
На всякий случай условная схемка сети
3526 с dhcp relay agent и option 82:
- с клиентами, порты 1-24 untagged в vlan таг 10, скажем подсеть 192.168.1.0/24.
- с dotq транками 25,26 и управляющим vlan таг 20 ip скажем 172.16.0.1/24.
всё это транком упирается в L3 агрегирующий свич откуда далее попадает в сетку где расположен ISC-DHCPD с адресом 10.0.0.1.
Смотрим дампом что попадает на сервер:
dhcp# tcpdump -p -n -vv -s 1500 src host 172.16.0.1
tcpdump: listening on em0, link-type EN10MB (Ethernet), capture size 1500 bytes
Gateway IP: 172.16.0.1
Client Ethernet Address: .........
Vendor-rfc1048:.........
Для тестирования используются конфиги выше по теме, адаптированные под мои адреса.
Итак несколько вариантов развития событий, которые удалось установить эксперементально:
1. Если dhcp сервер вообще не знает о существовании сети с железками, то до логирования по условию "if exists agent.remote-id and exists agent.circuit-id" дело вообще никогда не доходит, что в целом довольно логично, и в лог кладётся unknown network segment.
2. Если dhcp сервер знает "понаслышке" об этой сети ( типа subnet 172.16.0.0 netmask 255.255.255.0 {} ), то сервер откладывает в лог запись по условию, и до кучи network 172.16.0.0/24: no free leases.
3. Если пул для класса клиента запихнуть в subnet адресного пространства управляющего vlan свича, то клиенту отлично выдаётся адрес из 172.16.0.*, разумеется ничего при этом не работает.
4. Ну а если пул для класса клиента находится как и положено в subnet 192.168.1.* то клиенту попросту ничего не выдаётся и всё.
Все глаза себе сломал читая форум как этот, так и другие - тема эта поднималась, но в ответ звучало КОНЕЧНО ВСЁ РАБОТАЕТ

без конеретного примера КАК.
На всякий случай привожу пример как описан класс (используется комбинация IP:Port коммутатора):
class "test_class" {
match if concat(binary-to-ascii(10, 8, ".", packet(24, 4)), ":", binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1))) = "172.16.0.1:24";
}
24 порт выбран потому что dhcpdump при выборе порта ниже 10 просто напрочь сносит мозги ssh putty клиенту, он входит в полный ступор и убивается только как процесс

тоже одна из непостижимых загадок
