Небольшая библиотека на D для получения и разбора DHCP-опций на Linux.
Find a file
2026-02-13 01:07:49 +03:00
.vscode init 2026-02-12 23:59:02 +03:00
example Изменены префиксы в именах классов/структур. 2026-02-13 01:07:49 +03:00
source/dhcpop Изменены префиксы в именах классов/структур. 2026-02-13 01:07:49 +03:00
.gitignore init 2026-02-12 23:59:02 +03:00
dub.json init 2026-02-12 23:59:02 +03:00
dub.selections.json init 2026-02-12 23:59:02 +03:00
README.md Изменены префиксы в именах классов/структур. 2026-02-13 01:07:49 +03:00

dhcpop

dhcpop — мини-библиотека на D для получения DHCPACK и извлечения DHCP-опций на Linux.

Возможности

  • Минимальный DHCP DORA: DISCOVER → OFFER → REQUEST → ACK
  • Привязка UDP-сокета к интерфейсу: SO_BINDTODEVICE
  • Поиск опций с учётом Option Overload (52):
    • base options (после cookie)
    • BOOTP поля sname / file как TLV-потоки
  • Поддержка SPACE-опций: значение опции трактуется как TLV поток suboptions
  • Декодирование значений по схеме типов (в стиле ISC DHCP):
    • ip-address, string/text, boolean/flag
    • uint8/16/32, int8/16/32
    • array of [type] (для чисел и ip-address)

Ограничения

  • Lease lifecycle (renew/rebind) не реализован
  • Реализация ориентирована на Linux
  • Используется broadcast 255.255.255.255:67, relay сценарии не покрываются

Требования

  • bind на UDP/68: root или CAP_NET_BIND_SERVICE

Установка (DUB)

Добавить как зависимость:

{
	"dependencies": {
		"dhcpop": {
			"repository": "git+https://git.zhirov.kz/dlang/dhcpop.git",
			"version": "~master"
		}
	}
}

Быстрый пример

import dhcpop;
import core.time : dur;

void main()
{
    // Схема типов для интересующих опций
    DHCPopSchema s;
    s.setOption(131, DHCPopBaseType.text);
    s.setOption(130, DHCPopBaseType.text);
    s.setSubOption(130, 1, DHCPopBaseType.ipAddress);
    s.setSubOption(130, 2, DHCPopBaseType.string_);
    s.setSubOption(130, 3, DHCPopBaseType.string_);

    auto c = new DHCPopOptionsClient("eth0");
    c.setSchema(s);

    DHCPopClientConfig cfg;
    cfg.timeout = dur!"seconds"(3);
    cfg.tries = 3;
    cfg.dump = false;

    // Пример 1: обычная опция 131
    auto r131 = c.fetchOption(131, cfg);
    c.printResult(r131);

    // Пример 2: SPACE опция 130 (parseSpace=true)
    cfg.parseSpace = true;
    auto r130 = c.fetchOption(130, cfg);
    c.printResult(r130);
}

Модули

  • dhcpop.client — объектный API (DHCPopOptionsClient)
  • dhcpop.wire — wire-логика DORA, фильтры xid/mac/cookie, overload-поиск
  • dhcpop.tlv — TLV разбор и поиск
  • dhcpop.schema — схема типов (option + space/suboptions)
  • dhcpop.typedecode — декодирование по схеме
  • dhcpop.textdecode — best-effort декодер текста
  • dhcpop.util — MAC/sysfs, big-endian, ipv4, hex dump
  • dhcpop.types — структуры результата и конфиг

Отладка

Для вывода списка кодов/длин опций в ACK/OFFER:

cfg.dump = true;

Это печатает TLV-коды из base и overload областей (если overload включён сервером).

Лицензия

MIT.