За значение CoS отвечают три старших бита из четырех байт 802.1q тэга. Как правильно матчить значение CoS в tcpdump?
Можно матчить байт по смещению 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 спасибо
filonov за подсказку:
Три старших бита можно либо выделить сдвигом
ether[0x000e] >> 5
либо обнулить остальные биты
ether[0x000e] & 0xe0
Со сдвигом проще потом работать с результатом. ибо старшие биты сдвигаются в младшие, и результат получается от 0 до 7.Т.е. CoS=5 ловим выражением 'ether[0x000e] >> 5 == 0x05' либо 'ether[0x000e] & 0xe0 == 0xa0'