Jun. 14th, 2015
tcpdump и 802.1p
Jun. 14th, 2015 10:30 amЗа значение CoS отвечают три старших бита из четырех байт 802.1q тэга. Как правильно матчить значение CoS в tcpdump?
Можно матчить байт по смещению 0x000e, например "tcpdump -v -s0 'ether[0x000e] == 0xA0'" будет ловить кадры с CoS=5. Соответственно
Но эти выражения работают только при условии CFN=0 и номер vlan <= 255. С другой стороны, размер участка для сравнения в pcap-filter(7) может быть только кратным 1 байту (точнее 1, 2 или 4 байта).
Может с помощью битовых операторов можно сделать сравнение только по 3 старшим битам байта? Не могу сообразить как.
UPD спасибо
filonov за подсказку:
Три старших бита можно либо выделить сдвигом
ether[0x000e] >> 5
либо обнулить остальные биты
ether[0x000e] & 0xe0
Со сдвигом проще потом работать с результатом. ибо старшие биты сдвигаются в младшие, и результат получается от 0 до 7.
Т.е. CoS=5 ловим выражением 'ether[0x000e] >> 5 == 0x05' либо 'ether[0x000e] & 0xe0 == 0xa0'
Можно матчить байт по смещению 0x000e, например "tcpdump -v -s0 'ether[0x000e] == 0xA0'" будет ловить кадры с CoS=5. Соответственно
CoS=0 'ether[0x000e] == 0x00' CoS=1 'ether[0x000e] == 0x20' CoS=2 'ether[0x000e] == 0x40' CoS=3 'ether[0x000e] == 0x60' CoS=4 'ether[0x000e] == 0x80' CoS=5 'ether[0x000e] == 0xa0' CoS=6 'ether[0x000e] == 0xc0' CoS=7 'ether[0x000e] == 0xe0'
Но эти выражения работают только при условии CFN=0 и номер vlan <= 255. С другой стороны, размер участка для сравнения в pcap-filter(7) может быть только кратным 1 байту (точнее 1, 2 или 4 байта).
Может с помощью битовых операторов можно сделать сравнение только по 3 старшим битам байта? Не могу сообразить как.
UPD спасибо
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Три старших бита можно либо выделить сдвигом
ether[0x000e] >> 5
либо обнулить остальные биты
ether[0x000e] & 0xe0
Со сдвигом проще потом работать с результатом. ибо старшие биты сдвигаются в младшие, и результат получается от 0 до 7.
Т.е. CoS=5 ловим выражением 'ether[0x000e] >> 5 == 0x05' либо 'ether[0x000e] & 0xe0 == 0xa0'