nfqws и nfqws2 изначально строились на одной единственной событийной модели
процесс ждет пакет с перехвата и запускает обработку полученных данных. цикл повторяется.
единственное событие, способное привести процесс к активным действиям, это получение перехваченного пакета из сети. Сюда еще можно добавить некоторые unix сигналы, которые инициируют определенные действия.
Если посмотреть на tcp/ip стек ОС, то для реализации, скажем, tcp этой модели недостаточно.
Необходимо обрабатывать таймауты. Что-то послали, но не получили ожидаемого ответа в отведенный интервал времени. Следовательно, в событийной модели нужен таймер.
Именно это и было добавлено в nfqws2, чтобы он перестал быть только лишь пассивным слушателем и отвечателем. Все достаточно просто
timer_set(name, func, period, oneshot, data) - запустить таймер
timer_del(name) - удалить таймер
func(name,data) - таймер функция. получает name и data, заданные в timer_set
period задается в миллисекундах.
разрешение таймеров задается в параметре --timer-res. По умолчанию 50 мсек, но можно уменьшить до 10.
Если oneshot=true, вызов происходит 1 раз и таймер удаляется автоматически. Иначе дергается каждые period мсек.
data - произвольный обьект, который передается таймеру. может быть таблицей, в которой значения могут меняться самим таймером
name - уникальный идентификатор - имя таймера. при дублировании вызывается error
В режиме --intercept=0 после выполнения фазы lua-init обработка входит в цикл ожидания таймеров, пока они есть. Когда их не становится - процесс выходит
Никаких прямых sleep не предусмотрено - это сломает асинхронную обработку и повесит очередь. Только через события в стиле конечного автомата. Состояние автомата может включать data и глобальные переменные.
timer_set и timer_del можно вызывать из самих таймеров в том числе и в отношении самих себя
зачем это все делается
чтобы можно было реализовать практически любые сценарии обмена raw пакетами.
любая идея. спуф IP, портов, протоколов, разделение upstream и downstream, самостоятельная инциация обмена данными, отложенные во времени реакции. чтобы оно не зависло, если кто-то не отвечает, не плодило повисшие наборы данных в памяти
уже есть функции для получения ifconfig текущей системы и определения source ip для отправки в сторону dest ip. то есть вы можете сразу в lua init начать что-то делать, слать пакеты, а в intercept и timer ждать реакции от сети
если не получилось - можно по таймауту повторить. куда-то долбиться, подключаться