#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Wireshark ASTERIX dissector tests # By Atli Guðmundsson # # SPDX-License-Identifier: GPL-2.0-or-later # '''ASTERIX dissector tests''' # Standard modules import inspect # Wireshark modules import fixtures import subprocesstest from suite_dissectors.dissectorstest import * @fixtures.mark_usefixtures('test_env') @fixtures.uses_fixtures class case_asterix(subprocesstest.SubprocessTestCase): def test_for_asterix(self, dissection_validator): '''Verifies that the asterix dissector is installed and accessible''' tester = dissection_validator('asterix') tester.add_dissection( [0x13, 0x00, 0x03], { "asterix.category": "19", "asterix.length": "3" } ) tester.check_dissections() class _asterix_validator_real: def __init__(self, category, dissection_validator): self.category = category self.validator = dissection_validator("asterix") def add_dissection(self, byte_list, field, expected_message, line_no=None): '''pre-wrap asterix category messages with proper asterix structure''' total_length = len(byte_list) + 3 byte_list = [ self.category, (total_length // 256) % 256, total_length % 256 ] + byte_list expected_result = { "asterix.category": "{}".format(self.category), "asterix.length": "{}".format(total_length), "asterix.message": { "asterix.fspec": "", field: expected_message } } if line_no is None: caller = inspect.getframeinfo(inspect.stack()[1][0]) line_no = caller.lineno self.validator.add_dissection(byte_list, expected_result, line_no) def check_dissections(self): self.validator.check_dissections() @fixtures.fixture def asterix_validator(dissection_validator): def generate_asterix_validator(category): retval = _asterix_validator_real(category, dissection_validator) return retval return generate_asterix_validator class _asterix_re_validator_real(_asterix_validator_real): def __init__(self, category, re_byte_list, dissection_validator): super().__init__(category, dissection_validator) self.re_byte_list = re_byte_list def add_re_dissection(self, byte_list, field, expected_message, line_no=None): '''pre-wrap asterix RE messages with proper asterix RE structure''' re_length = len(byte_list) + 1 byte_list = self.re_byte_list + [ re_length % 256 ] + byte_list expected_result = { "asterix.re_field_len": "{}".format(re_length), "asterix.fspec": "", "asterix.{:03}_RE_{}".format(self.category, field): expected_message } if line_no is None: caller = inspect.getframeinfo(inspect.stack()[1][0]) line_no = caller.lineno self.add_dissection(byte_list, "asterix.{:03}_RE".format( self.category), expected_result, line_no) @fixtures.fixture def asterix_re_validator(dissection_validator): def generate_re_asterix_validator(category, re_byte_list): retval = _asterix_re_validator_real( category, re_byte_list, dissection_validator) return retval return generate_re_asterix_validator def fspec_local(key, idx, value): result = { "asterix.fspec": "", "asterix.{}".format(key): { "asterix.{}_{}".format(key, idx): value } } return result def fspec_global(key, idx, value): result = { "asterix.fspec": "", "asterix.{}".format(key): { "asterix.{}".format(idx): value } } return result def dict_local(vmap, key, idx, value): result = vmap.copy() result["asterix.{}_{}".format(key, idx)] = value return result def dict_global(vmap, key, value): result = vmap.copy() result["asterix.{}".format(key)] = value return result def dict_fspec_local(vmap, key, idx, value): result = { "asterix.fspec": "", "asterix.{}".format(key): dict_local(vmap, key, idx, value) } return result def dict_fspec_global(vmap, key, idx, value): result = { "asterix.fspec": "", "asterix.{}".format(key): dict_global(vmap, idx, value) } return result def counter_local(vmap, counter, key, idx, value): result = { "asterix.fspec": "", "asterix.{}".format(key): { "asterix.counter": counter, "asterix.{}".format(key): dict_local(vmap, key, idx, value) } } return result @fixtures.mark_usefixtures('test_env') @fixtures.uses_fixtures class case_category_019(subprocesstest.SubprocessTestCase): ''' Unittest case for ASTERIX Category 019 Online specification: https://www.eurocontrol.int/publications/cat019-multilateration-system-status-messages-part-18 Part 18 : Category 019 (1.3) Multilateration System Status Messages Standard User Application Profile FRN Data Item Information Length 1 I019/010 Data Source Identifier 2 2 I019/000 Message Type 1 3 I019/140 Time of Day 3 4 I019/550 System Status 1 5 I019/551 Tracking Processor Detailed Status 1 6 I019/552 Remote Sensor Detailed Status 1+ 7 I019/553 Reference Transponder Detailed Status 1+ FX - Field Extension Indicator - 8 I019/600 Position of the MLT System Reference point 8 9 I019/610 Height of the MLT System Reference point 2 10 I019/620 WGS-84 Undulation 1 11 - Spare - 12 - Spare - 13 RE Reserved Expansion Field - 14 SP Special Purpose Field - FX - Field Extension Indicator - ''' maxDiff = None def test_for_fields(self, asterix_validator): '''verifies existence of all fields and their maximum value''' validator = asterix_validator(19) validator.add_dissection( [0x80, 0xff, 0x00], "asterix.019_010", { "asterix.SAC": "255", "asterix.SIC": "0" } ) validator.add_dissection( [0x80, 0x00, 0xff], "asterix.019_010", { "asterix.SAC": "0", "asterix.SIC": "255" } ) validator.add_dissection( [0x40, 0x03], "asterix.019_000", { "asterix.019_000_MT": "3" } ) validator.add_dissection( [0x20, 0xa8, 0xbf, 0xff], "asterix.019_140", { "asterix.TOD": "86399.9921875" } ) validator.add_dissection( [0x10, 0xc0], "asterix.019_550", { "asterix.019_550_NOGO": "3", "asterix.019_550_OVL": "0", "asterix.019_550_TSV": "0", "asterix.019_550_TTF": "0" } ) validator.add_dissection( [0x10, 0x20], "asterix.019_550", { "asterix.019_550_NOGO": "0", "asterix.019_550_OVL": "1", "asterix.019_550_TSV": "0", "asterix.019_550_TTF": "0" } ) validator.add_dissection( [0x10, 0x10], "asterix.019_550", { "asterix.019_550_NOGO": "0", "asterix.019_550_OVL": "0", "asterix.019_550_TSV": "1", "asterix.019_550_TTF": "0" } ) validator.add_dissection( [0x10, 0x08], "asterix.019_550", { "asterix.019_550_NOGO": "0", "asterix.019_550_OVL": "0", "asterix.019_550_TSV": "0", "asterix.019_550_TTF": "1" } ) validator.add_dissection( [0x08, 0x80], "asterix.019_551", { "asterix.019_551_SP1_EXEC": "1", "asterix.019_551_SP1_GOOD": "0", "asterix.019_551_SP2_EXEC": "0", "asterix.019_551_SP2_GOOD": "0", "asterix.019_551_SP3_EXEC": "0", "asterix.019_551_SP3_GOOD": "0", "asterix.019_551_SP4_EXEC": "0", "asterix.019_551_SP4_GOOD": "0" } ) validator.add_dissection( [0x08, 0x40], "asterix.019_551", { "asterix.019_551_SP1_EXEC": "0", "asterix.019_551_SP1_GOOD": "1", "asterix.019_551_SP2_EXEC": "0", "asterix.019_551_SP2_GOOD": "0", "asterix.019_551_SP3_EXEC": "0", "asterix.019_551_SP3_GOOD": "0", "asterix.019_551_SP4_EXEC": "0", "asterix.019_551_SP4_GOOD": "0" } ) validator.add_dissection( [0x08, 0x20], "asterix.019_551", { "asterix.019_551_SP1_EXEC": "0", "asterix.019_551_SP1_GOOD": "0", "asterix.019_551_SP2_EXEC": "1", "asterix.019_551_SP2_GOOD": "0", "asterix.019_551_SP3_EXEC": "0", "asterix.019_551_SP3_GOOD": "0", "asterix.019_551_SP4_EXEC": "0", "asterix.019_551_SP4_GOOD": "0" } ) validator.add_dissection( [0x08, 0x10], "asterix.019_551", { "asterix.019_551_SP1_EXEC": "0", "asterix.019_551_SP1_GOOD": "0", "asterix.019_551_SP2_EXEC": "0", "asterix.019_551_SP2_GOOD": "1", "asterix.019_551_SP3_EXEC": "0", "asterix.019_551_SP3_GOOD": "0", "asterix.019_551_SP4_EXEC": "0", "asterix.019_551_SP4_GOOD": "0" } ) validator.add_dissection( [0x08, 0x08], "asterix.019_551", { "asterix.019_551_SP1_EXEC": "0", "asterix.019_551_SP1_GOOD": "0", "asterix.019_551_SP2_EXEC": "0", "asterix.019_551_SP2_GOOD": "0", "asterix.019_551_SP3_EXEC": "1", "asterix.019_551_SP3_GOOD": "0", "asterix.019_551_SP4_EXEC": "0", "asterix.019_551_SP4_GOOD": "0" } ) validator.add_dissection( [0x08, 0x04], "asterix.019_551", { "asterix.019_551_SP1_EXEC": "0", "asterix.019_551_SP1_GOOD": "0", "asterix.019_551_SP2_EXEC": "0", "asterix.019_551_SP2_GOOD": "0", "asterix.019_551_SP3_EXEC": "0", "asterix.019_551_SP3_GOOD": "1", "asterix.019_551_SP4_EXEC": "0", "asterix.019_551_SP4_GOOD": "0" } ) validator.add_dissection( [0x08, 0x02], "asterix.019_551", { "asterix.019_551_SP1_EXEC": "0", "asterix.019_551_SP1_GOOD": "0", "asterix.019_551_SP2_EXEC": "0", "asterix.019_551_SP2_GOOD": "0", "asterix.019_551_SP3_EXEC": "0", "asterix.019_551_SP3_GOOD": "0", "asterix.019_551_SP4_EXEC": "1", "asterix.019_551_SP4_GOOD": "0" } ) validator.add_dissection( [0x08, 0x01], "asterix.019_551", { "asterix.019_551_SP1_EXEC": "0", "asterix.019_551_SP1_GOOD": "0", "asterix.019_551_SP2_EXEC": "0", "asterix.019_551_SP2_GOOD": "0", "asterix.019_551_SP3_EXEC": "0", "asterix.019_551_SP3_GOOD": "0", "asterix.019_551_SP4_EXEC": "0", "asterix.019_551_SP4_GOOD": "1" } ) validator.add_dissection( [0x04, 0x00], "asterix.019_552", { "asterix.counter": "0" } ) validator.add_dissection( [0x04, 0x01, 0xff, 0x00], "asterix.019_552", { "asterix.counter": "1", "asterix.019_552": { "asterix.019_552_RS_Identification": "255", "asterix.019_552_Receiver_1090_MHz": "0", "asterix.019_552_Transmitter_1030_MHz": "0", "asterix.019_552_Transmitter_1090_MHz": "0", "asterix.019_552_RS_Status": "0", "asterix.019_552_RS_Operational": "0" } } ) validator.add_dissection( [0x04, 0x01, 0x00, 0x40], "asterix.019_552", { "asterix.counter": "1", "asterix.019_552": { "asterix.019_552_RS_Identification": "0", "asterix.019_552_Receiver_1090_MHz": "1", "asterix.019_552_Transmitter_1030_MHz": "0", "asterix.019_552_Transmitter_1090_MHz": "0", "asterix.019_552_RS_Status": "0", "asterix.019_552_RS_Operational": "0" } } ) validator.add_dissection( [0x04, 0x01, 0x00, 0x20], "asterix.019_552", { "asterix.counter": "1", "asterix.019_552": { "asterix.019_552_RS_Identification": "0", "asterix.019_552_Receiver_1090_MHz": "0", "asterix.019_552_Transmitter_1030_MHz": "1", "asterix.019_552_Transmitter_1090_MHz": "0", "asterix.019_552_RS_Status": "0", "asterix.019_552_RS_Operational": "0" } } ) validator.add_dissection( [0x04, 0x01, 0x00, 0x10], "asterix.019_552", { "asterix.counter": "1", "asterix.019_552": { "asterix.019_552_RS_Identification": "0", "asterix.019_552_Receiver_1090_MHz": "0", "asterix.019_552_Transmitter_1030_MHz": "0", "asterix.019_552_Transmitter_1090_MHz": "1", "asterix.019_552_RS_Status": "0", "asterix.019_552_RS_Operational": "0" } } ) validator.add_dissection( [0x04, 0x01, 0x00, 0x08], "asterix.019_552", { "asterix.counter": "1", "asterix.019_552": { "asterix.019_552_RS_Identification": "0", "asterix.019_552_Receiver_1090_MHz": "0", "asterix.019_552_Transmitter_1030_MHz": "0", "asterix.019_552_Transmitter_1090_MHz": "0", "asterix.019_552_RS_Status": "1", "asterix.019_552_RS_Operational": "0" } } ) validator.add_dissection( [0x04, 0x01, 0x00, 0x04], "asterix.019_552", { "asterix.counter": "1", "asterix.019_552": { "asterix.019_552_RS_Identification": "0", "asterix.019_552_Receiver_1090_MHz": "0", "asterix.019_552_Transmitter_1030_MHz": "0", "asterix.019_552_Transmitter_1090_MHz": "0", "asterix.019_552_RS_Status": "0", "asterix.019_552_RS_Operational": "1" } } ) validator.add_dissection( [0x04, 0x03, 0x12, 0x34, 0x56, 0x78, 0x9a, 0x0c], "asterix.019_552", { "asterix.counter": "3", "asterix.019_552": { "asterix.019_552_RS_Identification": "18", "asterix.019_552_Receiver_1090_MHz": "0", "asterix.019_552_Transmitter_1030_MHz": "1", "asterix.019_552_Transmitter_1090_MHz": "1", "asterix.019_552_RS_Status": "0", "asterix.019_552_RS_Operational": "1" }, "asterix.019_552": { "asterix.019_552_RS_Identification": "86", "asterix.019_552_Receiver_1090_MHz": "1", "asterix.019_552_Transmitter_1030_MHz": "1", "asterix.019_552_Transmitter_1090_MHz": "1", "asterix.019_552_RS_Status": "1", "asterix.019_552_RS_Operational": "0" }, "asterix.019_552": { "asterix.019_552_RS_Identification": "154", "asterix.019_552_Receiver_1090_MHz": "0", "asterix.019_552_Transmitter_1030_MHz": "0", "asterix.019_552_Transmitter_1090_MHz": "0", "asterix.019_552_RS_Status": "1", "asterix.019_552_RS_Operational": "1" } } ) validator.add_dissection( [0x02, 0xc0], "asterix.019_553", { "asterix.019_553_Ref_Trans_1_Status": "3", "asterix.019_553_Ref_Trans_2_Status": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x02, 0x0c], "asterix.019_553", { "asterix.019_553_Ref_Trans_1_Status": "0", "asterix.019_553_Ref_Trans_2_Status": "3", "asterix.FX": "0" } ) validator.add_dissection( [0x02, 0x01, 0x01, 0x0c], "asterix.019_553", { "asterix.019_553_Ref_Trans_1_Status": "0", "asterix.019_553_Ref_Trans_2_Status": "0", "asterix.019_553_Ref_Trans_3_Status": "0", "asterix.019_553_Ref_Trans_4_Status": "0", "asterix.019_553_Ref_Trans_5_Status": "0", "asterix.019_553_Ref_Trans_6_Status": "3", "asterix.FX": "0" } ) validator.add_dissection( [0x01, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.019_600", { "asterix.019_600_Latitude": "90", "asterix.019_600_Longitude": "0" } ) validator.add_dissection( [0x01, 0x80, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.019_600", { "asterix.019_600_Latitude": "-90", "asterix.019_600_Longitude": "0" } ) validator.add_dissection( [0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00], "asterix.019_600", { "asterix.019_600_Latitude": "0", "asterix.019_600_Longitude": "180" } ) validator.add_dissection( [0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00], "asterix.019_600", { "asterix.019_600_Latitude": "0", "asterix.019_600_Longitude": "-180" } ) validator.add_dissection( [0x01, 0x40, 0x7f, 0xff], "asterix.019_610", { "asterix.019_610_Height": "8191.75" } ) validator.add_dissection( [0x01, 0x40, 0x80, 0x00], "asterix.019_610", { "asterix.019_610_Height": "-8192" } ) validator.add_dissection( [0x01, 0x20, 0x7f], "asterix.019_620", { "asterix.019_620_Undulation": "127" } ) validator.add_dissection( [0x01, 0x20, 0x81], "asterix.019_620", { "asterix.019_620_Undulation": "-127" } ) validator.check_dissections() def test_undefined_value_handling(self, asterix_validator): '''verifies that the dissector can dissect undefined field values by setting the maximum value of bits or by setting all undefined bits''' validator = asterix_validator(19) validator.add_dissection( [0x40, 0xff], "asterix.019_000", { "asterix.019_000_MT": "255" } ) validator.add_dissection( [0x20, 0xff, 0xff, 0xff], "asterix.019_140", { "asterix.TOD": "131071.9921875" } ) validator.add_dissection( [0x10, 0x07], "asterix.019_550", { "asterix.019_550_NOGO": "0", "asterix.019_550_OVL": "0", "asterix.019_550_TSV": "0", "asterix.019_550_TTF": "0" } ) validator.add_dissection( [0x04, 0x01, 0x00, 0x83], "asterix.019_552", { "asterix.counter": "1", "asterix.019_552": { "asterix.019_552_RS_Identification": "0", "asterix.019_552_Receiver_1090_MHz": "0", "asterix.019_552_Transmitter_1030_MHz": "0", "asterix.019_552_Transmitter_1090_MHz": "0", "asterix.019_552_RS_Status": "0", "asterix.019_552_RS_Operational": "0" } } ) validator.add_dissection( [0x02, 0x32], "asterix.019_553", { "asterix.019_553_Ref_Trans_1_Status": "0", "asterix.019_553_Ref_Trans_2_Status": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x02, 0x33, 0x33, 0x32], "asterix.019_553", { "asterix.019_553_Ref_Trans_1_Status": "0", "asterix.019_553_Ref_Trans_2_Status": "0", "asterix.019_553_Ref_Trans_3_Status": "0", "asterix.019_553_Ref_Trans_4_Status": "0", "asterix.019_553_Ref_Trans_5_Status": "0", "asterix.019_553_Ref_Trans_6_Status": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x01, 0x80, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00], "asterix.019_600", { "asterix.019_600_Latitude": "359.999999832362", "asterix.019_600_Longitude": "0" } ) validator.add_dissection( [0x01, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.019_600", { "asterix.019_600_Latitude": "-360", "asterix.019_600_Longitude": "0" } ) validator.add_dissection( [0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff], "asterix.019_600", { "asterix.019_600_Latitude": "0", "asterix.019_600_Longitude": "359.999999832362" } ) validator.add_dissection( [0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00], "asterix.019_600", { "asterix.019_600_Latitude": "0", "asterix.019_600_Longitude": "-360" } ) validator.add_dissection( [0x01, 0x20, 0x80], "asterix.019_620", { "asterix.019_620_Undulation": "-128" } ) validator.add_dissection( [0x01, 0x10], "asterix.spare", "" ) validator.add_dissection( [0x01, 0x08], "asterix.spare", "" ) validator.add_dissection( [0x01, 0x04, 0x02, 0x00], "asterix.019_RE", { "asterix.re_field_len": "2", "asterix.fspec": "" } ) validator.add_dissection( [0x01, 0x04, 0x10, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff], "asterix.019_RE", { "asterix.fspec": "", "asterix.re_field_len": "16" } ) validator.add_dissection( [0x01, 0x02, 0x01], "asterix.019_SP", "" ) validator.add_dissection( [0x01, 0x02, 0x10, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff], "asterix.019_SP", "" ) validator.check_dissections() @fixtures.mark_usefixtures('test_env') @fixtures.uses_fixtures class case_category_034(subprocesstest.SubprocessTestCase): ''' Unittest case for ASTERIX Category 034 Online specification: https://www.eurocontrol.int/publications/cat034-monoradar-service-messages-part-2b-next-version-cat-002 Part 2b Transmission of Monoradar Service Messages Standard User Application Profile FRN Data Item Information Length 1 I034/010 Data Source Identifier 2 2 I034/000 Message Type 1 3 I034/030 Time-of-Day 3 4 I034/020 Sector Number 1 5 I034/041 Antenna Rotation Period 2 6 I034/050 System Configuration and Status 1+ 7 I034/060 System Processing Mode 1+ FX N/A. Field Extension Indicator N/A. 8 I034/070 Message Count Values (1+2*N) 9 I034/100 Generic Polar Window 8 10 I034/110 Data Filter 1 11 I034/120 3D-Position of Data Source 8 12 I034/090 Collimation Error 2 13 RE-Data Item Reserved Expansion Field 1+1+ 14 SP-Data Item Special Purpose Field 1+1+ FX N/A. Field Extension Indicator n.a. ''' maxDiff = None def test_for_fields(self, asterix_validator): '''verifies existence of all fields and their maximum value''' validator = asterix_validator(34) validator.add_dissection( [0x80, 0xff, 0x00], "asterix.034_010", { "asterix.SAC": "255", "asterix.SIC": "0" } ) validator.add_dissection( [0x80, 0x00, 0xff], "asterix.034_010", { "asterix.SAC": "0", "asterix.SIC": "255" } ) validator.add_dissection( [0x40, 0x04], "asterix.034_000", { "asterix.034_000_MT": "4" } ) validator.add_dissection( [0x20, 0xa8, 0xbf, 0xff], "asterix.034_030", { "asterix.TOD": "86399.9921875" } ) validator.add_dissection( [0x10, 0xff], "asterix.034_020", { "asterix.034_020_SN": "358.59375" } ) validator.add_dissection( [0x08, 0xff, 0xff], "asterix.034_041", { "asterix.034_041_ARS": "511.9921875" } ) x_050_01 = { "asterix.034_050_01_NOGO": "0", "asterix.034_050_01_RDPC": "0", "asterix.034_050_01_RDPR": "0", "asterix.034_050_01_OVL_RDP": "0", "asterix.034_050_01_OVL_XMT": "0", "asterix.034_050_01_MSC": "0", "asterix.034_050_01_TSV": "0" } validator.add_dissection( [0x04, 0x80, 0x80], "asterix.034_050", dict_fspec_local(x_050_01, "034_050_01", "NOGO", "1") ) validator.add_dissection( [0x04, 0x80, 0x40], "asterix.034_050", dict_fspec_local(x_050_01, "034_050_01", "RDPC", "1") ) validator.add_dissection( [0x04, 0x80, 0x20], "asterix.034_050", dict_fspec_local(x_050_01, "034_050_01", "RDPR", "1") ) validator.add_dissection( [0x04, 0x80, 0x10], "asterix.034_050", dict_fspec_local(x_050_01, "034_050_01", "OVL_RDP", "1") ) validator.add_dissection( [0x04, 0x80, 0x08], "asterix.034_050", dict_fspec_local(x_050_01, "034_050_01", "OVL_XMT", "1") ) validator.add_dissection( [0x04, 0x80, 0x04], "asterix.034_050", dict_fspec_local(x_050_01, "034_050_01", "MSC", "1") ) validator.add_dissection( [0x04, 0x80, 0x02], "asterix.034_050", dict_fspec_local(x_050_01, "034_050_01", "TSV", "1") ) x_050_02 = { "asterix.034_050_02_ANT": "0", "asterix.034_050_02_CHAB": "0", "asterix.034_050_02_OVL": "0", "asterix.034_050_02_MSC": "0" } validator.add_dissection( [0x04, 0x10, 0x80], "asterix.034_050", dict_fspec_local(x_050_02, "034_050_02", "ANT", "1") ) validator.add_dissection( [0x04, 0x10, 0x60], "asterix.034_050", dict_fspec_local(x_050_02, "034_050_02", "CHAB", "3") ) validator.add_dissection( [0x04, 0x10, 0x10], "asterix.034_050", dict_fspec_local(x_050_02, "034_050_02", "OVL", "1") ) validator.add_dissection( [0x04, 0x10, 0x08], "asterix.034_050", dict_fspec_local(x_050_02, "034_050_02", "MSC", "1") ) x_050_03 = { "asterix.034_050_03_ANT": "0", "asterix.034_050_03_CHAB": "0", "asterix.034_050_03_OVL": "0", "asterix.034_050_03_MSC": "0" } validator.add_dissection( [0x04, 0x08, 0x80], "asterix.034_050", dict_fspec_local(x_050_03, "034_050_03", "ANT", "1") ) validator.add_dissection( [0x04, 0x08, 0x60], "asterix.034_050", dict_fspec_local(x_050_03, "034_050_03", "CHAB", "3") ) validator.add_dissection( [0x04, 0x08, 0x10], "asterix.034_050", dict_fspec_local(x_050_03, "034_050_03", "OVL", "1") ) validator.add_dissection( [0x04, 0x08, 0x08], "asterix.034_050", dict_fspec_local(x_050_03, "034_050_03", "MSC", "1") ) x_050_04 = { "asterix.034_050_04_ANT": "0", "asterix.034_050_04_CHAB": "0", "asterix.034_050_04_OVL_SUR": "0", "asterix.034_050_04_MSC": "0", "asterix.034_050_04_SCF": "0", "asterix.034_050_04_DLF": "0", "asterix.034_050_04_OVL_SCF": "0", "asterix.034_050_04_OVL_DLF": "0" } validator.add_dissection( [0x04, 0x04, 0x80, 0x00], "asterix.034_050", dict_fspec_local(x_050_04, "034_050_04", "ANT", "1") ) validator.add_dissection( [0x04, 0x04, 0x60, 0x00], "asterix.034_050", dict_fspec_local(x_050_04, "034_050_04", "CHAB", "3") ) validator.add_dissection( [0x04, 0x04, 0x10, 0x00], "asterix.034_050", dict_fspec_local(x_050_04, "034_050_04", "OVL_SUR", "1") ) validator.add_dissection( [0x04, 0x04, 0x08, 0x00], "asterix.034_050", dict_fspec_local(x_050_04, "034_050_04", "MSC", "1") ) validator.add_dissection( [0x04, 0x04, 0x04, 0x00], "asterix.034_050", dict_fspec_local(x_050_04, "034_050_04", "SCF", "1") ) validator.add_dissection( [0x04, 0x04, 0x02, 0x00], "asterix.034_050", dict_fspec_local(x_050_04, "034_050_04", "DLF", "1") ) validator.add_dissection( [0x04, 0x04, 0x01, 0x00], "asterix.034_050", dict_fspec_local(x_050_04, "034_050_04", "OVL_SCF", "1") ) validator.add_dissection( [0x04, 0x04, 0x00, 0x80], "asterix.034_050", dict_fspec_local(x_050_04, "034_050_04", "OVL_DLF", "1") ) x_060_01 = { "asterix.034_060_01_RED_RDP": "0", "asterix.034_060_01_RED_XMT": "0" } validator.add_dissection( [0x02, 0x80, 0x70], "asterix.034_060", dict_fspec_local(x_060_01, "034_060_01", "RED_RDP", "7") ) validator.add_dissection( [0x02, 0x80, 0x0e], "asterix.034_060", dict_fspec_local(x_060_01, "034_060_01", "RED_XMT", "7") ) x_060_02 = { "asterix.034_060_02_POL": "0", "asterix.034_060_02_RED_RAD": "0", "asterix.034_060_02_STC": "0" } validator.add_dissection( [0x02, 0x10, 0x80], "asterix.034_060", dict_fspec_local(x_060_02, "034_060_02", "POL", "1") ) validator.add_dissection( [0x02, 0x10, 0x70], "asterix.034_060", dict_fspec_local(x_060_02, "034_060_02", "RED_RAD", "7") ) validator.add_dissection( [0x02, 0x10, 0x0c], "asterix.034_060", dict_fspec_local(x_060_02, "034_060_02", "STC", "3") ) validator.add_dissection( [0x02, 0x08, 0xe0], "asterix.034_060", fspec_local("034_060_03", "RED_RAD", "7") ) x_060_06 = { "asterix.034_060_04_RED_RAD": "0", "asterix.034_060_04_CLU": "0" } validator.add_dissection( [0x02, 0x04, 0xe0], "asterix.034_060", dict_fspec_local(x_060_06, "034_060_04", "RED_RAD", "7") ) validator.add_dissection( [0x02, 0x04, 0x10], "asterix.034_060", dict_fspec_local(x_060_06, "034_060_04", "CLU", "1") ) x_070 = { "asterix.034_070_TYP": "0", "asterix.034_070_COUNTER": "0" } validator.add_dissection( [0x01, 0x80, 0x01, 0x80, 0x00], "asterix.034_070", { "asterix.counter": "1", "asterix.034_070": dict_local(x_070, "034_070", "TYP", "16") } ) validator.add_dissection( [0x01, 0x80, 0x03, 0x80, 0x00, 0x87, 0xff, 0x07, 0xff], "asterix.034_070", { "asterix.counter": "3", "asterix.034_070": dict_local(x_070, "034_070", "TYPE", "16"), "asterix.034_070": { "asterix.034_070_TYP": "16", "asterix.034_070_COUNTER": "2047" }, "asterix.034_070": dict_local(x_070, "034_070", "COUNTER", "2047"), } ) x_100 = { "asterix.034_100_RHOS": "0", "asterix.034_100_RHOE": "0", "asterix.034_100_THETAS": "0", "asterix.034_100_THETAE": "0" } validator.add_dissection( [0x01, 0x40, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.034_100", dict_local(x_100, "034_100", "RHOS", "255.99609375") ) validator.add_dissection( [0x01, 0x40, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00], "asterix.034_100", dict_local(x_100, "034_100", "RHOE", "255.99609375") ) validator.add_dissection( [0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00], "asterix.034_100", dict_local(x_100, "034_100", "THETAS", "359.994506835938") ) validator.add_dissection( [0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff], "asterix.034_100", dict_local(x_100, "034_100", "THETAE", "359.994506835938") ) validator.add_dissection( [0x01, 0x20, 0x09], "asterix.034_110", { "asterix.034_110_TYP": "9" } ) x_120 = { "asterix.034_120_H": "0", "asterix.034_120_LAT": "0", "asterix.034_120_LON": "0" } validator.add_dissection( [0x01, 0x10, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.034_120", dict_local(x_120, "034_120", "H", "32767") ) validator.add_dissection( [0x01, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.034_120", dict_local(x_120, "034_120", "H", "-32768") ) validator.add_dissection( [0x01, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.034_120", dict_local(x_120, "034_120", "LAT", "90") ) validator.add_dissection( [0x01, 0x10, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.034_120", dict_local(x_120, "034_120", "LAT", "-90") ) validator.add_dissection( [0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff], "asterix.034_120", dict_local(x_120, "034_120", "LON", "179.999978542328") ) validator.add_dissection( [0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00], "asterix.034_120", dict_local(x_120, "034_120", "LON", "-180") ) x_090 = { "asterix.034_090_RE": "0", "asterix.034_090_AE": "0" } validator.add_dissection( [0x01, 0x08, 0x7f, 0x00], "asterix.034_090", dict_local(x_090, "034_090", "RE", "0.9921875") ) validator.add_dissection( [0x01, 0x08, 0x80, 0x00], "asterix.034_090", dict_local(x_090, "034_090", "RE", "-1") ) validator.add_dissection( [0x01, 0x08, 0x00, 0x80], "asterix.034_090", dict_local(x_090, "034_090", "AE", "-2.8125") ) validator.check_dissections() def test_undefined_value_handling(self, asterix_validator): '''verifies that the dissector can dissect undefined field values by setting the maximum value of bits or by setting all undefined bits''' validator = asterix_validator(34) validator.add_dissection( [0x40, 0xff], "asterix.034_000", { "asterix.034_000_MT": "255" } ) validator.add_dissection( [0x20, 0xff, 0xff, 0xff], "asterix.034_030", { "asterix.TOD": "131071.9921875" } ) validator.add_dissection( [0x04, 0x63, 0x00], "asterix.034_050", { "asterix.fspec": "", "asterix.spare": "" } ) validator.add_dissection( [0x04, 0x80, 0x01], "asterix.034_050", { "asterix.fspec": "", "asterix.034_050_01": { "asterix.034_050_01_NOGO": "0", "asterix.034_050_01_RDPC": "0", "asterix.034_050_01_RDPR": "0", "asterix.034_050_01_OVL_RDP": "0", "asterix.034_050_01_OVL_XMT": "0", "asterix.034_050_01_MSC": "0", "asterix.034_050_01_TSV": "0" } } ) validator.add_dissection( [0x04, 0x10, 0x07], "asterix.034_050", { "asterix.fspec": "", "asterix.034_050_02": { "asterix.034_050_02_ANT": "0", "asterix.034_050_02_CHAB": "0", "asterix.034_050_02_OVL": "0", "asterix.034_050_02_MSC": "0" } } ) validator.add_dissection( [0x04, 0x08, 0x07], "asterix.034_050", { "asterix.fspec": "", "asterix.034_050_03": { "asterix.034_050_03_ANT": "0", "asterix.034_050_03_CHAB": "0", "asterix.034_050_03_OVL": "0", "asterix.034_050_03_MSC": "0" } } ) validator.add_dissection( [0x04, 0x04, 0x00, 0x7f], "asterix.034_050", { "asterix.fspec": "", "asterix.034_050_04": { "asterix.034_050_04_ANT": "0", "asterix.034_050_04_CHAB": "0", "asterix.034_050_04_OVL_SUR": "0", "asterix.034_050_04_MSC": "0", "asterix.034_050_04_SCF": "0", "asterix.034_050_04_DLF": "0", "asterix.034_050_04_OVL_SCF": "0", "asterix.034_050_04_OVL_DLF": "0" } } ) validator.add_dissection( [0x02, 0x63, 0x00], "asterix.034_060", { "asterix.fspec": "", "asterix.spare": "" } ) validator.add_dissection( [0x02, 0x80, 0x81], "asterix.034_060", { "asterix.fspec": "", "asterix.034_060_01": { "asterix.034_060_01_RED_RDP": "0", "asterix.034_060_01_RED_XMT": "0" } } ) validator.add_dissection( [0x02, 0x10, 0x03], "asterix.034_060", { "asterix.fspec": "", "asterix.034_060_02": { "asterix.034_060_02_POL": "0", "asterix.034_060_02_RED_RAD": "0", "asterix.034_060_02_STC": "0" } } ) validator.add_dissection( [0x02, 0x08, 0x1f], "asterix.034_060", fspec_local("034_060_03", "RED_RAD", "0") ) validator.add_dissection( [0x02, 0x04, 0x0f], "asterix.034_060", { "asterix.fspec": "", "asterix.034_060_04": { "asterix.034_060_04_RED_RAD": "0", "asterix.034_060_04_CLU": "0" } } ) x_070 = { "asterix.034_070_TYP": "0", "asterix.034_070_COUNTER": "0" } validator.add_dissection( [0x01, 0x80, 0x01, 0xf8, 0x00], "asterix.034_070", { "asterix.counter": "1", "asterix.034_070": dict_local(x_070, "034_070", "TYP", "31") } ) validator.add_dissection( [0x01, 0x20, 0xff], "asterix.034_110", { "asterix.034_110_TYP": "255" } ) validator.add_dissection( [0x01, 0x04, 0x02, 0xfe], "asterix.034_RE", { "asterix.re_field_len": "2", "asterix.fspec": "" } ) validator.add_dissection( [0x01, 0x02, 0x01], "asterix.034_SP", "" ) validator.add_dissection( [0x01, 0x02, 0x11, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff], "asterix.034_SP", "" ) validator.check_dissections() @fixtures.mark_usefixtures('test_env') @fixtures.uses_fixtures class case_category_048(subprocesstest.SubprocessTestCase): ''' Unittest case for ASTERIX Category 048 Online specification: https://www.eurocontrol.int/publications/cat048-monoradar-target-reports-part-4-next-version-cat-001 https://www.eurocontrol.int/publications/cat048-reserved-expansion-field-part-4-appendix Part 4 Category 048 Monoradar Target Reports Standard User Application Profile FRN Data Item Information Length 1 I048/010 Data Source Identifier 2 2 I048/140 Time-of-Day 3 3 I048/020 Target Report Descriptor 1+ 4 I048/040 Measured Position in Slant Polar Coordinates 4 5 I048/070 Mode-3/A Code in Octal Representation 2 6 I048/090 Flight Level in Binary Representation 2 7 I048/130 Radar Plot Characteristics 1+1+ FX n.a. Field Extension Indicator n.a. 8 I048/220 Aircraft Address 3 9 I048/240 Aircraft Identification 6 10 I048/250 Mode S MB Data 1+8*n 11 I048/161 Track Number 2 12 I048/042 Calculated Position in Cartesian Coordinates 4 13 I048/200 Calculated Track Velocity in Polar Representation 4 14 I048/170 Track Status 1+ FX n.a. Field Extension Indicator n.a. 15 I048/210 Track Quality 4 16 I048/030 Warning/Error Conditions 1+ 17 I048/080 Mode-3/A Code Confidence Indicator 2 18 I048/100 Mode-C Code and Confidence Indicator 4 19 I048/110 Height Measured by 3D Radar 2 20 I048/120 Radial Doppler Speed 1+ 21 I048/230 Communications / ACAS Capability and Flight Status 2 FX n.a. Field Extension Indicator n.a. 22 I048/260 ACAS Resolution Advisory Report 7 23 I048/055 Mode-1 Code in Octal Representation 1 24 I048/050 Mode-2 Code in Octal Representation 2 25 I048/065 Mode-1 Code Confidence Indicator 1 26 I048/060 Mode-2 Code Confidence Indicator 2 27 SP-Data Item Special Purpose Field 1+1+ 28 RE-Data Item Reserved Expansion Field 1+1+ FX n.a. Field Extension Indicator n.a. ''' maxDiff = None def test_for_fields(self, asterix_re_validator): '''verifies existence of all fields and their maximum value''' validator = asterix_re_validator(48, [0x01, 0x01, 0x01, 0x02]) validator.add_dissection( [0x80, 0xff, 0x00], "asterix.048_010", { "asterix.SAC": "255", "asterix.SIC": "0" } ) validator.add_dissection( [0x80, 0x00, 0xff], "asterix.048_010", { "asterix.SAC": "0", "asterix.SIC": "255" } ) validator.add_dissection( [0x40, 0xa8, 0xbf, 0xff], "asterix.048_140", { "asterix.TOD": "86399.9921875" } ) x_020 = { "asterix.048_020_TYP": "0", "asterix.048_020_SIM": "0", "asterix.048_020_RDP": "0", "asterix.048_020_SPI": "0", "asterix.048_020_RAB": "0", "asterix.FX": "0" } validator.add_dissection( [0x20, 0xe0], "asterix.048_020", dict_local(x_020, "048_020", "TYP", "7") ) validator.add_dissection( [0x20, 0x08], "asterix.048_020", dict_local(x_020, "048_020", "RDP", "1") ) validator.add_dissection( [0x20, 0x04], "asterix.048_020", dict_local(x_020, "048_020", "SPI", "1") ) validator.add_dissection( [0x20, 0x02], "asterix.048_020", dict_local(x_020, "048_020", "RAB", "1") ) x_020.update({ "asterix.048_020_TST": "0", "asterix.048_020_ERR": "0", "asterix.048_020_XPP": "0", "asterix.048_020_ME": "0", "asterix.048_020_MI": "0", "asterix.048_020_FOE": "0" }) validator.add_dissection( [0x20, 0x01, 0x80], "asterix.048_020", dict_local(x_020, "048_020", "TST", "1") ) validator.add_dissection( [0x20, 0x01, 0x40], "asterix.048_020", dict_local(x_020, "048_020", "ERR", "1") ) validator.add_dissection( [0x20, 0x01, 0x20], "asterix.048_020", dict_local(x_020, "048_020", "XPP", "1") ) validator.add_dissection( [0x20, 0x01, 0x10], "asterix.048_020", dict_local(x_020, "048_020", "ME", "1") ) validator.add_dissection( [0x20, 0x01, 0x08], "asterix.048_020", dict_local(x_020, "048_020", "MI", "1") ) validator.add_dissection( [0x20, 0x01, 0x06], "asterix.048_020", dict_local(x_020, "048_020", "FOE", "3") ) x_040 = { "asterix.048_040_RHO": "0", "asterix.048_040_THETA": "0" } validator.add_dissection( [0x10, 0xff, 0xff, 0x00, 0x00], "asterix.048_040", dict_local(x_040, "048_040", "RHO", "255.99609375") ) validator.add_dissection( [0x10, 0x00, 0x00, 0xff, 0xff], "asterix.048_040", dict_local(x_040, "048_040", "THETA", "359.994506835938") ) x_070 = { "asterix.048_070_V": "0", "asterix.048_070_G": "0", "asterix.048_070_L": "0", "asterix.048_070_SQUAWK": "0" } validator.add_dissection( [0x08, 0x80, 0x00], "asterix.048_070", dict_local(x_070, "048_070", "V", "1") ) validator.add_dissection( [0x08, 0x40, 0x00], "asterix.048_070", dict_local(x_070, "048_070", "G", "1") ) validator.add_dissection( [0x08, 0x20, 0x00], "asterix.048_070", dict_local(x_070, "048_070", "L", "1") ) validator.add_dissection( [0x08, 0x0e, 0x00], "asterix.048_070", dict_local(x_070, "048_070", "SQUAWK", "3584") # 07000 ) validator.add_dissection( [0x08, 0x01, 0xc0], "asterix.048_070", dict_local(x_070, "048_070", "SQUAWK", "448") # 0700 ) validator.add_dissection( [0x08, 0x00, 0x38], "asterix.048_070", dict_local(x_070, "048_070", "SQUAWK", "56") # 070 ) validator.add_dissection( [0x08, 0x00, 0x07], "asterix.048_070", dict_local(x_070, "048_070", "SQUAWK", "7") # 07 ) x_090 = { "asterix.048_090_V": "0", "asterix.048_090_G": "0", "asterix.048_090_FL": "0" } validator.add_dissection( [0x04, 0x80, 0x00], "asterix.048_090", dict_local(x_090, "048_090", "V", "1") ) validator.add_dissection( [0x04, 0x40, 0x00], "asterix.048_090", dict_local(x_090, "048_090", "G", "1") ) validator.add_dissection( [0x04, 0x1f, 0xff], "asterix.048_090", dict_local(x_090, "048_090", "FL", "2047.75") ) validator.add_dissection( [0x04, 0x20, 0x00], "asterix.048_090", dict_local(x_090, "048_090", "FL", "-2048") ) validator.add_dissection( [0x02, 0x80, 0xff], "asterix.048_130", fspec_local("048_130_01", "SRL", "11.2060546875") ) validator.add_dissection( [0x02, 0x40, 0xff], "asterix.048_130", fspec_local("048_130_02", "SRR", "255") ) validator.add_dissection( [0x02, 0x20, 0x7f], "asterix.048_130", fspec_local("048_130_03", "SAM", "127") ) validator.add_dissection( [0x02, 0x20, 0x80], "asterix.048_130", fspec_local("048_130_03", "SAM", "-128") ) validator.add_dissection( [0x02, 0x10, 0xff], "asterix.048_130", fspec_local("048_130_04", "PRL", "11.2060546875") ) validator.add_dissection( [0x02, 0x08, 0x7f], "asterix.048_130", fspec_local("048_130_05", "PAM", "127") ) validator.add_dissection( [0x02, 0x08, 0x80], "asterix.048_130", fspec_local("048_130_05", "PAM", "-128") ) validator.add_dissection( [0x02, 0x04, 0x7f], "asterix.048_130", fspec_local("048_130_06", "RPD", "0.49609375") ) validator.add_dissection( [0x02, 0x04, 0x80], "asterix.048_130", fspec_local("048_130_06", "RPD", "-0.5") ) validator.add_dissection( [0x02, 0x02, 0x7f], "asterix.048_130", fspec_local("048_130_07", "APD", "2.79052734375") ) validator.add_dissection( [0x02, 0x02, 0x80], "asterix.048_130", fspec_local("048_130_07", "APD", "-2.8125") ) validator.add_dissection( [0x01, 0x80, 0xff, 0xff, 0xff], "asterix.048_220", { "asterix.AA": "0x00ffffff" } ) validator.add_dissection( [0x01, 0x80, 0xff, 0xff, 0xff], "asterix.048_220", { "asterix.AA": "0x00ffffff" } ) validator.add_dissection( [0x01, 0x40, 0x04, 0x20, 0xda, 0x83, 0x0c, 0x79], "asterix.048_240", { "asterix.AI": "ABCZ 019" } ) x_250 = { "asterix.MB_DATA": "00:00:00:00:00:00:00", "asterix.BDS1": "0", "asterix.BDS2": "0" } validator.add_dissection( [0x01, 0x20, 0x01, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x00], "asterix.048_250", { "asterix.counter": "1", "asterix.048_250": dict_global(x_250, "MB_DATA", "11:22:33:44:55:66:77"), } ) validator.add_dissection( [0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0], "asterix.048_250", { "asterix.counter": "1", "asterix.048_250": dict_global(x_250, "BDS1", "15"), } ) validator.add_dissection( [0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f], "asterix.048_250", { "asterix.counter": "1", "asterix.048_250": dict_global(x_250, "BDS2", "15"), } ) validator.add_dissection( [0x01, 0x20, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f], "asterix.048_250", { "asterix.counter": "3", "asterix.048_250": dict_global(x_250, "MB_DATA", "11:22:33:44:55:66:77"), "asterix.048_250": dict_global(x_250, "BDS1", "15"), "asterix.048_250": dict_global(x_250, "BDS2", "15"), } ) validator.add_dissection( [0x01, 0x10, 0x0f, 0xff], "asterix.048_161", { "asterix.048_161_TN": "4095" } ) x_042 = { "asterix.048_042_X": "0", "asterix.048_042_Y": "0" } validator.add_dissection( [0x01, 0x08, 0x7f, 0xff, 0x00, 0x00], "asterix.048_042", dict_local(x_042, "048_042", "X", "255.9921875") ) validator.add_dissection( [0x01, 0x08, 0x80, 0x00, 0x00, 0x00], "asterix.048_042", dict_local(x_042, "048_042", "X", "-256") ) validator.add_dissection( [0x01, 0x08, 0x00, 0x0, 0x7f, 0xff], "asterix.048_042", dict_local(x_042, "048_042", "Y", "255.9921875") ) validator.add_dissection( [0x01, 0x08, 0x00, 0x0, 0x80, 0x00], "asterix.048_042", dict_local(x_042, "048_042", "Y", "-256") ) x_200 = { "asterix.048_200_GS": "0", "asterix.048_200_HDG": "0" } validator.add_dissection( [0x01, 0x04, 0xff, 0xff, 0x00, 0x00], "asterix.048_200", dict_local(x_200, "048_200", "GS", "3.99993896484375") ) validator.add_dissection( [0x01, 0x04, 0x00, 0x00, 0xff, 0xff], "asterix.048_200", dict_local(x_200, "048_200", "HDG", "359.994506835938") ) x_170 = { "asterix.048_170_CNF": "0", "asterix.048_170_RAD": "0", "asterix.048_170_DOU": "0", "asterix.048_170_MAH": "0", "asterix.048_170_CDM": "0", "asterix.FX": "0" } validator.add_dissection( [0x01, 0x02, 0x80], "asterix.048_170", dict_local(x_170, "048_170", "CNF", "1") ) validator.add_dissection( [0x01, 0x02, 0x60], "asterix.048_170", dict_local(x_170, "048_170", "RAD", "3") ) validator.add_dissection( [0x01, 0x02, 0x10], "asterix.048_170", dict_local(x_170, "048_170", "DOU", "1") ) validator.add_dissection( [0x01, 0x02, 0x08], "asterix.048_170", dict_local(x_170, "048_170", "MAH", "1") ) validator.add_dissection( [0x01, 0x02, 0x06], "asterix.048_170", dict_local(x_170, "048_170", "CDM", "3") ) x_170.update({ "asterix.048_170_TRE": "0", "asterix.048_170_GHO": "0", "asterix.048_170_SUP": "0", "asterix.048_170_TCC": "0" }) validator.add_dissection( [0x01, 0x02, 0x01, 0x80], "asterix.048_170", dict_local(x_170, "048_170", "TRE", "1") ) validator.add_dissection( [0x01, 0x02, 0x01, 0x40], "asterix.048_170", dict_local(x_170, "048_170", "GHO", "1") ) validator.add_dissection( [0x01, 0x02, 0x01, 0x20], "asterix.048_170", dict_local(x_170, "048_170", "SUP", "1") ) validator.add_dissection( [0x01, 0x02, 0x01, 0x10], "asterix.048_170", dict_local(x_170, "048_170", "TCC", "1") ) x_210 = { "asterix.048_210_X": "0", "asterix.048_210_Y": "0", "asterix.048_210_V": "0", "asterix.048_210_H": "0" } validator.add_dissection( [0x01, 0x01, 0x80, 0xff, 0x00, 0x00, 0x00], "asterix.048_210", dict_local(x_210, "048_210", "X", "1.9921875") ) validator.add_dissection( [0x01, 0x01, 0x80, 0x00, 0xff, 0x00, 0x00], "asterix.048_210", dict_local(x_210, "048_210", "Y", "1.9921875") ) validator.add_dissection( [0x01, 0x01, 0x80, 0x00, 0x00, 0xff, 0x00], "asterix.048_210", dict_local(x_210, "048_210", "V", "0.01556396484375") ) validator.add_dissection( [0x01, 0x01, 0x80, 0x00, 0x00, 0x00, 0xff], "asterix.048_210", dict_local(x_210, "048_210", "H", "22.412109375") ) validator.add_dissection( [0x01, 0x01, 0x40, 0x2e], "asterix.048_030", { "asterix.048_030_WE": "23", "asterix.FX": "0" } ) validator.add_dissection( [0x01, 0x01, 0x40, 0x2f, 0x03, 0x05, 0x06], "asterix.048_030", { "asterix.048_030_WE": "23", "asterix.048_030_1_WE": "1", "asterix.048_030_2_WE": "2", "asterix.048_030_3_WE": "3", "asterix.FX": "0" } ) x_080 = { "asterix.048_080_QA4": "0", "asterix.048_080_QA2": "0", "asterix.048_080_QA1": "0", "asterix.048_080_QB4": "0", "asterix.048_080_QB2": "0", "asterix.048_080_QB1": "0", "asterix.048_080_QC4": "0", "asterix.048_080_QC2": "0", "asterix.048_080_QC1": "0", "asterix.048_080_QD4": "0", "asterix.048_080_QD2": "0", "asterix.048_080_QD1": "0" } validator.add_dissection( [0x01, 0x01, 0x20, 0x08, 0x00], "asterix.048_080", dict_local(x_080, "048_080", "QA4", "1") ) validator.add_dissection( [0x01, 0x01, 0x20, 0x04, 0x00], "asterix.048_080", dict_local(x_080, "048_080", "QA2", "1") ) validator.add_dissection( [0x01, 0x01, 0x20, 0x02, 0x00], "asterix.048_080", dict_local(x_080, "048_080", "QA1", "1") ) validator.add_dissection( [0x01, 0x01, 0x20, 0x01, 0x00], "asterix.048_080", dict_local(x_080, "048_080", "QB4", "1") ) validator.add_dissection( [0x01, 0x01, 0x20, 0x00, 0x80], "asterix.048_080", dict_local(x_080, "048_080", "QB2", "1") ) validator.add_dissection( [0x01, 0x01, 0x20, 0x00, 0x40], "asterix.048_080", dict_local(x_080, "048_080", "QB1", "1") ) validator.add_dissection( [0x01, 0x01, 0x20, 0x00, 0x20], "asterix.048_080", dict_local(x_080, "048_080", "QC4", "1") ) validator.add_dissection( [0x01, 0x01, 0x20, 0x00, 0x10], "asterix.048_080", dict_local(x_080, "048_080", "QC2", "1") ) validator.add_dissection( [0x01, 0x01, 0x20, 0x00, 0x08], "asterix.048_080", dict_local(x_080, "048_080", "QC1", "1") ) validator.add_dissection( [0x01, 0x01, 0x20, 0x00, 0x04], "asterix.048_080", dict_local(x_080, "048_080", "QD4", "1") ) validator.add_dissection( [0x01, 0x01, 0x20, 0x00, 0x02], "asterix.048_080", dict_local(x_080, "048_080", "QD2", "1") ) validator.add_dissection( [0x01, 0x01, 0x20, 0x00, 0x01], "asterix.048_080", dict_local(x_080, "048_080", "QD1", "1") ) x_100 = { "asterix.048_100_V": "0", "asterix.048_100_G": "0", "asterix.048_100_C1": "0", "asterix.048_100_A1": "0", "asterix.048_100_C2": "0", "asterix.048_100_A2": "0", "asterix.048_100_C4": "0", "asterix.048_100_A4": "0", "asterix.048_100_B1": "0", "asterix.048_100_D1": "0", "asterix.048_100_B2": "0", "asterix.048_100_D2": "0", "asterix.048_100_B4": "0", "asterix.048_100_D4": "0", "asterix.048_100_QC1": "0", "asterix.048_100_QA1": "0", "asterix.048_100_QC2": "0", "asterix.048_100_QA2": "0", "asterix.048_100_QC4": "0", "asterix.048_100_QA4": "0", "asterix.048_100_QB1": "0", "asterix.048_100_QD1": "0", "asterix.048_100_QB2": "0", "asterix.048_100_QD2": "0", "asterix.048_100_QB4": "0", "asterix.048_100_QD4": "0" } validator.add_dissection( [0x01, 0x01, 0x10, 0x80, 0x00, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "V", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x40, 0x00, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "G", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x08, 0x00, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "C1", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x04, 0x00, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "A1", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x02, 0x00, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "C2", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "A2", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x80, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "C4", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x40, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "A4", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x20, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "B1", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x10, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "D1", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x08, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "B2", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x04, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "D2", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x02, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "B4", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x01, 0x00, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "D4", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x08, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "QC1", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x04, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "QA1", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x02, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "QC2", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x01, 0x00], "asterix.048_100", dict_local(x_100, "048_100", "QA2", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x80], "asterix.048_100", dict_local(x_100, "048_100", "QC4", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x40], "asterix.048_100", dict_local(x_100, "048_100", "QA4", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x20], "asterix.048_100", dict_local(x_100, "048_100", "QB1", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x10], "asterix.048_100", dict_local(x_100, "048_100", "QD1", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x08], "asterix.048_100", dict_local(x_100, "048_100", "QB2", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x04], "asterix.048_100", dict_local(x_100, "048_100", "QD2", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x02], "asterix.048_100", dict_local(x_100, "048_100", "QB4", "1") ) validator.add_dissection( [0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01], "asterix.048_100", dict_local(x_100, "048_100", "QD4", "1") ) validator.add_dissection( [0x01, 0x01, 0x08, 0x1f, 0xff], "asterix.048_110", { "asterix.048_110_3DHEIGHT": "204775" } ) validator.add_dissection( [0x01, 0x01, 0x08, 0x20, 0x00], "asterix.048_110", { "asterix.048_110_3DHEIGHT": "-204800" } ) x_120_01 = { "asterix.048_120_01_D": "0", "asterix.048_120_01_CAL": "0" } validator.add_dissection( [0x01, 0x01, 0x04, 0x80, 0x80, 0x00], "asterix.048_120", dict_fspec_local(x_120_01, "048_120_01", "D", "1") ) validator.add_dissection( [0x01, 0x01, 0x04, 0x80, 0x01, 0xff], "asterix.048_120", dict_fspec_local(x_120_01, "048_120_01", "CAL", "511") ) validator.add_dissection( [0x01, 0x01, 0x04, 0x80, 0x02, 0x00], "asterix.048_120", dict_fspec_local(x_120_01, "048_120_01", "CAL", "-512") ) x_120_02 = { "asterix.048_120_02_DOP": "0", "asterix.048_120_02_AMB": "0", "asterix.048_120_02_FRQ": "0" } validator.add_dissection( [0x01, 0x01, 0x04, 0x40, 0x01, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00], "asterix.048_120", counter_local(x_120_02, "1", "048_120_02", "DOP", "32767") ) validator.add_dissection( [0x01, 0x01, 0x04, 0x40, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.048_120", counter_local(x_120_02, "1", "048_120_02", "DOP", "-32768") ) validator.add_dissection( [0x01, 0x01, 0x04, 0x40, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00], "asterix.048_120", counter_local(x_120_02, "1", "048_120_02", "AMB", "65535") ) validator.add_dissection( [0x01, 0x01, 0x04, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff], "asterix.048_120", counter_local(x_120_02, "1", "048_120_02", "FRQ", "65535") ) validator.add_dissection( [0x01, 0x01, 0x04, 0x40, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff], "asterix.048_120", { "asterix.fspec": "", "asterix.048_120_02": { "asterix.counter": "3", "asterix.048_120_02": dict_local(x_120_02, "048_120_02", "DOP", "-32768"), "asterix.048_120_02": dict_local(x_120_02, "048_120_02", "AMB", "65535"), "asterix.048_120_02": dict_local(x_120_02, "048_120_02", "FRQ", "65535") } } ) x_230 = { "asterix.048_230_COM": "0", "asterix.048_230_STAT": "0", "asterix.048_230_SI": "0", "asterix.048_230_MSSC": "0", "asterix.048_230_ARC": "0", "asterix.048_230_AIC": "0", "asterix.048_230_B1A": "0", "asterix.048_230_B1B": "0" } validator.add_dissection( [0x01, 0x01, 0x02, 0xe0, 0x00], "asterix.048_230", dict_local(x_230, "048_230", "COM", "7") ) validator.add_dissection( [0x01, 0x01, 0x02, 0x1c, 0x00], "asterix.048_230", dict_local(x_230, "048_230", "STAT", "7") ) validator.add_dissection( [0x01, 0x01, 0x02, 0x02, 0x00], "asterix.048_230", dict_local(x_230, "048_230", "SI", "1") ) validator.add_dissection( [0x01, 0x01, 0x02, 0x00, 0x80], "asterix.048_230", dict_local(x_230, "048_230", "MSSC", "1") ) validator.add_dissection( [0x01, 0x01, 0x02, 0x00, 0x40], "asterix.048_230", dict_local(x_230, "048_230", "ARC", "1") ) validator.add_dissection( [0x01, 0x01, 0x02, 0x00, 0x20], "asterix.048_230", dict_local(x_230, "048_230", "AIC", "1") ) validator.add_dissection( [0x01, 0x01, 0x02, 0x00, 0x10], "asterix.048_230", dict_local(x_230, "048_230", "B1A", "1") ) validator.add_dissection( [0x01, 0x01, 0x02, 0x00, 0x0f], "asterix.048_230", dict_local(x_230, "048_230", "B1B", "15") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x80, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77], "asterix.048_260", { "asterix.048_260_ACAS": "11:22:33:44:55:66:77" } ) x_055 = { "asterix.048_055_V": "0", "asterix.048_055_G": "0", "asterix.048_055_L": "0", "asterix.048_055_CODE": "0" } validator.add_dissection( [0x01, 0x01, 0x01, 0x40, 0x80], "asterix.048_055", dict_local(x_055, "048_055", "V", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x40, 0x40], "asterix.048_055", dict_local(x_055, "048_055", "G", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x40, 0x20], "asterix.048_055", dict_local(x_055, "048_055", "L", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x40, 0x1f], "asterix.048_055", dict_local(x_055, "048_055", "CODE", "31") ) x_050 = { "asterix.048_050_V": "0", "asterix.048_050_G": "0", "asterix.048_050_L": "0", "asterix.048_050_SQUAWK": "0" } validator.add_dissection( [0x01, 0x01, 0x01, 0x20, 0x80, 0x00], "asterix.048_050", dict_local(x_050, "048_050", "V", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x20, 0x40, 0x00], "asterix.048_050", dict_local(x_050, "048_050", "G", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x20, 0x20, 0x00], "asterix.048_050", dict_local(x_050, "048_050", "L", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x20, 0x0f, 0xff], "asterix.048_050", dict_local(x_050, "048_050", "SQUAWK", "4095") ) x_065 = { "asterix.048_065_QA4": "0", "asterix.048_065_QA2": "0", "asterix.048_065_QA1": "0", "asterix.048_065_QB2": "0", "asterix.048_065_QB1": "0" } validator.add_dissection( [0x01, 0x01, 0x01, 0x10, 0x10], "asterix.048_065", dict_local(x_065, "048_065", "QA4", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x10, 0x08], "asterix.048_065", dict_local(x_065, "048_065", "QA2", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x10, 0x04], "asterix.048_065", dict_local(x_065, "048_065", "QA1", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x10, 0x02], "asterix.048_065", dict_local(x_065, "048_065", "QB2", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x10, 0x01], "asterix.048_065", dict_local(x_065, "048_065", "QB1", "1") ) x_060 = { "asterix.048_060_QA4": "0", "asterix.048_060_QA2": "0", "asterix.048_060_QA1": "0", "asterix.048_060_QB4": "0", "asterix.048_060_QB2": "0", "asterix.048_060_QB1": "0", "asterix.048_060_QC4": "0", "asterix.048_060_QC2": "0", "asterix.048_060_QC1": "0", "asterix.048_060_QD4": "0", "asterix.048_060_QD2": "0", "asterix.048_060_QD1": "0" } validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x08, 0x00], "asterix.048_060", dict_local(x_060, "048_060", "QA4", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x04, 0x00], "asterix.048_060", dict_local(x_060, "048_060", "QA2", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x02, 0x00], "asterix.048_060", dict_local(x_060, "048_060", "QA1", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x01, 0x00], "asterix.048_060", dict_local(x_060, "048_060", "QB4", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x00, 0x80], "asterix.048_060", dict_local(x_060, "048_060", "QB2", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x00, 0x40], "asterix.048_060", dict_local(x_060, "048_060", "QB1", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x00, 0x20], "asterix.048_060", dict_local(x_060, "048_060", "QC4", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x00, 0x10], "asterix.048_060", dict_local(x_060, "048_060", "QC2", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x00, 0x08], "asterix.048_060", dict_local(x_060, "048_060", "QC1", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x00, 0x04], "asterix.048_060", dict_local(x_060, "048_060", "QD4", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x00, 0x02], "asterix.048_060", dict_local(x_060, "048_060", "QD2", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x08, 0x00, 0x01], "asterix.048_060", dict_local(x_060, "048_060", "QD1", "1") ) validator.add_dissection( [0x01, 0x01, 0x01, 0x04, 0x01], "asterix.048_SP", "" ) validator.add_dissection( [0x01, 0x01, 0x01, 0x04, 0x10, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff], "asterix.048_SP", "" ) x_re_md5 = { "asterix.048_RE_MD5_01_M5": "0", "asterix.048_RE_MD5_01_ID": "0", "asterix.048_RE_MD5_01_DA": "0", "asterix.048_RE_MD5_01_M1": "0", "asterix.048_RE_MD5_01_M2": "0", "asterix.048_RE_MD5_01_M3": "0", "asterix.048_RE_MD5_01_MC": "0" } validator.add_re_dissection( [0x80, 0x80, 0x80], "MD5", dict_fspec_local(x_re_md5, "048_RE_MD5_01", "M5", "1") ) validator.add_re_dissection( [0x80, 0x80, 0x40], "MD5", dict_fspec_local(x_re_md5, "048_RE_MD5_01", "ID", "1") ) validator.add_re_dissection( [0x80, 0x80, 0x20], "MD5", dict_fspec_local(x_re_md5, "048_RE_MD5_01", "DA", "1") ) validator.add_re_dissection( [0x80, 0x80, 0x10], "MD5", dict_fspec_local(x_re_md5, "048_RE_MD5_01", "M1", "1") ) validator.add_re_dissection( [0x80, 0x80, 0x08], "MD5", dict_fspec_local(x_re_md5, "048_RE_MD5_01", "M2", "1") ) validator.add_re_dissection( [0x80, 0x80, 0x04], "MD5", dict_fspec_local(x_re_md5, "048_RE_MD5_01", "M3", "1") ) validator.add_re_dissection( [0x80, 0x80, 0x02], "MD5", dict_fspec_local(x_re_md5, "048_RE_MD5_01", "MC", "1") ) x_re_pmn = { "asterix.048_RE_MD5_02_PIN": "0", "asterix.048_RE_MD5_02_NAV": "0", "asterix.048_RE_MD5_02_NAT": "0", "asterix.048_RE_MD5_02_MIS": "0" } validator.add_re_dissection( [0x80, 0x40, 0x3f, 0xff, 0x00, 0x00], "MD5", dict_fspec_local(x_re_pmn, "048_RE_MD5_02", "PIN", "16383") ) validator.add_re_dissection( [0x80, 0x40, 0x00, 0x00, 0x20, 0x00], "MD5", dict_fspec_local(x_re_pmn, "048_RE_MD5_02", "NAV", "1") ) validator.add_re_dissection( [0x80, 0x40, 0x00, 0x00, 0x1f, 0x00], "MD5", dict_fspec_local(x_re_pmn, "048_RE_MD5_02", "NAT", "31") ) validator.add_re_dissection( [0x80, 0x40, 0x00, 0x00, 0x00, 0x3f], "MD5", dict_fspec_local(x_re_pmn, "048_RE_MD5_02", "MIS", "63") ) x_re_pos = { "asterix.048_RE_MD5_03_LAT": "0", "asterix.048_RE_MD5_03_LON": "0" } validator.add_re_dissection( [0x80, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00], "MD5", dict_fspec_local(x_re_pos, "048_RE_MD5_03", "LAT", "90") ) validator.add_re_dissection( [0x80, 0x20, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00], "MD5", dict_fspec_local(x_re_pos, "048_RE_MD5_03", "LAT", "-90") ) validator.add_re_dissection( [0x80, 0x20, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff], "MD5", dict_fspec_local(x_re_pos, "048_RE_MD5_03", "LON", "179.999978542328") ) validator.add_re_dissection( [0x80, 0x20, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00], "MD5", dict_fspec_local(x_re_pos, "048_RE_MD5_03", "LON", "-180") ) x_re_ga = { "asterix.048_RE_MD5_04_RES": "0", "asterix.048_RE_MD5_04_GA": "0" } validator.add_re_dissection( [0x80, 0x10, 0x40, 0x00], "MD5", dict_fspec_local(x_re_ga, "048_RE_MD5_04", "RES", "1") ) validator.add_re_dissection( [0x80, 0x10, 0x1f, 0xff], "MD5", dict_fspec_local(x_re_ga, "048_RE_MD5_04", "GA", "204775") ) validator.add_re_dissection( [0x80, 0x10, 0x20, 0x00], "MD5", dict_fspec_local(x_re_ga, "048_RE_MD5_04", "GA", "-204800") ) x_re_em1 = { "asterix.048_RE_MD5_05_V": "0", "asterix.048_RE_MD5_05_G": "0", "asterix.048_RE_MD5_05_L": "0", "asterix.048_RE_MD5_05_SQUAWK": "0" } validator.add_re_dissection( [0x80, 0x08, 0x80, 0x00], "MD5", dict_fspec_local(x_re_em1, "048_RE_MD5_05", "V", "1") ) validator.add_re_dissection( [0x80, 0x08, 0x40, 0x00], "MD5", dict_fspec_local(x_re_em1, "048_RE_MD5_05", "G", "1") ) validator.add_re_dissection( [0x80, 0x08, 0x20, 0x00], "MD5", dict_fspec_local(x_re_em1, "048_RE_MD5_05", "L", "1") ) validator.add_re_dissection( [0x80, 0x08, 0x0f, 0xff], "MD5", dict_fspec_local(x_re_em1, "048_RE_MD5_05", "SQUAWK", "4095") ) validator.add_re_dissection( [0x80, 0x04, 0x7f], "MD5", fspec_local("048_RE_MD5_06", "TOS", "0.9921875") ) validator.add_re_dissection( [0x80, 0x04, 0x80], "MD5", fspec_local("048_RE_MD5_06", "TOS", "-1") ) x_re_xp = { "asterix.048_RE_MD5_07_XP": "0", "asterix.048_RE_MD5_07_X5": "0", "asterix.048_RE_MD5_07_XC": "0", "asterix.048_RE_MD5_07_X3": "0", "asterix.048_RE_MD5_07_X2": "0", "asterix.048_RE_MD5_07_X1": "0" } validator.add_re_dissection( [0x80, 0x02, 0x20], "MD5", dict_fspec_local(x_re_xp, "048_RE_MD5_07", "XP", "1") ) validator.add_re_dissection( [0x80, 0x02, 0x10], "MD5", dict_fspec_local(x_re_xp, "048_RE_MD5_07", "X5", "1") ) validator.add_re_dissection( [0x80, 0x02, 0x08], "MD5", dict_fspec_local(x_re_xp, "048_RE_MD5_07", "XC", "1") ) validator.add_re_dissection( [0x80, 0x02, 0x04], "MD5", dict_fspec_local(x_re_xp, "048_RE_MD5_07", "X3", "1") ) validator.add_re_dissection( [0x80, 0x02, 0x02], "MD5", dict_fspec_local(x_re_xp, "048_RE_MD5_07", "X2", "1") ) validator.add_re_dissection( [0x80, 0x02, 0x01], "MD5", dict_fspec_local(x_re_xp, "048_RE_MD5_07", "X1", "1") ) x_re_md5 = { "asterix.048_RE_M5N_01_M5": "0", "asterix.048_RE_M5N_01_ID": "0", "asterix.048_RE_M5N_01_DA": "0", "asterix.048_RE_M5N_01_M1": "0", "asterix.048_RE_M5N_01_M2": "0", "asterix.048_RE_M5N_01_M3": "0", "asterix.048_RE_M5N_01_MC": "0" } validator.add_re_dissection( [0x40, 0x80, 0x80], "M5N", dict_fspec_local(x_re_md5, "048_RE_M5N_01", "M5", "1") ) validator.add_re_dissection( [0x40, 0x80, 0x40], "M5N", dict_fspec_local(x_re_md5, "048_RE_M5N_01", "ID", "1") ) validator.add_re_dissection( [0x40, 0x80, 0x20], "M5N", dict_fspec_local(x_re_md5, "048_RE_M5N_01", "DA", "1") ) validator.add_re_dissection( [0x40, 0x80, 0x10], "M5N", dict_fspec_local(x_re_md5, "048_RE_M5N_01", "M1", "1") ) validator.add_re_dissection( [0x40, 0x80, 0x08], "M5N", dict_fspec_local(x_re_md5, "048_RE_M5N_01", "M2", "1") ) validator.add_re_dissection( [0x40, 0x80, 0x04], "M5N", dict_fspec_local(x_re_md5, "048_RE_M5N_01", "M3", "1") ) validator.add_re_dissection( [0x40, 0x80, 0x02], "M5N", dict_fspec_local(x_re_md5, "048_RE_M5N_01", "MC", "1") ) x_re_pmn = { "asterix.048_RE_M5N_02_PIN": "0", "asterix.048_RE_M5N_02_NOV": "0", "asterix.048_RE_M5N_02_NO": "0" } validator.add_re_dissection( [0x40, 0x40, 0x3f, 0xff, 0x00, 0x00], "M5N", dict_fspec_local(x_re_pmn, "048_RE_M5N_02", "PIN", "16383") ) validator.add_re_dissection( [0x40, 0x40, 0x00, 0x00, 0x08, 0x00], "M5N", dict_fspec_local(x_re_pmn, "048_RE_M5N_02", "NOV", "1") ) validator.add_re_dissection( [0x40, 0x40, 0x00, 0x00, 0x07, 0xff], "M5N", dict_fspec_local(x_re_pmn, "048_RE_M5N_02", "NO", "2047") ) x_re_pos = { "asterix.048_RE_M5N_03_LAT": "0", "asterix.048_RE_M5N_03_LON": "0" } validator.add_re_dissection( [0x40, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00], "M5N", dict_fspec_local(x_re_pos, "048_RE_M5N_03", "LAT", "90") ) validator.add_re_dissection( [0x40, 0x20, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00], "M5N", dict_fspec_local(x_re_pos, "048_RE_M5N_03", "LAT", "-90") ) validator.add_re_dissection( [0x40, 0x20, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff], "M5N", dict_fspec_local(x_re_pos, "048_RE_M5N_03", "LON", "179.999978542328") ) validator.add_re_dissection( [0x40, 0x20, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00], "M5N", dict_fspec_local(x_re_pos, "048_RE_M5N_03", "LON", "-180") ) x_re_ga = { "asterix.048_RE_M5N_04_RES": "0", "asterix.048_RE_M5N_04_GA": "0" } validator.add_re_dissection( [0x40, 0x10, 0x40, 0x00], "M5N", dict_fspec_local(x_re_ga, "048_RE_M5N_04", "RES", "1") ) validator.add_re_dissection( [0x40, 0x10, 0x1f, 0xff], "M5N", dict_fspec_local(x_re_ga, "048_RE_M5N_04", "GA", "204775") ) validator.add_re_dissection( [0x40, 0x10, 0x20, 0x00], "M5N", dict_fspec_local(x_re_ga, "048_RE_M5N_04", "GA", "-204800") ) x_re_em1 = { "asterix.048_RE_M5N_05_V": "0", "asterix.048_RE_M5N_05_G": "0", "asterix.048_RE_M5N_05_L": "0", "asterix.048_RE_M5N_05_SQUAWK": "0" } validator.add_re_dissection( [0x40, 0x08, 0x80, 0x00], "M5N", dict_fspec_local(x_re_em1, "048_RE_M5N_05", "V", "1") ) validator.add_re_dissection( [0x40, 0x08, 0x40, 0x00], "M5N", dict_fspec_local(x_re_em1, "048_RE_M5N_05", "G", "1") ) validator.add_re_dissection( [0x40, 0x08, 0x20, 0x00], "M5N", dict_fspec_local(x_re_em1, "048_RE_M5N_05", "L", "1") ) validator.add_re_dissection( [0x40, 0x08, 0x0f, 0xff], "M5N", dict_fspec_local(x_re_em1, "048_RE_M5N_05", "SQUAWK", "4095") ) validator.add_re_dissection( [0x40, 0x04, 0x7f], "M5N", fspec_local("048_RE_M5N_06", "TOS", "0.9921875") ) validator.add_re_dissection( [0x40, 0x04, 0x80], "M5N", fspec_local("048_RE_M5N_06", "TOS", "-1") ) x_re_xp = { "asterix.048_RE_M5N_07_XP": "0", "asterix.048_RE_M5N_07_X5": "0", "asterix.048_RE_M5N_07_XC": "0", "asterix.048_RE_M5N_07_X3": "0", "asterix.048_RE_M5N_07_X2": "0", "asterix.048_RE_M5N_07_X1": "0" } validator.add_re_dissection( [0x40, 0x02, 0x20], "M5N", dict_fspec_local(x_re_xp, "048_RE_M5N_07", "XP", "1") ) validator.add_re_dissection( [0x40, 0x02, 0x10], "M5N", dict_fspec_local(x_re_xp, "048_RE_M5N_07", "X5", "1") ) validator.add_re_dissection( [0x40, 0x02, 0x08], "M5N", dict_fspec_local(x_re_xp, "048_RE_M5N_07", "XC", "1") ) validator.add_re_dissection( [0x40, 0x02, 0x04], "M5N", dict_fspec_local(x_re_xp, "048_RE_M5N_07", "X3", "1") ) validator.add_re_dissection( [0x40, 0x02, 0x02], "M5N", dict_fspec_local(x_re_xp, "048_RE_M5N_07", "X2", "1") ) validator.add_re_dissection( [0x40, 0x02, 0x01], "M5N", dict_fspec_local(x_re_xp, "048_RE_M5N_07", "X1", "1") ) validator.add_re_dissection( [0x40, 0x01, 0x80, 0x1f], "M5N", fspec_local("048_RE_M5N_08", "FOM", "31") ) validator.add_re_dissection( [0x20, 0x06], "M4E", { "asterix.048_RE_M4E_FOE_FRI": "3", "asterix.FX": "0" } ) validator.add_re_dissection( [0x10, 0x80, 0xff], "RPC", fspec_local("048_RE_RPC_01", "SCO", "255") ) validator.add_re_dissection( [0x10, 0x40, 0xff, 0xff], "RPC", fspec_local("048_RE_RPC_02", "SCR", "6553.5") ) validator.add_re_dissection( [0x10, 0x20, 0xff, 0xff], "RPC", fspec_local("048_RE_RPC_03", "RW", "255.99609375") ) validator.add_re_dissection( [0x10, 0x10, 0xff, 0xff], "RPC", fspec_local("048_RE_RPC_04", "AR", "255.99609375") ) validator.add_re_dissection( [0x08, 0xff, 0xff, 0xff], "ERR", { "asterix.048_RE_ERR_RHO": "65535.99609375" } ) validator.check_dissections() def test_undefined_value_handling(self, asterix_re_validator): '''verifies that the dissector can dissect undefined field values by setting the maximum value of bits or by setting all undefined bits''' validator = asterix_re_validator(48, [0x01, 0x01, 0x01, 0x02]) validator.add_dissection( [0x08, 0x10, 0x00], "asterix.048_070", { "asterix.048_070_V": "0", "asterix.048_070_G": "0", "asterix.048_070_L": "0", "asterix.048_070_SQUAWK": "0" } ) validator.add_dissection( [0x01, 0x10, 0xf0, 0x00], "asterix.048_161", { "asterix.048_161_TN": "0" } ) validator.add_dissection( [0x01, 0x02, 0x01, 0x0e], "asterix.048_170", { "asterix.048_170_CNF": "0", "asterix.048_170_RAD": "0", "asterix.048_170_DOU": "0", "asterix.048_170_MAH": "0", "asterix.048_170_CDM": "0", "asterix.048_170_TRE": "0", "asterix.048_170_GHO": "0", "asterix.048_170_SUP": "0", "asterix.048_170_TCC": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x01, 0x01, 0x40, 0xfe], "asterix.048_030", { "asterix.048_030_WE": "127", "asterix.FX": "0" } ) validator.add_dissection( [0x01, 0x01, 0x20, 0xf0, 0x00], "asterix.048_080", { "asterix.048_080_QA4": "0", "asterix.048_080_QA2": "0", "asterix.048_080_QA1": "0", "asterix.048_080_QB4": "0", "asterix.048_080_QB2": "0", "asterix.048_080_QB1": "0", "asterix.048_080_QC4": "0", "asterix.048_080_QC2": "0", "asterix.048_080_QC1": "0", "asterix.048_080_QD4": "0", "asterix.048_080_QD2": "0", "asterix.048_080_QD1": "0" } ) validator.add_dissection( [0x01, 0x01, 0x10, 0x30, 0x00, 0xf0, 0x00], "asterix.048_100", { "asterix.048_100_V": "0", "asterix.048_100_G": "0", "asterix.048_100_C1": "0", "asterix.048_100_A1": "0", "asterix.048_100_C2": "0", "asterix.048_100_A2": "0", "asterix.048_100_C4": "0", "asterix.048_100_A4": "0", "asterix.048_100_B1": "0", "asterix.048_100_D1": "0", "asterix.048_100_B2": "0", "asterix.048_100_D2": "0", "asterix.048_100_B4": "0", "asterix.048_100_D4": "0", "asterix.048_100_QC1": "0", "asterix.048_100_QA1": "0", "asterix.048_100_QC2": "0", "asterix.048_100_QA2": "0", "asterix.048_100_QC4": "0", "asterix.048_100_QA4": "0", "asterix.048_100_QB1": "0", "asterix.048_100_QD1": "0", "asterix.048_100_QB2": "0", "asterix.048_100_QD2": "0", "asterix.048_100_QB4": "0", "asterix.048_100_QD4": "0" } ) validator.add_dissection( [0x01, 0x01, 0x04, 0x80, 0x7c, 0x00], "asterix.048_120", { "asterix.fspec": "", "asterix.048_120_01": { "asterix.048_120_01_D": "0", "asterix.048_120_01_CAL": "0" } } ) validator.add_dissection( [0x01, 0x01, 0x04, 0x3e], "asterix.048_120", { "asterix.fspec": "" } ) validator.add_dissection( [0x01, 0x01, 0x02, 0x01, 0x00], "asterix.048_230", { "asterix.048_230_COM": "0", "asterix.048_230_STAT": "0", "asterix.048_230_SI": "0", "asterix.048_230_MSSC": "0", "asterix.048_230_ARC": "0", "asterix.048_230_AIC": "0", "asterix.048_230_B1A": "0", "asterix.048_230_B1B": "0" } ) validator.add_dissection( [0x01, 0x01, 0x01, 0x20, 0x10, 0x00], "asterix.048_050", { "asterix.048_050_V": "0", "asterix.048_050_G": "0", "asterix.048_050_L": "0", "asterix.048_050_SQUAWK": "0" } ) validator.add_dissection( [0x01, 0x01, 0x01, 0x10, 0xe0], "asterix.048_065", { "asterix.048_065_QA4": "0", "asterix.048_065_QA2": "0", "asterix.048_065_QA1": "0", "asterix.048_065_QB2": "0", "asterix.048_065_QB1": "0" } ) x_re_md5 = { "asterix.048_RE_MD5_01_M5": "0", "asterix.048_RE_MD5_01_ID": "0", "asterix.048_RE_MD5_01_DA": "0", "asterix.048_RE_MD5_01_M1": "0", "asterix.048_RE_MD5_01_M2": "0", "asterix.048_RE_MD5_01_M3": "0", "asterix.048_RE_MD5_01_MC": "0" } validator.add_re_dissection( [0x80, 0x80, 0x01, 0x00], "MD5", dict_fspec_local(x_re_md5, "048_RE_MD5_01", "M5", "0") ) x_re_pmn = { "asterix.048_RE_MD5_02_PIN": "0", "asterix.048_RE_MD5_02_NAV": "0", "asterix.048_RE_MD5_02_NAT": "0", "asterix.048_RE_MD5_02_MIS": "0" } validator.add_re_dissection( [0x80, 0x40, 0xc0, 0x00, 0xc0, 0xc0], "MD5", dict_fspec_local(x_re_pmn, "048_RE_MD5_02", "PIN", "0") ) x_re_em1 = { "asterix.048_RE_MD5_05_V": "0", "asterix.048_RE_MD5_05_G": "0", "asterix.048_RE_MD5_05_L": "0", "asterix.048_RE_MD5_05_SQUAWK": "0" } validator.add_re_dissection( [0x80, 0x08, 0x10, 0x00], "MD5", dict_fspec_local(x_re_em1, "048_RE_MD5_05", "V", "0") ) x_re_md5 = { "asterix.048_RE_M5N_01_M5": "0", "asterix.048_RE_M5N_01_ID": "0", "asterix.048_RE_M5N_01_DA": "0", "asterix.048_RE_M5N_01_M1": "0", "asterix.048_RE_M5N_01_M2": "0", "asterix.048_RE_M5N_01_M3": "0", "asterix.048_RE_M5N_01_MC": "0" } validator.add_re_dissection( [0x40, 0x80, 0x01, 0x00], "M5N", dict_fspec_local(x_re_md5, "048_RE_M5N_01", "M5", "0") ) x_re_pmn = { "asterix.048_RE_M5N_02_PIN": "0", "asterix.048_RE_M5N_02_NOV": "0", "asterix.048_RE_M5N_02_NO": "0" } validator.add_re_dissection( [0x40, 0x40, 0xc0, 0x00, 0xf0, 0x00], "M5N", dict_fspec_local(x_re_pmn, "048_RE_M5N_02", "PIN", "0") ) x_re_em1 = { "asterix.048_RE_M5N_05_V": "0", "asterix.048_RE_M5N_05_G": "0", "asterix.048_RE_M5N_05_L": "0", "asterix.048_RE_M5N_05_SQUAWK": "0" } validator.add_re_dissection( [0x40, 0x08, 0x10, 0x00], "M5N", dict_fspec_local(x_re_em1, "048_RE_M5N_05", "V", "0") ) validator.add_re_dissection( [0x40, 0x01, 0x80, 0xe0], "M5N", fspec_local("048_RE_M5N_08", "FOM", "0") ) validator.add_re_dissection( [0x20, 0xf8], "M4E", { "asterix.048_RE_M4E_FOE_FRI": "0", "asterix.FX": "0" } ) validator.add_re_dissection( [0x20, 0x01, 0x00], "M4E", { "asterix.048_RE_M4E_FOE_FRI": "0", "asterix.FX": "1" } ) validator.check_dissections() @fixtures.mark_usefixtures('test_env') @fixtures.uses_fixtures class case_category_063(subprocesstest.SubprocessTestCase): ''' Unittest case for ASTERIX Category 063 Online specification: https://www.eurocontrol.int/publications/cat063-sensor-status-messages-part-10 Part 10: Category 63 (1.4) Sensor Status Messages Standard User Application Profile FRN Data Item Information Length 1 I063/010 Data Source Identifier 2 2 I063/015 Service Identification 1 3 I063/030 Time of Message 3 4 I063/050 Sensor Identifier 2 5 I063/060 Sensor Configuration and Status 1+1 6 I063/070 Time Stamping Bias 2 7 I063/080 SSR/Mode S Range Gain and Bias 4 FX - Field extension indicator - 8 I063/081 SSR/Mode S Azimuth Bias 2 9 I063/090 PSR Range Gain and Bias 4 10 I063/091 PSR Azimuth Bias 2 11 I063/092 PSR Elevation Bias 2 12 - spare - 13 RE Reserved Expansion Field 1+1+ 14 SP Special Purpose Field 1+1+ FX - Field extension indicator - ''' maxDiff = None def test_for_fields(self, asterix_validator): '''verifies existence of all fields and their maximum value''' validator = asterix_validator(63) validator.add_dissection( [0x80, 0xff, 0x00], "asterix.063_010", { "asterix.SAC": "255", "asterix.SIC": "0" } ) validator.add_dissection( [0x80, 0x00, 0xff], "asterix.063_010", { "asterix.SAC": "0", "asterix.SIC": "255" } ) validator.add_dissection( [0x40, 0xff], "asterix.063_015", { "asterix.063_015_SI": "255" } ) validator.add_dissection( [0x20, 0xa8, 0xbf, 0xff], "asterix.063_030", { "asterix.TOD": "86399.9921875" } ) validator.add_dissection( [0x10, 0xff, 0x00], "asterix.063_050", { "asterix.SAC": "255", "asterix.SIC": "0" } ) validator.add_dissection( [0x10, 0x00, 0xff], "asterix.063_050", { "asterix.SAC": "0", "asterix.SIC": "255" } ) validator.add_dissection( [0x08, 0xc0], "asterix.063_060", { "asterix.063_060_CON": "3", "asterix.063_060_PSR": "0", "asterix.063_060_SSR": "0", "asterix.063_060_MDS": "0", "asterix.063_060_ADS": "0", "asterix.063_060_MLT": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x08, 0x20], "asterix.063_060", { "asterix.063_060_CON": "0", "asterix.063_060_PSR": "1", "asterix.063_060_SSR": "0", "asterix.063_060_MDS": "0", "asterix.063_060_ADS": "0", "asterix.063_060_MLT": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x08, 0x10], "asterix.063_060", { "asterix.063_060_CON": "0", "asterix.063_060_PSR": "0", "asterix.063_060_SSR": "1", "asterix.063_060_MDS": "0", "asterix.063_060_ADS": "0", "asterix.063_060_MLT": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x08, 0x08], "asterix.063_060", { "asterix.063_060_CON": "0", "asterix.063_060_PSR": "0", "asterix.063_060_SSR": "0", "asterix.063_060_MDS": "1", "asterix.063_060_ADS": "0", "asterix.063_060_MLT": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x08, 0x04], "asterix.063_060", { "asterix.063_060_CON": "0", "asterix.063_060_PSR": "0", "asterix.063_060_SSR": "0", "asterix.063_060_MDS": "0", "asterix.063_060_ADS": "1", "asterix.063_060_MLT": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x08, 0x02], "asterix.063_060", { "asterix.063_060_CON": "0", "asterix.063_060_PSR": "0", "asterix.063_060_SSR": "0", "asterix.063_060_MDS": "0", "asterix.063_060_ADS": "0", "asterix.063_060_MLT": "1", "asterix.FX": "0" } ) validator.add_dissection( [0x08, 0x01, 0x80], "asterix.063_060", { "asterix.063_060_CON": "0", "asterix.063_060_PSR": "0", "asterix.063_060_SSR": "0", "asterix.063_060_MDS": "0", "asterix.063_060_ADS": "0", "asterix.063_060_MLT": "0", "asterix.063_060_OPS": "1", "asterix.063_060_ODP": "0", "asterix.063_060_OXT": "0", "asterix.063_060_MSC": "0", "asterix.063_060_TSV": "0", "asterix.063_060_NPW": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x08, 0x01, 0x40], "asterix.063_060", { "asterix.063_060_CON": "0", "asterix.063_060_PSR": "0", "asterix.063_060_SSR": "0", "asterix.063_060_MDS": "0", "asterix.063_060_ADS": "0", "asterix.063_060_MLT": "0", "asterix.063_060_OPS": "0", "asterix.063_060_ODP": "1", "asterix.063_060_OXT": "0", "asterix.063_060_MSC": "0", "asterix.063_060_TSV": "0", "asterix.063_060_NPW": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x08, 0x01, 0x20], "asterix.063_060", { "asterix.063_060_CON": "0", "asterix.063_060_PSR": "0", "asterix.063_060_SSR": "0", "asterix.063_060_MDS": "0", "asterix.063_060_ADS": "0", "asterix.063_060_MLT": "0", "asterix.063_060_OPS": "0", "asterix.063_060_ODP": "0", "asterix.063_060_OXT": "1", "asterix.063_060_MSC": "0", "asterix.063_060_TSV": "0", "asterix.063_060_NPW": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x08, 0x01, 0x10], "asterix.063_060", { "asterix.063_060_CON": "0", "asterix.063_060_PSR": "0", "asterix.063_060_SSR": "0", "asterix.063_060_MDS": "0", "asterix.063_060_ADS": "0", "asterix.063_060_MLT": "0", "asterix.063_060_OPS": "0", "asterix.063_060_ODP": "0", "asterix.063_060_OXT": "0", "asterix.063_060_MSC": "1", "asterix.063_060_TSV": "0", "asterix.063_060_NPW": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x08, 0x01, 0x08], "asterix.063_060", { "asterix.063_060_CON": "0", "asterix.063_060_PSR": "0", "asterix.063_060_SSR": "0", "asterix.063_060_MDS": "0", "asterix.063_060_ADS": "0", "asterix.063_060_MLT": "0", "asterix.063_060_OPS": "0", "asterix.063_060_ODP": "0", "asterix.063_060_OXT": "0", "asterix.063_060_MSC": "0", "asterix.063_060_TSV": "1", "asterix.063_060_NPW": "0", "asterix.FX": "0" } ) validator.add_dissection( [0x08, 0x01, 0x04], "asterix.063_060", { "asterix.063_060_CON": "0", "asterix.063_060_PSR": "0", "asterix.063_060_SSR": "0", "asterix.063_060_MDS": "0", "asterix.063_060_ADS": "0", "asterix.063_060_MLT": "0", "asterix.063_060_OPS": "0", "asterix.063_060_ODP": "0", "asterix.063_060_OXT": "0", "asterix.063_060_MSC": "0", "asterix.063_060_TSV": "0", "asterix.063_060_NPW": "1", "asterix.FX": "0" } ) validator.add_dissection( [0x04, 0xff, 0xff], "asterix.063_070", { "asterix.063_070_TSB": "65535" } ) validator.add_dissection( [0x02, 0x7f, 0xff, 0x00, 0x00], "asterix.063_080", { "asterix.063_080_SRG": "0.32767", "asterix.063_080_SRB": "0" } ) validator.add_dissection( [0x02, 0x80, 0x00, 0x00, 0x00], "asterix.063_080", { "asterix.063_080_SRG": "-0.32768", "asterix.063_080_SRB": "0" } ) validator.add_dissection( [0x02, 0x00, 0x00, 0x7f, 0xff], "asterix.063_080", { "asterix.063_080_SRG": "0", "asterix.063_080_SRB": "255.9921875" } ) validator.add_dissection( [0x02, 0x00, 0x00, 0x80, 0x00], "asterix.063_080", { "asterix.063_080_SRG": "0", "asterix.063_080_SRB": "-256" } ) validator.add_dissection( [0x01, 0x80, 0x7f, 0xff], "asterix.063_081", { "asterix.063_081_SAB": "179.994506835938" } ) validator.add_dissection( [0x01, 0x80, 0x80, 0x00], "asterix.063_081", { "asterix.063_081_SAB": "-180" } ) validator.add_dissection( [0x01, 0x40, 0x7f, 0xff, 0x00, 0x00], "asterix.063_090", { "asterix.063_090_PRG": "0.32767", "asterix.063_090_PRB": "0" } ) validator.add_dissection( [0x01, 0x40, 0x80, 0x00, 0x00, 0x00], "asterix.063_090", { "asterix.063_090_PRG": "-0.32768", "asterix.063_090_PRB": "0" } ) validator.add_dissection( [0x01, 0x40, 0x00, 0x00, 0x7f, 0xff], "asterix.063_090", { "asterix.063_090_PRG": "0", "asterix.063_090_PRB": "255.9921875" } ) validator.add_dissection( [0x01, 0x40, 0x00, 0x00, 0x80, 0x00], "asterix.063_090", { "asterix.063_090_PRG": "0", "asterix.063_090_PRB": "-256" } ) validator.add_dissection( [0x01, 0x20, 0x7f, 0xff], "asterix.063_091", { "asterix.063_091_PAB": "179.994506835938" } ) validator.add_dissection( [0x01, 0x20, 0x80, 0x00], "asterix.063_091", { "asterix.063_091_PAB": "-180" } ) validator.add_dissection( [0x01, 0x10, 0x7f, 0xff], "asterix.063_092", { "asterix.063_092_PEB": "179.994506835938" } ) validator.add_dissection( [0x01, 0x10, 0x80, 0x00], "asterix.063_092", { "asterix.063_092_PEB": "-180" } ) validator.check_dissections() def test_undefined_value_handling(self, asterix_validator): '''verifies that the dissector can dissect undefined field values by setting the maximum value of bits or by setting all undefined bits''' validator = asterix_validator(63) validator.add_dissection( [0x01, 0x08], "asterix.spare", "" ) validator.add_dissection( [0x01, 0x04, 0x02, 0x00], "asterix.063_RE", { "asterix.re_field_len": "2", "asterix.fspec": "" } ) validator.add_dissection( [0x01, 0x04, 0x10, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff], "asterix.063_RE", { "asterix.fspec": "", "asterix.re_field_len": "16" } ) validator.add_dissection( [0x01, 0x02, 0x01], "asterix.063_SP", "" ) validator.add_dissection( [0x01, 0x02, 0x10, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff], "asterix.063_SP", "" ) validator.check_dissections() @fixtures.mark_usefixtures('test_env') @fixtures.uses_fixtures class case_category_065(subprocesstest.SubprocessTestCase): ''' Unittest case for ASTERIX Category 065 Online specification: https://www.eurocontrol.int/publications/cat065-surveillance-data-processing-system-sdps-service-status-messages-part-15 https://www.eurocontrol.int/publications/cat065-coding-rules-reserved-expansion-field-part-15-appendix Part 15 Category 65 (1.4) SDPS Service Status Reports Standard User Application Profile FRN Data Item Information Length 1 I065/010 Data Source Identifier 2 2 I065/000 Message Type 1 3 I065/015 Service Identification 1 4 I065/030 Time of Message 3 5 I065/020 Batch Number 1 6 I065/040 SDPS Configuration and Status 1 7 I065/050 Service Status Report 1 FX - Field extension indicator - 8 - Spare - 9 - Spare - 10 - Spare - 11 - Spare - 12 - Spare - 13 RE Reserved Expansion Field 1+1+ 14 SP Special Purpose Field 1+1+ FX - Field extension indicator - ''' maxDiff = None def test_for_fields(self, asterix_validator): '''verifies existence of all fields and their maximum value''' validator = asterix_validator(65) validator.add_dissection( [0x80, 0xff, 0x00], "asterix.065_010", { "asterix.SAC": "255", "asterix.SIC": "0" } ) validator.add_dissection( [0x80, 0x00, 0xff], "asterix.065_010", { "asterix.SAC": "0", "asterix.SIC": "255" } ) validator.add_dissection( [0x40, 0x03], "asterix.065_000", { "asterix.065_000_MT": "3" } ) validator.add_dissection( [0x20, 0xff], "asterix.065_015", { "asterix.065_015_SI": "255" } ) validator.add_dissection( [0x10, 0xa8, 0xbf, 0xff], "asterix.065_030", { "asterix.TOD": "86399.9921875" } ) validator.add_dissection( [0x08, 0xff], "asterix.065_020", { "asterix.065_020_BTN": "255" } ) validator.add_dissection( [0x04, 0xc0], "asterix.065_040", { "asterix.065_040_NOGO": "3", "asterix.065_040_OVL": "0", "asterix.065_040_TSV": "0", "asterix.065_040_PSS": "0", "asterix.065_040_STTN": "0" } ) validator.add_dissection( [0x04, 0x20], "asterix.065_040", { "asterix.065_040_NOGO": "0", "asterix.065_040_OVL": "1", "asterix.065_040_TSV": "0", "asterix.065_040_PSS": "0", "asterix.065_040_STTN": "0" } ) validator.add_dissection( [0x04, 0x10], "asterix.065_040", { "asterix.065_040_NOGO": "0", "asterix.065_040_OVL": "0", "asterix.065_040_TSV": "1", "asterix.065_040_PSS": "0", "asterix.065_040_STTN": "0" } ) validator.add_dissection( [0x04, 0x0c], "asterix.065_040", { "asterix.065_040_NOGO": "0", "asterix.065_040_OVL": "0", "asterix.065_040_TSV": "0", "asterix.065_040_PSS": "3", "asterix.065_040_STTN": "0" } ) validator.add_dissection( [0x04, 0x02], "asterix.065_040", { "asterix.065_040_NOGO": "0", "asterix.065_040_OVL": "0", "asterix.065_040_TSV": "0", "asterix.065_040_PSS": "0", "asterix.065_040_STTN": "1" } ) validator.add_dissection( [0x02, 0xff], "asterix.065_050", { "asterix.065_050_REP": "255" } ) validator.add_dissection( [0x01, 0x04, 0x02, 0x00], "asterix.065_RE", { "asterix.re_field_len": "2", "asterix.fspec": "" } ) validator.add_dissection( [0x01, 0x04, 0x0a, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.065_RE", { "asterix.re_field_len": "10", "asterix.fspec": "", "asterix.065_RE_SRP": { "asterix.065_RE_SRP_Latitude": "90", "asterix.065_RE_SRP_Longitude": "0" } } ) validator.add_dissection( [0x01, 0x04, 0x0a, 0x80, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.065_RE", { "asterix.re_field_len": "10", "asterix.fspec": "", "asterix.065_RE_SRP": { "asterix.065_RE_SRP_Latitude": "-90", "asterix.065_RE_SRP_Longitude": "0" } } ) validator.add_dissection( [0x01, 0x04, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00], "asterix.065_RE", { "asterix.re_field_len": "10", "asterix.fspec": "", "asterix.065_RE_SRP": { "asterix.065_RE_SRP_Latitude": "0", "asterix.065_RE_SRP_Longitude": "180" } } ) validator.add_dissection( [0x01, 0x04, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00], "asterix.065_RE", { "asterix.re_field_len": "10", "asterix.fspec": "", "asterix.065_RE_SRP": { "asterix.065_RE_SRP_Latitude": "0", "asterix.065_RE_SRP_Longitude": "-180" } } ) validator.add_dissection( [0x01, 0x04, 0x04, 0x40, 0xff, 0xfc], "asterix.065_RE", { "asterix.re_field_len": "4", "asterix.fspec": "", "asterix.065_RE_ARL": { "asterix.065_RE_ARL_ARL": "65532" } } ) validator.check_dissections() def test_undefined_value_handling(self, asterix_validator): '''verifies that the dissector can dissect undefined field values by setting the maximum value of bits or by setting all undefined bits''' validator = asterix_validator(65) validator.add_dissection( [0x40, 0xff], "asterix.065_000", { "asterix.065_000_MT": "255" } ) validator.add_dissection( [0x10, 0xff, 0xff, 0xff], "asterix.065_030", { "asterix.TOD": "131071.9921875" } ) validator.add_dissection( [0x04, 0x01], "asterix.065_040", { "asterix.065_040_NOGO": "0", "asterix.065_040_OVL": "0", "asterix.065_040_TSV": "0", "asterix.065_040_PSS": "0", "asterix.065_040_STTN": "0" } ) validator.add_dissection( [0x01, 0x80], "asterix.spare", "" ) validator.add_dissection( [0x01, 0x40], "asterix.spare", "" ) validator.add_dissection( [0x01, 0x20], "asterix.spare", "" ) validator.add_dissection( [0x01, 0x10], "asterix.spare", "" ) validator.add_dissection( [0x01, 0x08], "asterix.spare", "" ) validator.add_dissection( [0x01, 0x04, 0x0a, 0x80, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00], "asterix.065_RE", { "asterix.re_field_len": "10", "asterix.fspec": "", "asterix.065_RE_SRP": { "asterix.065_RE_SRP_Latitude": "359.999999832362", "asterix.065_RE_SRP_Longitude": "0" } } ) validator.add_dissection( [0x01, 0x04, 0x0a, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], "asterix.065_RE", { "asterix.re_field_len": "10", "asterix.fspec": "", "asterix.065_RE_SRP": { "asterix.065_RE_SRP_Latitude": "-360", "asterix.065_RE_SRP_Longitude": "0" } } ) validator.add_dissection( [0x01, 0x04, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff], "asterix.065_RE", { "asterix.re_field_len": "10", "asterix.fspec": "", "asterix.065_RE_SRP": { "asterix.065_RE_SRP_Latitude": "0", "asterix.065_RE_SRP_Longitude": "359.999999832362" } } ) validator.add_dissection( [0x01, 0x04, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00], "asterix.065_RE", { "asterix.re_field_len": "10", "asterix.fspec": "", "asterix.065_RE_SRP": { "asterix.065_RE_SRP_Latitude": "0", "asterix.065_RE_SRP_Longitude": "-360" } } ) validator.add_dissection( [0x01, 0x04, 0x04, 0x40, 0xff, 0xff], "asterix.065_RE", { "asterix.re_field_len": "4", "asterix.fspec": "", "asterix.065_RE_ARL": { "asterix.065_RE_ARL_ARL": "65535" } } ) validator.add_dissection( [0x01, 0x02, 0x01], "asterix.065_SP", "" ) validator.add_dissection( [0x01, 0x02, 0x10, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff], "asterix.065_SP", "" ) validator.check_dissections()