Автонастройка url-адреса ACS сервера TR-069 для Wi-Fi роутера через DHCP. Магия кнопки SMART.
Последний способ нас и интересует, так как позволяет ускорить и автоматизировать развёртывание роутеров на базе Wive-NG-HQ.
По умолчанию на CPE демон cwmp отключен. По нажатию кнопки SMART операционная система запускает его. Если перед этим роутер вместе с сетевыми реквизитами получил по DHCP и url-адрес ACS, то cwmp демон подхватывает его и подключается.
Как это работает.

Согласно стандарта TR-069 CPE отправляет обычный запрос DHCP, но в атрибуте Vendor Class Identifier (DHCP option 60 subopt 3561) со строкой “dslforum.org” (string). На это DHCP-сервер может ответить DHCP ACK с атрибутом Vendor Specific Information (DHCP option 43) содержащим CWMP информацию.
Option 43 позволяет DHCP серверу отправлять vendor specific параметры клиенту. В ответе они кодируются в форме код_опции/длина_значения/значение.
RFC 2132 определяет, что серверы DHCP должны возвращать зависящую от поставщика информацию (vendor specific) в виде параметра 43 DHCP. RFC
позволяет поставщикам определять инкапсулировавшие определяемые поставщиком коды подпараметра между 0 и 255.
Все вложенные параметры включены в DHCP ACK в качестве блоков “тип-длина-значение” (TLV, type-length-value) и являются частью параметра 43 DHCP. Определение атрибутов опции и их формата определяется производителем оборудования или в нашем случае стандартом TR-069.
CWMP определяет опцию 43 следующим образом.
Когда серверы DHCP сконфигурированы на предоставление IP-адресов для беспроводных ЛВС в качестве опции 43 DHCP для оборудования с поддержкой cwmp, структура TLV вложенного параметра выглядит следующим образом:
Тип 1 (Option code 1) служит для передачи URL-адреса сервера автоконфигурирования;
Тип 2 (Option code 2) служит для передачи ProvosioningCode
Длина (Length) — число символов ASCII в поле значения.
Значение (Value) — ненулевая завершенная строка ASCII.
DHCPd
Я использую isc-dhcp сервер, поэтому настройки будут для него.
Типичный способ передачи опций это использование параметра option vendor-encapsulated-options.
Например для url http://acs.me.com эта опция будет выглядеть так:
option vendor-encapsulated-options 01:11:68:74:74:70:3A:2F:2F:61:63:73:2E:6D:65:2E:63:6F:6D;
01 – Тип 1 в hex.
11 – Длина url 17 знаков в hex.
“всё остальное” – url в hex.
Достаточно просто и тривиально.
Но было лень перекодировать, поэтому используем функциональность “option-space” isc-dhcpd сервера. Пусть сам закодирует как ему нужно:
option space tr069;
option tr069.acs-server code 1 = text;
option tr069.provisioning-code code 2 = text;
subnet 10.40.0.0 netmask 255.255.255.0 {
option routers 10.40.0.1;
range 10.40.0.50 10.40.0.254;
option domain-name-servers 77.88.8.2, 77.88.8.3;
vendor-option-space tr069;
option tr069.acs-server "http://10.40.0.40:7547";
# option tr069.provisioning.code "";
# solution from Tenda&Co surprises
# append dhcp-parameter-request-list 43;
}
Применяем конфиг и можно проверять.
Для чистоты эксперимента роутер сброшен до настроек по умолчанию и удалён из ACS. Нажимаем на кнопку SMART на роутере с заводскими настройками и он появляется во вкладке “Devices” GenieACS сервера. Далее можно либо в ручную либо автоматически его настраивать.
Заметки.
Не все беспроводные маршрутизаторы работают по стандарту, даже если “реализован” или “заявлен” TR-069. Особенно это относится к программному коду азиатских коллег. Роутер может не отправлять запрос на опцию 43 в DHCP REQUEST и соответственно останется без управления.
Лекарство – принудительная отправка cwmp артибутов option 43 в OFFER/ACK:
# solution from Tenda&Co surprises
append dhcp-parameter-request-list 43;
При желании можно привязать выдачу атрибутов к конкретному оборудованию по vendor-class-identifier:
class "Wive-NG-HQ" {
match if option vendor-class-identifier = "Wive-NG-HQ";
option vendor-class-identifier "Wive-NG-HQ";
vendor-option-space tr069;
option tr069.acs-server "http://10.40.0.40:7547";
}
class "SNR-CPE" {
match if option vendor-class-identifier = "SNR-CPE";
option vendor-class-identifier "SNR-CPE";
vendor-option-space tr069;
option tr069.acs-server "http://10.40.0.40:7547";
append dhcp-parameter-request-list 43;
}
Или такой вариант первоначального конфига:
subnet 10.40.0.0 netmask 255.255.255.0 {
option domain-name "local";
option routers 10.40.0.1;
range 10.40.0.50 10.40.0.254;
option domain-name-servers 77.88.8.2, 77.88.8.3;
# Wive-NG-HQ
if ( option vendor-class-identifier = "Wive-NG-HQ" ) {
vendor-option-space tr069;
option tr069.acs-server "http://10.40.0.40:7547";
}
# SNR-CPE, TEnda etc
elsif ( substring (option vendor-class-identifier, 0, 3) = "SNR" or substring (option vendor-class-identifier, 0, 5) = "Tenda" ) {
vendor-option-space tr069;
option tr069.acs-server "http://10.40.0.40:7547";
append dhcp-parameter-request-list 43;
}
# all other're going to the sandbox. aliens!
else {
option routers 10.40.0.2;
option domain-name-servers 10.40.0.2;
}
...
}
Значения vendor-class-identifier можно посмотреть через tcpdump (option 60).
В GenieACS в версии 1.2.1 изменился формат взаимодействия с устройствами что к падениям клиента cwmp. Данная проблема исправлена в Wive-NG-HQ версии 2.9.1.
