Использование LUA для формирования имени пользователя на основе DHCP пакета

Для этого необходимо:

    собрать accel-ppp с поддержкой lua: cmake -DLUA=TRUE
    в кофиге указать:

     [ipoe]
     lua-file=имя_файла
     username=lua:имя_функции

    например

     [ipoe]
     lua-file=/etc/accel-ppp.lua
     username=lua:username

    в /etc/accel-ppp.lua пишем:

    function username(pkt)
        v,b1,b2,b3,b4=string.unpack(pkt:agent_remote_id():sub(-4),'bbbb')
        ip=b1..'.'..b2..'.'..b3..'.'..b4
        v,port=string.unpack(string.sub(pkt:agent_circuit_id(),'-1'),'b')
        local username=ip..'-'..port
    --    print(username)
        return username
    end

этот скрипт подходит для разбора опции 82 коммутаторов Dlink.

Объект pkt имеет следующие функции:

hdr(name)
    Возвращает значение поля в заголовке пакета DHCP
    name может принимать следующие значения: xid, ciaddr, giaddr, chaddr. 
ifname()
    Возвращает имя интерфейса принявшего пакет. 
options()
    Возвращает таблицу содержащую номера DHCP опций в принятом пакете. 
option(num)
    Возвращает значение опции с номером num. 
agent_circuit_id()
    Возвращает значение agent_circuit_id опции 82. 
agent_remote_id()
    Возвращает значение agent_remote_id опции 82. 

Все функции за исключением options() возвращают string.

Так-же для удобства разбора бинарных данных в состав accel-ppp включен пакет lpack
Он добавляет к объекту string дополнительную функцию unpack(binary, fmt), где binary -
это строка содержащая бинарные данные, а fmt - формат этих данных. В fmt можно указать
следующие типы данных:

z - zero terminated string
p - string precended by length byte
P - string precended by length word
f - float
d - double
c - int8_t
b - uint8_t
h - int16_t
H - uint16_t
i - int32_t
I - uint32_t
l - int64_t
L - uint64_t
< - little endian
> - big endian
= - native endian
