diff options
author | Bill Meier <wmeier@newsguy.com> | 2014-10-02 17:47:19 -0400 |
---|---|---|
committer | Bill Meier <wmeier@newsguy.com> | 2014-10-02 22:30:52 +0000 |
commit | 482e8e565125cc8f595aa80e8ba08299f9c410fe (patch) | |
tree | c2e3ce7ba52055ee59a6fa15fbb8520493b1f962 /epan/dissectors/packet-x25.c | |
parent | 70abd39bb756c6d2567188691c29ededa6aa714e (diff) |
Add editor modelines & adjust indentation/whitespace as needed.
Change-Id: Ice2d93632cd42dfcef3bfbf0e15f2a8a147278fc
Reviewed-on: https://code.wireshark.org/review/4433
Reviewed-by: Bill Meier <wmeier@newsguy.com>
Diffstat (limited to 'epan/dissectors/packet-x25.c')
-rw-r--r-- | epan/dissectors/packet-x25.c | 3587 |
1 files changed, 1800 insertions, 1787 deletions
diff --git a/epan/dissectors/packet-x25.c b/epan/dissectors/packet-x25.c index 80157d9ebe..a0cfd92ee9 100644 --- a/epan/dissectors/packet-x25.c +++ b/epan/dissectors/packet-x25.c @@ -47,79 +47,79 @@ void proto_reg_handoff_x25(void); * Direction of packet. */ typedef enum { - X25_FROM_DCE, /* DCE->DTE */ - X25_FROM_DTE, /* DTE->DCE */ - X25_UNKNOWN /* direction unknown */ + X25_FROM_DCE, /* DCE->DTE */ + X25_FROM_DTE, /* DTE->DCE */ + X25_UNKNOWN /* direction unknown */ } x25_dir_t; /* * 0 for data packets, 1 for non-data packets. */ -#define X25_NONDATA_BIT 0x01 - -#define X25_CALL_REQUEST 0x0B -#define X25_CALL_ACCEPTED 0x0F -#define X25_CLEAR_REQUEST 0x13 -#define X25_CLEAR_CONFIRMATION 0x17 -#define X25_INTERRUPT 0x23 -#define X25_INTERRUPT_CONFIRMATION 0x27 -#define X25_RESET_REQUEST 0x1B -#define X25_RESET_CONFIRMATION 0x1F -#define X25_RESTART_REQUEST 0xFB -#define X25_RESTART_CONFIRMATION 0xFF -#define X25_REGISTRATION_REQUEST 0xF3 -#define X25_REGISTRATION_CONFIRMATION 0xF7 -#define X25_DIAGNOSTIC 0xF1 -#define X25_RR 0x01 -#define X25_RNR 0x05 -#define X25_REJ 0x09 -#define X25_DATA 0x00 - -#define PACKET_IS_DATA(type) (!(type & X25_NONDATA_BIT)) -#define PACKET_TYPE_FC(type) (type & 0x1F) - -#define X25_MBIT_MOD8 0x10 -#define X25_MBIT_MOD128 0x01 - -#define X25_ABIT 0x8000 - -#define X25_QBIT 0x8000 -#define X25_DBIT 0x4000 - -#define X25_FAC_CLASS_MASK 0xC0 - -#define X25_FAC_CLASS_A 0x00 -#define X25_FAC_CLASS_B 0x40 -#define X25_FAC_CLASS_C 0x80 -#define X25_FAC_CLASS_D 0xC0 - -#define X25_FAC_COMP_MARK 0x00 -#define X25_FAC_REVERSE 0x01 -#define X25_FAC_THROUGHPUT 0x02 -#define X25_FAC_CUG 0x03 -#define X25_FAC_CHARGING_INFO 0x04 -#define X25_FAC_CALLED_MODIF 0x08 -#define X25_FAC_CUG_OUTGOING_ACC 0x09 -#define X25_FAC_THROUGHPUT_MIN 0x0A -#define X25_FAC_EXPRESS_DATA 0x0B -#define X25_FAC_BILATERAL_CUG 0x41 -#define X25_FAC_PACKET_SIZE 0x42 -#define X25_FAC_WINDOW_SIZE 0x43 -#define X25_FAC_RPOA_SELECTION 0x44 -#define X25_FAC_CUG_EXT 0x47 -#define X25_FAC_CUG_OUTGOING_ACC_EXT 0x48 -#define X25_FAC_TRANSIT_DELAY 0x49 -#define X25_FAC_CALL_DURATION 0xC1 -#define X25_FAC_SEGMENT_COUNT 0xC2 -#define X25_FAC_CALL_TRANSFER 0xC3 -#define X25_FAC_RPOA_SELECTION_EXT 0xC4 -#define X25_FAC_MONETARY_UNIT 0xC5 -#define X25_FAC_NUI 0xC6 -#define X25_FAC_CALLED_ADDR_EXT 0xC9 -#define X25_FAC_ETE_TRANSIT_DELAY 0xCA -#define X25_FAC_CALLING_ADDR_EXT 0xCB -#define X25_FAC_CALL_DEFLECT 0xD1 -#define X25_FAC_PRIORITY 0xD2 +#define X25_NONDATA_BIT 0x01 + +#define X25_CALL_REQUEST 0x0B +#define X25_CALL_ACCEPTED 0x0F +#define X25_CLEAR_REQUEST 0x13 +#define X25_CLEAR_CONFIRMATION 0x17 +#define X25_INTERRUPT 0x23 +#define X25_INTERRUPT_CONFIRMATION 0x27 +#define X25_RESET_REQUEST 0x1B +#define X25_RESET_CONFIRMATION 0x1F +#define X25_RESTART_REQUEST 0xFB +#define X25_RESTART_CONFIRMATION 0xFF +#define X25_REGISTRATION_REQUEST 0xF3 +#define X25_REGISTRATION_CONFIRMATION 0xF7 +#define X25_DIAGNOSTIC 0xF1 +#define X25_RR 0x01 +#define X25_RNR 0x05 +#define X25_REJ 0x09 +#define X25_DATA 0x00 + +#define PACKET_IS_DATA(type) (!(type & X25_NONDATA_BIT)) +#define PACKET_TYPE_FC(type) (type & 0x1F) + +#define X25_MBIT_MOD8 0x10 +#define X25_MBIT_MOD128 0x01 + +#define X25_ABIT 0x8000 + +#define X25_QBIT 0x8000 +#define X25_DBIT 0x4000 + +#define X25_FAC_CLASS_MASK 0xC0 + +#define X25_FAC_CLASS_A 0x00 +#define X25_FAC_CLASS_B 0x40 +#define X25_FAC_CLASS_C 0x80 +#define X25_FAC_CLASS_D 0xC0 + +#define X25_FAC_COMP_MARK 0x00 +#define X25_FAC_REVERSE 0x01 +#define X25_FAC_THROUGHPUT 0x02 +#define X25_FAC_CUG 0x03 +#define X25_FAC_CHARGING_INFO 0x04 +#define X25_FAC_CALLED_MODIF 0x08 +#define X25_FAC_CUG_OUTGOING_ACC 0x09 +#define X25_FAC_THROUGHPUT_MIN 0x0A +#define X25_FAC_EXPRESS_DATA 0x0B +#define X25_FAC_BILATERAL_CUG 0x41 +#define X25_FAC_PACKET_SIZE 0x42 +#define X25_FAC_WINDOW_SIZE 0x43 +#define X25_FAC_RPOA_SELECTION 0x44 +#define X25_FAC_CUG_EXT 0x47 +#define X25_FAC_CUG_OUTGOING_ACC_EXT 0x48 +#define X25_FAC_TRANSIT_DELAY 0x49 +#define X25_FAC_CALL_DURATION 0xC1 +#define X25_FAC_SEGMENT_COUNT 0xC2 +#define X25_FAC_CALL_TRANSFER 0xC3 +#define X25_FAC_RPOA_SELECTION_EXT 0xC4 +#define X25_FAC_MONETARY_UNIT 0xC5 +#define X25_FAC_NUI 0xC6 +#define X25_FAC_CALLED_ADDR_EXT 0xC9 +#define X25_FAC_ETE_TRANSIT_DELAY 0xCA +#define X25_FAC_CALLING_ADDR_EXT 0xCB +#define X25_FAC_CALL_DEFLECT 0xD1 +#define X25_FAC_PRIORITY 0xD2 static int proto_x25 = -1; static int hf_x25_facility = -1; @@ -225,285 +225,285 @@ static gint hf_x25_reg_confirm_diagnostic = -1; static expert_field ei_x25_facility_length = EI_INIT; static const value_string vals_modulo[] = { - { 1, "8" }, - { 2, "128" }, - { 0, NULL} + { 1, "8" }, + { 2, "128" }, + { 0, NULL} }; static const value_string vals_x25_type[] = { - { X25_CALL_REQUEST, "Call" }, - { X25_CALL_ACCEPTED, "Call Accepted" }, - { X25_CLEAR_REQUEST, "Clear" }, - { X25_CLEAR_CONFIRMATION, "Clear Confirmation" }, - { X25_INTERRUPT, "Interrupt" }, - { X25_INTERRUPT_CONFIRMATION, "Interrupt Confirmation" }, - { X25_RESET_REQUEST, "Reset" }, - { X25_RESET_CONFIRMATION, "Reset Confirmation" }, - { X25_RESTART_REQUEST, "Restart" }, - { X25_RESTART_CONFIRMATION, "Restart Confirmation" }, - { X25_REGISTRATION_REQUEST, "Registration" }, - { X25_REGISTRATION_CONFIRMATION, "Registration Confirmation" }, - { X25_DIAGNOSTIC, "Diagnostic" }, - { X25_RR, "RR" }, - { X25_RNR, "RNR" }, - { X25_REJ, "REJ" }, - { X25_DATA, "Data" }, - { 0, NULL} + { X25_CALL_REQUEST, "Call" }, + { X25_CALL_ACCEPTED, "Call Accepted" }, + { X25_CLEAR_REQUEST, "Clear" }, + { X25_CLEAR_CONFIRMATION, "Clear Confirmation" }, + { X25_INTERRUPT, "Interrupt" }, + { X25_INTERRUPT_CONFIRMATION, "Interrupt Confirmation" }, + { X25_RESET_REQUEST, "Reset" }, + { X25_RESET_CONFIRMATION, "Reset Confirmation" }, + { X25_RESTART_REQUEST, "Restart" }, + { X25_RESTART_CONFIRMATION, "Restart Confirmation" }, + { X25_REGISTRATION_REQUEST, "Registration" }, + { X25_REGISTRATION_CONFIRMATION, "Registration Confirmation" }, + { X25_DIAGNOSTIC, "Diagnostic" }, + { X25_RR, "RR" }, + { X25_RNR, "RNR" }, + { X25_REJ, "REJ" }, + { X25_DATA, "Data" }, + { 0, NULL} }; static struct true_false_string m_bit_tfs = { - "More data follows", - "End of data" + "More data follows", + "End of data" }; static const value_string x25_fast_select_vals[] = { - { 0, "Not requested" }, - { 1, "Not requested" }, - { 2, "No restriction on response" }, - { 3, "Restriction on response" }, - { 0, NULL} + { 0, "Not requested" }, + { 1, "Not requested" }, + { 2, "No restriction on response" }, + { 3, "Restriction on response" }, + { 0, NULL} }; static const value_string x25_icrd_vals[] = { - { 0, "Status not selected" }, - { 1, "Prevention requested" }, - { 2, "Allowance requested" }, - { 3, "Not allowed" }, - { 0, NULL} + { 0, "Status not selected" }, + { 1, "Prevention requested" }, + { 2, "Allowance requested" }, + { 3, "Not allowed" }, + { 0, NULL} }; static const value_string x25_clear_diag_vals[] = { - { 0, "No additional information" }, - { 1, "Invalid P(S)" }, - { 2, "Invalid P(R)" }, - { 16, "Packet type invalid" }, - { 17, "Packet type invalid for state r1" }, - { 18, "Packet type invalid for state r2" }, - { 19, "Packet type invalid for state r3" }, - { 20, "Packet type invalid for state p1" }, - { 21, "Packet type invalid for state p2" }, - { 22, "Packet type invalid for state p3" }, - { 23, "Packet type invalid for state p4" }, - { 24, "Packet type invalid for state p5" }, - { 25, "Packet type invalid for state p6" }, - { 26, "Packet type invalid for state p7" }, - { 27, "Packet type invalid for state d1" }, - { 28, "Packet type invalid for state d2" }, - { 29, "Packet type invalid for state d3" }, - { 32, "Packet not allowed" }, - { 33, "Unidentifiable packet" }, - { 34, "Call on one-way logical channel" }, - { 35, "Invalid packet type on a PVC" }, - { 36, "Packet on unassigned LC" }, - { 37, "Reject not subscribed to" }, - { 38, "Packet too short" }, - { 39, "Packet too long" }, - { 40, "Invalid general format identifier" }, - { 41, "Restart/registration packet with nonzero bits" }, - { 42, "Packet type not compatible with facility" }, - { 43, "Unauthorised interrupt confirmation" }, - { 44, "Unauthorised interrupt" }, - { 45, "Unauthorised reject" }, - { 48, "Time expired" }, - { 49, "Time expired for incoming call" }, - { 50, "Time expired for clear indication" }, - { 51, "Time expired for reset indication" }, - { 52, "Time expired for restart indication" }, - { 53, "Time expired for call deflection" }, - { 64, "Call set-up/clearing or registration pb." }, - { 65, "Facility/registration code not allowed" }, - { 66, "Facility parameter not allowed" }, - { 67, "Invalid called DTE address" }, - { 68, "Invalid calling DTE address" }, - { 69, "Invalid facility/registration length" }, - { 70, "Incoming call barred" }, - { 71, "No logical channel available" }, - { 72, "Call collision" }, - { 73, "Duplicate facility requested" }, - { 74, "Non zero address length" }, - { 75, "Non zero facility length" }, - { 76, "Facility not provided when expected" }, - { 77, "Invalid CCITT-specified DTE facility" }, - { 78, "Max. nb of call redir/defl. exceeded" }, - { 80, "Miscellaneous" }, - { 81, "Improper cause code from DTE" }, - { 82, "Not aligned octet" }, - { 83, "Inconsistent Q bit setting" }, - { 84, "NUI problem" }, - { 112, "International problem" }, - { 113, "Remote network problem" }, - { 114, "International protocol problem" }, - { 115, "International link out of order" }, - { 116, "International link busy" }, - { 117, "Transit network facility problem" }, - { 118, "Remote network facility problem" }, - { 119, "International routing problem" }, - { 120, "Temporary routing problem" }, - { 121, "Unknown called DNIC" }, - { 122, "Maintenance action" }, - { 144, "Timer expired or retransmission count surpassed" }, - { 145, "Timer expired or retransmission count surpassed for INTERRUPT" }, - { 146, "Timer expired or retransmission count surpassed for DATA packet transmission" }, - { 147, "Timer expired or retransmission count surpassed for REJECT" }, - { 160, "DTE-specific signals" }, - { 161, "DTE operational" }, - { 162, "DTE not operational" }, - { 163, "DTE resource constraint" }, - { 164, "Fast select not subscribed" }, - { 165, "Invalid partially full DATA packet" }, - { 166, "D-bit procedure not supported" }, - { 167, "Registration/Cancellation confirmed" }, - { 224, "OSI network service problem" }, - { 225, "Disconnection (transient condition)" }, - { 226, "Disconnection (permanent condition)" }, - { 227, "Connection rejection - reason unspecified (transient condition)" }, - { 228, "Connection rejection - reason unspecified (permanent condition)" }, - { 229, "Connection rejection - quality of service not available (transient condition)" }, - { 230, "Connection rejection - quality of service not available (permanent condition)" }, - { 231, "Connection rejection - NSAP unreachable (transient condition)" }, - { 232, "Connection rejection - NSAP unreachable (permanent condition)" }, - { 233, "reset - reason unspecified" }, - { 234, "reset - congestion" }, - { 235, "Connection rejection - NSAP address unknown (permanent condition)" }, - { 240, "Higher layer initiated" }, - { 241, "Disconnection - normal" }, - { 242, "Disconnection - abnormal" }, - { 243, "Disconnection - incompatible information in user data" }, - { 244, "Connection rejection - reason unspecified (transient condition)" }, - { 245, "Connection rejection - reason unspecified (permanent condition)" }, - { 246, "Connection rejection - quality of service not available (transient condition)" }, - { 247, "Connection rejection - quality of service not available (permanent condition)" }, - { 248, "Connection rejection - incompatible information in user data" }, - { 249, "Connection rejection - unrecognizable protocol identifier in user data" }, - { 250, "Reset - user resynchronization" }, - { 0, NULL} + { 0, "No additional information" }, + { 1, "Invalid P(S)" }, + { 2, "Invalid P(R)" }, + { 16, "Packet type invalid" }, + { 17, "Packet type invalid for state r1" }, + { 18, "Packet type invalid for state r2" }, + { 19, "Packet type invalid for state r3" }, + { 20, "Packet type invalid for state p1" }, + { 21, "Packet type invalid for state p2" }, + { 22, "Packet type invalid for state p3" }, + { 23, "Packet type invalid for state p4" }, + { 24, "Packet type invalid for state p5" }, + { 25, "Packet type invalid for state p6" }, + { 26, "Packet type invalid for state p7" }, + { 27, "Packet type invalid for state d1" }, + { 28, "Packet type invalid for state d2" }, + { 29, "Packet type invalid for state d3" }, + { 32, "Packet not allowed" }, + { 33, "Unidentifiable packet" }, + { 34, "Call on one-way logical channel" }, + { 35, "Invalid packet type on a PVC" }, + { 36, "Packet on unassigned LC" }, + { 37, "Reject not subscribed to" }, + { 38, "Packet too short" }, + { 39, "Packet too long" }, + { 40, "Invalid general format identifier" }, + { 41, "Restart/registration packet with nonzero bits" }, + { 42, "Packet type not compatible with facility" }, + { 43, "Unauthorised interrupt confirmation" }, + { 44, "Unauthorised interrupt" }, + { 45, "Unauthorised reject" }, + { 48, "Time expired" }, + { 49, "Time expired for incoming call" }, + { 50, "Time expired for clear indication" }, + { 51, "Time expired for reset indication" }, + { 52, "Time expired for restart indication" }, + { 53, "Time expired for call deflection" }, + { 64, "Call set-up/clearing or registration pb." }, + { 65, "Facility/registration code not allowed" }, + { 66, "Facility parameter not allowed" }, + { 67, "Invalid called DTE address" }, + { 68, "Invalid calling DTE address" }, + { 69, "Invalid facility/registration length" }, + { 70, "Incoming call barred" }, + { 71, "No logical channel available" }, + { 72, "Call collision" }, + { 73, "Duplicate facility requested" }, + { 74, "Non zero address length" }, + { 75, "Non zero facility length" }, + { 76, "Facility not provided when expected" }, + { 77, "Invalid CCITT-specified DTE facility" }, + { 78, "Max. nb of call redir/defl. exceeded" }, + { 80, "Miscellaneous" }, + { 81, "Improper cause code from DTE" }, + { 82, "Not aligned octet" }, + { 83, "Inconsistent Q bit setting" }, + { 84, "NUI problem" }, + { 112, "International problem" }, + { 113, "Remote network problem" }, + { 114, "International protocol problem" }, + { 115, "International link out of order" }, + { 116, "International link busy" }, + { 117, "Transit network facility problem" }, + { 118, "Remote network facility problem" }, + { 119, "International routing problem" }, + { 120, "Temporary routing problem" }, + { 121, "Unknown called DNIC" }, + { 122, "Maintenance action" }, + { 144, "Timer expired or retransmission count surpassed" }, + { 145, "Timer expired or retransmission count surpassed for INTERRUPT" }, + { 146, "Timer expired or retransmission count surpassed for DATA packet transmission" }, + { 147, "Timer expired or retransmission count surpassed for REJECT" }, + { 160, "DTE-specific signals" }, + { 161, "DTE operational" }, + { 162, "DTE not operational" }, + { 163, "DTE resource constraint" }, + { 164, "Fast select not subscribed" }, + { 165, "Invalid partially full DATA packet" }, + { 166, "D-bit procedure not supported" }, + { 167, "Registration/Cancellation confirmed" }, + { 224, "OSI network service problem" }, + { 225, "Disconnection (transient condition)" }, + { 226, "Disconnection (permanent condition)" }, + { 227, "Connection rejection - reason unspecified (transient condition)" }, + { 228, "Connection rejection - reason unspecified (permanent condition)" }, + { 229, "Connection rejection - quality of service not available (transient condition)" }, + { 230, "Connection rejection - quality of service not available (permanent condition)" }, + { 231, "Connection rejection - NSAP unreachable (transient condition)" }, + { 232, "Connection rejection - NSAP unreachable (permanent condition)" }, + { 233, "reset - reason unspecified" }, + { 234, "reset - congestion" }, + { 235, "Connection rejection - NSAP address unknown (permanent condition)" }, + { 240, "Higher layer initiated" }, + { 241, "Disconnection - normal" }, + { 242, "Disconnection - abnormal" }, + { 243, "Disconnection - incompatible information in user data" }, + { 244, "Connection rejection - reason unspecified (transient condition)" }, + { 245, "Connection rejection - reason unspecified (permanent condition)" }, + { 246, "Connection rejection - quality of service not available (transient condition)" }, + { 247, "Connection rejection - quality of service not available (permanent condition)" }, + { 248, "Connection rejection - incompatible information in user data" }, + { 249, "Connection rejection - unrecognizable protocol identifier in user data" }, + { 250, "Reset - user resynchronization" }, + { 0, NULL} }; value_string_ext x25_clear_diag_vals_ext = VALUE_STRING_EXT_INIT(x25_clear_diag_vals); static const value_string x25_registration_code_vals[] = { - { 0x03, "Invalid facility request" }, - { 0x05, "Network congestion" }, - { 0x13, "Local procedure error" }, - { 0x7F, "Registration/cancellation confirmed" }, - { 0, NULL} + { 0x03, "Invalid facility request" }, + { 0x05, "Network congestion" }, + { 0x13, "Local procedure error" }, + { 0x7F, "Registration/cancellation confirmed" }, + { 0, NULL} }; static const value_string x25_facilities_class_vals[] = { - { X25_FAC_CLASS_A>>6, "A" }, - { X25_FAC_CLASS_B>>6, "B" }, - { X25_FAC_CLASS_C>>6, "C" }, - { X25_FAC_CLASS_D>>6, "D" }, - { 0, NULL} + { X25_FAC_CLASS_A>>6, "A" }, + { X25_FAC_CLASS_B>>6, "B" }, + { X25_FAC_CLASS_C>>6, "C" }, + { X25_FAC_CLASS_D>>6, "D" }, + { 0, NULL} }; static const value_string x25_facilities_classA_vals[] = { - { X25_FAC_COMP_MARK, "Marker" }, - { X25_FAC_REVERSE, "Reverse charging / Fast select" }, - { X25_FAC_CHARGING_INFO, "Charging information" }, - { X25_FAC_THROUGHPUT, "Throughput class negotiation" }, - { X25_FAC_CUG, "Closed user group selection" }, - { X25_FAC_CALLED_MODIF, "Called address modified" }, - { X25_FAC_CUG_OUTGOING_ACC, "Closed user group with outgoing access selection" }, - { X25_FAC_THROUGHPUT_MIN, "Minimum throughput class" }, - { X25_FAC_EXPRESS_DATA, "Negotiation of express data" }, - { 0, NULL} + { X25_FAC_COMP_MARK, "Marker" }, + { X25_FAC_REVERSE, "Reverse charging / Fast select" }, + { X25_FAC_CHARGING_INFO, "Charging information" }, + { X25_FAC_THROUGHPUT, "Throughput class negotiation" }, + { X25_FAC_CUG, "Closed user group selection" }, + { X25_FAC_CALLED_MODIF, "Called address modified" }, + { X25_FAC_CUG_OUTGOING_ACC, "Closed user group with outgoing access selection" }, + { X25_FAC_THROUGHPUT_MIN, "Minimum throughput class" }, + { X25_FAC_EXPRESS_DATA, "Negotiation of express data" }, + { 0, NULL} }; static const value_string x25_facilities_classA_comp_mark_vals[] = { - { 0x00, "Network complementary services - calling DTE" }, - { 0x0F, "DTE complementary services" }, - { 0xFF, "Network complementary services - called DTE" }, - { 0, NULL} + { 0x00, "Network complementary services - calling DTE" }, + { 0x0F, "DTE complementary services" }, + { 0xFF, "Network complementary services - called DTE" }, + { 0, NULL} }; static const value_string x25_facilities_classA_throughput_vals[] = { - { 3, "75 bps" }, - { 4, "150 bps" }, - { 5, "300 bps" }, - { 6, "600 bps" }, - { 7, "1200 bps" }, - { 8, "2400 bps" }, - { 9, "4800 bps" }, - { 10, "9600 bps" }, - { 11, "19200 bps" }, - { 12, "48000 bps" }, - { 13, "64000 bps" }, - { 0, NULL} + { 3, "75 bps" }, + { 4, "150 bps" }, + { 5, "300 bps" }, + { 6, "600 bps" }, + { 7, "1200 bps" }, + { 8, "2400 bps" }, + { 9, "4800 bps" }, + { 10, "9600 bps" }, + { 11, "19200 bps" }, + { 12, "48000 bps" }, + { 13, "64000 bps" }, + { 0, NULL} }; static const value_string x25_facilities_classB_vals[] = { - { X25_FAC_BILATERAL_CUG, "Bilateral closed user group selection" }, - { X25_FAC_PACKET_SIZE, "Packet size" }, - { X25_FAC_WINDOW_SIZE, "Window size" }, - { X25_FAC_RPOA_SELECTION, "RPOA selection" }, - { X25_FAC_CUG_EXT, "Extended closed user group selection" }, - { X25_FAC_CUG_OUTGOING_ACC_EXT, "Extended closed user group with outgoing access selection" }, - { X25_FAC_TRANSIT_DELAY, "Transit delay selection and indication" }, - { 0, NULL} + { X25_FAC_BILATERAL_CUG, "Bilateral closed user group selection" }, + { X25_FAC_PACKET_SIZE, "Packet size" }, + { X25_FAC_WINDOW_SIZE, "Window size" }, + { X25_FAC_RPOA_SELECTION, "RPOA selection" }, + { X25_FAC_CUG_EXT, "Extended closed user group selection" }, + { X25_FAC_CUG_OUTGOING_ACC_EXT, "Extended closed user group with outgoing access selection" }, + { X25_FAC_TRANSIT_DELAY, "Transit delay selection and indication" }, + { 0, NULL} }; static const value_string x25_facilities_classB_packet_size_vals[] = { - { 0x04, "16" }, - { 0x05, "32" }, - { 0x06, "64" }, - { 0x07, "128" }, - { 0x08, "256" }, - { 0x09, "512" }, - { 0x0A, "1024" }, - { 0x0B, "2048" }, - { 0x0C, "4096" }, - { 0, NULL} + { 0x04, "16" }, + { 0x05, "32" }, + { 0x06, "64" }, + { 0x07, "128" }, + { 0x08, "256" }, + { 0x09, "512" }, + { 0x0A, "1024" }, + { 0x0B, "2048" }, + { 0x0C, "4096" }, + { 0, NULL} }; static const value_string x25_facilities_classC_vals[] = { - { 0, NULL} + { 0, NULL} }; static const value_string x25_facilities_classD_vals[] = { - { X25_FAC_CALL_DURATION, "Call duration" }, - { X25_FAC_SEGMENT_COUNT, "Segment count" }, - { X25_FAC_CALL_TRANSFER, "Call redirection or deflection notification" }, - { X25_FAC_RPOA_SELECTION_EXT, "Extended RPOA selection" }, - { X25_FAC_CALLING_ADDR_EXT, "Calling address extension" }, - { X25_FAC_MONETARY_UNIT, "Monetary Unit" }, - { X25_FAC_NUI, "Network User Identification selection" }, - { X25_FAC_CALLED_ADDR_EXT, "Called address extension" }, - { X25_FAC_ETE_TRANSIT_DELAY, "End to end transit delay" }, - { X25_FAC_CALL_DEFLECT, "Call deflection selection" }, - { X25_FAC_PRIORITY, "Priority" }, - { 0, NULL} + { X25_FAC_CALL_DURATION, "Call duration" }, + { X25_FAC_SEGMENT_COUNT, "Segment count" }, + { X25_FAC_CALL_TRANSFER, "Call redirection or deflection notification" }, + { X25_FAC_RPOA_SELECTION_EXT, "Extended RPOA selection" }, + { X25_FAC_CALLING_ADDR_EXT, "Calling address extension" }, + { X25_FAC_MONETARY_UNIT, "Monetary Unit" }, + { X25_FAC_NUI, "Network User Identification selection" }, + { X25_FAC_CALLED_ADDR_EXT, "Called address extension" }, + { X25_FAC_ETE_TRANSIT_DELAY, "End to end transit delay" }, + { X25_FAC_CALL_DEFLECT, "Call deflection selection" }, + { X25_FAC_PRIORITY, "Priority" }, + { 0, NULL} }; static struct true_false_string x25_reverse_charging_val = { - "Requested", - "Not requested" + "Requested", + "Not requested" }; static const value_string x25_facilities_call_transfer_reason_vals[] = { - { 0x01, "originally called DTE busy" }, - { 0x07, "call dist. within a hunt group" }, - { 0x09, "originally called DTE out of order" }, - { 0x0F, "systematic call redirection" }, - { 0, NULL} + { 0x01, "originally called DTE busy" }, + { 0x07, "call dist. within a hunt group" }, + { 0x09, "originally called DTE out of order" }, + { 0x0F, "systematic call redirection" }, + { 0, NULL} }; static const fragment_items x25_frag_items = { - &ett_x25_segment, - &ett_x25_segments, - &hf_x25_segments, - &hf_x25_segment, - &hf_x25_segment_overlap, - &hf_x25_segment_overlap_conflict, - &hf_x25_segment_multiple_tails, - &hf_x25_segment_too_long_segment, - &hf_x25_segment_error, - &hf_x25_segment_count, - NULL, - &hf_x25_reassembled_length, - /* Reassembled data field */ - NULL, - "segments" + &ett_x25_segment, + &ett_x25_segments, + &hf_x25_segments, + &hf_x25_segment, + &hf_x25_segment_overlap, + &hf_x25_segment_overlap_conflict, + &hf_x25_segment_multiple_tails, + &hf_x25_segment_too_long_segment, + &hf_x25_segment_error, + &hf_x25_segment_count, + NULL, + &hf_x25_reassembled_length, + /* Reassembled data field */ + NULL, + "segments" }; static dissector_handle_t ip_handle; @@ -528,491 +528,491 @@ static heur_dissector_list_t x25_heur_subdissector_list; static void x25_hash_add_proto_start(guint16 vc, guint32 frame, dissector_handle_t dissect) { - circuit_t *circuit; + circuit_t *circuit; - /* - * Is there already a circuit with this VC number? - */ - circuit = find_circuit(CT_X25, vc, frame); - if (circuit != NULL) { /* - * Yes - close it, as we're creating a new one. + * Is there already a circuit with this VC number? */ - close_circuit(circuit, frame - 1); - } - - /* - * Set up a new circuit. - */ - circuit = circuit_new(CT_X25, vc, frame); - - /* - * Set its dissector. - */ - circuit_set_dissector(circuit, dissect); + circuit = find_circuit(CT_X25, vc, frame); + if (circuit != NULL) { + /* + * Yes - close it, as we're creating a new one. + */ + close_circuit(circuit, frame - 1); + } + + /* + * Set up a new circuit. + */ + circuit = circuit_new(CT_X25, vc, frame); + + /* + * Set its dissector. + */ + circuit_set_dissector(circuit, dissect); } static void x25_hash_add_proto_end(guint16 vc, guint32 frame) { - circuit_t *circuit; - - /* - * Try to find the circuit. - */ - circuit = find_circuit(CT_X25, vc, frame); - - /* - * If we succeeded, close it. - */ - if (circuit != NULL) - close_circuit(circuit, frame); + circuit_t *circuit; + + /* + * Try to find the circuit. + */ + circuit = find_circuit(CT_X25, vc, frame); + + /* + * If we succeeded, close it. + */ + if (circuit != NULL) + close_circuit(circuit, frame); } static const char *clear_code(unsigned char code) { - if (code == 0x00 || (code & 0x80) == 0x80) - return "DTE Originated"; - - switch(code) - { - case 0x01: - return "Number Busy"; - case 0x03: - return "Invalid Facility Requested"; - case 0x05: - return "Network Congestion"; - case 0x09: - return "Out Of Order"; - case 0x0B: - return "Access Barred"; - case 0x0D: - return "Not Obtainable"; - case 0x11: - return "Remote Procedure Error"; - case 0x13: - return "Local Procedure Error"; - case 0x15: - return "RPOA Out Of Order"; - case 0x19: - return "Reverse Charging Acceptance Not Subscribed"; - case 0x21: - return "Incompatible Destination"; - case 0x29: - return "Fast Select Acceptance Not Subscribed"; - case 0x39: - return "Destination Absent"; - } - - return wmem_strdup_printf(wmem_packet_scope(),"Unknown %02X", code); + if (code == 0x00 || (code & 0x80) == 0x80) + return "DTE Originated"; + + switch(code) + { + case 0x01: + return "Number Busy"; + case 0x03: + return "Invalid Facility Requested"; + case 0x05: + return "Network Congestion"; + case 0x09: + return "Out Of Order"; + case 0x0B: + return "Access Barred"; + case 0x0D: + return "Not Obtainable"; + case 0x11: + return "Remote Procedure Error"; + case 0x13: + return "Local Procedure Error"; + case 0x15: + return "RPOA Out Of Order"; + case 0x19: + return "Reverse Charging Acceptance Not Subscribed"; + case 0x21: + return "Incompatible Destination"; + case 0x29: + return "Fast Select Acceptance Not Subscribed"; + case 0x39: + return "Destination Absent"; + } + + return wmem_strdup_printf(wmem_packet_scope(),"Unknown %02X", code); } static const char *reset_code(unsigned char code) { - if (code == 0x00 || (code & 0x80) == 0x80) - return "DTE Originated"; - - switch(code) - { - case 0x01: - return "Out of order"; - case 0x03: - return "Remote Procedure Error"; - case 0x05: - return "Local Procedure Error"; - case 0x07: - return "Network Congestion"; - case 0x09: - return "Remote DTE operational"; - case 0x0F: - return "Network operational"; - case 0x11: - return "Incompatible Destination"; - case 0x1D: - return "Network out of order"; - } - - return wmem_strdup_printf(wmem_packet_scope(),"Unknown %02X", code); + if (code == 0x00 || (code & 0x80) == 0x80) + return "DTE Originated"; + + switch(code) + { + case 0x01: + return "Out of order"; + case 0x03: + return "Remote Procedure Error"; + case 0x05: + return "Local Procedure Error"; + case 0x07: + return "Network Congestion"; + case 0x09: + return "Remote DTE operational"; + case 0x0F: + return "Network operational"; + case 0x11: + return "Incompatible Destination"; + case 0x1D: + return "Network out of order"; + } + + return wmem_strdup_printf(wmem_packet_scope(),"Unknown %02X", code); } static const char *restart_code(unsigned char code) { - if (code == 0x00 || (code & 0x80) == 0x80) - return "DTE Originated"; - - switch(code) - { - case 0x01: - return "Local Procedure Error"; - case 0x03: - return "Network Congestion"; - case 0x07: - return "Network Operational"; - case 0x7F: - return "Registration/cancellation confirmed"; - } - - return wmem_strdup_printf(wmem_packet_scope(),"Unknown %02X", code); + if (code == 0x00 || (code & 0x80) == 0x80) + return "DTE Originated"; + + switch(code) + { + case 0x01: + return "Local Procedure Error"; + case 0x03: + return "Network Congestion"; + case 0x07: + return "Network Operational"; + case 0x7F: + return "Registration/cancellation confirmed"; + } + + return wmem_strdup_printf(wmem_packet_scope(),"Unknown %02X", code); } static char * dte_address_util(tvbuff_t *tvb, int offset, guint8 len) { - int i; - char *tmpbuf = (char *)wmem_alloc(wmem_packet_scope(), 258); - - for (i = 0; (i<len)&&(i<256); i++) { - if (i % 2 == 0) { - tmpbuf[i] = ((tvb_get_guint8(tvb, offset+i/2) >> 4) & 0x0F) + '0'; - /* if > 9, convert to the right hexadecimal letter */ - if (tmpbuf[i] > '9') - tmpbuf[i] += ('A' - '0' - 10); - } else { - tmpbuf[i] = (tvb_get_guint8(tvb, offset+i/2) & 0x0F) + '0'; - /* if > 9, convert to the right hexadecimal letter */ - if (tmpbuf[i] > '9') - tmpbuf[i] += ('A' - '0' - 10); - } - } - - tmpbuf[i] = '\0'; - - return tmpbuf; + int i; + char *tmpbuf = (char *)wmem_alloc(wmem_packet_scope(), 258); + + for (i = 0; (i<len)&&(i<256); i++) { + if (i % 2 == 0) { + tmpbuf[i] = ((tvb_get_guint8(tvb, offset+i/2) >> 4) & 0x0F) + '0'; + /* if > 9, convert to the right hexadecimal letter */ + if (tmpbuf[i] > '9') + tmpbuf[i] += ('A' - '0' - 10); + } else { + tmpbuf[i] = (tvb_get_guint8(tvb, offset+i/2) & 0x0F) + '0'; + /* if > 9, convert to the right hexadecimal letter */ + if (tmpbuf[i] > '9') + tmpbuf[i] += ('A' - '0' - 10); + } + } + + tmpbuf[i] = '\0'; + + return tmpbuf; } static void add_priority(proto_tree *tree, int hf, tvbuff_t *tvb, int offset) { - guint8 priority; - - priority = tvb_get_guint8(tvb, offset); - if (priority == 255) - proto_tree_add_uint_format_value(tree, hf, tvb, offset, 1, priority, - "Unspecified (255)"); - else - proto_tree_add_uint(tree, hf, tvb, offset, 1, priority); + guint8 priority; + + priority = tvb_get_guint8(tvb, offset); + if (priority == 255) + proto_tree_add_uint_format_value(tree, hf, tvb, offset, 1, priority, + "Unspecified (255)"); + else + proto_tree_add_uint(tree, hf, tvb, offset, 1, priority); } static void dump_facilities(proto_tree *tree, int *offset, tvbuff_t *tvb, packet_info *pinfo) { - guint8 fac, byte1, byte2, byte3; - guint32 len; /* facilities length */ - proto_item *ti = NULL; - proto_tree *facilities_tree = NULL, *facility_tree = NULL; - - len = tvb_get_guint8(tvb, *offset); - if (len && tree) { - facilities_tree = proto_tree_add_subtree(tree, tvb, *offset, len + 1, - ett_x25_facilities, NULL, "Facilities"); - proto_tree_add_item(facilities_tree, hf_x25_facilities_length, tvb, *offset, 1, ENC_NA); - } - (*offset)++; - - while (len > 0) { - ti = proto_tree_add_item(facilities_tree, hf_x25_facility, tvb, *offset, -1, ENC_NA); - fac = tvb_get_guint8(tvb, *offset); - switch(fac & X25_FAC_CLASS_MASK) { - case X25_FAC_CLASS_A: - proto_item_set_len(ti, 2); - proto_item_append_text(ti, ": %s", - val_to_str(fac, x25_facilities_classA_vals, "Unknown (0x%02X)")); - facility_tree = proto_item_add_subtree(ti, ett_x25_facility); - proto_tree_add_item(facility_tree, hf_x25_facility_class, tvb, *offset, 1, ENC_NA); - proto_tree_add_item(facility_tree, hf_x25_facility_classA, tvb, *offset, 1, ENC_NA); - if (facility_tree) { - switch (fac) { - case X25_FAC_COMP_MARK: - proto_tree_add_item(facility_tree, hf_x25_facility_classA_comp_mark, tvb, *offset+1, 1, ENC_NA); - break; - case X25_FAC_REVERSE: - proto_tree_add_item(facility_tree, hf_x25_facility_classA_reverse, tvb, *offset+1, 1, ENC_NA); - proto_tree_add_item(facility_tree, hf_x25_fast_select, tvb, *offset+1, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(facility_tree, hf_x25_icrd, tvb, *offset+1, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(facility_tree, hf_x25_facility_reverse_charging, tvb, *offset+1, 1, ENC_BIG_ENDIAN); - break; - case X25_FAC_CHARGING_INFO: - proto_tree_add_item(facility_tree, hf_x25_facility_classA_charging_info, tvb, *offset+1, 1, ENC_NA); - proto_tree_add_item(facility_tree, hf_x25_facility_charging_info, tvb, *offset+1, 1, ENC_NA); - break; - case X25_FAC_THROUGHPUT: - proto_tree_add_item(facility_tree, hf_x25_facility_throughput_called_dte, tvb, *offset+1, 1, ENC_NA); - proto_tree_add_item(facility_tree, hf_x25_throughput_called_dte, tvb, *offset+1, 1, ENC_NA); - break; - case X25_FAC_CUG: - proto_tree_add_item(facility_tree, hf_x25_facility_classA_cug, tvb, *offset+1, 1, ENC_NA); - break; - case X25_FAC_CALLED_MODIF: - proto_tree_add_item(facility_tree, hf_x25_facility_classA_called_motif, tvb, *offset+1, 1, ENC_NA); - break; - case X25_FAC_CUG_OUTGOING_ACC: - proto_tree_add_item(facility_tree, hf_x25_facility_classA_cug_outgoing_acc, tvb, *offset+1, 1, ENC_NA); - break; - case X25_FAC_THROUGHPUT_MIN: - proto_tree_add_item(facility_tree, hf_x25_facility_classA_throughput_min, tvb, *offset+1, 1, ENC_NA); - break; - case X25_FAC_EXPRESS_DATA: - proto_tree_add_item(facility_tree, hf_x25_facility_classA_express_data, tvb, *offset+1, 1, ENC_NA); - break; - default: - proto_tree_add_item(facility_tree, hf_x25_facility_classA_unknown, tvb, *offset+1, 1, ENC_NA); - break; - } - } - (*offset) += 2; - len -= 2; - break; - case X25_FAC_CLASS_B: - proto_item_set_len(ti, 3); - proto_item_append_text(ti, ": %s", - val_to_str(fac, x25_facilities_classB_vals, "Unknown (0x%02X)")); - facility_tree = proto_item_add_subtree(ti, ett_x25_facility); - proto_tree_add_item(facility_tree, hf_x25_facility_class, tvb, *offset, 1, ENC_NA); - proto_tree_add_item(facility_tree, hf_x25_facility_classB, tvb, *offset, 1, ENC_NA); - if (facility_tree) { - switch (fac) { - case X25_FAC_BILATERAL_CUG: - proto_tree_add_item(facility_tree, hf_x25_facility_classB_bilateral_cug, tvb, *offset+1, 2, ENC_BIG_ENDIAN); - break; - case X25_FAC_PACKET_SIZE: - proto_tree_add_item(facility_tree, hf_x25_facility_packet_size_called_dte, tvb, *offset+1, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(facility_tree, hf_x25_facility_packet_size_calling_dte, tvb, *offset+2, 1, ENC_BIG_ENDIAN); - break; - case X25_FAC_WINDOW_SIZE: - proto_tree_add_item(facility_tree, hf_x25_window_size_called_dte, tvb, *offset+1, 1, ENC_NA); - proto_tree_add_item(facility_tree, hf_x25_window_size_calling_dte, tvb, *offset+2, 1, ENC_NA); - break; - case X25_FAC_RPOA_SELECTION: - proto_tree_add_item(facility_tree, hf_x25_facility_data_network_id_code, tvb, *offset+1, 2, ENC_BIG_ENDIAN); - break; - case X25_FAC_CUG_EXT: - proto_tree_add_item(facility_tree, hf_x25_facility_cug_ext, tvb, *offset+1, 2, ENC_BIG_ENDIAN); - break; - case X25_FAC_CUG_OUTGOING_ACC_EXT: - proto_tree_add_item(facility_tree, hf_x25_facility_cug_outgoing_acc_ext, tvb, *offset+1, 2, ENC_BIG_ENDIAN); - break; - case X25_FAC_TRANSIT_DELAY: - proto_tree_add_item(facility_tree, hf_x25_facility_transit_delay, tvb, *offset+1, 2, ENC_BIG_ENDIAN); - break; - default: - proto_tree_add_item(facility_tree, hf_x25_facility_classB_unknown, tvb, *offset+1, 2, ENC_BIG_ENDIAN); - break; - } - } - (*offset) += 3; - len -= 3; - break; - case X25_FAC_CLASS_C: - proto_item_set_len(ti, 4); - proto_item_append_text(ti, ": %s", - val_to_str(fac, x25_facilities_classC_vals, "Unknown (0x%02X)")); - facility_tree = proto_item_add_subtree(ti, ett_x25_facility); - proto_tree_add_item(facility_tree, hf_x25_facility_class, tvb, *offset, 1, ENC_NA); - proto_tree_add_item(facility_tree, hf_x25_facility_classC, tvb, *offset, 1, ENC_NA); - if (facility_tree) { - proto_tree_add_item(facility_tree, hf_x25_facility_classC_unknown, tvb, *offset+1, 2, ENC_BIG_ENDIAN); - } - (*offset) += 4; - len -= 4; - break; - case X25_FAC_CLASS_D: - proto_item_append_text(ti, ": %s", - val_to_str(fac, x25_facilities_classD_vals, "Unknown (0x%02X)")); - facility_tree = proto_item_add_subtree(ti, ett_x25_facility); - proto_tree_add_item(facility_tree, hf_x25_facility_class, tvb, *offset, 1, ENC_NA); - byte1 = tvb_get_guint8(tvb, *offset+1); - proto_item_set_len(ti, byte1+2); - proto_tree_add_item(facility_tree, hf_x25_facility_classD, tvb, *offset, 1, ENC_NA); - proto_tree_add_item(facility_tree, hf_x25_facility_length, tvb, *offset+1, 1, ENC_NA); - if (facility_tree) { - switch (fac) { - case X25_FAC_CALL_DURATION: - { - int i; - - if ((byte1 < 4) || (byte1 % 4)) { - expert_add_info(pinfo, ti, &ei_x25_facility_length); - return; - } - for (i = 0; (i<byte1); i+=4) { - proto_tree_add_text(facility_tree, tvb, *offset+2+i, 4, - "Call duration: %u Day(s) %02X:%02X:%02X Hour(s)", - tvb_get_guint8(tvb, *offset+2+i), - tvb_get_guint8(tvb, *offset+3+i), - tvb_get_guint8(tvb, *offset+4+i), - tvb_get_guint8(tvb, *offset+5+i)); - } - } - break; - case X25_FAC_SEGMENT_COUNT: - { - int i; - - if ((byte1 < 8) || (byte1 % 8)) { - expert_add_info(pinfo, ti, &ei_x25_facility_length); - return; - } - for (i = 0; (i<byte1); i+=8) { - proto_tree_add_text(facility_tree, tvb, *offset+2+i, 4, - "Segments sent to DTE: %02X%02X%02X%02X", - tvb_get_guint8(tvb, *offset+2+i), - tvb_get_guint8(tvb, *offset+3+i), - tvb_get_guint8(tvb, *offset+4+i), - tvb_get_guint8(tvb, *offset+5+i)); - proto_tree_add_text(facility_tree, tvb, *offset+6+i, 4, - "Segments received from DTE: %02X%02X%02X%02X", - tvb_get_guint8(tvb, *offset+6+i), - tvb_get_guint8(tvb, *offset+7+i), - tvb_get_guint8(tvb, *offset+8+i), - tvb_get_guint8(tvb, *offset+9+i)); - } - } - break; - case X25_FAC_CALL_TRANSFER: - { - char *tmpbuf; - - if (byte1 < 2) { - expert_add_info(pinfo, ti, &ei_x25_facility_length); - return; - } - byte2 = tvb_get_guint8(tvb, *offset+2); - if ((byte2 & 0xC0) == 0xC0) { - proto_tree_add_uint_format_value(facility_tree, hf_x25_facility_call_transfer_reason, tvb, - *offset+2, 1, byte2, "call deflection by the originally called DTE address"); - } - else { - proto_tree_add_uint(facility_tree, hf_x25_facility_call_transfer_reason, tvb, *offset+2, 1, byte2); - } - byte3 = tvb_get_guint8(tvb, *offset+3); - proto_tree_add_uint(facility_tree, hf_x25_facility_call_transfer_num_semi_octets, tvb, *offset+4, 1, byte3); - tmpbuf = dte_address_util(tvb, *offset + 4, byte3); - - proto_tree_add_text(facility_tree, tvb, *offset+4, byte1 - 2, - "DTE address: %s", tmpbuf); - } - break; - case X25_FAC_RPOA_SELECTION_EXT: - { - int i; - - if ((byte1 < 2) || (byte1 % 2)) { - expert_add_info(pinfo, ti, &ei_x25_facility_length); - return; - } - for (i = 0; (i<byte1); i+=2) { - proto_tree_add_text(facility_tree, tvb, *offset+2+i, 2, - "Data network identification code: %04X", - tvb_get_ntohs(tvb, *offset+2+i)); - } - } - break; - case X25_FAC_CALLING_ADDR_EXT: - { - char *tmpbuf; - - if (byte1 < 1) { - expert_add_info(pinfo, ti, &ei_x25_facility_length); - return; - } - byte2 = tvb_get_guint8(tvb, *offset+2) & 0x3F; - proto_tree_add_uint(facility_tree, hf_x25_facility_calling_addr_ext_num_semi_octets, tvb, *offset+2, 1, byte2); - tmpbuf = dte_address_util(tvb, *offset + 3, byte2); - proto_tree_add_text(facility_tree, tvb, *offset+3, byte1 - 1, - "DTE address: %s", tmpbuf); - } - break; - case X25_FAC_MONETARY_UNIT: - proto_tree_add_item(facility_tree, hf_x25_facility_monetary_unit, tvb, *offset+2, byte1, ENC_NA); - break; - case X25_FAC_NUI: - proto_tree_add_item(facility_tree, hf_x25_facility_nui, tvb, *offset+2, byte1, ENC_NA); - break; - case X25_FAC_CALLED_ADDR_EXT: - { - char *tmpbuf; - - if (byte1 < 1) { - expert_add_info(pinfo, ti, &ei_x25_facility_length); - return; - } - byte2 = tvb_get_guint8(tvb, *offset+2) & 0x3F; - proto_tree_add_uint(facility_tree, hf_x25_facility_called_addr_ext_num_semi_octets, tvb, *offset+2, 1, byte2); - tmpbuf = dte_address_util(tvb, *offset+3, byte2); - - proto_tree_add_text(facility_tree, tvb, *offset+3, byte1 - 1, - "DTE address: %s", tmpbuf); - } - break; - case X25_FAC_ETE_TRANSIT_DELAY: - if (byte1 < 2) - break; - proto_tree_add_item(facility_tree, hf_x25_facility_cumulative_ete_transit_delay, tvb, *offset+2, 2, ENC_BIG_ENDIAN); - if (byte1 < 4) - break; - proto_tree_add_item(facility_tree, hf_x25_facility_requested_ete_transit_delay, tvb, *offset+4, 2, ENC_BIG_ENDIAN); - if (byte1 < 6) - break; - proto_tree_add_item(facility_tree, hf_x25_facility_max_acceptable_ete_transit_delay, tvb, *offset+6, 2, ENC_BIG_ENDIAN); - break; - case X25_FAC_CALL_DEFLECT: - { - char *tmpbuf; - - if (byte1 < 2) { - expert_add_info(pinfo, ti, &ei_x25_facility_length); - return; - } - byte2 = tvb_get_guint8(tvb, *offset+2); - if ((byte2 & 0xC0) == 0xC0) - proto_tree_add_text(facility_tree, tvb, *offset+2, 1, - "Reason: call DTE originated"); - else - proto_tree_add_text(facility_tree, tvb, *offset+2, 1, - "Reason: unknown"); - byte3 = tvb_get_guint8(tvb, *offset+3); - proto_tree_add_uint(facility_tree, hf_x25_facility_call_deflect_num_semi_octets, tvb, *offset+3, 1, byte3); - tmpbuf = dte_address_util(tvb, *offset+4, byte3); - - proto_tree_add_text(facility_tree, tvb, *offset+4, byte1 - 2, - "Alternative DTE address: %s", tmpbuf); - } - break; - case X25_FAC_PRIORITY: - if (byte1 < 1) - break; - add_priority(facility_tree, hf_x25_facility_priority_data, tvb, *offset+2); - if (byte1 < 2) - break; - add_priority(facility_tree, hf_x25_facility_priority_estab_conn, tvb, *offset+3); - if (byte1 < 3) - break; - add_priority(facility_tree, hf_x25_facility_priority_keep_conn, tvb, *offset+4); - if (byte1 < 4) - break; - add_priority(facility_tree, hf_x25_facility_min_acceptable_priority_data, tvb, *offset+5); - if (byte1 < 5) - break; - add_priority(facility_tree, hf_x25_facility_min_acceptable_priority_estab_conn, tvb, *offset+6); - if (byte1 < 6) - break; - add_priority(facility_tree, hf_x25_facility_min_acceptable_priority_keep_conn, tvb, *offset+7); - break; - default: - proto_tree_add_item(facility_tree, hf_x25_facility_classD_unknown, tvb, *offset+2, byte1, ENC_NA); - } - } - byte1 = tvb_get_guint8(tvb, *offset+1); - (*offset) += byte1+2; - len -= byte1+2; - break; - } - } + guint8 fac, byte1, byte2, byte3; + guint32 len; /* facilities length */ + proto_item *ti = NULL; + proto_tree *facilities_tree = NULL, *facility_tree = NULL; + + len = tvb_get_guint8(tvb, *offset); + if (len && tree) { + facilities_tree = proto_tree_add_subtree(tree, tvb, *offset, len + 1, + ett_x25_facilities, NULL, "Facilities"); + proto_tree_add_item(facilities_tree, hf_x25_facilities_length, tvb, *offset, 1, ENC_NA); + } + (*offset)++; + + while (len > 0) { + ti = proto_tree_add_item(facilities_tree, hf_x25_facility, tvb, *offset, -1, ENC_NA); + fac = tvb_get_guint8(tvb, *offset); + switch(fac & X25_FAC_CLASS_MASK) { + case X25_FAC_CLASS_A: + proto_item_set_len(ti, 2); + proto_item_append_text(ti, ": %s", + val_to_str(fac, x25_facilities_classA_vals, "Unknown (0x%02X)")); + facility_tree = proto_item_add_subtree(ti, ett_x25_facility); + proto_tree_add_item(facility_tree, hf_x25_facility_class, tvb, *offset, 1, ENC_NA); + proto_tree_add_item(facility_tree, hf_x25_facility_classA, tvb, *offset, 1, ENC_NA); + if (facility_tree) { + switch (fac) { + case X25_FAC_COMP_MARK: + proto_tree_add_item(facility_tree, hf_x25_facility_classA_comp_mark, tvb, *offset+1, 1, ENC_NA); + break; + case X25_FAC_REVERSE: + proto_tree_add_item(facility_tree, hf_x25_facility_classA_reverse, tvb, *offset+1, 1, ENC_NA); + proto_tree_add_item(facility_tree, hf_x25_fast_select, tvb, *offset+1, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(facility_tree, hf_x25_icrd, tvb, *offset+1, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(facility_tree, hf_x25_facility_reverse_charging, tvb, *offset+1, 1, ENC_BIG_ENDIAN); + break; + case X25_FAC_CHARGING_INFO: + proto_tree_add_item(facility_tree, hf_x25_facility_classA_charging_info, tvb, *offset+1, 1, ENC_NA); + proto_tree_add_item(facility_tree, hf_x25_facility_charging_info, tvb, *offset+1, 1, ENC_NA); + break; + case X25_FAC_THROUGHPUT: + proto_tree_add_item(facility_tree, hf_x25_facility_throughput_called_dte, tvb, *offset+1, 1, ENC_NA); + proto_tree_add_item(facility_tree, hf_x25_throughput_called_dte, tvb, *offset+1, 1, ENC_NA); + break; + case X25_FAC_CUG: + proto_tree_add_item(facility_tree, hf_x25_facility_classA_cug, tvb, *offset+1, 1, ENC_NA); + break; + case X25_FAC_CALLED_MODIF: + proto_tree_add_item(facility_tree, hf_x25_facility_classA_called_motif, tvb, *offset+1, 1, ENC_NA); + break; + case X25_FAC_CUG_OUTGOING_ACC: + proto_tree_add_item(facility_tree, hf_x25_facility_classA_cug_outgoing_acc, tvb, *offset+1, 1, ENC_NA); + break; + case X25_FAC_THROUGHPUT_MIN: + proto_tree_add_item(facility_tree, hf_x25_facility_classA_throughput_min, tvb, *offset+1, 1, ENC_NA); + break; + case X25_FAC_EXPRESS_DATA: + proto_tree_add_item(facility_tree, hf_x25_facility_classA_express_data, tvb, *offset+1, 1, ENC_NA); + break; + default: + proto_tree_add_item(facility_tree, hf_x25_facility_classA_unknown, tvb, *offset+1, 1, ENC_NA); + break; + } + } + (*offset) += 2; + len -= 2; + break; + case X25_FAC_CLASS_B: + proto_item_set_len(ti, 3); + proto_item_append_text(ti, ": %s", + val_to_str(fac, x25_facilities_classB_vals, "Unknown (0x%02X)")); + facility_tree = proto_item_add_subtree(ti, ett_x25_facility); + proto_tree_add_item(facility_tree, hf_x25_facility_class, tvb, *offset, 1, ENC_NA); + proto_tree_add_item(facility_tree, hf_x25_facility_classB, tvb, *offset, 1, ENC_NA); + if (facility_tree) { + switch (fac) { + case X25_FAC_BILATERAL_CUG: + proto_tree_add_item(facility_tree, hf_x25_facility_classB_bilateral_cug, tvb, *offset+1, 2, ENC_BIG_ENDIAN); + break; + case X25_FAC_PACKET_SIZE: + proto_tree_add_item(facility_tree, hf_x25_facility_packet_size_called_dte, tvb, *offset+1, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(facility_tree, hf_x25_facility_packet_size_calling_dte, tvb, *offset+2, 1, ENC_BIG_ENDIAN); + break; + case X25_FAC_WINDOW_SIZE: + proto_tree_add_item(facility_tree, hf_x25_window_size_called_dte, tvb, *offset+1, 1, ENC_NA); + proto_tree_add_item(facility_tree, hf_x25_window_size_calling_dte, tvb, *offset+2, 1, ENC_NA); + break; + case X25_FAC_RPOA_SELECTION: + proto_tree_add_item(facility_tree, hf_x25_facility_data_network_id_code, tvb, *offset+1, 2, ENC_BIG_ENDIAN); + break; + case X25_FAC_CUG_EXT: + proto_tree_add_item(facility_tree, hf_x25_facility_cug_ext, tvb, *offset+1, 2, ENC_BIG_ENDIAN); + break; + case X25_FAC_CUG_OUTGOING_ACC_EXT: + proto_tree_add_item(facility_tree, hf_x25_facility_cug_outgoing_acc_ext, tvb, *offset+1, 2, ENC_BIG_ENDIAN); + break; + case X25_FAC_TRANSIT_DELAY: + proto_tree_add_item(facility_tree, hf_x25_facility_transit_delay, tvb, *offset+1, 2, ENC_BIG_ENDIAN); + break; + default: + proto_tree_add_item(facility_tree, hf_x25_facility_classB_unknown, tvb, *offset+1, 2, ENC_BIG_ENDIAN); + break; + } + } + (*offset) += 3; + len -= 3; + break; + case X25_FAC_CLASS_C: + proto_item_set_len(ti, 4); + proto_item_append_text(ti, ": %s", + val_to_str(fac, x25_facilities_classC_vals, "Unknown (0x%02X)")); + facility_tree = proto_item_add_subtree(ti, ett_x25_facility); + proto_tree_add_item(facility_tree, hf_x25_facility_class, tvb, *offset, 1, ENC_NA); + proto_tree_add_item(facility_tree, hf_x25_facility_classC, tvb, *offset, 1, ENC_NA); + if (facility_tree) { + proto_tree_add_item(facility_tree, hf_x25_facility_classC_unknown, tvb, *offset+1, 2, ENC_BIG_ENDIAN); + } + (*offset) += 4; + len -= 4; + break; + case X25_FAC_CLASS_D: + proto_item_append_text(ti, ": %s", + val_to_str(fac, x25_facilities_classD_vals, "Unknown (0x%02X)")); + facility_tree = proto_item_add_subtree(ti, ett_x25_facility); + proto_tree_add_item(facility_tree, hf_x25_facility_class, tvb, *offset, 1, ENC_NA); + byte1 = tvb_get_guint8(tvb, *offset+1); + proto_item_set_len(ti, byte1+2); + proto_tree_add_item(facility_tree, hf_x25_facility_classD, tvb, *offset, 1, ENC_NA); + proto_tree_add_item(facility_tree, hf_x25_facility_length, tvb, *offset+1, 1, ENC_NA); + if (facility_tree) { + switch (fac) { + case X25_FAC_CALL_DURATION: + { + int i; + + if ((byte1 < 4) || (byte1 % 4)) { + expert_add_info(pinfo, ti, &ei_x25_facility_length); + return; + } + for (i = 0; (i<byte1); i+=4) { + proto_tree_add_text(facility_tree, tvb, *offset+2+i, 4, + "Call duration: %u Day(s) %02X:%02X:%02X Hour(s)", + tvb_get_guint8(tvb, *offset+2+i), + tvb_get_guint8(tvb, *offset+3+i), + tvb_get_guint8(tvb, *offset+4+i), + tvb_get_guint8(tvb, *offset+5+i)); + } + } + break; + case X25_FAC_SEGMENT_COUNT: + { + int i; + + if ((byte1 < 8) || (byte1 % 8)) { + expert_add_info(pinfo, ti, &ei_x25_facility_length); + return; + } + for (i = 0; (i<byte1); i+=8) { + proto_tree_add_text(facility_tree, tvb, *offset+2+i, 4, + "Segments sent to DTE: %02X%02X%02X%02X", + tvb_get_guint8(tvb, *offset+2+i), + tvb_get_guint8(tvb, *offset+3+i), + tvb_get_guint8(tvb, *offset+4+i), + tvb_get_guint8(tvb, *offset+5+i)); + proto_tree_add_text(facility_tree, tvb, *offset+6+i, 4, + "Segments received from DTE: %02X%02X%02X%02X", + tvb_get_guint8(tvb, *offset+6+i), + tvb_get_guint8(tvb, *offset+7+i), + tvb_get_guint8(tvb, *offset+8+i), + tvb_get_guint8(tvb, *offset+9+i)); + } + } + break; + case X25_FAC_CALL_TRANSFER: + { + char *tmpbuf; + + if (byte1 < 2) { + expert_add_info(pinfo, ti, &ei_x25_facility_length); + return; + } + byte2 = tvb_get_guint8(tvb, *offset+2); + if ((byte2 & 0xC0) == 0xC0) { + proto_tree_add_uint_format_value(facility_tree, hf_x25_facility_call_transfer_reason, tvb, + *offset+2, 1, byte2, "call deflection by the originally called DTE address"); + } + else { + proto_tree_add_uint(facility_tree, hf_x25_facility_call_transfer_reason, tvb, *offset+2, 1, byte2); + } + byte3 = tvb_get_guint8(tvb, *offset+3); + proto_tree_add_uint(facility_tree, hf_x25_facility_call_transfer_num_semi_octets, tvb, *offset+4, 1, byte3); + tmpbuf = dte_address_util(tvb, *offset + 4, byte3); + + proto_tree_add_text(facility_tree, tvb, *offset+4, byte1 - 2, + "DTE address: %s", tmpbuf); + } + break; + case X25_FAC_RPOA_SELECTION_EXT: + { + int i; + + if ((byte1 < 2) || (byte1 % 2)) { + expert_add_info(pinfo, ti, &ei_x25_facility_length); + return; + } + for (i = 0; (i<byte1); i+=2) { + proto_tree_add_text(facility_tree, tvb, *offset+2+i, 2, + "Data network identification code: %04X", + tvb_get_ntohs(tvb, *offset+2+i)); + } + } + break; + case X25_FAC_CALLING_ADDR_EXT: + { + char *tmpbuf; + + if (byte1 < 1) { + expert_add_info(pinfo, ti, &ei_x25_facility_length); + return; + } + byte2 = tvb_get_guint8(tvb, *offset+2) & 0x3F; + proto_tree_add_uint(facility_tree, hf_x25_facility_calling_addr_ext_num_semi_octets, tvb, *offset+2, 1, byte2); + tmpbuf = dte_address_util(tvb, *offset + 3, byte2); + proto_tree_add_text(facility_tree, tvb, *offset+3, byte1 - 1, + "DTE address: %s", tmpbuf); + } + break; + case X25_FAC_MONETARY_UNIT: + proto_tree_add_item(facility_tree, hf_x25_facility_monetary_unit, tvb, *offset+2, byte1, ENC_NA); + break; + case X25_FAC_NUI: + proto_tree_add_item(facility_tree, hf_x25_facility_nui, tvb, *offset+2, byte1, ENC_NA); + break; + case X25_FAC_CALLED_ADDR_EXT: + { + char *tmpbuf; + + if (byte1 < 1) { + expert_add_info(pinfo, ti, &ei_x25_facility_length); + return; + } + byte2 = tvb_get_guint8(tvb, *offset+2) & 0x3F; + proto_tree_add_uint(facility_tree, hf_x25_facility_called_addr_ext_num_semi_octets, tvb, *offset+2, 1, byte2); + tmpbuf = dte_address_util(tvb, *offset+3, byte2); + + proto_tree_add_text(facility_tree, tvb, *offset+3, byte1 - 1, + "DTE address: %s", tmpbuf); + } + break; + case X25_FAC_ETE_TRANSIT_DELAY: + if (byte1 < 2) + break; + proto_tree_add_item(facility_tree, hf_x25_facility_cumulative_ete_transit_delay, tvb, *offset+2, 2, ENC_BIG_ENDIAN); + if (byte1 < 4) + break; + proto_tree_add_item(facility_tree, hf_x25_facility_requested_ete_transit_delay, tvb, *offset+4, 2, ENC_BIG_ENDIAN); + if (byte1 < 6) + break; + proto_tree_add_item(facility_tree, hf_x25_facility_max_acceptable_ete_transit_delay, tvb, *offset+6, 2, ENC_BIG_ENDIAN); + break; + case X25_FAC_CALL_DEFLECT: + { + char *tmpbuf; + + if (byte1 < 2) { + expert_add_info(pinfo, ti, &ei_x25_facility_length); + return; + } + byte2 = tvb_get_guint8(tvb, *offset+2); + if ((byte2 & 0xC0) == 0xC0) + proto_tree_add_text(facility_tree, tvb, *offset+2, 1, + "Reason: call DTE originated"); + else + proto_tree_add_text(facility_tree, tvb, *offset+2, 1, + "Reason: unknown"); + byte3 = tvb_get_guint8(tvb, *offset+3); + proto_tree_add_uint(facility_tree, hf_x25_facility_call_deflect_num_semi_octets, tvb, *offset+3, 1, byte3); + tmpbuf = dte_address_util(tvb, *offset+4, byte3); + + proto_tree_add_text(facility_tree, tvb, *offset+4, byte1 - 2, + "Alternative DTE address: %s", tmpbuf); + } + break; + case X25_FAC_PRIORITY: + if (byte1 < 1) + break; + add_priority(facility_tree, hf_x25_facility_priority_data, tvb, *offset+2); + if (byte1 < 2) + break; + add_priority(facility_tree, hf_x25_facility_priority_estab_conn, tvb, *offset+3); + if (byte1 < 3) + break; + add_priority(facility_tree, hf_x25_facility_priority_keep_conn, tvb, *offset+4); + if (byte1 < 4) + break; + add_priority(facility_tree, hf_x25_facility_min_acceptable_priority_data, tvb, *offset+5); + if (byte1 < 5) + break; + add_priority(facility_tree, hf_x25_facility_min_acceptable_priority_estab_conn, tvb, *offset+6); + if (byte1 < 6) + break; + add_priority(facility_tree, hf_x25_facility_min_acceptable_priority_keep_conn, tvb, *offset+7); + break; + default: + proto_tree_add_item(facility_tree, hf_x25_facility_classD_unknown, tvb, *offset+2, byte1, ENC_NA); + } + } + byte1 = tvb_get_guint8(tvb, *offset+1); + (*offset) += byte1+2; + len -= byte1+2; + break; + } + } } static void x25_ntoa(proto_tree *tree, int *offset, tvbuff_t *tvb, - packet_info *pinfo, gboolean is_registration) + packet_info *pinfo, gboolean is_registration) { int len1, len2; int i; @@ -1046,23 +1046,23 @@ x25_ntoa(proto_tree *tree, int *offset, tvbuff_t *tvb, first=addr1; second=addr2; for (i = 0; i < (len1 + len2); i++) { - if (i < len1) { - if (i % 2 != 0) { - *first++ = ((byte >> 0) & 0x0F) + '0'; - localoffset++; - byte = tvb_get_guint8(tvb, localoffset); - } else { - *first++ = ((byte >> 4) & 0x0F) + '0'; - } - } else { - if (i % 2 != 0) { - *second++ = ((byte >> 0) & 0x0F) + '0'; - localoffset++; - byte = tvb_get_guint8(tvb, localoffset); - } else { - *second++ = ((byte >> 4) & 0x0F) + '0'; - } - } + if (i < len1) { + if (i % 2 != 0) { + *first++ = ((byte >> 0) & 0x0F) + '0'; + localoffset++; + byte = tvb_get_guint8(tvb, localoffset); + } else { + *first++ = ((byte >> 4) & 0x0F) + '0'; + } + } else { + if (i % 2 != 0) { + *second++ = ((byte >> 0) & 0x0F) + '0'; + localoffset++; + byte = tvb_get_guint8(tvb, localoffset); + } else { + *second++ = ((byte >> 4) & 0x0F) + '0'; + } + } } *first = '\0'; @@ -1070,30 +1070,30 @@ x25_ntoa(proto_tree *tree, int *offset, tvbuff_t *tvb, if (len1) { col_add_str(pinfo->cinfo, COL_RES_DL_DST, addr1); - if (tree) - proto_tree_add_text(tree, tvb, *offset, - (len1 + 1) / 2, - is_registration ? - "DCE address: %s" : - "Called address: %s", - addr1); + if (tree) + proto_tree_add_text(tree, tvb, *offset, + (len1 + 1) / 2, + is_registration ? + "DCE address: %s" : + "Called address: %s", + addr1); } if (len2) { col_add_str(pinfo->cinfo, COL_RES_DL_SRC, addr2); - if (tree) - proto_tree_add_text(tree, tvb, *offset + len1/2, - (len2+1)/2+(len1%2+(len2+1)%2)/2, - is_registration ? - "DTE address: %s" : - "Calling address: %s", - addr2); + if (tree) + proto_tree_add_text(tree, tvb, *offset + len1/2, + (len2+1)/2+(len1%2+(len2+1)%2)/2, + is_registration ? + "DTE address: %s" : + "Calling address: %s", + addr2); } (*offset) += ((len1 + len2 + 1) / 2); } static void x25_toa(proto_tree *tree, int *offset, tvbuff_t *tvb, - packet_info *pinfo) + packet_info *pinfo) { int len1, len2; int i; @@ -1107,17 +1107,17 @@ x25_toa(proto_tree *tree, int *offset, tvbuff_t *tvb, len1 = tvb_get_guint8(tvb, *offset); if (tree) { - proto_tree_add_text(tree, tvb, *offset, 1, - "Called address length: %u", - len1); + proto_tree_add_text(tree, tvb, *offset, 1, + "Called address length: %u", + len1); } (*offset)++; len2 = tvb_get_guint8(tvb, *offset); if (tree) { - proto_tree_add_text(tree, tvb, *offset, 1, - "Calling address length: %u", - len2); + proto_tree_add_text(tree, tvb, *offset, 1, + "Calling address length: %u", + len2); } (*offset)++; @@ -1133,23 +1133,23 @@ x25_toa(proto_tree *tree, int *offset, tvbuff_t *tvb, first=addr1; second=addr2; for (i = 0; i < (len1 + len2); i++) { - if (i < len1) { - if (i % 2 != 0) { - *first++ = ((byte >> 0) & 0x0F) + '0'; - localoffset++; - byte = tvb_get_guint8(tvb, localoffset); - } else { - *first++ = ((byte >> 4) & 0x0F) + '0'; - } - } else { - if (i % 2 != 0) { - *second++ = ((byte >> 0) & 0x0F) + '0'; - localoffset++; - byte = tvb_get_guint8(tvb, localoffset); - } else { - *second++ = ((byte >> 4) & 0x0F) + '0'; - } - } + if (i < len1) { + if (i % 2 != 0) { + *first++ = ((byte >> 0) & 0x0F) + '0'; + localoffset++; + byte = tvb_get_guint8(tvb, localoffset); + } else { + *first++ = ((byte >> 4) & 0x0F) + '0'; + } + } else { + if (i % 2 != 0) { + *second++ = ((byte >> 0) & 0x0F) + '0'; + localoffset++; + byte = tvb_get_guint8(tvb, localoffset); + } else { + *second++ = ((byte >> 4) & 0x0F) + '0'; + } + } } *first = '\0'; @@ -1157,19 +1157,19 @@ x25_toa(proto_tree *tree, int *offset, tvbuff_t *tvb, if (len1) { col_add_str(pinfo->cinfo, COL_RES_DL_DST, addr1); - if (tree) - proto_tree_add_text(tree, tvb, *offset, - (len1 + 1) / 2, - "Called address: %s", - addr1); + if (tree) + proto_tree_add_text(tree, tvb, *offset, + (len1 + 1) / 2, + "Called address: %s", + addr1); } if (len2) { col_add_str(pinfo->cinfo, COL_RES_DL_SRC, addr2); - if (tree) - proto_tree_add_text(tree, tvb, *offset + len1/2, - (len2+1)/2+(len1%2+(len2+1)%2)/2, - "Calling address: %s", - addr2); + if (tree) + proto_tree_add_text(tree, tvb, *offset + len1/2, + (len2+1)/2+(len1%2+(len2+1)%2)/2, + "Calling address: %s", + addr2); } (*offset) += ((len1 + len2 + 1) / 2); } @@ -1184,95 +1184,95 @@ get_x25_pkt_len(tvbuff_t *tvb) switch (byte2) { case X25_CALL_REQUEST: - bytex = tvb_get_guint8(tvb, 3); - called_len = (bytex >> 0) & 0x0F; - calling_len = (bytex >> 4) & 0x0F; - length = 4 + (called_len + calling_len + 1) / 2; /* addr */ - if (length < tvb_reported_length(tvb)) - length += (1 + tvb_get_guint8(tvb, length)); /* facilities */ + bytex = tvb_get_guint8(tvb, 3); + called_len = (bytex >> 0) & 0x0F; + calling_len = (bytex >> 4) & 0x0F; + length = 4 + (called_len + calling_len + 1) / 2; /* addr */ + if (length < tvb_reported_length(tvb)) + length += (1 + tvb_get_guint8(tvb, length)); /* facilities */ - return MIN(tvb_reported_length(tvb),length); + return MIN(tvb_reported_length(tvb),length); case X25_CALL_ACCEPTED: - /* The calling/called address length byte (following the packet type) - * is not mandatory, so we must check the packet length before trying - * to read it */ - if (tvb_reported_length(tvb) == 3) - return(3); - bytex = tvb_get_guint8(tvb, 3); - called_len = (bytex >> 0) & 0x0F; - calling_len = (bytex >> 4) & 0x0F; - length = 4 + (called_len + calling_len + 1) / 2; /* addr */ - if (length < tvb_reported_length(tvb)) - length += (1 + tvb_get_guint8(tvb, length)); /* facilities */ - - return MIN(tvb_reported_length(tvb),length); + /* The calling/called address length byte (following the packet type) + * is not mandatory, so we must check the packet length before trying + * to read it */ + if (tvb_reported_length(tvb) == 3) + return(3); + bytex = tvb_get_guint8(tvb, 3); + called_len = (bytex >> 0) & 0x0F; + calling_len = (bytex >> 4) & 0x0F; + length = 4 + (called_len + calling_len + 1) / 2; /* addr */ + if (length < tvb_reported_length(tvb)) + length += (1 + tvb_get_guint8(tvb, length)); /* facilities */ + + return MIN(tvb_reported_length(tvb),length); case X25_CLEAR_REQUEST: case X25_RESET_REQUEST: case X25_RESTART_REQUEST: - return MIN(tvb_reported_length(tvb),5); + return MIN(tvb_reported_length(tvb),5); case X25_DIAGNOSTIC: - return MIN(tvb_reported_length(tvb),4); + return MIN(tvb_reported_length(tvb),4); case X25_CLEAR_CONFIRMATION: case X25_INTERRUPT: case X25_INTERRUPT_CONFIRMATION: case X25_RESET_CONFIRMATION: case X25_RESTART_CONFIRMATION: - return MIN(tvb_reported_length(tvb),3); + return MIN(tvb_reported_length(tvb),3); case X25_REGISTRATION_REQUEST: - bytex = tvb_get_guint8(tvb, 3); - dce_len = (bytex >> 0) & 0x0F; - dte_len = (bytex >> 4) & 0x0F; - length = 4 + (dte_len + dce_len + 1) / 2; /* addr */ - if (length < tvb_reported_length(tvb)) - length += (1 + tvb_get_guint8(tvb, length)); /* registration */ + bytex = tvb_get_guint8(tvb, 3); + dce_len = (bytex >> 0) & 0x0F; + dte_len = (bytex >> 4) & 0x0F; + length = 4 + (dte_len + dce_len + 1) / 2; /* addr */ + if (length < tvb_reported_length(tvb)) + length += (1 + tvb_get_guint8(tvb, length)); /* registration */ - return MIN(tvb_reported_length(tvb),length); + return MIN(tvb_reported_length(tvb),length); case X25_REGISTRATION_CONFIRMATION: - bytex = tvb_get_guint8(tvb, 5); - dce_len = (bytex >> 0) & 0x0F; - dte_len = (bytex >> 4) & 0x0F; - length = 6 + (dte_len + dce_len + 1) / 2; /* addr */ - if (length < tvb_reported_length(tvb)) - length += (1 + tvb_get_guint8(tvb, length)); /* registration */ - - return MIN(tvb_reported_length(tvb),length); + bytex = tvb_get_guint8(tvb, 5); + dce_len = (bytex >> 0) & 0x0F; + dte_len = (bytex >> 4) & 0x0F; + length = 6 + (dte_len + dce_len + 1) / 2; /* addr */ + if (length < tvb_reported_length(tvb)) + length += (1 + tvb_get_guint8(tvb, length)); /* registration */ + + return MIN(tvb_reported_length(tvb),length); } if (PACKET_IS_DATA(byte2)) - return MIN(tvb_reported_length(tvb),3); + return MIN(tvb_reported_length(tvb),3); switch (PACKET_TYPE_FC(byte2)) { case X25_RR: - return MIN(tvb_reported_length(tvb),3); + return MIN(tvb_reported_length(tvb),3); case X25_RNR: - return MIN(tvb_reported_length(tvb),3); + return MIN(tvb_reported_length(tvb),3); case X25_REJ: - return MIN(tvb_reported_length(tvb),3); + return MIN(tvb_reported_length(tvb),3); } return 0; } static const value_string prt_id_vals[] = { - {PRT_ID_ISO_8073, "ISO 8073 COTP"}, - {PRT_ID_ISO_8602, "ISO 8602 CLTP"}, - {PRT_ID_ISO_10736_ISO_8073, "ISO 10736 in conjunction with ISO 8073 COTP"}, - {PRT_ID_ISO_10736_ISO_8602, "ISO 10736 in conjunction with ISO 8602 CLTP"}, - {0x00, NULL} + {PRT_ID_ISO_8073, "ISO 8073 COTP"}, + {PRT_ID_ISO_8602, "ISO 8602 CLTP"}, + {PRT_ID_ISO_10736_ISO_8073, "ISO 10736 in conjunction with ISO 8073 COTP"}, + {PRT_ID_ISO_10736_ISO_8602, "ISO 10736 in conjunction with ISO 8602 CLTP"}, + {0x00, NULL} }; static const value_string sharing_strategy_vals[] = { - {0x00, "No sharing"}, - {0x00, NULL} + {0x00, "No sharing"}, + {0x00, NULL} }; static void @@ -1319,17 +1319,17 @@ dissect_x25_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, x25_pkt_len = get_x25_pkt_len(tvb); if (x25_pkt_len < 3) /* packet too short */ { - col_set_str(pinfo->cinfo, COL_INFO, "Invalid/short X.25 packet"); - if (tree) - proto_tree_add_protocol_format(tree, proto_x25, tvb, 0, -1, - "Invalid/short X.25 packet"); - return; + col_set_str(pinfo->cinfo, COL_INFO, "Invalid/short X.25 packet"); + if (tree) + proto_tree_add_protocol_format(tree, proto_x25, tvb, 0, -1, + "Invalid/short X.25 packet"); + return; } pkt_type = tvb_get_guint8(tvb, 2); if (PACKET_IS_DATA(pkt_type)) { - if (bytes0_1 & X25_QBIT) - q_bit_set = TRUE; + if (bytes0_1 & X25_QBIT) + q_bit_set = TRUE; } if (tree) { @@ -1362,589 +1362,589 @@ dissect_x25_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, case X25_CALL_REQUEST: switch (dir) { - case X25_FROM_DCE: - short_name = "Inc. call"; - long_name = "Incoming call"; - break; - - case X25_FROM_DTE: - short_name = "Call req."; - long_name = "Call request"; - break; - - case X25_UNKNOWN: - short_name = "Inc. call/Call req."; - long_name = "Incoming call/Call request"; - break; - } - col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d", short_name, vc); - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, - 0, 2, bytes0_1); - proto_tree_add_uint_format_value(x25_tree, hf_x25_type, tvb, 2, 1, - X25_CALL_REQUEST, "%s", long_name); - } - localoffset = 3; - if (localoffset < x25_pkt_len) { /* calling/called addresses */ - if (toa) - x25_toa(x25_tree, (gint*)&localoffset, tvb, pinfo); - else - x25_ntoa(x25_tree, (gint*)&localoffset, tvb, pinfo, FALSE); - } - - if (localoffset < x25_pkt_len) /* facilities */ - dump_facilities(x25_tree, (gint*)&localoffset, tvb, pinfo); - - if (localoffset < tvb_reported_length(tvb)) /* user data */ - { - - userdata_tree = proto_tree_add_subtree(x25_tree, tvb, localoffset, -1, - ett_x25_user_data, &ti, "User data"); - - /* X.263/ISO 9577 says that: - - When CLNP or ESIS are run over X.25, the SPI - is 0x81 or 0x82, respectively; those are the - NLPIDs for those protocol. - - When X.224/ISO 8073 COTP is run over X.25, and - when ISO 11570 explicit identification is being - used, the first octet of the user data field is - a TPDU length field, and the rest is "as defined - in ITU-T Rec. X.225 | ISO/IEC 8073, Annex B, - or ITU-T Rec. X.264 and ISO/IEC 11570". - - When X.264/ISO 11570 default identification is - being used, there is no user data field in the - CALL REQUEST packet. This is for X.225/ISO 8073 - COTP. - - It also says that SPI values from 0x03 through 0x3f are - reserved and are in use by X.224/ISO 8073 Annex B and - X.264/ISO 11570. The note says that those values are - not NLPIDs, they're "used by the respective higher layer - protocol" and "not used for higher layer protocol - identification". I infer from this and from what - X.264/ISO 11570 says that this means that values in those - range are valid values for the first octet of an - X.224/ISO 8073 packet or for X.264/ISO 11570. - - Annex B of X.225/ISO 8073 mentions some additional TPDU - types that can be put in what I presume is the user - data of connect requests. It says that: - - The sending transport entity shall: - - a) either not transmit any TPDU in the NS-user data - parameter of the N-CONNECT request primitive; or - - b) transmit the UN-TPDU (see ITU-T Rec. X.264 and - ISO/IEC 11570) followed by the NCM-TPDU in the - NS-user data parameter of the N-CONNECT request - primitive. - - I don't know if this means that the user data field - will contain a UN TPDU followed by an NCM TPDU or not. - - X.264/ISO 11570 says that: - - When default identification is being used, - X.225/ISO 8073 COTP is identified. No user data - is sent in the network-layer connection request. - - When explicit identification is being used, - the user data is a UN TPDU ("Use of network - connection TPDU"), which specifies the transport - protocol to use over this network connection. - It also says that the length of a UN TPDU shall - not exceed 32 octets, i.e. shall not exceed 0x20; - it says this is "due to the desire not to conflict - with the protocol identifier field carried by X.25 - CALL REQUEST/INCOMING CALL packets", and says that - field has values specified in X.244. X.244 has been - superseded by X.263/ISO 9577, so that presumably - means the goal is to allow a UN TPDU's length - field to be distinguished from an NLPID, allowing - you to tell whether X.264/ISO 11570 explicit - identification is being used or an NLPID is - being used as the SPI. - - I read this as meaning that, if the ISO mechanisms are - used to identify the protocol being carried over X.25: - - if there's no user data in the CALL REQUEST/ - INCOMING CALL packet, it's COTP; - - if there is user data, then: - - if the first octet is less than or equal to - 32, it might be a UN TPDU, and that identifies - the transport protocol being used, and - it may be followed by more data, such - as a COTP NCM TPDU if it's COTP; - - if the first octet is greater than 32, it's - an NLPID, *not* a TPDU length, and the - stuff following it is *not* a TPDU. - - Figure A.2 of X.263/ISO 9577 seems to say that the - first octet of the user data is a TPDU length field, - in the range 0x03 through 0x82, and says they are - for X.225/ISO 8073 Annex B or X.264/ISO 11570. - - However, X.264/ISO 11570 seems to imply that the length - field would be that of a UN TPDU, which must be less - than or equal to 0x20, and X.225/ISO 8073 Annex B seems - to indicate that the user data must begin with - an X.264/ISO 11570 UN TPDU, so I'd say that A.2 should - have said "in the range 0x03 through 0x20", instead - (the length value doesn't include the length field, - and the minimum UN TPDU has length, type, PRT-ID, - and SHARE, so that's 3 bytes without the length). */ - spi = tvb_get_guint8(tvb, localoffset); - if (spi > 32 || spi < 3) { - /* First octet is > 32, or < 3, so the user data isn't an - X.264/ISO 11570 UN TPDU */ - is_x_264 = FALSE; - } else { - /* First octet is >= 3 and <= 32, so the user data *might* - be an X.264/ISO 11570 UN TPDU. Check whether we have - enough data to see if it is. */ - if (tvb_bytes_exist(tvb, localoffset+1, 1)) { - /* We do; check whether the second octet is 1. */ - if (tvb_get_guint8(tvb, localoffset+1) == 0x01) { - /* Yes, the second byte is 1, so it looks like - a UN TPDU. */ - is_x_264 = TRUE; - } else { - /* No, the second byte is not 1, so it's not a - UN TPDU. */ - is_x_264 = FALSE; - } - } else { - /* We can't see the second byte of the putative UN - TPDU, so we don't know if that's what it is. */ - is_x_264 = -1; - } - } - if (is_x_264 == -1) { - /* - * We don't know what it is; just skip it. - */ - localoffset = tvb_length(tvb); - } else if (is_x_264) { - /* It looks like an X.264 UN TPDU, so show it as such. */ - if (userdata_tree) { - proto_tree_add_item( userdata_tree, hf_x264_length_indicator, tvb, localoffset, 1, ENC_NA); - proto_tree_add_item( userdata_tree, hf_x264_un_tpdu_id, tvb, localoffset+1, 1, ENC_NA); - } - prt_id = tvb_get_guint8(tvb, localoffset+2); - if (userdata_tree) { - proto_tree_add_item( userdata_tree, hf_x264_protocol_id, tvb, localoffset+2, 1, ENC_NA); - proto_tree_add_item( userdata_tree, hf_x264_sharing_strategy, tvb, localoffset+3, 1, ENC_NA); - } - - /* XXX - dissect the variable part? */ - - /* The length doesn't include the length octet itself. */ - localoffset += spi + 1; - - switch (prt_id) { - - case PRT_ID_ISO_8073: - /* ISO 8073 COTP */ - if (!pinfo->fd->flags.visited) - x25_hash_add_proto_start(vc, pinfo->fd->num, ositp_handle); - /* XXX - dissect the rest of the user data as COTP? - That needs support for NCM TPDUs, etc. */ - break; - - case PRT_ID_ISO_8602: - /* ISO 8602 CLTP */ - if (!pinfo->fd->flags.visited) - x25_hash_add_proto_start(vc, pinfo->fd->num, ositp_handle); - break; - } - } else if (is_x_264 == 0) { - /* It doesn't look like a UN TPDU, so compare the first - octet of the CALL REQUEST packet with various X.263/ - ISO 9577 NLPIDs, as per Annex A of X.263/ISO 9577. */ - - if (userdata_tree) { - proto_tree_add_item( userdata_tree, hf_x263_sec_protocol_id, tvb, localoffset, 1, ENC_NA); - } - - if (!pinfo->fd->flags.visited) { - /* - * Is there a dissector handle for this SPI? - * If so, assign it to this virtual circuit. - */ - dissect = dissector_get_uint_handle(x25_subdissector_table, spi); - if (dissect != NULL) - x25_hash_add_proto_start(vc, pinfo->fd->num, dissect); - } - - /* - * If there's only one octet of user data, it's just - * an NLPID; don't try to dissect it. - */ - if (localoffset + 1 == tvb_reported_length(tvb)) - return; - - /* - * There's more than one octet of user data, so we'll - * dissect it; for some protocols, the NLPID is considered - * to be part of the PDU, so, for those cases, we don't - * skip past it. For other protocols, we skip the NLPID. - */ - switch (spi) { - - case NLPID_ISO8473_CLNP: - case NLPID_ISO9542_ESIS: - case NLPID_ISO10589_ISIS: - case NLPID_ISO10747_IDRP: - case NLPID_SNDCF: - /* - * The NLPID is part of the PDU. Don't skip it. - * But if it's all there is to the PDU, don't - * bother dissecting it. - */ - break; - - case NLPID_SPI_X_29: - /* - * The first 4 bytes of the call user data are - * the SPI plus 3 reserved bytes; they are not - * part of the data to be dissected as X.29 data. - */ - localoffset += 4; - break; - - default: - /* - * The NLPID isn't part of the PDU - skip it. - * If that means there's nothing to dissect - */ - localoffset++; - } - } - } else { - /* if there's no user data in the CALL REQUEST/ - INCOMING CALL packet, it's COTP; */ + case X25_FROM_DCE: + short_name = "Inc. call"; + long_name = "Incoming call"; + break; + + case X25_FROM_DTE: + short_name = "Call req."; + long_name = "Call request"; + break; + + case X25_UNKNOWN: + short_name = "Inc. call/Call req."; + long_name = "Incoming call/Call request"; + break; + } + col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d", short_name, vc); + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, + 0, 2, bytes0_1); + proto_tree_add_uint_format_value(x25_tree, hf_x25_type, tvb, 2, 1, + X25_CALL_REQUEST, "%s", long_name); + } + localoffset = 3; + if (localoffset < x25_pkt_len) { /* calling/called addresses */ + if (toa) + x25_toa(x25_tree, (gint*)&localoffset, tvb, pinfo); + else + x25_ntoa(x25_tree, (gint*)&localoffset, tvb, pinfo, FALSE); + } + + if (localoffset < x25_pkt_len) /* facilities */ + dump_facilities(x25_tree, (gint*)&localoffset, tvb, pinfo); + + if (localoffset < tvb_reported_length(tvb)) /* user data */ + { + + userdata_tree = proto_tree_add_subtree(x25_tree, tvb, localoffset, -1, + ett_x25_user_data, &ti, "User data"); + + /* X.263/ISO 9577 says that: + + When CLNP or ESIS are run over X.25, the SPI + is 0x81 or 0x82, respectively; those are the + NLPIDs for those protocol. + + When X.224/ISO 8073 COTP is run over X.25, and + when ISO 11570 explicit identification is being + used, the first octet of the user data field is + a TPDU length field, and the rest is "as defined + in ITU-T Rec. X.225 | ISO/IEC 8073, Annex B, + or ITU-T Rec. X.264 and ISO/IEC 11570". + + When X.264/ISO 11570 default identification is + being used, there is no user data field in the + CALL REQUEST packet. This is for X.225/ISO 8073 + COTP. + + It also says that SPI values from 0x03 through 0x3f are + reserved and are in use by X.224/ISO 8073 Annex B and + X.264/ISO 11570. The note says that those values are + not NLPIDs, they're "used by the respective higher layer + protocol" and "not used for higher layer protocol + identification". I infer from this and from what + X.264/ISO 11570 says that this means that values in those + range are valid values for the first octet of an + X.224/ISO 8073 packet or for X.264/ISO 11570. + + Annex B of X.225/ISO 8073 mentions some additional TPDU + types that can be put in what I presume is the user + data of connect requests. It says that: + + The sending transport entity shall: + + a) either not transmit any TPDU in the NS-user data + parameter of the N-CONNECT request primitive; or + + b) transmit the UN-TPDU (see ITU-T Rec. X.264 and + ISO/IEC 11570) followed by the NCM-TPDU in the + NS-user data parameter of the N-CONNECT request + primitive. + + I don't know if this means that the user data field + will contain a UN TPDU followed by an NCM TPDU or not. + + X.264/ISO 11570 says that: + + When default identification is being used, + X.225/ISO 8073 COTP is identified. No user data + is sent in the network-layer connection request. + + When explicit identification is being used, + the user data is a UN TPDU ("Use of network + connection TPDU"), which specifies the transport + protocol to use over this network connection. + It also says that the length of a UN TPDU shall + not exceed 32 octets, i.e. shall not exceed 0x20; + it says this is "due to the desire not to conflict + with the protocol identifier field carried by X.25 + CALL REQUEST/INCOMING CALL packets", and says that + field has values specified in X.244. X.244 has been + superseded by X.263/ISO 9577, so that presumably + means the goal is to allow a UN TPDU's length + field to be distinguished from an NLPID, allowing + you to tell whether X.264/ISO 11570 explicit + identification is being used or an NLPID is + being used as the SPI. + + I read this as meaning that, if the ISO mechanisms are + used to identify the protocol being carried over X.25: + + if there's no user data in the CALL REQUEST/ + INCOMING CALL packet, it's COTP; + + if there is user data, then: + + if the first octet is less than or equal to + 32, it might be a UN TPDU, and that identifies + the transport protocol being used, and + it may be followed by more data, such + as a COTP NCM TPDU if it's COTP; + + if the first octet is greater than 32, it's + an NLPID, *not* a TPDU length, and the + stuff following it is *not* a TPDU. + + Figure A.2 of X.263/ISO 9577 seems to say that the + first octet of the user data is a TPDU length field, + in the range 0x03 through 0x82, and says they are + for X.225/ISO 8073 Annex B or X.264/ISO 11570. + + However, X.264/ISO 11570 seems to imply that the length + field would be that of a UN TPDU, which must be less + than or equal to 0x20, and X.225/ISO 8073 Annex B seems + to indicate that the user data must begin with + an X.264/ISO 11570 UN TPDU, so I'd say that A.2 should + have said "in the range 0x03 through 0x20", instead + (the length value doesn't include the length field, + and the minimum UN TPDU has length, type, PRT-ID, + and SHARE, so that's 3 bytes without the length). */ + spi = tvb_get_guint8(tvb, localoffset); + if (spi > 32 || spi < 3) { + /* First octet is > 32, or < 3, so the user data isn't an + X.264/ISO 11570 UN TPDU */ + is_x_264 = FALSE; + } else { + /* First octet is >= 3 and <= 32, so the user data *might* + be an X.264/ISO 11570 UN TPDU. Check whether we have + enough data to see if it is. */ + if (tvb_bytes_exist(tvb, localoffset+1, 1)) { + /* We do; check whether the second octet is 1. */ + if (tvb_get_guint8(tvb, localoffset+1) == 0x01) { + /* Yes, the second byte is 1, so it looks like + a UN TPDU. */ + is_x_264 = TRUE; + } else { + /* No, the second byte is not 1, so it's not a + UN TPDU. */ + is_x_264 = FALSE; + } + } else { + /* We can't see the second byte of the putative UN + TPDU, so we don't know if that's what it is. */ + is_x_264 = -1; + } + } + if (is_x_264 == -1) { + /* + * We don't know what it is; just skip it. + */ + localoffset = tvb_length(tvb); + } else if (is_x_264) { + /* It looks like an X.264 UN TPDU, so show it as such. */ + if (userdata_tree) { + proto_tree_add_item( userdata_tree, hf_x264_length_indicator, tvb, localoffset, 1, ENC_NA); + proto_tree_add_item( userdata_tree, hf_x264_un_tpdu_id, tvb, localoffset+1, 1, ENC_NA); + } + prt_id = tvb_get_guint8(tvb, localoffset+2); + if (userdata_tree) { + proto_tree_add_item( userdata_tree, hf_x264_protocol_id, tvb, localoffset+2, 1, ENC_NA); + proto_tree_add_item( userdata_tree, hf_x264_sharing_strategy, tvb, localoffset+3, 1, ENC_NA); + } + + /* XXX - dissect the variable part? */ + + /* The length doesn't include the length octet itself. */ + localoffset += spi + 1; + + switch (prt_id) { + + case PRT_ID_ISO_8073: + /* ISO 8073 COTP */ + if (!pinfo->fd->flags.visited) + x25_hash_add_proto_start(vc, pinfo->fd->num, ositp_handle); + /* XXX - dissect the rest of the user data as COTP? + That needs support for NCM TPDUs, etc. */ + break; + + case PRT_ID_ISO_8602: + /* ISO 8602 CLTP */ + if (!pinfo->fd->flags.visited) + x25_hash_add_proto_start(vc, pinfo->fd->num, ositp_handle); + break; + } + } else if (is_x_264 == 0) { + /* It doesn't look like a UN TPDU, so compare the first + octet of the CALL REQUEST packet with various X.263/ + ISO 9577 NLPIDs, as per Annex A of X.263/ISO 9577. */ + + if (userdata_tree) { + proto_tree_add_item( userdata_tree, hf_x263_sec_protocol_id, tvb, localoffset, 1, ENC_NA); + } + + if (!pinfo->fd->flags.visited) { + /* + * Is there a dissector handle for this SPI? + * If so, assign it to this virtual circuit. + */ + dissect = dissector_get_uint_handle(x25_subdissector_table, spi); + if (dissect != NULL) + x25_hash_add_proto_start(vc, pinfo->fd->num, dissect); + } + + /* + * If there's only one octet of user data, it's just + * an NLPID; don't try to dissect it. + */ + if (localoffset + 1 == tvb_reported_length(tvb)) + return; + + /* + * There's more than one octet of user data, so we'll + * dissect it; for some protocols, the NLPID is considered + * to be part of the PDU, so, for those cases, we don't + * skip past it. For other protocols, we skip the NLPID. + */ + switch (spi) { + + case NLPID_ISO8473_CLNP: + case NLPID_ISO9542_ESIS: + case NLPID_ISO10589_ISIS: + case NLPID_ISO10747_IDRP: + case NLPID_SNDCF: + /* + * The NLPID is part of the PDU. Don't skip it. + * But if it's all there is to the PDU, don't + * bother dissecting it. + */ + break; + + case NLPID_SPI_X_29: + /* + * The first 4 bytes of the call user data are + * the SPI plus 3 reserved bytes; they are not + * part of the data to be dissected as X.29 data. + */ + localoffset += 4; + break; + + default: + /* + * The NLPID isn't part of the PDU - skip it. + * If that means there's nothing to dissect + */ + localoffset++; + } + } + } else { + /* if there's no user data in the CALL REQUEST/ + INCOMING CALL packet, it's COTP; */ if (call_request_nodata_is_cotp){ x25_hash_add_proto_start(vc, pinfo->fd->num, ositp_handle); } - } - break; + } + break; case X25_CALL_ACCEPTED: switch (dir) { - case X25_FROM_DCE: - short_name = "Call conn."; - long_name = "Call connected"; - break; - - case X25_FROM_DTE: - short_name = "Call acc."; - long_name = "Call accepted"; - break; - - case X25_UNKNOWN: - short_name = "Call conn./Call acc."; - long_name = "Call connected/Call accepted"; - break; - } - col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d", short_name, vc); - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); - proto_tree_add_uint_format_value(x25_tree, hf_x25_type, tvb, 2, 1, - X25_CALL_ACCEPTED, "%s", long_name); - } - localoffset = 3; + case X25_FROM_DCE: + short_name = "Call conn."; + long_name = "Call connected"; + break; + + case X25_FROM_DTE: + short_name = "Call acc."; + long_name = "Call accepted"; + break; + + case X25_UNKNOWN: + short_name = "Call conn./Call acc."; + long_name = "Call connected/Call accepted"; + break; + } + col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d", short_name, vc); + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); + proto_tree_add_uint_format_value(x25_tree, hf_x25_type, tvb, 2, 1, + X25_CALL_ACCEPTED, "%s", long_name); + } + localoffset = 3; if (localoffset < x25_pkt_len) { /* calling/called addresses */ - if (toa) - x25_toa(x25_tree, (gint*)&localoffset, tvb, pinfo); - else - x25_ntoa(x25_tree, (gint*)&localoffset, tvb, pinfo, FALSE); - } - - if (localoffset < x25_pkt_len) /* facilities */ - dump_facilities(x25_tree, (gint*)&localoffset, tvb, pinfo); - break; + if (toa) + x25_toa(x25_tree, (gint*)&localoffset, tvb, pinfo); + else + x25_ntoa(x25_tree, (gint*)&localoffset, tvb, pinfo, FALSE); + } + + if (localoffset < x25_pkt_len) /* facilities */ + dump_facilities(x25_tree, (gint*)&localoffset, tvb, pinfo); + break; case X25_CLEAR_REQUEST: switch (dir) { - case X25_FROM_DCE: - short_name = "Clear ind."; - long_name = "Clear indication"; - break; - - case X25_FROM_DTE: - short_name = "Clear req."; - long_name = "Clear request"; - break; - - case X25_UNKNOWN: - short_name = "Clear ind./Clear req."; - long_name = "Clear indication/Clear request"; - break; - } - col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d %s - %s", short_name, - vc, clear_code(tvb_get_guint8(tvb, 3)), - val_to_str_ext(tvb_get_guint8(tvb, 4), &x25_clear_diag_vals_ext, "Unknown (0x%02x)")); - x25_hash_add_proto_end(vc, pinfo->fd->num); - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); - proto_tree_add_uint_format_value(x25_tree, hf_x25_type, tvb, - localoffset+2, 1, X25_CLEAR_REQUEST, "%s", - long_name); - proto_tree_add_text(x25_tree, tvb, 3, 1, - "Cause: %s", clear_code(tvb_get_guint8(tvb, 3))); - proto_tree_add_item(x25_tree, hf_x25_diagnostic, tvb, 4, 1, ENC_NA); - } - localoffset = x25_pkt_len; - break; + case X25_FROM_DCE: + short_name = "Clear ind."; + long_name = "Clear indication"; + break; + + case X25_FROM_DTE: + short_name = "Clear req."; + long_name = "Clear request"; + break; + + case X25_UNKNOWN: + short_name = "Clear ind./Clear req."; + long_name = "Clear indication/Clear request"; + break; + } + col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d %s - %s", short_name, + vc, clear_code(tvb_get_guint8(tvb, 3)), + val_to_str_ext(tvb_get_guint8(tvb, 4), &x25_clear_diag_vals_ext, "Unknown (0x%02x)")); + x25_hash_add_proto_end(vc, pinfo->fd->num); + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); + proto_tree_add_uint_format_value(x25_tree, hf_x25_type, tvb, + localoffset+2, 1, X25_CLEAR_REQUEST, "%s", + long_name); + proto_tree_add_text(x25_tree, tvb, 3, 1, + "Cause: %s", clear_code(tvb_get_guint8(tvb, 3))); + proto_tree_add_item(x25_tree, hf_x25_diagnostic, tvb, 4, 1, ENC_NA); + } + localoffset = x25_pkt_len; + break; case X25_CLEAR_CONFIRMATION: - col_add_fstr(pinfo->cinfo, COL_INFO, "Clear Conf. VC:%d", vc); - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); - proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, - X25_CLEAR_CONFIRMATION); - } - localoffset = x25_pkt_len; - - if (localoffset < tvb_reported_length(tvb)) { /* extended clear conf format */ - if (toa) - x25_toa(x25_tree, (gint*)&localoffset, tvb, pinfo); - else - x25_ntoa(x25_tree,(gint*)&localoffset, tvb, pinfo, FALSE); - } - - if (localoffset < tvb_reported_length(tvb)) /* facilities */ - dump_facilities(x25_tree, (gint*)&localoffset, tvb, pinfo); - break; + col_add_fstr(pinfo->cinfo, COL_INFO, "Clear Conf. VC:%d", vc); + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); + proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, + X25_CLEAR_CONFIRMATION); + } + localoffset = x25_pkt_len; + + if (localoffset < tvb_reported_length(tvb)) { /* extended clear conf format */ + if (toa) + x25_toa(x25_tree, (gint*)&localoffset, tvb, pinfo); + else + x25_ntoa(x25_tree,(gint*)&localoffset, tvb, pinfo, FALSE); + } + + if (localoffset < tvb_reported_length(tvb)) /* facilities */ + dump_facilities(x25_tree, (gint*)&localoffset, tvb, pinfo); + break; case X25_DIAGNOSTIC: - col_add_fstr(pinfo->cinfo, COL_INFO, "Diag. %d", - (int)tvb_get_guint8(tvb, 3)); - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, - X25_DIAGNOSTIC); - proto_tree_add_text(x25_tree, tvb, 3, 1, - "Diagnostic: %d", (int)tvb_get_guint8(tvb, 3)); - } - localoffset = x25_pkt_len; - break; + col_add_fstr(pinfo->cinfo, COL_INFO, "Diag. %d", + (int)tvb_get_guint8(tvb, 3)); + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, + X25_DIAGNOSTIC); + proto_tree_add_text(x25_tree, tvb, 3, 1, + "Diagnostic: %d", (int)tvb_get_guint8(tvb, 3)); + } + localoffset = x25_pkt_len; + break; case X25_INTERRUPT: - col_add_fstr(pinfo->cinfo, COL_INFO, "Interrupt VC:%d", vc); - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); - proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, - X25_INTERRUPT); - } - localoffset = x25_pkt_len; - break; + col_add_fstr(pinfo->cinfo, COL_INFO, "Interrupt VC:%d", vc); + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); + proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, + X25_INTERRUPT); + } + localoffset = x25_pkt_len; + break; case X25_INTERRUPT_CONFIRMATION: - col_add_fstr(pinfo->cinfo, COL_INFO, "Interrupt Conf. VC:%d", vc); - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); - proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, - X25_INTERRUPT_CONFIRMATION); - } - localoffset = x25_pkt_len; - break; + col_add_fstr(pinfo->cinfo, COL_INFO, "Interrupt Conf. VC:%d", vc); + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); + proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, + X25_INTERRUPT_CONFIRMATION); + } + localoffset = x25_pkt_len; + break; case X25_RESET_REQUEST: switch (dir) { - case X25_FROM_DCE: - short_name = "Reset ind."; - long_name = "Reset indication"; - break; - - case X25_FROM_DTE: - short_name = "Reset req."; - long_name = "Reset request"; - break; - - case X25_UNKNOWN: - short_name = "Reset ind./Reset req."; - long_name = "Reset indication/Reset request"; - break; - } - col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d %s - Diag.:%d", - short_name, vc, reset_code(tvb_get_guint8(tvb, 3)), - (int)tvb_get_guint8(tvb, 4)); - x25_hash_add_proto_end(vc, pinfo->fd->num); - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); - proto_tree_add_uint_format_value(x25_tree, hf_x25_type, tvb, 2, 1, - X25_RESET_REQUEST, "%s", long_name); - proto_tree_add_text(x25_tree, tvb, 3, 1, - "Cause: %s", reset_code(tvb_get_guint8(tvb, 3))); - proto_tree_add_text(x25_tree, tvb, 4, 1, - "Diagnostic: %d", (int)tvb_get_guint8(tvb, 4)); - } - localoffset = x25_pkt_len; - break; + case X25_FROM_DCE: + short_name = "Reset ind."; + long_name = "Reset indication"; + break; + + case X25_FROM_DTE: + short_name = "Reset req."; + long_name = "Reset request"; + break; + + case X25_UNKNOWN: + short_name = "Reset ind./Reset req."; + long_name = "Reset indication/Reset request"; + break; + } + col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d %s - Diag.:%d", + short_name, vc, reset_code(tvb_get_guint8(tvb, 3)), + (int)tvb_get_guint8(tvb, 4)); + x25_hash_add_proto_end(vc, pinfo->fd->num); + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); + proto_tree_add_uint_format_value(x25_tree, hf_x25_type, tvb, 2, 1, + X25_RESET_REQUEST, "%s", long_name); + proto_tree_add_text(x25_tree, tvb, 3, 1, + "Cause: %s", reset_code(tvb_get_guint8(tvb, 3))); + proto_tree_add_text(x25_tree, tvb, 4, 1, + "Diagnostic: %d", (int)tvb_get_guint8(tvb, 4)); + } + localoffset = x25_pkt_len; + break; case X25_RESET_CONFIRMATION: - col_add_fstr(pinfo->cinfo, COL_INFO, "Reset conf. VC:%d", vc); - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); - proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, - X25_RESET_CONFIRMATION); - } - localoffset = x25_pkt_len; - break; - case X25_RESTART_REQUEST: + col_add_fstr(pinfo->cinfo, COL_INFO, "Reset conf. VC:%d", vc); + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, 0, 2, bytes0_1); + proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, + X25_RESET_CONFIRMATION); + } + localoffset = x25_pkt_len; + break; + case X25_RESTART_REQUEST: switch (dir) { - case X25_FROM_DCE: - short_name = "Restart ind."; - long_name = "Restart indication"; - break; - - case X25_FROM_DTE: - short_name = "Restart req."; - long_name = "Restart request"; - break; - - case X25_UNKNOWN: - short_name = "Restart ind./Restart req."; - long_name = "Restart indication/Restart request"; - break; - } - col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s - Diag.:%d", - short_name, - restart_code(tvb_get_guint8(tvb, 3)), - (int)tvb_get_guint8(tvb, 4)); - if (x25_tree) { - proto_tree_add_uint_format_value(x25_tree, hf_x25_type, tvb, 2, 1, - X25_RESTART_REQUEST, "%s", long_name); - proto_tree_add_text(x25_tree, tvb, 3, 1, - "Cause: %s", restart_code(tvb_get_guint8(tvb, 3))); - proto_tree_add_text(x25_tree, tvb, 4, 1, - "Diagnostic: %d", (int)tvb_get_guint8(tvb, 4)); - } - localoffset = x25_pkt_len; - break; + case X25_FROM_DCE: + short_name = "Restart ind."; + long_name = "Restart indication"; + break; + + case X25_FROM_DTE: + short_name = "Restart req."; + long_name = "Restart request"; + break; + + case X25_UNKNOWN: + short_name = "Restart ind./Restart req."; + long_name = "Restart indication/Restart request"; + break; + } + col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s - Diag.:%d", + short_name, + restart_code(tvb_get_guint8(tvb, 3)), + (int)tvb_get_guint8(tvb, 4)); + if (x25_tree) { + proto_tree_add_uint_format_value(x25_tree, hf_x25_type, tvb, 2, 1, + X25_RESTART_REQUEST, "%s", long_name); + proto_tree_add_text(x25_tree, tvb, 3, 1, + "Cause: %s", restart_code(tvb_get_guint8(tvb, 3))); + proto_tree_add_text(x25_tree, tvb, 4, 1, + "Diagnostic: %d", (int)tvb_get_guint8(tvb, 4)); + } + localoffset = x25_pkt_len; + break; case X25_RESTART_CONFIRMATION: - col_set_str(pinfo->cinfo, COL_INFO, "Restart conf."); - if (x25_tree) - proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, - X25_RESTART_CONFIRMATION); - localoffset = x25_pkt_len; - break; + col_set_str(pinfo->cinfo, COL_INFO, "Restart conf."); + if (x25_tree) + proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, + X25_RESTART_CONFIRMATION); + localoffset = x25_pkt_len; + break; case X25_REGISTRATION_REQUEST: - col_set_str(pinfo->cinfo, COL_INFO, "Registration req."); - if (x25_tree) - proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, - X25_REGISTRATION_REQUEST); - localoffset = 3; - if (localoffset < x25_pkt_len) - x25_ntoa(x25_tree, (gint*)&localoffset, tvb, pinfo, TRUE); - - if (x25_tree) { - if (localoffset < x25_pkt_len) - proto_tree_add_item( x25_tree, hf_x25_reg_request_length, tvb, localoffset, 1, ENC_NA); - if (localoffset+1 < x25_pkt_len) - proto_tree_add_text(x25_tree, tvb, localoffset+1, - tvb_get_guint8(tvb, localoffset) & 0x7F, - "Registration"); - } - localoffset = tvb_reported_length(tvb); - break; + col_set_str(pinfo->cinfo, COL_INFO, "Registration req."); + if (x25_tree) + proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, + X25_REGISTRATION_REQUEST); + localoffset = 3; + if (localoffset < x25_pkt_len) + x25_ntoa(x25_tree, (gint*)&localoffset, tvb, pinfo, TRUE); + + if (x25_tree) { + if (localoffset < x25_pkt_len) + proto_tree_add_item( x25_tree, hf_x25_reg_request_length, tvb, localoffset, 1, ENC_NA); + if (localoffset+1 < x25_pkt_len) + proto_tree_add_text(x25_tree, tvb, localoffset+1, + tvb_get_guint8(tvb, localoffset) & 0x7F, + "Registration"); + } + localoffset = tvb_reported_length(tvb); + break; case X25_REGISTRATION_CONFIRMATION: - col_set_str(pinfo->cinfo, COL_INFO, "Registration conf."); - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, - X25_REGISTRATION_CONFIRMATION); - proto_tree_add_item(x25_tree, hf_x25_reg_confirm_cause, tvb, 3, 1, ENC_NA); - proto_tree_add_item(x25_tree, hf_x25_reg_confirm_diagnostic, tvb, 4, 1, ENC_NA); - } - localoffset = 5; - if (localoffset < x25_pkt_len) - x25_ntoa(x25_tree, (gint*)&localoffset, tvb, pinfo, TRUE); - - if (x25_tree) { - if (localoffset < x25_pkt_len) - proto_tree_add_item( x25_tree, hf_x25_reg_confirm_length, tvb, localoffset, 1, ENC_NA); - if (localoffset+1 < x25_pkt_len) - proto_tree_add_text(x25_tree, tvb, localoffset+1, - tvb_get_guint8(tvb, localoffset) & 0x7F, - "Registration"); - } - localoffset = tvb_reported_length(tvb); - break; + col_set_str(pinfo->cinfo, COL_INFO, "Registration conf."); + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_type, tvb, 2, 1, + X25_REGISTRATION_CONFIRMATION); + proto_tree_add_item(x25_tree, hf_x25_reg_confirm_cause, tvb, 3, 1, ENC_NA); + proto_tree_add_item(x25_tree, hf_x25_reg_confirm_diagnostic, tvb, 4, 1, ENC_NA); + } + localoffset = 5; + if (localoffset < x25_pkt_len) + x25_ntoa(x25_tree, (gint*)&localoffset, tvb, pinfo, TRUE); + + if (x25_tree) { + if (localoffset < x25_pkt_len) + proto_tree_add_item( x25_tree, hf_x25_reg_confirm_length, tvb, localoffset, 1, ENC_NA); + if (localoffset+1 < x25_pkt_len) + proto_tree_add_text(x25_tree, tvb, localoffset+1, + tvb_get_guint8(tvb, localoffset) & 0x7F, + "Registration"); + } + localoffset = tvb_reported_length(tvb); + break; default: - localoffset = 2; - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, localoffset-2, - 2, bytes0_1); - } - if (PACKET_IS_DATA(pkt_type)) { - if (modulo == 8) - col_add_fstr(pinfo->cinfo, COL_INFO, - "Data VC:%d P(S):%d P(R):%d %s", vc, - (pkt_type >> 1) & 0x07, - (pkt_type >> 5) & 0x07, - (pkt_type & X25_MBIT_MOD8) ? " M" : ""); - else - col_add_fstr(pinfo->cinfo, COL_INFO, - "Data VC:%d P(S):%d P(R):%d %s", vc, - tvb_get_guint8(tvb, localoffset+1) >> 1, - pkt_type >> 1, - (tvb_get_guint8(tvb, localoffset+1) & X25_MBIT_MOD128) ? " M" : ""); - if (x25_tree) { - if (modulo == 8) { - proto_tree_add_uint(x25_tree, hf_x25_p_r_mod8, tvb, - localoffset, 1, pkt_type); - proto_tree_add_boolean(x25_tree, hf_x25_mbit_mod8, tvb, - localoffset, 1, pkt_type); - proto_tree_add_uint(x25_tree, hf_x25_p_s_mod8, tvb, - localoffset, 1, pkt_type); - proto_tree_add_uint(x25_tree, hf_x25_type_data, tvb, - localoffset, 1, pkt_type); - } - else { - proto_tree_add_uint(x25_tree, hf_x25_p_r_mod128, tvb, - localoffset, 1, pkt_type); - proto_tree_add_uint(x25_tree, hf_x25_type_data, tvb, - localoffset, 1, pkt_type); - proto_tree_add_uint(x25_tree, hf_x25_p_s_mod128, tvb, - localoffset+1, 1, - tvb_get_guint8(tvb, localoffset+1)); - proto_tree_add_boolean(x25_tree, hf_x25_mbit_mod128, tvb, - localoffset+1, 1, - tvb_get_guint8(tvb, localoffset+1)); - } - } - if (modulo == 8) { - m_bit_set = pkt_type & X25_MBIT_MOD8; - localoffset += 1; - } else { - m_bit_set = tvb_get_guint8(tvb, localoffset+1) & X25_MBIT_MOD128; - localoffset += 2; - } - payload_len = tvb_reported_length_remaining(tvb, localoffset); - if (reassemble_x25) { - /* - * Reassemble received and sent traffic separately. - * We don't reassemble traffic with an unknown direction - * at all. - */ - frag_key = vc; - if (side) { - /* - * OR in an extra bit to distinguish from traffic - * in the other direction. - */ - frag_key |= 0x10000; - } - fd_head = fragment_add_seq_next(&x25_reassembly_table, - tvb, localoffset, - pinfo, frag_key, NULL, - payload_len, m_bit_set); - pinfo->fragmented = m_bit_set; + localoffset = 2; + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_lcn, tvb, localoffset-2, + 2, bytes0_1); + } + if (PACKET_IS_DATA(pkt_type)) { + if (modulo == 8) + col_add_fstr(pinfo->cinfo, COL_INFO, + "Data VC:%d P(S):%d P(R):%d %s", vc, + (pkt_type >> 1) & 0x07, + (pkt_type >> 5) & 0x07, + (pkt_type & X25_MBIT_MOD8) ? " M" : ""); + else + col_add_fstr(pinfo->cinfo, COL_INFO, + "Data VC:%d P(S):%d P(R):%d %s", vc, + tvb_get_guint8(tvb, localoffset+1) >> 1, + pkt_type >> 1, + (tvb_get_guint8(tvb, localoffset+1) & X25_MBIT_MOD128) ? " M" : ""); + if (x25_tree) { + if (modulo == 8) { + proto_tree_add_uint(x25_tree, hf_x25_p_r_mod8, tvb, + localoffset, 1, pkt_type); + proto_tree_add_boolean(x25_tree, hf_x25_mbit_mod8, tvb, + localoffset, 1, pkt_type); + proto_tree_add_uint(x25_tree, hf_x25_p_s_mod8, tvb, + localoffset, 1, pkt_type); + proto_tree_add_uint(x25_tree, hf_x25_type_data, tvb, + localoffset, 1, pkt_type); + } + else { + proto_tree_add_uint(x25_tree, hf_x25_p_r_mod128, tvb, + localoffset, 1, pkt_type); + proto_tree_add_uint(x25_tree, hf_x25_type_data, tvb, + localoffset, 1, pkt_type); + proto_tree_add_uint(x25_tree, hf_x25_p_s_mod128, tvb, + localoffset+1, 1, + tvb_get_guint8(tvb, localoffset+1)); + proto_tree_add_boolean(x25_tree, hf_x25_mbit_mod128, tvb, + localoffset+1, 1, + tvb_get_guint8(tvb, localoffset+1)); + } + } + if (modulo == 8) { + m_bit_set = pkt_type & X25_MBIT_MOD8; + localoffset += 1; + } else { + m_bit_set = tvb_get_guint8(tvb, localoffset+1) & X25_MBIT_MOD128; + localoffset += 2; + } + payload_len = tvb_reported_length_remaining(tvb, localoffset); + if (reassemble_x25) { + /* + * Reassemble received and sent traffic separately. + * We don't reassemble traffic with an unknown direction + * at all. + */ + frag_key = vc; + if (side) { + /* + * OR in an extra bit to distinguish from traffic + * in the other direction. + */ + frag_key |= 0x10000; + } + fd_head = fragment_add_seq_next(&x25_reassembly_table, + tvb, localoffset, + pinfo, frag_key, NULL, + payload_len, m_bit_set); + pinfo->fragmented = m_bit_set; /* Fragment handling is not adapted to handle several x25 * packets in the same frame. This is common with XOT and @@ -1952,62 +1952,62 @@ dissect_x25_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, * Therefore, fragment_add_seq_next seem to always return fd_head * A fix to use m_bit_set to only show fragments for last pkt */ - if (!m_bit_set && fd_head) { - if (fd_head->next) { - proto_item *frag_tree_item; + if (!m_bit_set && fd_head) { + if (fd_head->next) { + proto_item *frag_tree_item; - /* This is the last packet */ - next_tvb = tvb_new_chain(tvb, fd_head->tvb_data); - add_new_data_source(pinfo, next_tvb, "Reassembled X.25"); + /* This is the last packet */ + next_tvb = tvb_new_chain(tvb, fd_head->tvb_data); + add_new_data_source(pinfo, next_tvb, "Reassembled X.25"); if (x25_tree) { show_fragment_seq_tree(fd_head, &x25_frag_items, x25_tree, pinfo, next_tvb, &frag_tree_item); } - } - } - - if (m_bit_set && next_tvb == NULL) { - /* - * This isn't the last packet, so just - * show it as X.25 user data. - */ - proto_tree_add_text(x25_tree, tvb, localoffset, -1, - "User data (%u byte%s)", payload_len, - plurality(payload_len, "", "s")); - return; - } - } - } else { - /* - * Non-data packets (RR, RNR, REJ). - */ - if (modulo == 8) { - if (x25_tree) { - proto_tree_add_uint(x25_tree, hf_x25_p_r_mod8, tvb, - localoffset, 1, pkt_type); - proto_tree_add_item(x25_tree, hf_x25_type_fc_mod8, tvb, - localoffset, 1, ENC_NA); - } - col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d P(R):%d", - val_to_str(PACKET_TYPE_FC(pkt_type), vals_x25_type, "Unknown (0x%02X)"), - vc, (pkt_type >> 5) & 0x07); - localoffset += 1; - } else { - if (x25_tree) { - proto_tree_add_item(x25_tree, hf_x25_type, tvb, - localoffset, 1, ENC_NA); - proto_tree_add_item(x25_tree, hf_x25_p_r_mod128, tvb, - localoffset+1, 1, ENC_NA); - } - col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d P(R):%d", - val_to_str(PACKET_TYPE_FC(pkt_type), vals_x25_type, "Unknown (0x%02X)"), - vc, tvb_get_guint8(tvb, localoffset+1) >> 1); - localoffset += 2; - } - } - break; + } + } + + if (m_bit_set && next_tvb == NULL) { + /* + * This isn't the last packet, so just + * show it as X.25 user data. + */ + proto_tree_add_text(x25_tree, tvb, localoffset, -1, + "User data (%u byte%s)", payload_len, + plurality(payload_len, "", "s")); + return; + } + } + } else { + /* + * Non-data packets (RR, RNR, REJ). + */ + if (modulo == 8) { + if (x25_tree) { + proto_tree_add_uint(x25_tree, hf_x25_p_r_mod8, tvb, + localoffset, 1, pkt_type); + proto_tree_add_item(x25_tree, hf_x25_type_fc_mod8, tvb, + localoffset, 1, ENC_NA); + } + col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d P(R):%d", + val_to_str(PACKET_TYPE_FC(pkt_type), vals_x25_type, "Unknown (0x%02X)"), + vc, (pkt_type >> 5) & 0x07); + localoffset += 1; + } else { + if (x25_tree) { + proto_tree_add_item(x25_tree, hf_x25_type, tvb, + localoffset, 1, ENC_NA); + proto_tree_add_item(x25_tree, hf_x25_p_r_mod128, tvb, + localoffset+1, 1, ENC_NA); + } + col_add_fstr(pinfo->cinfo, COL_INFO, "%s VC:%d P(R):%d", + val_to_str(PACKET_TYPE_FC(pkt_type), vals_x25_type, "Unknown (0x%02X)"), + vc, tvb_get_guint8(tvb, localoffset+1) >> 1); + localoffset += 2; + } + } + break; } if (localoffset >= tvb_reported_length(tvb)) @@ -2020,17 +2020,17 @@ dissect_x25_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* See if there's already a dissector for this circuit. */ if (try_circuit_dissector(CT_X25, vc, pinfo->fd->num, next_tvb, pinfo, - tree, &q_bit_set)) { - return; /* found it and dissected it */ + tree, &q_bit_set)) { + return; /* found it and dissected it */ } /* Did the user suggest QLLC/SNA? */ if (payload_is_qllc_sna) { - /* Yes - dissect it as QLLC/SNA. */ - if (!pinfo->fd->flags.visited) - x25_hash_add_proto_start(vc, pinfo->fd->num, qllc_handle); - call_dissector_with_data(qllc_handle, next_tvb, pinfo, tree, &q_bit_set); - return; + /* Yes - dissect it as QLLC/SNA. */ + if (!pinfo->fd->flags.visited) + x25_hash_add_proto_start(vc, pinfo->fd->num, qllc_handle); + call_dissector_with_data(qllc_handle, next_tvb, pinfo, tree, &q_bit_set); + return; } if (payload_check_data){ @@ -2039,11 +2039,11 @@ dissect_x25_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, if (tvb_get_guint8(tvb, localoffset) == tvb_length(next_tvb)-1) { /* First byte contains the length of the remaining buffer */ if ((tvb_get_guint8(tvb, localoffset+1) & 0x0F) == 0) { - /* Second byte contains a valid COTP TPDU */ - if (!pinfo->fd->flags.visited) - x25_hash_add_proto_start(vc, pinfo->fd->num, ositp_handle); - call_dissector(ositp_handle, next_tvb, pinfo, tree); - return; + /* Second byte contains a valid COTP TPDU */ + if (!pinfo->fd->flags.visited) + x25_hash_add_proto_start(vc, pinfo->fd->num, ositp_handle); + call_dissector(ositp_handle, next_tvb, pinfo, tree); + return; } } @@ -2052,24 +2052,24 @@ dissect_x25_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, switch (tvb_get_guint8(tvb, localoffset)) { case 0x45: - /* Looks like an IP header */ - if (!pinfo->fd->flags.visited) - x25_hash_add_proto_start(vc, pinfo->fd->num, ip_handle); - call_dissector(ip_handle, next_tvb, pinfo, tree); - return; + /* Looks like an IP header */ + if (!pinfo->fd->flags.visited) + x25_hash_add_proto_start(vc, pinfo->fd->num, ip_handle); + call_dissector(ip_handle, next_tvb, pinfo, tree); + return; case NLPID_ISO8473_CLNP: - if (!pinfo->fd->flags.visited) - x25_hash_add_proto_start(vc, pinfo->fd->num, clnp_handle); - call_dissector(clnp_handle, next_tvb, pinfo, tree); - return; + if (!pinfo->fd->flags.visited) + x25_hash_add_proto_start(vc, pinfo->fd->num, clnp_handle); + call_dissector(clnp_handle, next_tvb, pinfo, tree); + return; } } /* Try the heuristic dissectors. */ if (dissector_try_heuristic(x25_heur_subdissector_list, next_tvb, pinfo, - tree, &hdtbl_entry, NULL)) { - return; + tree, &hdtbl_entry, NULL)) { + return; } /* All else failed; dissect it as raw data */ @@ -2084,9 +2084,9 @@ static void dissect_x25_dir(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { dissect_x25_common(tvb, pinfo, tree, - (pinfo->pseudo_header->x25.flags & FROM_DCE) ? X25_FROM_DCE : - X25_FROM_DTE, - pinfo->pseudo_header->x25.flags & FROM_DCE); + (pinfo->pseudo_header->x25.flags & FROM_DCE) ? X25_FROM_DCE : + X25_FROM_DTE, + pinfo->pseudo_header->x25.flags & FROM_DCE); } /* @@ -2106,311 +2106,311 @@ dissect_x25(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) */ direction = CMP_ADDRESS(&pinfo->src, &pinfo->dst); if (direction == 0) - direction = (pinfo->srcport > pinfo->destport)*2 - 1; + direction = (pinfo->srcport > pinfo->destport)*2 - 1; dissect_x25_common(tvb, pinfo, tree, X25_UNKNOWN, direction > 0); } static void x25_reassemble_init(void) { - reassembly_table_init(&x25_reassembly_table, - &addresses_reassembly_table_functions); + reassembly_table_init(&x25_reassembly_table, + &addresses_reassembly_table_functions); } void proto_register_x25(void) { static hf_register_info hf[] = { - { &hf_x25_facility, - { "Facility", "x25.facility", FT_NONE, BASE_NONE, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facilities_length, - { "Facilities Length", "x25.facilities_length", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_length, - { "Length", "x25.facility_length", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_class, - { "Facility Class", "x25.facility.class", FT_UINT8, BASE_HEX, VALS(x25_facilities_class_vals), X25_FAC_CLASS_MASK, - NULL, HFILL }}, - { &hf_x25_facility_classA, - { "Code", "x25.facility.classA", FT_UINT8, BASE_HEX, VALS(x25_facilities_classA_vals), 0, - "Facility ClassA Code", HFILL }}, - { &hf_x25_facility_classA_comp_mark, - { "Parameter", "x25.facility.comp_mark", FT_UINT8, BASE_DEC, VALS(x25_facilities_classA_comp_mark_vals), 0, - "Facility Marker Parameter", HFILL }}, - { &hf_x25_facility_classA_reverse, - { "Parameter", "x25.facility.reverse", FT_UINT8, BASE_HEX, NULL, 0, - "Facility Reverse Charging Parameter", HFILL }}, - { &hf_x25_facility_classA_charging_info, - { "Parameter", "x25.facility.charging_info", FT_UINT8, BASE_HEX, NULL, 0, - "Facility Charging Information Parameter", HFILL }}, - { &hf_x25_facility_reverse_charging, - { "Reverse charging", "x25.reverse_charging", FT_BOOLEAN, 8, TFS(&x25_reverse_charging_val), 0x01, - NULL, HFILL }}, - { &hf_x25_facility_charging_info, - { "Charging information", "x25.charging_info", FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x01, - NULL, HFILL }}, - { &hf_x25_facility_throughput_called_dte, - { "From the called DTE", "x25.facility.throughput.called_dte", FT_UINT8, BASE_DEC, VALS(x25_facilities_classA_throughput_vals), 0xF0, - "Facility Throughput called DTE", HFILL }}, - { &hf_x25_throughput_called_dte, - { "From the calling DTE", "x25.facility.throughput.called_dte", FT_UINT8, BASE_DEC, VALS(x25_facilities_classA_throughput_vals), 0x0F, - "Facility Throughput called DTE", HFILL }}, - { &hf_x25_facility_classA_cug, - { "Closed user group", "x25.facility.cug", FT_UINT8, BASE_HEX, NULL, 0, - "Facility Closed user group", HFILL }}, - { &hf_x25_facility_classA_called_motif, - { "Parameter", "x25.facility.called_motif", FT_UINT8, BASE_HEX, NULL, 0, - "Facility Called address modified parameter", HFILL }}, - { &hf_x25_facility_classA_cug_outgoing_acc, - { "Closed user group", "x25.facility.cug_outgoing_acc", FT_UINT8, BASE_HEX, NULL, 0, - "Facility Closed user group with outgoing access selection", HFILL }}, - { &hf_x25_facility_classA_throughput_min, - { "Parameter", "x25.facility.throughput_min", FT_UINT8, BASE_HEX, NULL, 0, - "Facility Minimum throughput class parameter", HFILL }}, - { &hf_x25_facility_classA_express_data, - { "Parameter", "x25.facility.express_data", FT_UINT8, BASE_HEX, NULL, 0, - "Facility Negotiation of express data parameter", HFILL }}, - { &hf_x25_facility_classA_unknown, - { "Parameter", "x25.facility.classA_unknown", FT_UINT8, BASE_HEX, NULL, 0, - "Facility Class A unknown parameter", HFILL }}, - { &hf_x25_facility_classB, - { "Code", "x25.facility.classB", FT_UINT8, BASE_HEX, VALS(x25_facilities_classB_vals), 0, - "Facility ClassB Code", HFILL }}, - { &hf_x25_facility_classB_bilateral_cug, - { "Bilateral CUG", "x25.facility.bilateral_cug", FT_UINT16, BASE_HEX, NULL, 0, - "Facility Bilateral CUG", HFILL }}, - { &hf_x25_facility_packet_size_called_dte, - { "From the called DTE", "x25.facility.packet_size.called_dte", FT_UINT8, BASE_DEC, VALS(x25_facilities_classB_packet_size_vals), 0, - "Facility Packet size from the called DTE", HFILL }}, - { &hf_x25_facility_packet_size_calling_dte, - { "From the calling DTE", "x25.facility.packet_size.calling_dte", FT_UINT8, BASE_DEC, VALS(x25_facilities_classB_packet_size_vals), 0, - "Facility Packet size from the calling DTE", HFILL }}, - { &hf_x25_facility_data_network_id_code, - { "Data network identification code", "x25.facility.data_network_id_code", FT_UINT16, BASE_HEX, NULL, 0, - "Facility RPOA selection data network identification code", HFILL }}, - { &hf_x25_facility_cug_ext, - { "Closed user group", "x25.facility.cug_ext", FT_UINT16, BASE_HEX, NULL, 0, - "Facility Extended closed user group selection", HFILL }}, - { &hf_x25_facility_cug_outgoing_acc_ext, - { "Closed user group", "x25.facility.cug_outgoing_acc_ext", FT_UINT16, BASE_HEX, NULL, 0, - "Facility Extended closed user group with outgoing access selection", HFILL }}, - { &hf_x25_facility_transit_delay, - { "Transit delay (ms)", "x25.facility.transit_delay", FT_UINT16, BASE_DEC, NULL, 0, - "Facility Transit delay selection and indication", HFILL }}, - { &hf_x25_facility_classB_unknown, - { "Parameter", "x25.facility.classB_unknown", FT_UINT16, BASE_HEX, NULL, 0, - "Facility Class B unknown parameter", HFILL }}, - { &hf_x25_facility_classC_unknown, - { "Parameter", "x25.facility.classC_unknown", FT_UINT24, BASE_HEX, NULL, 0, - "Facility Class C unknown parameter", HFILL }}, - { &hf_x25_facility_classC, - { "Code", "x25.facility.classC", FT_UINT8, BASE_HEX, VALS(x25_facilities_classC_vals), 0, - "Facility ClassC Code", HFILL }}, - { &hf_x25_facility_classD, - { "Code", "x25.facility.classD", FT_UINT8, BASE_HEX, VALS(x25_facilities_classD_vals), 0, - "Facility ClassD Code", HFILL }}, - { &hf_x25_gfi, - { "GFI", "x25.gfi", FT_UINT16, BASE_DEC, NULL, 0xF000, - "General format identifier", HFILL }}, - { &hf_x25_abit, - { "A Bit", "x25.a", FT_BOOLEAN, 16, NULL, X25_ABIT, - "Address Bit", HFILL }}, - { &hf_x25_qbit, - { "Q Bit", "x25.q", FT_BOOLEAN, 16, NULL, X25_QBIT, - "Qualifier Bit", HFILL }}, - { &hf_x25_dbit, - { "D Bit", "x25.d", FT_BOOLEAN, 16, NULL, X25_DBIT, - "Delivery Confirmation Bit", HFILL }}, - { &hf_x25_mod, - { "Modulo", "x25.mod", FT_UINT16, BASE_DEC, VALS(vals_modulo), 0x3000, - "Specifies whether the frame is modulo 8 or 128", HFILL }}, - { &hf_x25_lcn, - { "Logical Channel", "x25.lcn", FT_UINT16, BASE_DEC, NULL, 0x0FFF, - "Logical Channel Number", HFILL }}, - { &hf_x25_type, - { "Packet Type", "x25.type", FT_UINT8, BASE_HEX, VALS(vals_x25_type), 0x0, - NULL, HFILL }}, - { &hf_x25_type_fc_mod8, - { "Packet Type", "x25.type", FT_UINT8, BASE_HEX, VALS(vals_x25_type), 0x1F, - NULL, HFILL }}, - { &hf_x25_type_data, - { "Packet Type", "x25.type", FT_UINT8, BASE_HEX, VALS(vals_x25_type), 0x01, - NULL, HFILL }}, - { &hf_x25_diagnostic, - { "Diagnostic", "x25.diagnostic", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &x25_clear_diag_vals_ext, 0, - NULL, HFILL }}, - { &hf_x25_p_r_mod8, - { "P(R)", "x25.p_r", FT_UINT8, BASE_DEC, NULL, 0xE0, - "Packet Receive Sequence Number", HFILL }}, - { &hf_x25_p_r_mod128, - { "P(R)", "x25.p_r", FT_UINT8, BASE_DEC, NULL, 0xFE, - "Packet Receive Sequence Number", HFILL }}, - { &hf_x25_mbit_mod8, - { "M Bit", "x25.m", FT_BOOLEAN, 8, TFS(&m_bit_tfs), X25_MBIT_MOD8, - "More Bit", HFILL }}, - { &hf_x25_mbit_mod128, - { "M Bit", "x25.m", FT_BOOLEAN, 8, TFS(&m_bit_tfs), X25_MBIT_MOD128, - "More Bit", HFILL }}, - { &hf_x25_p_s_mod8, - { "P(S)", "x25.p_s", FT_UINT8, BASE_DEC, NULL, 0x0E, - "Packet Send Sequence Number", HFILL }}, - { &hf_x25_p_s_mod128, - { "P(S)", "x25.p_s", FT_UINT8, BASE_DEC, NULL, 0xFE, - "Packet Send Sequence Number", HFILL }}, - { &hf_x25_window_size_called_dte, - { "From the called DTE", "x25.window_size.called_dte", FT_UINT8, BASE_DEC, NULL, 0x7F, - NULL, HFILL }}, - { &hf_x25_window_size_calling_dte, - { "From the calling DTE", "x25.window_size.calling_dte", FT_UINT8, BASE_DEC, NULL, 0x7F, - NULL, HFILL }}, - { &hf_x25_dte_address_length, - { "DTE address length", "x25.dte_address_length", FT_UINT8, BASE_DEC, NULL, 0xF0, - NULL, HFILL }}, - { &hf_x25_dce_address_length, - { "DCE address length", "x25.dce_address_length", FT_UINT8, BASE_DEC, NULL, 0x0F, - NULL, HFILL }}, - { &hf_x25_calling_address_length, - { "Calling address length", "x25.calling_address_length", FT_UINT8, BASE_DEC, NULL, 0xF0, - NULL, HFILL }}, - { &hf_x25_called_address_length, - { "Called address length", "x25.called_address_length", FT_UINT8, BASE_DEC, NULL, 0x0F, - NULL, HFILL }}, - { &hf_x25_facility_call_transfer_reason, - { "Reason", "x25.facility.call_transfer_reason", FT_UINT8, BASE_DEC, VALS(x25_facilities_call_transfer_reason_vals), 0, - NULL, HFILL }}, - { &hf_x25_facility_monetary_unit, - { "Monetary unit", "x25.facility.monetary_unit", FT_BYTES, BASE_NONE, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_nui, - { "NUI", "x25.facility.nui", FT_BYTES, BASE_NONE, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_cumulative_ete_transit_delay, - { "Cumulative end-to-end transit delay (ms)", "x25.facility.cumulative_ete_transit_delay", FT_UINT16, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_requested_ete_transit_delay, - { "Requested end-to-end transit delay (ms)", "x25.facility.requested_ete_transit_delay", FT_UINT16, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_max_acceptable_ete_transit_delay, - { "Maximum acceptable end-to-end transit delay (ms)", "x25.facility.mac_acceptable_ete_transit_delay", FT_UINT16, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_priority_data, - { "Priority for data", "x25.facility.priority_data", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_priority_estab_conn, - { "Priority for establishing connection", "x25.facility.priority_estab_conn", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_priority_keep_conn, - { "Priority for keeping connection", "x25.facility.priority_keep_conn", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_min_acceptable_priority_data, - { "Minimum acceptable priority for data", "x25.facility.min_acceptable_priority_data", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_min_acceptable_priority_estab_conn, - { "Minimum acceptable priority for establishing connection", "x25.facility.min_acceptable_priority_estab_conn", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_min_acceptable_priority_keep_conn, - { "Minimum acceptable priority for keeping connection", "x25.facility.min_acceptable_priority_keep_conn", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_classD_unknown, - { "Parameter", "x25.facility.classD_unknown", FT_BYTES, BASE_NONE, NULL, 0, - "Facility Class D unknown parameter", HFILL }}, - { &hf_x25_facility_call_transfer_num_semi_octets, - { "Number of semi-octets in DTE address", "x25.facility.call_transfer_num_semi_octets", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_calling_addr_ext_num_semi_octets, - { "Number of semi-octets in DTE address", "x25.facility.calling_addr_ext_num_semi_octets", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_called_addr_ext_num_semi_octets, - { "Number of semi-octets in DTE address", "x25.facility.called_addr_ext_num_semi_octets", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x25_facility_call_deflect_num_semi_octets, - { "Number of semi-octets in the alternative DTE address", "x25.facility.call_deflect_num_semi_octets", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x264_length_indicator, - { "X.264 length indicator", "x25.x264_length_indicator", FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_x264_un_tpdu_id, - { "X.264 UN TPDU identifier", "x25.x264_un_tpdu_id", FT_UINT8, BASE_HEX, NULL, 0, - NULL, HFILL }}, - { &hf_x264_protocol_id, - { "X.264 protocol identifier", "x25.x264_protocol_id", FT_UINT8, BASE_HEX, VALS(prt_id_vals), 0, - NULL, HFILL }}, - { &hf_x264_sharing_strategy, - { "X.264 sharing strategy", "x25.x264_sharing_strategy", FT_UINT8, BASE_HEX, VALS(sharing_strategy_vals), 0, - NULL, HFILL }}, - { &hf_x263_sec_protocol_id, - { "X.263 secondary protocol ID", "x25.x263_sec_protocol_id", FT_UINT8, BASE_HEX, VALS(nlpid_vals), 0, - NULL, HFILL }}, - { &hf_x25_reg_request_length, - { "Registration length", "x25.reg_request_length", FT_UINT8, BASE_DEC, NULL, 0x7F, - NULL, HFILL }}, - { &hf_x25_reg_confirm_length, - { "Registration length", "x25.reg_confirm_length", FT_UINT8, BASE_DEC, NULL, 0x7F, - NULL, HFILL }}, - - { &hf_x25_segment_overlap, - { "Fragment overlap", "x25.fragment.overlap", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Fragment overlaps with other fragments", HFILL }}, - - { &hf_x25_segment_overlap_conflict, - { "Conflicting data in fragment overlap", "x25.fragment.overlap.conflict", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Overlapping fragments contained conflicting data", HFILL }}, - - { &hf_x25_segment_multiple_tails, - { "Multiple tail fragments found", "x25.fragment.multipletails", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Several tails were found when defragmenting the packet", HFILL }}, - - { &hf_x25_segment_too_long_segment, - { "Fragment too long", "x25.fragment.toolongfragment", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Fragment contained data past end of packet", HFILL }}, - - { &hf_x25_segment_error, - { "Defragmentation error", "x25.fragment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x0, - "Defragmentation error due to illegal fragments", HFILL }}, - - { &hf_x25_segment_count, - { "Fragment count", "x25.fragment.count", FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, HFILL }}, - - { &hf_x25_reassembled_length, - { "Reassembled X.25 length", "x25.reassembled.length", FT_UINT32, BASE_DEC, NULL, 0x0, - "The total length of the reassembled payload", HFILL }}, - - { &hf_x25_segment, - { "X.25 Fragment", "x25.fragment", FT_FRAMENUM, BASE_NONE, NULL, 0x0, - "X25 Fragment", HFILL }}, - - { &hf_x25_segments, - { "X.25 Fragments", "x25.fragments", FT_NONE, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, - - { &hf_x25_fast_select, - { "Fast select", "x25.fast_select", FT_UINT8, BASE_DEC, VALS(x25_fast_select_vals), 0xC0, - NULL, HFILL }}, - - { &hf_x25_icrd, - { "ICRD", "x25.icrd", FT_UINT8, BASE_DEC, VALS(x25_icrd_vals), 0x30, - NULL, HFILL }}, - - { &hf_x25_reg_confirm_cause, - { "Cause", "x25.reg_confirm.cause", FT_UINT8, BASE_DEC, VALS(x25_registration_code_vals), 0, - NULL, HFILL }}, - - { &hf_x25_reg_confirm_diagnostic, - { "Diagnostic", "x25.reg_confirm.diagnostic", FT_UINT8, BASE_DEC, VALS(x25_registration_code_vals), 0, - NULL, HFILL }}, + { &hf_x25_facility, + { "Facility", "x25.facility", FT_NONE, BASE_NONE, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facilities_length, + { "Facilities Length", "x25.facilities_length", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_length, + { "Length", "x25.facility_length", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_class, + { "Facility Class", "x25.facility.class", FT_UINT8, BASE_HEX, VALS(x25_facilities_class_vals), X25_FAC_CLASS_MASK, + NULL, HFILL }}, + { &hf_x25_facility_classA, + { "Code", "x25.facility.classA", FT_UINT8, BASE_HEX, VALS(x25_facilities_classA_vals), 0, + "Facility ClassA Code", HFILL }}, + { &hf_x25_facility_classA_comp_mark, + { "Parameter", "x25.facility.comp_mark", FT_UINT8, BASE_DEC, VALS(x25_facilities_classA_comp_mark_vals), 0, + "Facility Marker Parameter", HFILL }}, + { &hf_x25_facility_classA_reverse, + { "Parameter", "x25.facility.reverse", FT_UINT8, BASE_HEX, NULL, 0, + "Facility Reverse Charging Parameter", HFILL }}, + { &hf_x25_facility_classA_charging_info, + { "Parameter", "x25.facility.charging_info", FT_UINT8, BASE_HEX, NULL, 0, + "Facility Charging Information Parameter", HFILL }}, + { &hf_x25_facility_reverse_charging, + { "Reverse charging", "x25.reverse_charging", FT_BOOLEAN, 8, TFS(&x25_reverse_charging_val), 0x01, + NULL, HFILL }}, + { &hf_x25_facility_charging_info, + { "Charging information", "x25.charging_info", FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x01, + NULL, HFILL }}, + { &hf_x25_facility_throughput_called_dte, + { "From the called DTE", "x25.facility.throughput.called_dte", FT_UINT8, BASE_DEC, VALS(x25_facilities_classA_throughput_vals), 0xF0, + "Facility Throughput called DTE", HFILL }}, + { &hf_x25_throughput_called_dte, + { "From the calling DTE", "x25.facility.throughput.called_dte", FT_UINT8, BASE_DEC, VALS(x25_facilities_classA_throughput_vals), 0x0F, + "Facility Throughput called DTE", HFILL }}, + { &hf_x25_facility_classA_cug, + { "Closed user group", "x25.facility.cug", FT_UINT8, BASE_HEX, NULL, 0, + "Facility Closed user group", HFILL }}, + { &hf_x25_facility_classA_called_motif, + { "Parameter", "x25.facility.called_motif", FT_UINT8, BASE_HEX, NULL, 0, + "Facility Called address modified parameter", HFILL }}, + { &hf_x25_facility_classA_cug_outgoing_acc, + { "Closed user group", "x25.facility.cug_outgoing_acc", FT_UINT8, BASE_HEX, NULL, 0, + "Facility Closed user group with outgoing access selection", HFILL }}, + { &hf_x25_facility_classA_throughput_min, + { "Parameter", "x25.facility.throughput_min", FT_UINT8, BASE_HEX, NULL, 0, + "Facility Minimum throughput class parameter", HFILL }}, + { &hf_x25_facility_classA_express_data, + { "Parameter", "x25.facility.express_data", FT_UINT8, BASE_HEX, NULL, 0, + "Facility Negotiation of express data parameter", HFILL }}, + { &hf_x25_facility_classA_unknown, + { "Parameter", "x25.facility.classA_unknown", FT_UINT8, BASE_HEX, NULL, 0, + "Facility Class A unknown parameter", HFILL }}, + { &hf_x25_facility_classB, + { "Code", "x25.facility.classB", FT_UINT8, BASE_HEX, VALS(x25_facilities_classB_vals), 0, + "Facility ClassB Code", HFILL }}, + { &hf_x25_facility_classB_bilateral_cug, + { "Bilateral CUG", "x25.facility.bilateral_cug", FT_UINT16, BASE_HEX, NULL, 0, + "Facility Bilateral CUG", HFILL }}, + { &hf_x25_facility_packet_size_called_dte, + { "From the called DTE", "x25.facility.packet_size.called_dte", FT_UINT8, BASE_DEC, VALS(x25_facilities_classB_packet_size_vals), 0, + "Facility Packet size from the called DTE", HFILL }}, + { &hf_x25_facility_packet_size_calling_dte, + { "From the calling DTE", "x25.facility.packet_size.calling_dte", FT_UINT8, BASE_DEC, VALS(x25_facilities_classB_packet_size_vals), 0, + "Facility Packet size from the calling DTE", HFILL }}, + { &hf_x25_facility_data_network_id_code, + { "Data network identification code", "x25.facility.data_network_id_code", FT_UINT16, BASE_HEX, NULL, 0, + "Facility RPOA selection data network identification code", HFILL }}, + { &hf_x25_facility_cug_ext, + { "Closed user group", "x25.facility.cug_ext", FT_UINT16, BASE_HEX, NULL, 0, + "Facility Extended closed user group selection", HFILL }}, + { &hf_x25_facility_cug_outgoing_acc_ext, + { "Closed user group", "x25.facility.cug_outgoing_acc_ext", FT_UINT16, BASE_HEX, NULL, 0, + "Facility Extended closed user group with outgoing access selection", HFILL }}, + { &hf_x25_facility_transit_delay, + { "Transit delay (ms)", "x25.facility.transit_delay", FT_UINT16, BASE_DEC, NULL, 0, + "Facility Transit delay selection and indication", HFILL }}, + { &hf_x25_facility_classB_unknown, + { "Parameter", "x25.facility.classB_unknown", FT_UINT16, BASE_HEX, NULL, 0, + "Facility Class B unknown parameter", HFILL }}, + { &hf_x25_facility_classC_unknown, + { "Parameter", "x25.facility.classC_unknown", FT_UINT24, BASE_HEX, NULL, 0, + "Facility Class C unknown parameter", HFILL }}, + { &hf_x25_facility_classC, + { "Code", "x25.facility.classC", FT_UINT8, BASE_HEX, VALS(x25_facilities_classC_vals), 0, + "Facility ClassC Code", HFILL }}, + { &hf_x25_facility_classD, + { "Code", "x25.facility.classD", FT_UINT8, BASE_HEX, VALS(x25_facilities_classD_vals), 0, + "Facility ClassD Code", HFILL }}, + { &hf_x25_gfi, + { "GFI", "x25.gfi", FT_UINT16, BASE_DEC, NULL, 0xF000, + "General format identifier", HFILL }}, + { &hf_x25_abit, + { "A Bit", "x25.a", FT_BOOLEAN, 16, NULL, X25_ABIT, + "Address Bit", HFILL }}, + { &hf_x25_qbit, + { "Q Bit", "x25.q", FT_BOOLEAN, 16, NULL, X25_QBIT, + "Qualifier Bit", HFILL }}, + { &hf_x25_dbit, + { "D Bit", "x25.d", FT_BOOLEAN, 16, NULL, X25_DBIT, + "Delivery Confirmation Bit", HFILL }}, + { &hf_x25_mod, + { "Modulo", "x25.mod", FT_UINT16, BASE_DEC, VALS(vals_modulo), 0x3000, + "Specifies whether the frame is modulo 8 or 128", HFILL }}, + { &hf_x25_lcn, + { "Logical Channel", "x25.lcn", FT_UINT16, BASE_DEC, NULL, 0x0FFF, + "Logical Channel Number", HFILL }}, + { &hf_x25_type, + { "Packet Type", "x25.type", FT_UINT8, BASE_HEX, VALS(vals_x25_type), 0x0, + NULL, HFILL }}, + { &hf_x25_type_fc_mod8, + { "Packet Type", "x25.type", FT_UINT8, BASE_HEX, VALS(vals_x25_type), 0x1F, + NULL, HFILL }}, + { &hf_x25_type_data, + { "Packet Type", "x25.type", FT_UINT8, BASE_HEX, VALS(vals_x25_type), 0x01, + NULL, HFILL }}, + { &hf_x25_diagnostic, + { "Diagnostic", "x25.diagnostic", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &x25_clear_diag_vals_ext, 0, + NULL, HFILL }}, + { &hf_x25_p_r_mod8, + { "P(R)", "x25.p_r", FT_UINT8, BASE_DEC, NULL, 0xE0, + "Packet Receive Sequence Number", HFILL }}, + { &hf_x25_p_r_mod128, + { "P(R)", "x25.p_r", FT_UINT8, BASE_DEC, NULL, 0xFE, + "Packet Receive Sequence Number", HFILL }}, + { &hf_x25_mbit_mod8, + { "M Bit", "x25.m", FT_BOOLEAN, 8, TFS(&m_bit_tfs), X25_MBIT_MOD8, + "More Bit", HFILL }}, + { &hf_x25_mbit_mod128, + { "M Bit", "x25.m", FT_BOOLEAN, 8, TFS(&m_bit_tfs), X25_MBIT_MOD128, + "More Bit", HFILL }}, + { &hf_x25_p_s_mod8, + { "P(S)", "x25.p_s", FT_UINT8, BASE_DEC, NULL, 0x0E, + "Packet Send Sequence Number", HFILL }}, + { &hf_x25_p_s_mod128, + { "P(S)", "x25.p_s", FT_UINT8, BASE_DEC, NULL, 0xFE, + "Packet Send Sequence Number", HFILL }}, + { &hf_x25_window_size_called_dte, + { "From the called DTE", "x25.window_size.called_dte", FT_UINT8, BASE_DEC, NULL, 0x7F, + NULL, HFILL }}, + { &hf_x25_window_size_calling_dte, + { "From the calling DTE", "x25.window_size.calling_dte", FT_UINT8, BASE_DEC, NULL, 0x7F, + NULL, HFILL }}, + { &hf_x25_dte_address_length, + { "DTE address length", "x25.dte_address_length", FT_UINT8, BASE_DEC, NULL, 0xF0, + NULL, HFILL }}, + { &hf_x25_dce_address_length, + { "DCE address length", "x25.dce_address_length", FT_UINT8, BASE_DEC, NULL, 0x0F, + NULL, HFILL }}, + { &hf_x25_calling_address_length, + { "Calling address length", "x25.calling_address_length", FT_UINT8, BASE_DEC, NULL, 0xF0, + NULL, HFILL }}, + { &hf_x25_called_address_length, + { "Called address length", "x25.called_address_length", FT_UINT8, BASE_DEC, NULL, 0x0F, + NULL, HFILL }}, + { &hf_x25_facility_call_transfer_reason, + { "Reason", "x25.facility.call_transfer_reason", FT_UINT8, BASE_DEC, VALS(x25_facilities_call_transfer_reason_vals), 0, + NULL, HFILL }}, + { &hf_x25_facility_monetary_unit, + { "Monetary unit", "x25.facility.monetary_unit", FT_BYTES, BASE_NONE, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_nui, + { "NUI", "x25.facility.nui", FT_BYTES, BASE_NONE, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_cumulative_ete_transit_delay, + { "Cumulative end-to-end transit delay (ms)", "x25.facility.cumulative_ete_transit_delay", FT_UINT16, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_requested_ete_transit_delay, + { "Requested end-to-end transit delay (ms)", "x25.facility.requested_ete_transit_delay", FT_UINT16, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_max_acceptable_ete_transit_delay, + { "Maximum acceptable end-to-end transit delay (ms)", "x25.facility.mac_acceptable_ete_transit_delay", FT_UINT16, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_priority_data, + { "Priority for data", "x25.facility.priority_data", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_priority_estab_conn, + { "Priority for establishing connection", "x25.facility.priority_estab_conn", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_priority_keep_conn, + { "Priority for keeping connection", "x25.facility.priority_keep_conn", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_min_acceptable_priority_data, + { "Minimum acceptable priority for data", "x25.facility.min_acceptable_priority_data", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_min_acceptable_priority_estab_conn, + { "Minimum acceptable priority for establishing connection", "x25.facility.min_acceptable_priority_estab_conn", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_min_acceptable_priority_keep_conn, + { "Minimum acceptable priority for keeping connection", "x25.facility.min_acceptable_priority_keep_conn", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_classD_unknown, + { "Parameter", "x25.facility.classD_unknown", FT_BYTES, BASE_NONE, NULL, 0, + "Facility Class D unknown parameter", HFILL }}, + { &hf_x25_facility_call_transfer_num_semi_octets, + { "Number of semi-octets in DTE address", "x25.facility.call_transfer_num_semi_octets", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_calling_addr_ext_num_semi_octets, + { "Number of semi-octets in DTE address", "x25.facility.calling_addr_ext_num_semi_octets", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_called_addr_ext_num_semi_octets, + { "Number of semi-octets in DTE address", "x25.facility.called_addr_ext_num_semi_octets", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x25_facility_call_deflect_num_semi_octets, + { "Number of semi-octets in the alternative DTE address", "x25.facility.call_deflect_num_semi_octets", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x264_length_indicator, + { "X.264 length indicator", "x25.x264_length_indicator", FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_x264_un_tpdu_id, + { "X.264 UN TPDU identifier", "x25.x264_un_tpdu_id", FT_UINT8, BASE_HEX, NULL, 0, + NULL, HFILL }}, + { &hf_x264_protocol_id, + { "X.264 protocol identifier", "x25.x264_protocol_id", FT_UINT8, BASE_HEX, VALS(prt_id_vals), 0, + NULL, HFILL }}, + { &hf_x264_sharing_strategy, + { "X.264 sharing strategy", "x25.x264_sharing_strategy", FT_UINT8, BASE_HEX, VALS(sharing_strategy_vals), 0, + NULL, HFILL }}, + { &hf_x263_sec_protocol_id, + { "X.263 secondary protocol ID", "x25.x263_sec_protocol_id", FT_UINT8, BASE_HEX, VALS(nlpid_vals), 0, + NULL, HFILL }}, + { &hf_x25_reg_request_length, + { "Registration length", "x25.reg_request_length", FT_UINT8, BASE_DEC, NULL, 0x7F, + NULL, HFILL }}, + { &hf_x25_reg_confirm_length, + { "Registration length", "x25.reg_confirm_length", FT_UINT8, BASE_DEC, NULL, 0x7F, + NULL, HFILL }}, + + { &hf_x25_segment_overlap, + { "Fragment overlap", "x25.fragment.overlap", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + "Fragment overlaps with other fragments", HFILL }}, + + { &hf_x25_segment_overlap_conflict, + { "Conflicting data in fragment overlap", "x25.fragment.overlap.conflict", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + "Overlapping fragments contained conflicting data", HFILL }}, + + { &hf_x25_segment_multiple_tails, + { "Multiple tail fragments found", "x25.fragment.multipletails", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + "Several tails were found when defragmenting the packet", HFILL }}, + + { &hf_x25_segment_too_long_segment, + { "Fragment too long", "x25.fragment.toolongfragment", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + "Fragment contained data past end of packet", HFILL }}, + + { &hf_x25_segment_error, + { "Defragmentation error", "x25.fragment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x0, + "Defragmentation error due to illegal fragments", HFILL }}, + + { &hf_x25_segment_count, + { "Fragment count", "x25.fragment.count", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + { &hf_x25_reassembled_length, + { "Reassembled X.25 length", "x25.reassembled.length", FT_UINT32, BASE_DEC, NULL, 0x0, + "The total length of the reassembled payload", HFILL }}, + + { &hf_x25_segment, + { "X.25 Fragment", "x25.fragment", FT_FRAMENUM, BASE_NONE, NULL, 0x0, + "X25 Fragment", HFILL }}, + + { &hf_x25_segments, + { "X.25 Fragments", "x25.fragments", FT_NONE, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + + { &hf_x25_fast_select, + { "Fast select", "x25.fast_select", FT_UINT8, BASE_DEC, VALS(x25_fast_select_vals), 0xC0, + NULL, HFILL }}, + + { &hf_x25_icrd, + { "ICRD", "x25.icrd", FT_UINT8, BASE_DEC, VALS(x25_icrd_vals), 0x30, + NULL, HFILL }}, + + { &hf_x25_reg_confirm_cause, + { "Cause", "x25.reg_confirm.cause", FT_UINT8, BASE_DEC, VALS(x25_registration_code_vals), 0, + NULL, HFILL }}, + + { &hf_x25_reg_confirm_diagnostic, + { "Diagnostic", "x25.reg_confirm.diagnostic", FT_UINT8, BASE_DEC, VALS(x25_registration_code_vals), 0, + NULL, HFILL }}, }; static gint *ett[] = { &ett_x25, - &ett_x25_gfi, - &ett_x25_facilities, - &ett_x25_facility, - &ett_x25_user_data, - &ett_x25_segment, - &ett_x25_segments + &ett_x25_gfi, + &ett_x25_facilities, + &ett_x25_facility, + &ett_x25_user_data, + &ett_x25_segment, + &ett_x25_segments }; static ei_register_info ei[] = { @@ -2427,7 +2427,7 @@ proto_register_x25(void) expert_register_field_array(expert_x25, ei, array_length(ei)); x25_subdissector_table = register_dissector_table("x.25.spi", - "X.25 secondary protocol identifier", FT_UINT8, BASE_HEX); + "X.25 secondary protocol identifier", FT_UINT8, BASE_HEX); register_heur_dissector_list("x.25", &x25_heur_subdissector_list); register_dissector("x.25_dir", dissect_x25_dir, proto_x25); @@ -2449,9 +2449,9 @@ proto_register_x25(void) "If CALL REQUEST not seen or didn't specify protocol, check user data before checking heuristic dissectors", &payload_check_data); prefs_register_bool_preference(x25_module, "reassemble", - "Reassemble fragmented X.25 packets", - "Reassemble fragmented X.25 packets", - &reassemble_x25); + "Reassemble fragmented X.25 packets", + "Reassemble fragmented X.25 packets", + &reassemble_x25); register_init_routine(&x25_reassemble_init); } @@ -2474,3 +2474,16 @@ proto_reg_handoff_x25(void) dissector_add_uint("lapd.sapi", LAPD_SAPI_X25, x25_handle); dissector_add_uint("ax25.pid", AX25_P_ROSE, x25_handle); } + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ |