86890704fd
todo: add documentation & wireshark dissector
653 lines
20 KiB
Text
Executable file
653 lines
20 KiB
Text
Executable file
% TZSP test campaign
|
|
|
|
#
|
|
# execute test:
|
|
# > test/run_tests -P "load_contrib('tzsp')" -t scapy/contrib/tzsp.uts
|
|
#
|
|
|
|
+ Basic layer handling
|
|
|
|
= build basic TZSP frames
|
|
|
|
== basic TZSP header - keepalive
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \
|
|
IP(src='1.1.1.1', dst='2.2.2.2')/ \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \
|
|
TZSP(type=TZSP.TYPE_KEEPALIVE, encapsulated_protocol=0)
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_KEEPALIVE)
|
|
assert(not tzsp_lyr.payload)
|
|
|
|
== basic TZSP header - keepalive + ignored end tag
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \
|
|
IP(src='1.1.1.1', dst='2.2.2.2')/ \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \
|
|
TZSP(type=TZSP.TYPE_KEEPALIVE, encapsulated_protocol=0)/ \
|
|
TZSPTagEnd()
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_KEEPALIVE)
|
|
assert(tzsp_lyr.guess_payload_class(tzsp_lyr.payload) is scapy.packet.Raw)
|
|
|
|
== basic TZSP header with RX Packet and EndTag
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_end = tzsp_lyr.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
encapsulated_payload = tzsp_lyr.get_encapsulated_payload()
|
|
encapsulated_ether_lyr = encapsulated_payload.getlayer(Ether)
|
|
assert(encapsulated_ether_lyr.src == '00:03:03:03:03:03')
|
|
|
|
== basic TZSP header with RX Packet and Padding
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagPadding() / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_padding = tzsp_lyr.payload
|
|
assert(tzsp_tag_padding.type == 0)
|
|
|
|
tzsp_tag_end = tzsp_tag_padding.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== basic TZSP header with RX Packet and RAWRSSI (byte, short)
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagRawRSSIByte(raw_rssi=42) / \
|
|
TZSPTagRawRSSIShort(raw_rssi=12345) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_raw_rssi_byte = tzsp_lyr.payload
|
|
assert(tzsp_tag_raw_rssi_byte.type == 10)
|
|
assert(tzsp_tag_raw_rssi_byte.raw_rssi == 42)
|
|
|
|
tzsp_tag_raw_rssi_short = tzsp_tag_raw_rssi_byte.payload
|
|
assert(tzsp_tag_raw_rssi_short.type == 10)
|
|
assert(tzsp_tag_raw_rssi_short.raw_rssi == 12345)
|
|
|
|
tzsp_tag_end = tzsp_tag_raw_rssi_short.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== basic TZSP header with RX Packet and SNR (byte, short)
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagSNRByte(snr=23) / \
|
|
TZSPTagSNRShort(snr=54321) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_snr_byte = tzsp_lyr.payload
|
|
assert(tzsp_tag_snr_byte.type == 11)
|
|
assert(tzsp_tag_snr_byte.len == 1)
|
|
assert(tzsp_tag_snr_byte.snr == 23)
|
|
|
|
tzsp_tag_snr_short = tzsp_tag_snr_byte.payload
|
|
assert(tzsp_tag_snr_short.type == 11)
|
|
assert(tzsp_tag_snr_short.len == 2)
|
|
assert(tzsp_tag_snr_short.snr == 54321)
|
|
|
|
tzsp_tag_end = tzsp_tag_snr_short.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== basic TZSP header with RX Packet and DATA Rate
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagDataRate(data_rate=TZSPTagDataRate.DATA_RATE_33) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_data_rate = tzsp_lyr.payload
|
|
assert(tzsp_tag_data_rate.type == 12)
|
|
assert(tzsp_tag_data_rate.len == 1)
|
|
assert(tzsp_tag_data_rate.data_rate == TZSPTagDataRate.DATA_RATE_33)
|
|
|
|
tzsp_tag_end = tzsp_tag_data_rate.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== basic TZSP header with RX Packet and Timestamp
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagTimestamp(timestamp=0x11223344) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_timestamp = tzsp_lyr.payload
|
|
assert(tzsp_tag_timestamp.type == 13)
|
|
assert(tzsp_tag_timestamp.len == 4)
|
|
assert(tzsp_tag_timestamp.timestamp == 0x11223344)
|
|
|
|
tzsp_tag_end = tzsp_tag_timestamp.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== basic TZSP header with RX Packet and ContentionFree
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagContentionFree(contention_free=TZSPTagContentionFree.NO) / \
|
|
TZSPTagContentionFree(contention_free=TZSPTagContentionFree.YES) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_contention_free_no = tzsp_lyr.payload
|
|
assert(tzsp_tag_contention_free_no.type == 15)
|
|
assert(tzsp_tag_contention_free_no.len == 1)
|
|
assert(tzsp_tag_contention_free_no.contention_free == TZSPTagContentionFree.NO)
|
|
|
|
tzsp_tag_contention_free_yes = tzsp_tag_contention_free_no.payload
|
|
assert(tzsp_tag_contention_free_yes.type == 15)
|
|
assert(tzsp_tag_contention_free_yes.len == 1)
|
|
assert(tzsp_tag_contention_free_yes.contention_free == TZSPTagContentionFree.YES)
|
|
|
|
tzsp_tag_end = tzsp_tag_contention_free_yes.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== basic TZSP header with RX Packet and Decrypted
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagDecrypted(decrypted=TZSPTagDecrypted.NO) / \
|
|
TZSPTagDecrypted(decrypted=TZSPTagDecrypted.YES) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_decrypted_no = tzsp_lyr.payload
|
|
assert(tzsp_tag_decrypted_no.type == 16)
|
|
assert(tzsp_tag_decrypted_no.len == 1)
|
|
assert(tzsp_tag_decrypted_no.decrypted == TZSPTagDecrypted.NO)
|
|
|
|
tzsp_tag_decrypted_yes= tzsp_tag_decrypted_no.payload
|
|
assert(tzsp_tag_decrypted_yes.type == 16)
|
|
assert(tzsp_tag_decrypted_yes.len == 1)
|
|
assert(tzsp_tag_decrypted_yes.decrypted == TZSPTagDecrypted.YES)
|
|
|
|
tzsp_tag_end = tzsp_tag_decrypted_yes.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== basic TZSP header with RX Packet and FCS error
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagError(fcs_error=TZSPTagError.NO) / \
|
|
TZSPTagError(fcs_error=TZSPTagError.YES) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_error_no = tzsp_lyr.payload
|
|
assert(tzsp_tag_error_no.type == 17)
|
|
assert(tzsp_tag_error_no.len == 1)
|
|
assert(tzsp_tag_error_no.fcs_error == TZSPTagError.NO)
|
|
|
|
tzsp_tag_error_yes = tzsp_tag_error_no.payload
|
|
assert(tzsp_tag_error_yes.type == 17)
|
|
assert(tzsp_tag_error_yes.len == 1)
|
|
assert(tzsp_tag_error_yes.fcs_error == TZSPTagError.YES)
|
|
|
|
tzsp_tag_end = tzsp_tag_error_yes.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== basic TZSP header with RX Packet and RXChannel
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagRXChannel(rx_channel=123) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_rx_channel = tzsp_lyr.payload
|
|
assert(tzsp_tag_rx_channel.type == 18)
|
|
assert(tzsp_tag_rx_channel.len == 1)
|
|
assert(tzsp_tag_rx_channel.rx_channel == 123)
|
|
|
|
tzsp_tag_end = tzsp_tag_rx_channel.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== basic TZSP header with RX Packet and Packet count
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagPacketCount(packet_count=0x44332211) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_packet_count = tzsp_lyr.payload
|
|
assert(tzsp_tag_packet_count.type == 40)
|
|
assert(tzsp_tag_packet_count.len == 4)
|
|
assert(tzsp_tag_packet_count.packet_count == 0x44332211)
|
|
|
|
tzsp_tag_end = tzsp_tag_packet_count.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== basic TZSP header with RX Packet and RXFrameLength
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagRXFrameLength(rx_frame_length=0xbad0) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_frame_length = tzsp_lyr.payload
|
|
assert(tzsp_tag_frame_length.type == 41)
|
|
assert(tzsp_tag_frame_length.len == 2)
|
|
assert(tzsp_tag_frame_length.rx_frame_length == 0xbad0)
|
|
|
|
tzsp_tag_end = tzsp_tag_frame_length.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== basic TZSP header with RX Packet and WLAN RADIO HDR SERIAL
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
SENSOR_ID = b'1E:AT:DE:AD:BE:EF'
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagWlanRadioHdrSerial(sensor_id=SENSOR_ID) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr.type == TZSP.TYPE_RX_PACKET)
|
|
|
|
tzsp_tag_sensor_id = tzsp_lyr.payload
|
|
assert(tzsp_tag_sensor_id.type == 60)
|
|
assert(tzsp_tag_sensor_id.len == len(SENSOR_ID))
|
|
assert(tzsp_tag_sensor_id.sensor_id == SENSOR_ID)
|
|
|
|
tzsp_tag_end = tzsp_tag_sensor_id.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
== handling of unknown tag
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
SENSOR_ID = b'1E:AT:DE:AD:BE:EF'
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagUnknown(len=6, data=b'\x06\x05\x04\x03\x02\x01') / \
|
|
TZSPTagWlanRadioHdrSerial(sensor_id=SENSOR_ID) / \
|
|
TZSPTagEnd() / \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \
|
|
Raw('foobar')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr)
|
|
tzsp_tag_unknown = tzsp_lyr.payload
|
|
assert(type(tzsp_tag_unknown) is TZSPTagUnknown)
|
|
|
|
= all layers stacked
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \
|
|
IP(src='1.1.1.1', dst='2.2.2.2')/ \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \
|
|
TZSP()/ \
|
|
TZSPTagRawRSSIByte(raw_rssi=12)/ \
|
|
TZSPTagRawRSSIShort(raw_rssi=1234)/ \
|
|
TZSPTagSNRByte(snr=12)/ \
|
|
TZSPTagSNRShort(snr=1234)/ \
|
|
TZSPTagDataRate(data_rate = TZSPTagDataRate.DATA_RATE_54)/ \
|
|
TZSPTagTimestamp(timestamp=12345)/ \
|
|
TZSPTagContentionFree(contention_free = TZSPTagContentionFree.NO)/ \
|
|
TZSPTagContentionFree(contention_free = TZSPTagContentionFree.YES)/ \
|
|
TZSPTagDecrypted(decrypted=TZSPTagDecrypted.NO)/ \
|
|
TZSPTagDecrypted(decrypted=TZSPTagDecrypted.YES)/ \
|
|
TZSPTagError(fcs_error = TZSPTagError.YES)/ \
|
|
TZSPTagError(fcs_error = TZSPTagError.NO)/ \
|
|
TZSPTagRXChannel(rx_channel = 42)/ \
|
|
TZSPTagPacketCount(packet_count = 987654)/ \
|
|
TZSPTagRXFrameLength(rx_frame_length = 0x0bad)/ \
|
|
TZSPTagWlanRadioHdrSerial(sensor_id = 'foobar')/ \
|
|
TZSPTagPadding()/ \
|
|
TZSPTagEnd()/ \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04')/ \
|
|
ARP()
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
|
|
tzsp_raw_rssi_byte_lyr = tzsp_lyr.payload
|
|
assert(tzsp_raw_rssi_byte_lyr.type == 10)
|
|
|
|
tzsp_tag_raw_rssi_short = tzsp_raw_rssi_byte_lyr.payload
|
|
assert(tzsp_tag_raw_rssi_short.type == 10)
|
|
|
|
tzsp_tag_snr_byte = tzsp_tag_raw_rssi_short.payload
|
|
assert(tzsp_tag_snr_byte.type == 11)
|
|
|
|
tzsp_tag_snr_short = tzsp_tag_snr_byte.payload
|
|
assert(tzsp_tag_snr_short.type == 11)
|
|
|
|
tzsp_tag_data_rate = tzsp_tag_snr_short.payload
|
|
assert(tzsp_tag_data_rate.type == 12)
|
|
|
|
tzsp_tag_timestamp = tzsp_tag_data_rate.payload
|
|
assert(tzsp_tag_timestamp.type == 13)
|
|
|
|
tzsp_tag_contention_free_no = tzsp_tag_timestamp.payload
|
|
assert(tzsp_tag_contention_free_no.type == 15)
|
|
|
|
tzsp_tag_contention_free_yes = tzsp_tag_contention_free_no.payload
|
|
assert(tzsp_tag_contention_free_yes.type == 15)
|
|
|
|
tzsp_tag_decrypted_no = tzsp_tag_contention_free_yes.payload
|
|
assert(tzsp_tag_decrypted_no.type == 16)
|
|
|
|
tzsp_tag_decrypted_yes = tzsp_tag_decrypted_no.payload
|
|
assert(tzsp_tag_decrypted_yes.type == 16)
|
|
|
|
tzsp_tag_error_yes = tzsp_tag_decrypted_yes.payload
|
|
assert(tzsp_tag_error_yes.type == 17)
|
|
|
|
tzsp_tag_error_no = tzsp_tag_error_yes.payload
|
|
assert(tzsp_tag_error_no.type == 17)
|
|
|
|
tzsp_tag_rx_channel = tzsp_tag_error_no.payload
|
|
assert(tzsp_tag_rx_channel.type == 18)
|
|
|
|
tzsp_tag_packet_count = tzsp_tag_rx_channel.payload
|
|
assert(tzsp_tag_packet_count.type == 40)
|
|
|
|
tzsp_tag_frame_length = tzsp_tag_packet_count.payload
|
|
assert(tzsp_tag_frame_length.type == 41)
|
|
|
|
tzsp_tag_sensor_id = tzsp_tag_frame_length.payload
|
|
assert(tzsp_tag_sensor_id.type == 60)
|
|
|
|
tzsp_tag_padding = tzsp_tag_sensor_id.payload
|
|
assert(tzsp_tag_padding.type == 0)
|
|
|
|
tzsp_tag_end = tzsp_tag_padding.payload
|
|
assert(tzsp_tag_end.type == 1)
|
|
|
|
encapsulated_payload = tzsp_tag_end.payload
|
|
encapsulated_ether_lyr = encapsulated_payload.getlayer(Ether)
|
|
assert(encapsulated_ether_lyr.src == '00:03:03:03:03:03')
|
|
|
|
+ corner cases
|
|
|
|
= state tags value range
|
|
|
|
== TZSPTagContentionFree
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \
|
|
IP(src='1.1.1.1', dst='2.2.2.2')/ \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \
|
|
TZSP()/ \
|
|
TZSPTagContentionFree(contention_free = 0xff)/ \
|
|
TZSPTagEnd()
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_tag_contention_free = frm.getlayer(TZSPTagContentionFree)
|
|
assert(tzsp_tag_contention_free)
|
|
tzsp_tag_contention_free_attr = tzsp_tag_contention_free.get_field('contention_free')
|
|
assert(tzsp_tag_contention_free_attr)
|
|
symb_str = tzsp_tag_contention_free_attr.i2repr(tzsp_tag_contention_free, tzsp_tag_contention_free.contention_free)
|
|
assert(symb_str == 'yes')
|
|
|
|
== TZSPTagError
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \
|
|
IP(src='1.1.1.1', dst='2.2.2.2')/ \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \
|
|
TZSP()/ \
|
|
TZSPTagError(fcs_error=TZSPTagError.NO)/ \
|
|
TZSPTagEnd()
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_tag_error = frm.getlayer(TZSPTagError)
|
|
assert(tzsp_tag_error)
|
|
tzsp_tag_error_attr = tzsp_tag_error.get_field('fcs_error')
|
|
assert(tzsp_tag_error_attr)
|
|
symb_str = tzsp_tag_error_attr.i2repr(tzsp_tag_error, tzsp_tag_error.fcs_error)
|
|
assert(symb_str == 'no')
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \
|
|
IP(src='1.1.1.1', dst='2.2.2.2')/ \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \
|
|
TZSP()/ \
|
|
TZSPTagError(fcs_error=TZSPTagError.YES + 1)/ \
|
|
TZSPTagEnd()
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
tzsp_tag_error = frm.getlayer(TZSPTagError)
|
|
assert(tzsp_tag_error)
|
|
tzsp_tag_error_attr = tzsp_tag_error.get_field('fcs_error')
|
|
assert(tzsp_tag_error_attr)
|
|
symb_str = tzsp_tag_error_attr.i2repr(tzsp_tag_error, tzsp_tag_error.fcs_error)
|
|
assert(symb_str == 'reserved')
|
|
|
|
== missing TZSP header before end tag
|
|
|
|
frm = TZSPTagEnd()/ \
|
|
Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04')/ \
|
|
ARP()
|
|
|
|
frm = frm.build()
|
|
try:
|
|
frm = TZSPTagEnd(frm)
|
|
assert False
|
|
except TZSPStructureException:
|
|
pass
|
|
|
|
== invalid length field for given tag
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
TZSPTagRawRSSIByte(len=3) / \
|
|
TZSPTagEnd()
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(type(tzsp_lyr.payload) is Raw )
|
|
|
|
== handling of unknown tag - payload to short
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
SENSOR_ID = '1E:AT:DE:AD:BE:EF'
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
Raw(b'\xff\x0a\x01\x02\x03\x04\x05')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
frm.show()
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr)
|
|
raw_lyr = tzsp_lyr.payload
|
|
assert(type(raw_lyr) is Raw)
|
|
assert(raw_lyr.load == b'\xff\x0a\x01\x02\x03\x04\x05')
|
|
|
|
== handling of unknown tag - no payload after tag type
|
|
|
|
bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)
|
|
|
|
SENSOR_ID = '1E:AT:DE:AD:BE:EF'
|
|
|
|
frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \
|
|
IP(src='1.1.1.1', dst='2.2.2.2') / \
|
|
UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \
|
|
TZSP() / \
|
|
Raw(b'\xff')
|
|
|
|
frm = frm.build()
|
|
frm = Ether(frm)
|
|
|
|
tzsp_lyr = frm.getlayer(TZSP)
|
|
assert(tzsp_lyr)
|
|
raw_lyr = tzsp_lyr.payload
|
|
assert(type(raw_lyr) is Raw)
|
|
assert(raw_lyr.load == b'\xff')
|