Здравствуйте!Есть у меня простенькая задача, на тестовом стенде сымитировать формат отправляемого пакета, для выяснения причин неработоспособности оборудования на продакшен-сети.
Стенд собран на freebsd
$ uname -srm
FreeBSD 11.0-STABLE i386
В состав входит ISC-DHCP
$ pkg info | grep isc-dhcp
isc-dhcp43-server-4.3.5 ISC Dynamic Host Configuration Protocol server
В частности сейчас передо мной стоит задача установить флаг DontFragment заголовка IP (старшие три бита в 7-ом байте от начала IP заголовка) в отправляемом DHCP пакете.
За основу беру пример из man ng_patch, но у меня на выходе ничего не модифицируется.
В частности ng_patch ниразу не срабатывает. (Самое ужасное, что не срабатывает и ни один из примеров из МАНа)
Мною проделано следующее:
sudo /usr/sbin/ngctl -f- <<-SEQ
mkpeer ipfw: patch 1 in
name ipfw:1 SET_DF
msg SET_DF: setconfig { count=2 csum_flags=1 ops=[ \
{ mode=7 value=0x1f length=1 offset=6 } \
{ mode=8 value=0x40 length=1 offset=6 } ] }
SEQsudo sysctl net.link.ether.ipfw=1
sudo sysctl net.inet.ip.fw.one_pass=0
sudo /sbin/ipfw add 150 netgraph 1 proto udp src-port 67 out xmit em1.512
И не смотря на то что правило 150 ловит пакеты, сам патч не срабатывает:
sudo /usr/sbin/ngctl msg ttl_add: getstats
Rec'd response "getstats" (3) from "[19]:":
Args: {}
и на выходе неизмененные пакеты.
Вместе с тем, такой нижеследующий скрипт меняет байты в исходящих пакетах, но естественно во всех без разбора, что неверно:
sudo /usr/sbin/ngctl -f- <<-SEQ
mkpeer em1_512: patch upper in
name em1_512:upper SET_DF
connect em1_512: SET_DF: lower out
msg SET_DF: setconfig { count=2 csum_flags=1 ops=[ \
{ mode=7 value=0x1f length=1 offset=20 } \
{ mode=8 value=0x40 length=1 offset=20 } ] }
SEQ
Подскажите, что упустил, где ошибся?