diff options
author | Bill Meier <wmeier@newsguy.com> | 2013-10-13 18:14:59 +0000 |
---|---|---|
committer | Bill Meier <wmeier@newsguy.com> | 2013-10-13 18:14:59 +0000 |
commit | 76d4b43a292ec42aeb91e7c81169ef1d017c6b17 (patch) | |
tree | 835719465e739bdd8c2d5b96ab0589513200b054 /epan/dissectors/packet-ansi_637.c | |
parent | ee6916b838f68b21c762293ad46390b5a137c964 (diff) |
Minor whitespace, formatting & etc changes.
svn path=/trunk/; revision=52588
Diffstat (limited to 'epan/dissectors/packet-ansi_637.c')
-rw-r--r-- | epan/dissectors/packet-ansi_637.c | 2455 |
1 files changed, 1227 insertions, 1228 deletions
diff --git a/epan/dissectors/packet-ansi_637.c b/epan/dissectors/packet-ansi_637.c index f541dfc137..c396126041 100644 --- a/epan/dissectors/packet-ansi_637.c +++ b/epan/dissectors/packet-ansi_637.c @@ -4,10 +4,10 @@ * Copyright 2003, Michael Lum <mlum [AT] telostech.com> * In association with Telos Technology Inc. * - * Title 3GPP2 Other + * Title 3GPP2 Other * * Short Message Service - * 3GPP2 C.S0015-0 TIA/EIA-637-A + * 3GPP2 C.S0015-0 TIA/EIA-637-A * * $Id$ * @@ -46,124 +46,124 @@ static const char *ansi_proto_name_trans = "ANSI IS-637-A (SMS) Transport Layer" static const char *ansi_proto_name_short = "IS-637-A"; static const value_string ansi_srvc_cat_strings[] = { - { 0x0000, "Unknown or unspecified" }, - { 0x0001, "Emergency Broadcasts" }, - { 0x0002, "Administrative" }, - { 0x0003, "Maintenance" }, - { 0x0004, "General News - Local" }, - { 0x0005, "General News - Regional" }, - { 0x0006, "General News - National" }, - { 0x0007, "General News - International" }, - { 0x0008, "Business/Financial News - Local" }, - { 0x0009, "Business/Financial News - Regional" }, - { 0x000A, "Business/Financial News - National" }, - { 0x000B, "Business/Financial News - International" }, - { 0x000C, "Sports News - Local" }, - { 0x000D, "Sports News - Regional" }, - { 0x000E, "Sports News - National" }, - { 0x000F, "Sports News - International" }, - { 0x0010, "Entertainment News - Local" }, - { 0x0011, "Entertainment News - Regional" }, - { 0x0012, "Entertainment News - National" }, - { 0x0013, "Entertainment News - International" }, - { 0x0014, "Local Weather" }, - { 0x0015, "Area Traffic Reports" }, - { 0x0016, "Local Airport Flight Schedules" }, - { 0x0017, "Restaurants" }, - { 0x0018, "Lodgings" }, - { 0x0019, "Retail Directory" }, - { 0x001A, "Advertisements" }, - { 0x001B, "Stock Quotes" }, - { 0x001C, "Employment Opportunities" }, - { 0x001D, "Medical/Health/Hospitals" }, - { 0x001E, "Technology News" }, - { 0x001F, "Multi-category" }, + { 0x0000, "Unknown or unspecified" }, + { 0x0001, "Emergency Broadcasts" }, + { 0x0002, "Administrative" }, + { 0x0003, "Maintenance" }, + { 0x0004, "General News - Local" }, + { 0x0005, "General News - Regional" }, + { 0x0006, "General News - National" }, + { 0x0007, "General News - International" }, + { 0x0008, "Business/Financial News - Local" }, + { 0x0009, "Business/Financial News - Regional" }, + { 0x000A, "Business/Financial News - National" }, + { 0x000B, "Business/Financial News - International" }, + { 0x000C, "Sports News - Local" }, + { 0x000D, "Sports News - Regional" }, + { 0x000E, "Sports News - National" }, + { 0x000F, "Sports News - International" }, + { 0x0010, "Entertainment News - Local" }, + { 0x0011, "Entertainment News - Regional" }, + { 0x0012, "Entertainment News - National" }, + { 0x0013, "Entertainment News - International" }, + { 0x0014, "Local Weather" }, + { 0x0015, "Area Traffic Reports" }, + { 0x0016, "Local Airport Flight Schedules" }, + { 0x0017, "Restaurants" }, + { 0x0018, "Lodgings" }, + { 0x0019, "Retail Directory" }, + { 0x001A, "Advertisements" }, + { 0x001B, "Stock Quotes" }, + { 0x001C, "Employment Opportunities" }, + { 0x001D, "Medical/Health/Hospitals" }, + { 0x001E, "Technology News" }, + { 0x001F, "Multi-category" }, { 0, NULL }, }; static const value_string ansi_tele_msg_type_strings[] = { - { 1, "Deliver (mobile-terminated only)" }, - { 2, "Submit (mobile-originated only)" }, - { 3, "Cancellation (mobile-originated only)" }, - { 4, "Delivery Acknowledgement (mobile-terminated only)" }, - { 5, "User Acknowledgement (either direction)" }, + { 1, "Deliver (mobile-terminated only)" }, + { 2, "Submit (mobile-originated only)" }, + { 3, "Cancellation (mobile-originated only)" }, + { 4, "Delivery Acknowledgement (mobile-terminated only)" }, + { 5, "User Acknowledgement (either direction)" }, { 0, NULL }, }; static const value_string ansi_tele_msg_status_strings[] = { - {0x00,"Message accepted"}, - {0x01,"Message deposited to Internet"}, - {0x02,"Message delivered"}, - {0x03,"Message cancelled"}, - {0x84,"Network congestion"}, - {0x85,"Network error"}, - {0x9f,"Unknown error"}, - {0xc4,"Network congestion"}, - {0xc5,"Network error"}, - {0xc6,"Cancel failed"}, - {0xc7,"Blocked destination"}, - {0xc8,"Text too long"}, - {0xc9,"Duplicate message"}, - {0xca,"Invalid destination"}, - {0xcd,"Message expired"}, - {0xdf,"Unknown error"}, + {0x00, "Message accepted"}, + {0x01, "Message deposited to Internet"}, + {0x02, "Message delivered"}, + {0x03, "Message cancelled"}, + {0x84, "Network congestion"}, + {0x85, "Network error"}, + {0x9f, "Unknown error"}, + {0xc4, "Network congestion"}, + {0xc5, "Network error"}, + {0xc6, "Cancel failed"}, + {0xc7, "Blocked destination"}, + {0xc8, "Text too long"}, + {0xc9, "Duplicate message"}, + {0xca, "Invalid destination"}, + {0xcd, "Message expired"}, + {0xdf, "Unknown error"}, { 0, NULL } }; static const value_string ansi_tele_id_strings[] = { - { 1, "Reserved for maintenance" }, - { 4096, "AMPS Extended Protocol Enhanced Services" }, - { 4097, "CDMA Cellular Paging Teleservice" }, - { 4098, "CDMA Cellular Messaging Teleservice" }, - { 4099, "CDMA Voice Mail Notification" }, - { 4100, "CDMA Wireless Application Protocol (WAP)" }, - { 4101, "CDMA Wireless Enhanced Messaging Teleservice (WEMT)" }, - { 65535, "(Reserved) Being used for Broadcast" }, + { 1, "Reserved for maintenance" }, + { 4096, "AMPS Extended Protocol Enhanced Services" }, + { 4097, "CDMA Cellular Paging Teleservice" }, + { 4098, "CDMA Cellular Messaging Teleservice" }, + { 4099, "CDMA Voice Mail Notification" }, + { 4100, "CDMA Wireless Application Protocol (WAP)" }, + { 4101, "CDMA Wireless Enhanced Messaging Teleservice (WEMT)" }, + { 65535, "(Reserved) Being used for Broadcast" }, { 0, NULL }, }; static const value_string ansi_tele_param_strings[] = { - { 0x00, "Message Identifier" }, - { 0x01, "User Data" }, - { 0x02, "User Response Code" }, - { 0x03, "Message Center Time Stamp" }, - { 0x04, "Validity Period - Absolute" }, - { 0x05, "Validity Period - Relative" }, - { 0x06, "Deferred Delivery Time - Absolute" }, - { 0x07, "Deferred Delivery Time - Relative" }, - { 0x08, "Priority Indicator" }, - { 0x09, "Privacy Indicator" }, - { 0x0a, "Reply Option" }, - { 0x0b, "Number of Messages" }, - { 0x0c, "Alert on Message Delivery" }, - { 0x0d, "Language Indicator" }, - { 0x0e, "Call-Back Number" }, - { 0x0f, "Message Display Mode" }, - { 0x10, "Multiple Encoding User Data" }, - { 0x14, "Message Status" }, + { 0x00, "Message Identifier" }, + { 0x01, "User Data" }, + { 0x02, "User Response Code" }, + { 0x03, "Message Center Time Stamp" }, + { 0x04, "Validity Period - Absolute" }, + { 0x05, "Validity Period - Relative" }, + { 0x06, "Deferred Delivery Time - Absolute" }, + { 0x07, "Deferred Delivery Time - Relative" }, + { 0x08, "Priority Indicator" }, + { 0x09, "Privacy Indicator" }, + { 0x0a, "Reply Option" }, + { 0x0b, "Number of Messages" }, + { 0x0c, "Alert on Message Delivery" }, + { 0x0d, "Language Indicator" }, + { 0x0e, "Call-Back Number" }, + { 0x0f, "Message Display Mode" }, + { 0x10, "Multiple Encoding User Data" }, + { 0x14, "Message Status" }, { 0, NULL }, }; -#define ANSI_TRANS_MSG_TYPE_BROADCAST 1 +#define ANSI_TRANS_MSG_TYPE_BROADCAST 1 static const value_string ansi_trans_msg_type_strings[] = { - { 0, "Point-to-Point" }, - { 1, "Broadcast" }, - { 2, "Acknowledge" }, + { 0, "Point-to-Point" }, + { 1, "Broadcast" }, + { 2, "Acknowledge" }, { 0, NULL }, }; static const value_string ansi_trans_param_strings[] = { - { 0x00, "Teleservice Identifier" }, - { 0x01, "Service Category" }, - { 0x02, "Originating Address" }, - { 0x03, "Originating Subaddress" }, - { 0x04, "Destination Address" }, - { 0x05, "Destination Subaddress" }, - { 0x06, "Bearer Reply Option" }, - { 0x07, "Cause Codes" }, - { 0x08, "Bearer Data" }, + { 0x00, "Teleservice Identifier" }, + { 0x01, "Service Category" }, + { 0x02, "Originating Address" }, + { 0x03, "Originating Subaddress" }, + { 0x04, "Destination Address" }, + { 0x05, "Destination Subaddress" }, + { 0x06, "Bearer Reply Option" }, + { 0x07, "Cause Codes" }, + { 0x08, "Bearer Data" }, { 0, NULL }, }; @@ -214,9 +214,9 @@ static proto_tree *g_tree; static int decode_7_bits(tvbuff_t *tvb, guint32 *offset, guint8 num_fields, guint8 *last_oct, guint8 *last_bit, gchar *buf) { - guint8 oct, oct2, bit; - /* guint32 saved_offset; */ - guint32 i; + guint8 oct, oct2, bit; + /* guint32 saved_offset; */ + guint32 i; if (num_fields == 0) @@ -230,65 +230,65 @@ decode_7_bits(tvbuff_t *tvb, guint32 *offset, guint8 num_fields, guint8 *last_oc if (bit == 1) { - oct2 = tvb_get_guint8(tvb, *offset); - (*offset)++; + oct2 = tvb_get_guint8(tvb, *offset); + (*offset) += 1; } for (i=0; i < num_fields; i++) { - if (bit != 1) - { - oct = oct2; - - /* - * cannot grab an octet if we are getting - * the last field and bit is 7 or 8 - * because there may not be another octet - */ - if (((i + 1) != num_fields) || - ((bit != 7) && (bit != 8))) - { - oct2 = tvb_get_guint8(tvb, *offset); - (*offset)++; - } - } - - switch (bit) - { - case 1: - buf[i] = ((oct & 0x01) << 6) | ((oct2 & 0xfc) >> 2); - break; - - case 2: - buf[i] = ((oct & 0x03) << 5) | ((oct2 & 0xf8) >> 3); - break; - - case 3: - buf[i] = ((oct & 0x07) << 4) | ((oct2 & 0xf0) >> 4); - break; - - case 4: - buf[i] = ((oct & 0x0f) << 3) | ((oct2 & 0xe0) >> 5); - break; - - case 5: - buf[i] = ((oct & 0x1f) << 2) | ((oct2 & 0xc0) >> 6); - break; - - case 6: - buf[i] = ((oct & 0x3f) << 1) | ((oct2 & 0x80) >> 7); - break; - - case 7: - buf[i] = oct & 0x7f; - break; - - case 8: - buf[i] = (oct & 0xfe) >> 1; - break; - } - - bit = (bit % 8) + 1; + if (bit != 1) + { + oct = oct2; + + /* + * cannot grab an octet if we are getting + * the last field and bit is 7 or 8 + * because there may not be another octet + */ + if (((i + 1) != num_fields) || + ((bit != 7) && (bit != 8))) + { + oct2 = tvb_get_guint8(tvb, *offset); + (*offset) += 1; + } + } + + switch (bit) + { + case 1: + buf[i] = ((oct & 0x01) << 6) | ((oct2 & 0xfc) >> 2); + break; + + case 2: + buf[i] = ((oct & 0x03) << 5) | ((oct2 & 0xf8) >> 3); + break; + + case 3: + buf[i] = ((oct & 0x07) << 4) | ((oct2 & 0xf0) >> 4); + break; + + case 4: + buf[i] = ((oct & 0x0f) << 3) | ((oct2 & 0xe0) >> 5); + break; + + case 5: + buf[i] = ((oct & 0x1f) << 2) | ((oct2 & 0xc0) >> 6); + break; + + case 6: + buf[i] = ((oct & 0x3f) << 1) | ((oct2 & 0x80) >> 7); + break; + + case 7: + buf[i] = oct & 0x7f; + break; + + case 8: + buf[i] = (oct & 0xfe) >> 1; + break; + } + + bit = (bit % 8) + 1; } buf[i] = '\0'; @@ -299,27 +299,27 @@ decode_7_bits(tvbuff_t *tvb, guint32 *offset, guint8 num_fields, guint8 *last_oc /* PARAM FUNCTIONS */ -#define EXTRANEOUS_DATA_CHECK(edc_len, edc_max_len) \ +#define EXTRANEOUS_DATA_CHECK(edc_len, edc_max_len) \ if ((edc_len) > (edc_max_len)) \ { \ - proto_tree_add_text(tree, tvb, offset, \ - (edc_len) - (edc_max_len), "Extraneous Data"); \ + proto_tree_add_text(tree, tvb, offset, \ + (edc_len) - (edc_max_len), "Extraneous Data"); \ } -#define SHORT_DATA_CHECK(sdc_len, sdc_min_len) \ +#define SHORT_DATA_CHECK(sdc_len, sdc_min_len) \ if ((sdc_len) < (sdc_min_len)) \ { \ - proto_tree_add_text(tree, tvb, offset, \ - (sdc_len), "Short Data (?)"); \ - return; \ + proto_tree_add_text(tree, tvb, offset, \ + (sdc_len), "Short Data (?)"); \ + return; \ } -#define EXACT_DATA_CHECK(edc_len, edc_eq_len) \ +#define EXACT_DATA_CHECK(edc_len, edc_eq_len) \ if ((edc_len) != (edc_eq_len)) \ { \ - proto_tree_add_text(tree, tvb, offset, \ - (edc_len), "Unexpected Data Length"); \ - return; \ + proto_tree_add_text(tree, tvb, offset, \ + (edc_len), "Unexpected Data Length"); \ + return; \ } static void @@ -344,10 +344,9 @@ static void tele_param_msg_status(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { /* Declare some variables */ - - guint8 oct; - guint8 error_class; - guint8 msg_status_code; + guint8 oct; + guint8 error_class; + guint8 msg_status_code; const gchar *str = NULL; /* Chceck if the exact length */ @@ -386,16 +385,16 @@ tele_param_msg_status(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset msg_status_code = (oct & 0x3f); if (error_class == 0x00){ - switch (msg_status_code) - { - case 0x00: str = "Message accepted";break; + switch (msg_status_code) + { + case 0x00: str = "Message accepted";break; case 0x01: str = "Message deposited to internet";break; case 0x02: str = "Message delivered";break; case 0x03: str = "Message cancelled";break; default: str = "Reserved";break; } - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x3f, 8); - proto_tree_add_text(tree, tvb, offset, 1, + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x3f, 8); + proto_tree_add_text(tree, tvb, offset, 1, "%s : Message status code: %s", ansi_637_bigbuf, str); @@ -443,18 +442,18 @@ tele_param_msg_status(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset static void tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct, oct2; - guint8 encoding; - guint8 msg_type; - guint8 num_fields; - guint8 used; - guint8 bit; - guint32 required_octs; - guint32 saved_offset; - guint32 i , out_len; - const gchar *str = NULL; - gchar *buf; - tvbuff_t * tvb_out = NULL; + guint8 oct, oct2; + guint8 encoding; + guint8 msg_type; + guint8 num_fields; + guint8 used; + guint8 bit; + guint32 required_octs; + guint32 saved_offset; + guint32 i , out_len; + const gchar *str = NULL; + gchar *buf; + tvbuff_t *tvb_out = NULL; gchar *utf8_text = NULL; GIConv cd; @@ -465,19 +464,19 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) /* * message encoding */ - oct = tvb_get_guint8(tvb, offset); - oct2 = 0; + oct = tvb_get_guint8(tvb, offset); + oct2 = 0; msg_type = 0; - used = 0; + used = 0; encoding = ((oct & 0xf8) >> 3); switch (encoding) { case 0x00: str = "Octet, unspecified"; break; case 0x01: str = "Extended Protocol Message"; - oct2 = tvb_get_guint8(tvb, offset+1); - msg_type = ((oct & 0x07) << 5) | ((oct2 & 0xf8) >> 3); - break; + oct2 = tvb_get_guint8(tvb, offset+1); + msg_type = ((oct & 0x07) << 5) | ((oct2 & 0xf8) >> 3); + break; case 0x02: str = "7-bit ASCII"; break; case 0x03: str = "IA5"; break; case 0x04: str = "UCS-2"; break; @@ -491,30 +490,30 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xf8, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Encoding: %s", - ansi_637_bigbuf, - str); + "%s : Encoding: %s", + ansi_637_bigbuf, + str); if (encoding == 0x01) { - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x07, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Message type: see TIA/EIA/IS-91 (%d)", - ansi_637_bigbuf, - msg_type); - - other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0xf8, 8); - proto_tree_add_text(tree, tvb, offset+1, 1, - "%s : Message type", - ansi_637_bigbuf); - - oct = oct2; - offset++; - used++; + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x07, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Message type: see TIA/EIA/IS-91 (%d)", + ansi_637_bigbuf, + msg_type); + + other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0xf8, 8); + proto_tree_add_text(tree, tvb, offset+1, 1, + "%s : Message type", + ansi_637_bigbuf); + + oct = oct2; + offset += 1; + used += 1; } - offset++; - used++; + offset += 1; + used += 1; /* * number of fields @@ -524,22 +523,22 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x07, 8); proto_tree_add_text(tree, tvb, offset-1, 1, - "%s : Number of fields (MSB): %d", - ansi_637_bigbuf, - num_fields); + "%s : Number of fields (MSB): %d", + ansi_637_bigbuf, + num_fields); other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0xf8, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Number of fields (LSB)", - ansi_637_bigbuf); + "%s : Number of fields (LSB)", + ansi_637_bigbuf); other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0x07, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Most significant bits of first field", - ansi_637_bigbuf); + "%s : Most significant bits of first field", + ansi_637_bigbuf); - offset++; - used++; + offset += 1; + used += 1; oct = oct2; /* NOTE: there are now 3 bits remaining in 'oct' */ @@ -551,71 +550,71 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) */ if (encoding == 0x02) { - /* - * magic numbers: - * 3 bits remaining from last octet - * 7 bit encoding - * 8 bits per octet - */ - i = (num_fields * 7) - 3; - required_octs = (i / 8) + ((i % 8) ? 1 : 0); - - if (required_octs + used > len) - { - proto_tree_add_text(tree, tvb, offset, 1, - "Missing %d octet(s) for number of fields", - (required_octs + used) - len); - - return; - } - - saved_offset = offset - 1; - i = num_fields * 7; - required_octs = (i / 8) + ((i % 8) ? 1 : 0); - buf = (gchar*)wmem_alloc(g_pinfo->pool, required_octs); - for (i=0; i < required_octs; i++) - { - oct = tvb_get_guint8(tvb, saved_offset); - oct2 = tvb_get_guint8(tvb, saved_offset + 1); - buf[i] = ((oct & 0x07) << 5) | ((oct2 & 0xf8) >> 3); - saved_offset++; - } - tvb_out = tvb_new_child_real_data(tvb, buf, required_octs, required_octs); - add_new_data_source(g_pinfo, tvb_out, "Characters"); - offset = 0; - bit = 0; - if (g_pinfo->private_data && (GPOINTER_TO_UINT(g_pinfo->private_data) == TRUE)) { - dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, TRUE, &bit); - } - - saved_offset = offset; - bit = bit ? bit : 8; - oct = tvb_get_guint8(tvb_out, offset); - offset++; - - decode_7_bits(tvb_out, &offset, num_fields, &oct, &bit, ansi_637_bigbuf); - - proto_tree_add_unicode_string(tree, hf_ansi_637_tele_user_data_text, tvb_out, saved_offset, - offset - saved_offset, ansi_637_bigbuf); - - switch (bit) - { - case 1: oct2 = 0x01; break; - case 2: oct2 = 0x03; break; - case 3: oct2 = 0x07; break; - case 4: oct2 = 0x0f; break; - case 5: oct2 = 0x1f; break; - case 6: oct2 = 0x3f; break; - case 7: oct2 = 0x7f; break; - } - - if (bit != 8) - { - other_decode_bitfield_value(ansi_637_bigbuf, oct, oct2, 8); - proto_tree_add_text(tree, tvb, offset - 1, 1, - "%s : Reserved", - ansi_637_bigbuf); - } + /* + * magic numbers: + * 3 bits remaining from last octet + * 7 bit encoding + * 8 bits per octet + */ + i = (num_fields * 7) - 3; + required_octs = (i / 8) + ((i % 8) ? 1 : 0); + + if (required_octs + used > len) + { + proto_tree_add_text(tree, tvb, offset, 1, + "Missing %d octet(s) for number of fields", + (required_octs + used) - len); + + return; + } + + saved_offset = offset - 1; + i = num_fields * 7; + required_octs = (i / 8) + ((i % 8) ? 1 : 0); + buf = (gchar*)wmem_alloc(g_pinfo->pool, required_octs); + for (i=0; i < required_octs; i++) + { + oct = tvb_get_guint8(tvb, saved_offset); + oct2 = tvb_get_guint8(tvb, saved_offset + 1); + buf[i] = ((oct & 0x07) << 5) | ((oct2 & 0xf8) >> 3); + saved_offset += 1; + } + tvb_out = tvb_new_child_real_data(tvb, buf, required_octs, required_octs); + add_new_data_source(g_pinfo, tvb_out, "Characters"); + offset = 0; + bit = 0; + if (g_pinfo->private_data && (GPOINTER_TO_UINT(g_pinfo->private_data) == TRUE)) { + dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, TRUE, &bit); + } + + saved_offset = offset; + bit = bit ? bit : 8; + oct = tvb_get_guint8(tvb_out, offset); + offset += 1; + + decode_7_bits(tvb_out, &offset, num_fields, &oct, &bit, ansi_637_bigbuf); + + proto_tree_add_unicode_string(tree, hf_ansi_637_tele_user_data_text, tvb_out, saved_offset, + offset - saved_offset, ansi_637_bigbuf); + + switch (bit) + { + case 1: oct2 = 0x01; break; + case 2: oct2 = 0x03; break; + case 3: oct2 = 0x07; break; + case 4: oct2 = 0x0f; break; + case 5: oct2 = 0x1f; break; + case 6: oct2 = 0x3f; break; + case 7: oct2 = 0x7f; break; + } + + if (bit != 8) + { + other_decode_bitfield_value(ansi_637_bigbuf, oct, oct2, 8); + proto_tree_add_text(tree, tvb, offset - 1, 1, + "%s : Reserved", + ansi_637_bigbuf); + } } else if (encoding == 0x03)/* IA5 */ { @@ -640,7 +639,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) oct = tvb_get_guint8(tvb, saved_offset); oct2 = tvb_get_guint8(tvb, saved_offset + 1); buf[i] = ((oct & 0x07) << 5) | ((oct2 & 0xf8) >> 3); - saved_offset++; + saved_offset += 1; } tvb_out = tvb_new_child_real_data(tvb, buf, required_octs, required_octs); add_new_data_source(g_pinfo, tvb_out, "Characters"); @@ -652,7 +651,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) saved_offset = offset; bit = bit ? bit : 8; oct = tvb_get_guint8(tvb_out, offset); - offset++; + offset += 1; out_len = decode_7_bits(tvb_out, &offset, num_fields, &oct, &bit, ansi_637_bigbuf); IA5_7BIT_decode(ia5_637_bigbuf, ansi_637_bigbuf, out_len); @@ -670,7 +669,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) oct = tvb_get_guint8(tvb, saved_offset); oct2 = tvb_get_guint8(tvb, saved_offset + 1); buf[i] = ((oct & 0x07) << 5) | ((oct2 & 0xf8) >> 3); - saved_offset++; + saved_offset += 1; } tvb_out = tvb_new_child_real_data(tvb, buf, required_octs, required_octs); add_new_data_source(g_pinfo, tvb_out, "Characters"); @@ -682,7 +681,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) if ((cd = g_iconv_open("UTF-8","UCS-2BE")) != (GIConv)-1) { utf8_text = g_convert_with_iconv(tvb_get_ptr(tvb_out, offset, required_octs), required_octs , cd , NULL , NULL , &l_conv_error); - if(!l_conv_error) + if (!l_conv_error) { proto_tree_add_unicode_string(tree, hf_ansi_637_tele_user_data_text, tvb_out, offset, required_octs, utf8_text); @@ -691,7 +690,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { proto_tree_add_text(tree, tvb_out, offset, required_octs, "%s", "Failed on UCS-2BE contact Wireshark developers"); } - if(utf8_text) + if (utf8_text) g_free(utf8_text); g_iconv_close(cd); } @@ -705,7 +704,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) oct = tvb_get_guint8(tvb, saved_offset); oct2 = tvb_get_guint8(tvb, saved_offset + 1); buf[i] = ((oct & 0x07) << 5) | ((oct2 & 0xf8) >> 3); - saved_offset++; + saved_offset += 1; } tvb_out = tvb_new_child_real_data(tvb, buf, num_fields, num_fields); add_new_data_source(g_pinfo, tvb_out, "Characters"); @@ -718,7 +717,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) if ((cd = g_iconv_open("UTF-8","iso-8859-8")) != (GIConv)-1) { utf8_text = g_convert_with_iconv(tvb_get_ptr(tvb_out, offset, num_fields), num_fields , cd , NULL , NULL , &l_conv_error); - if(!l_conv_error) + if (!l_conv_error) { proto_tree_add_unicode_string(tree, hf_ansi_637_tele_user_data_text, tvb_out, offset, num_fields, utf8_text); @@ -727,7 +726,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { proto_tree_add_text(tree, tvb_out, offset, num_fields, "%s", "Failed on iso-8859-8 contact Wireshark developers"); } - if(utf8_text) + if (utf8_text) g_free(utf8_text); g_iconv_close(cd); } @@ -741,7 +740,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) oct = tvb_get_guint8(tvb, saved_offset); oct2 = tvb_get_guint8(tvb, saved_offset + 1); buf[i] = ((oct & 0x07) << 5) | ((oct2 & 0xf8) >> 3); - saved_offset++; + saved_offset += 1; } tvb_out = tvb_new_child_real_data(tvb, buf, num_fields, num_fields); add_new_data_source(g_pinfo, tvb_out, "Characters"); @@ -754,7 +753,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) if ((cd = g_iconv_open("UTF-8","iso-8859-1")) != (GIConv)-1) { utf8_text = g_convert_with_iconv(tvb_get_ptr(tvb_out, offset, num_fields) , num_fields , cd , NULL , NULL , &l_conv_error); - if(!l_conv_error) + if (!l_conv_error) { proto_tree_add_unicode_string(tree, hf_ansi_637_tele_user_data_text, tvb_out, offset, num_fields, utf8_text); @@ -763,7 +762,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { proto_tree_add_text(tree, tvb_out, offset, num_fields, "%s", "Failed on iso-8859-1 contact Wireshark developers"); } - if(utf8_text) + if (utf8_text) g_free(utf8_text); g_iconv_close(cd); } @@ -791,7 +790,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) oct = tvb_get_guint8(tvb, saved_offset); oct2 = tvb_get_guint8(tvb, saved_offset + 1); buf[i] = ((oct & 0x07) << 5) | ((oct2 & 0xf8) >> 3); - saved_offset++; + saved_offset += 1; } tvb_out = tvb_new_child_real_data(tvb, buf, required_octs, required_octs); add_new_data_source(g_pinfo, tvb_out, "Characters"); @@ -801,7 +800,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, TRUE, &bit); } - out_len = gsm_sms_char_7bit_unpack(bit, required_octs, num_fields, + out_len = gsm_sms_char_7bit_unpack(bit, required_octs, num_fields, tvb_get_ptr(tvb_out, offset, required_octs), gsm_637_bigbuf); gsm_637_bigbuf[out_len] = '\0'; @@ -818,7 +817,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) static void tele_param_rsp_code(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct; + guint8 oct; EXACT_DATA_CHECK(len, 1); @@ -828,14 +827,14 @@ tele_param_rsp_code(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) oct = tvb_get_guint8(tvb, offset); proto_tree_add_text(tree, tvb, offset, 1, - "Response code: %d", - oct); + "Response code: %d", + oct); } static void tele_param_timestamp(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct, oct2, oct3; + guint8 oct, oct2, oct3; EXACT_DATA_CHECK(len, 6); @@ -844,13 +843,13 @@ tele_param_timestamp(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) oct3 = tvb_get_guint8(tvb, offset+2); proto_tree_add_text(tree, tvb, offset, 3, - "Year %d%d, Month %d%d, Day %d%d", - (oct & 0xf0) >> 4, - oct & 0x0f, - (oct2 & 0xf0) >> 4, - oct2 & 0x0f, - (oct3 & 0xf0) >> 4, - oct3 & 0x0f); + "Year %d%d, Month %d%d, Day %d%d", + (oct & 0xf0) >> 4, + oct & 0x0f, + (oct2 & 0xf0) >> 4, + oct2 & 0x0f, + (oct3 & 0xf0) >> 4, + oct3 & 0x0f); offset += 3; @@ -859,22 +858,22 @@ tele_param_timestamp(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) oct3 = tvb_get_guint8(tvb, offset+2); proto_tree_add_text(tree, tvb, offset, 3, - "Hour %d%d, Minutes %d%d, Seconds %d%d", - (oct & 0xf0) >> 4, - oct & 0x0f, - (oct2 & 0xf0) >> 4, - oct2 & 0x0f, - (oct3 & 0xf0) >> 4, - oct3 & 0x0f); + "Hour %d%d, Minutes %d%d, Seconds %d%d", + (oct & 0xf0) >> 4, + oct & 0x0f, + (oct2 & 0xf0) >> 4, + oct2 & 0x0f, + (oct3 & 0xf0) >> 4, + oct3 & 0x0f); } static void tele_param_rel_timestamp(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct; - guint32 value = 0; - const gchar *str = NULL; - const gchar *str2 = NULL; + guint8 oct; + guint32 value = 0; + const gchar *str = NULL; + const gchar *str2 = NULL; EXACT_DATA_CHECK(len, 1); @@ -887,39 +886,39 @@ tele_param_rel_timestamp(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 off case 247: str = "Valid until mobile becomes inactive/Deliver when mobile next becomes active"; break; case 248: str = "Valid until registration area changes, discard if not registered" ; break; default: - if (oct <= 143) { value = (oct + 1) * 5; str2 = "Minutes"; break; } - else if ((oct >= 144) && (oct <= 167)) { value = (oct - 143) * 30; str2 = "Minutes + 12 Hours"; break; } - else if ((oct >= 168) && (oct <= 196)) { value = oct - 166; str2 = "Days"; break; } - else if ((oct >= 197) && (oct <= 244)) { value = oct - 192; str2 = "Weeks"; break; } - else { str = "Reserved"; break; } + if (oct <= 143) { value = (oct + 1) * 5; str2 = "Minutes"; break; } + else if ((oct >= 144) && (oct <= 167)) { value = (oct - 143) * 30; str2 = "Minutes + 12 Hours"; break; } + else if ((oct >= 168) && (oct <= 196)) { value = oct - 166; str2 = "Days"; break; } + else if ((oct >= 197) && (oct <= 244)) { value = oct - 192; str2 = "Weeks"; break; } + else { str = "Reserved"; break; } } if (str == NULL) { - proto_tree_add_text(tree, tvb, offset, 1, - "%s", str2); + proto_tree_add_text(tree, tvb, offset, 1, + "%s", str2); } else { - proto_tree_add_text(tree, tvb, offset, 1, - "%d %s", - value, str2); + proto_tree_add_text(tree, tvb, offset, 1, + "%d %s", + value, str2); } } static const value_string tele_param_pri_ind_strings[] = { - { 0, "Normal" }, - { 1, "Interactive" }, - { 2, "Urgent" }, - { 3, "Emergency" }, + { 0, "Normal" }, + { 1, "Interactive" }, + { 2, "Urgent" }, + { 3, "Emergency" }, { 0, NULL } }; static void tele_param_pri_ind(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct; - const gchar *str = NULL; + guint8 oct; + const gchar *str = NULL; EXACT_DATA_CHECK(len, 1); @@ -929,21 +928,21 @@ tele_param_pri_ind(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xc0, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : %s", - ansi_637_bigbuf, - str); + "%s : %s", + ansi_637_bigbuf, + str); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x3f, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reserved", - ansi_637_bigbuf); + "%s : Reserved", + ansi_637_bigbuf); } static void tele_param_priv_ind(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct; - const gchar *str = NULL; + guint8 oct; + const gchar *str = NULL; EXACT_DATA_CHECK(len, 1); @@ -959,20 +958,20 @@ tele_param_priv_ind(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xc0, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : %s", - ansi_637_bigbuf, - str); + "%s : %s", + ansi_637_bigbuf, + str); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x3f, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reserved", - ansi_637_bigbuf); + "%s : Reserved", + ansi_637_bigbuf); } static void tele_param_reply_opt(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct; + guint8 oct; EXACT_DATA_CHECK(len, 1); @@ -980,42 +979,42 @@ tele_param_reply_opt(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x80, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : %s (manual) acknowledgment is requested", - ansi_637_bigbuf, - (oct & 0x80) ? "User" : "No user"); + "%s : %s (manual) acknowledgment is requested", + ansi_637_bigbuf, + (oct & 0x80) ? "User" : "No user"); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x40, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : %s acknowledgment requested", - ansi_637_bigbuf, - (oct & 0x40) ? "Delivery" : "No delivery"); + "%s : %s acknowledgment requested", + ansi_637_bigbuf, + (oct & 0x40) ? "Delivery" : "No delivery"); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x3f, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reserved", - ansi_637_bigbuf); + "%s : Reserved", + ansi_637_bigbuf); } static void tele_param_num_messages(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct; + guint8 oct; EXACT_DATA_CHECK(len, 1); oct = tvb_get_guint8(tvb, offset); proto_tree_add_text(tree, tvb, offset, 1, - "Number of voice mail messages: %d%d", - (oct & 0xf0) >> 4, - oct & 0x0f); + "Number of voice mail messages: %d%d", + (oct & 0xf0) >> 4, + oct & 0x0f); } static void tele_param_alert(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct; - const gchar *str = NULL; + guint8 oct; + const gchar *str = NULL; EXACT_DATA_CHECK(len, 1); @@ -1031,21 +1030,21 @@ tele_param_alert(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xc0, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : %s", - ansi_637_bigbuf, - str); + "%s : %s", + ansi_637_bigbuf, + str); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x3f, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reserved", - ansi_637_bigbuf); + "%s : Reserved", + ansi_637_bigbuf); } static void tele_param_lang_ind(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct; - const gchar *str = NULL; + guint8 oct; + const gchar *str = NULL; EXACT_DATA_CHECK(len, 1); @@ -1065,16 +1064,16 @@ tele_param_lang_ind(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) } proto_tree_add_text(tree, tvb, offset, 1, - "%s", str); + "%s", str); } static void tele_param_cb_num(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct, oct2, num_fields, odd; - guint32 saved_offset; - guint32 required_octs; - guint32 i; + guint8 oct, oct2, num_fields, odd; + guint32 saved_offset; + guint32 required_octs; + guint32 i; SHORT_DATA_CHECK(len, 2); @@ -1082,135 +1081,135 @@ tele_param_cb_num(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x80, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Digit mode: %s", - ansi_637_bigbuf, - (oct & 0x80) ? "8-bit ASCII" : "4-bit DTMF"); + "%s : Digit mode: %s", + ansi_637_bigbuf, + (oct & 0x80) ? "8-bit ASCII" : "4-bit DTMF"); if (oct & 0x80) { - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x70, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Type of number: (%d)", - ansi_637_bigbuf, - (oct & 0x70) >> 4); - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x0f, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Numbering plan: (%d)", - ansi_637_bigbuf, - oct & 0x0f); - - offset++; - num_fields = tvb_get_guint8(tvb, offset); - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xff, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Number of fields: (%d)", - ansi_637_bigbuf, - num_fields); - - if (num_fields == 0) return; - - if (num_fields > (len - 2)) - { - proto_tree_add_text(tree, tvb, offset, 1, - "Missing %d octet(s) for number of fields", - (num_fields + 2) - len); - - return; - } - - offset++; - - i = 0; - while (i < num_fields) - { - ansi_637_bigbuf[i] = tvb_get_guint8(tvb, offset+i) & 0x7f; - i++; - } - ansi_637_bigbuf[i] = '\0'; - - proto_tree_add_text(tree, tvb, offset, num_fields, - "Number: %s", - ansi_637_bigbuf); + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x70, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Type of number: (%d)", + ansi_637_bigbuf, + (oct & 0x70) >> 4); + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x0f, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Numbering plan: (%d)", + ansi_637_bigbuf, + oct & 0x0f); + + offset += 1; + num_fields = tvb_get_guint8(tvb, offset); + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xff, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Number of fields: (%d)", + ansi_637_bigbuf, + num_fields); + + if (num_fields == 0) return; + + if (num_fields > (len - 2)) + { + proto_tree_add_text(tree, tvb, offset, 1, + "Missing %d octet(s) for number of fields", + (num_fields + 2) - len); + + return; + } + + offset += 1; + + i = 0; + while (i < num_fields) + { + ansi_637_bigbuf[i] = tvb_get_guint8(tvb, offset+i) & 0x7f; + i += 1; + } + ansi_637_bigbuf[i] = '\0'; + + proto_tree_add_text(tree, tvb, offset, num_fields, + "Number: %s", + ansi_637_bigbuf); } else { - offset++; - num_fields = (oct & 0x7f) << 1; - oct2 = tvb_get_guint8(tvb, offset); - num_fields |= ((oct2 & 0x80) >> 7); - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x7f, 8); - proto_tree_add_text(tree, tvb, offset-1, 1, - "%s : Number of fields (MSB): (%d)", - ansi_637_bigbuf, - num_fields); - - other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0x80, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Number of fields (LSB)", - ansi_637_bigbuf); - - oct = oct2; - odd = FALSE; - - if (num_fields > 0) - { - i = (num_fields - 1) * 4; - required_octs = (i / 8) + ((i % 8) ? 1 : 0); - - if (required_octs + 2 > len) - { - proto_tree_add_text(tree, tvb, offset, 1, - "Missing %d octet(s) for number of fields", - (required_octs + 2) - len); - - return; - } - - odd = num_fields & 0x01; - memset((void *) ansi_637_bigbuf, 0, sizeof(ansi_637_bigbuf)); - saved_offset = offset; - offset++; - - i = 0; - while (i < num_fields) - { - ansi_637_bigbuf[i] = - air_digits[(oct & 0x78) >> 3]; - - i++; - if (i >= num_fields) break; - - oct2 = tvb_get_guint8(tvb, offset); - offset++; - - ansi_637_bigbuf[i] = - air_digits[((oct & 0x07) << 1) | ((oct2 & 0x80) >> 7)]; - - oct = oct2; - - i++; - } - - proto_tree_add_text(tree, tvb, saved_offset, offset - saved_offset, - "Number: %s", - ansi_637_bigbuf); - } - - other_decode_bitfield_value(ansi_637_bigbuf, oct, odd ? 0x07: 0x7f, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reserved", - ansi_637_bigbuf); + offset += 1; + num_fields = (oct & 0x7f) << 1; + oct2 = tvb_get_guint8(tvb, offset); + num_fields |= ((oct2 & 0x80) >> 7); + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x7f, 8); + proto_tree_add_text(tree, tvb, offset-1, 1, + "%s : Number of fields (MSB): (%d)", + ansi_637_bigbuf, + num_fields); + + other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0x80, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Number of fields (LSB)", + ansi_637_bigbuf); + + oct = oct2; + odd = FALSE; + + if (num_fields > 0) + { + i = (num_fields - 1) * 4; + required_octs = (i / 8) + ((i % 8) ? 1 : 0); + + if (required_octs + 2 > len) + { + proto_tree_add_text(tree, tvb, offset, 1, + "Missing %d octet(s) for number of fields", + (required_octs + 2) - len); + + return; + } + + odd = num_fields & 0x01; + memset((void *) ansi_637_bigbuf, 0, sizeof(ansi_637_bigbuf)); + saved_offset = offset; + offset += 1; + + i = 0; + while (i < num_fields) + { + ansi_637_bigbuf[i] = + air_digits[(oct & 0x78) >> 3]; + + i += 1; + if (i >= num_fields) break; + + oct2 = tvb_get_guint8(tvb, offset); + offset += 1; + + ansi_637_bigbuf[i] = + air_digits[((oct & 0x07) << 1) | ((oct2 & 0x80) >> 7)]; + + oct = oct2; + + i += 1; + } + + proto_tree_add_text(tree, tvb, saved_offset, offset - saved_offset, + "Number: %s", + ansi_637_bigbuf); + } + + other_decode_bitfield_value(ansi_637_bigbuf, oct, odd ? 0x07: 0x7f, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Reserved", + ansi_637_bigbuf); } } static void tele_param_disp_mode(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) { - guint8 oct; - const gchar *str = NULL; + guint8 oct; + const gchar *str = NULL; EXACT_DATA_CHECK(len, 1); @@ -1226,44 +1225,44 @@ tele_param_disp_mode(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xc0, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : %s", - ansi_637_bigbuf, - str); + "%s : %s", + ansi_637_bigbuf, + str); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x3f, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reserved", - ansi_637_bigbuf); + "%s : Reserved", + ansi_637_bigbuf); } -#define NUM_TELE_PARAM (sizeof(ansi_tele_param_strings)/sizeof(value_string)) +#define NUM_TELE_PARAM (sizeof(ansi_tele_param_strings)/sizeof(value_string)) static gint ett_ansi_637_tele_param[NUM_TELE_PARAM]; static void (*ansi_637_tele_param_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) = { - tele_param_msg_id, /* Message Identifier */ - tele_param_user_data, /* User Data */ - tele_param_rsp_code, /* User Response Code */ - tele_param_timestamp, /* Message Center Time Stamp */ - tele_param_timestamp, /* Validity Period Absolute */ - tele_param_rel_timestamp, /* Validity Period Relative */ - tele_param_timestamp, /* Deferred Delivery Time - Absolute */ - tele_param_rel_timestamp, /* Deferred Delivery Time - Relative */ - tele_param_pri_ind, /* Priority Indicator */ - tele_param_priv_ind, /* Privacy Indicator */ - tele_param_reply_opt, /* Reply Option */ - tele_param_num_messages, /* Number of Messages */ - tele_param_alert, /* Alert on Message Delivery */ - tele_param_lang_ind, /* Language Indicator */ - tele_param_cb_num, /* Call-Back Number */ - tele_param_disp_mode, /* Message Display Mode */ - NULL, /* Multiple Encoding User Data */ - tele_param_msg_status /* Message status */ + tele_param_msg_id, /* Message Identifier */ + tele_param_user_data, /* User Data */ + tele_param_rsp_code, /* User Response Code */ + tele_param_timestamp, /* Message Center Time Stamp */ + tele_param_timestamp, /* Validity Period Absolute */ + tele_param_rel_timestamp, /* Validity Period Relative */ + tele_param_timestamp, /* Deferred Delivery Time - Absolute */ + tele_param_rel_timestamp, /* Deferred Delivery Time - Relative */ + tele_param_pri_ind, /* Priority Indicator */ + tele_param_priv_ind, /* Privacy Indicator */ + tele_param_reply_opt, /* Reply Option */ + tele_param_num_messages, /* Number of Messages */ + tele_param_alert, /* Alert on Message Delivery */ + tele_param_lang_ind, /* Language Indicator */ + tele_param_cb_num, /* Call-Back Number */ + tele_param_disp_mode, /* Message Display Mode */ + NULL, /* Multiple Encoding User Data */ + tele_param_msg_status /* Message status */ }; static void trans_param_tele_id(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, gchar *add_string, int string_len) { - guint32 value; - const gchar *str = NULL; + guint32 value; + const gchar *str = NULL; EXACT_DATA_CHECK(len, 2); @@ -1275,65 +1274,65 @@ trans_param_tele_id(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, if (NULL == str) { - switch (value) - { - case 1: - str = "Reserved for maintenance"; - break; - case 4102: - str = "CDMA Service Category Programming Teleservice (SCPT)"; - break; - case 4103: - str = "CDMA Card Application Toolkit Protocol Teleservice (CATPT)"; - break; - case 32513: - str = "TDMA Cellular Messaging Teleservice"; - break; - case 32514: - str = "TDMA Cellular Paging Teleservice (CPT-136)"; - break; - case 32515: - str = "TDMA Over-the-Air Activation Teleservice (OATS)"; - break; - case 32520: - str = "TDMA System Assisted Mobile Positioning through Satellite (SAMPS)"; - break; - case 32584: - str = "TDMA Segmented System Assisted Mobile Positioning Service"; - break; - default: - if ((value >= 2) && (value <= 4095)) - { - str = "Reserved for assignment by TIA-41"; - } - else if ((value >= 4104) && (value <= 4113)) - { - str = "Reserved for GSM1x Teleservice (CDMA)"; - } - else if ((value >= 4114) && (value <= 32512)) - { - str = "Reserved for assignment by TIA-41"; - } - else if ((value >= 32521) && (value <= 32575)) - { - str = "Reserved for assignment by this Standard for TDMA MS-based SMEs"; - } - else if ((value >= 49152) && (value <= 65535)) - { - str = "Reserved for carrier specific teleservices"; - } - else - { - str = "Unrecognized Teleservice ID"; - } - break; - } + switch (value) + { + case 1: + str = "Reserved for maintenance"; + break; + case 4102: + str = "CDMA Service Category Programming Teleservice (SCPT)"; + break; + case 4103: + str = "CDMA Card Application Toolkit Protocol Teleservice (CATPT)"; + break; + case 32513: + str = "TDMA Cellular Messaging Teleservice"; + break; + case 32514: + str = "TDMA Cellular Paging Teleservice (CPT-136)"; + break; + case 32515: + str = "TDMA Over-the-Air Activation Teleservice (OATS)"; + break; + case 32520: + str = "TDMA System Assisted Mobile Positioning through Satellite (SAMPS)"; + break; + case 32584: + str = "TDMA Segmented System Assisted Mobile Positioning Service"; + break; + default: + if ((value >= 2) && (value <= 4095)) + { + str = "Reserved for assignment by TIA-41"; + } + else if ((value >= 4104) && (value <= 4113)) + { + str = "Reserved for GSM1x Teleservice (CDMA)"; + } + else if ((value >= 4114) && (value <= 32512)) + { + str = "Reserved for assignment by TIA-41"; + } + else if ((value >= 32521) && (value <= 32575)) + { + str = "Reserved for assignment by this Standard for TDMA MS-based SMEs"; + } + else if ((value >= 49152) && (value <= 65535)) + { + str = "Reserved for carrier specific teleservices"; + } + else + { + str = "Unrecognized Teleservice ID"; + } + break; + } } proto_tree_add_text(tree, tvb, offset, 2, - "%s (%d)", - str, - value); + "%s (%d)", + str, + value); g_snprintf(add_string, string_len, " - %s (%d)", str, value); } @@ -1341,8 +1340,8 @@ trans_param_tele_id(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, static void trans_param_srvc_cat(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, gchar *add_string, int string_len) { - guint32 value; - const gchar *str = NULL; + guint32 value; + const gchar *str = NULL; EXACT_DATA_CHECK(len, 2); @@ -1351,7 +1350,7 @@ trans_param_srvc_cat(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, str = val_to_str_const(value, ansi_srvc_cat_strings, "Reserved"); proto_tree_add_text(tree, tvb, offset, 2, - "%s", str); + "%s", str); g_snprintf(add_string, string_len, " - %s (%d)", str, value); } @@ -1359,12 +1358,12 @@ trans_param_srvc_cat(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, static void trans_param_address(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, gchar *add_string _U_, int string_len _U_) { - guint8 oct, oct2, num_fields, odd; - gboolean email_addr; - guint32 saved_offset; - guint32 required_octs; - guint32 i; - const gchar *str; + guint8 oct, oct2, num_fields, odd; + gboolean email_addr; + guint32 saved_offset; + guint32 required_octs; + guint32 i; + const gchar *str; SHORT_DATA_CHECK(len, 2); @@ -1374,268 +1373,268 @@ trans_param_address(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x80, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Digit mode: %s", - ansi_637_bigbuf, - (oct & 0x80) ? "8-bit ASCII" : "4-bit DTMF"); + "%s : Digit mode: %s", + ansi_637_bigbuf, + (oct & 0x80) ? "8-bit ASCII" : "4-bit DTMF"); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x40, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Number mode: %s", - ansi_637_bigbuf, - (oct & 0x40) ? "Data Network Address" : "ANSI T1.607"); + "%s : Number mode: %s", + ansi_637_bigbuf, + (oct & 0x40) ? "Data Network Address" : "ANSI T1.607"); if (oct & 0x80) { - if (oct & 0x40) - { - switch ((oct & 0x38) >> 3) - { - case 0: str = "Unknown"; break; - case 1: str = "Internet Protocol (RFC 791)"; break; - case 2: str = "Internet Email Address (RFC 822)"; email_addr = TRUE; break; - default: - str = "Reserved"; - break; - } - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x38, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Type of number: %s (%d)", - ansi_637_bigbuf, - str, - (oct & 0x38) >> 3); - - offset++; - num_fields = (oct & 0x07) << 5; - oct2 = tvb_get_guint8(tvb, offset); - num_fields |= ((oct2 & 0xf8) >> 3); - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x07, 8); - proto_tree_add_text(tree, tvb, offset-1, 1, - "%s : Number of fields (MSB): (%d)", - ansi_637_bigbuf, - num_fields); - - other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0xf8, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Number of fields (LSB)", - ansi_637_bigbuf); - - if (num_fields == 0) return; - - if (num_fields > (len - 2)) - { - proto_tree_add_text(tree, tvb, offset, 1, - "Missing %d octet(s) for number of fields", - (num_fields + 2) - len); - - return; - } - - other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0x07, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Most significant bits of first field", - ansi_637_bigbuf); - - offset++; - oct = oct2; - - i = 0; - while (i < num_fields) - { - ansi_637_bigbuf[i] = (oct & 0x07) << 5; - ansi_637_bigbuf[i] |= ((oct = tvb_get_guint8(tvb, offset+i)) & 0xf8) >> 3; - i++; - } - ansi_637_bigbuf[i] = '\0'; - - if (email_addr) - { - proto_tree_add_text(tree, tvb, offset, num_fields - 1, - "Number: %s", - ansi_637_bigbuf); - } - else - { - proto_tree_add_bytes(tree, hf_ansi_637_trans_bin_addr, tvb, offset, num_fields - 1, - (guint8*)ansi_637_bigbuf); - } - - offset += (num_fields - 1); - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xf8, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Least significant bits of last field", - ansi_637_bigbuf); - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x07, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reserved", - ansi_637_bigbuf); - } - else - { - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x38, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Type of number: (%d)", - ansi_637_bigbuf, - (oct & 0x38) >> 3); - - oct2 = tvb_get_guint8(tvb, offset + 1); - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x07, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Numbering plan (MSB): (%d)", - ansi_637_bigbuf, - ((oct & 0x07) << 1) | ((oct2 & 0x80) >> 7)); - - offset++; - oct = oct2; - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x80, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Numbering plan (LSB)", - ansi_637_bigbuf); - - offset++; - num_fields = (oct & 0x7f) << 1; - oct2 = tvb_get_guint8(tvb, offset); - num_fields |= ((oct2 & 0x80) >> 7); - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x7f, 8); - proto_tree_add_text(tree, tvb, offset-1, 1, - "%s : Number of fields (MSB): (%d)", - ansi_637_bigbuf, - num_fields); - - other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0x80, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Number of fields (LSB)", - ansi_637_bigbuf); - - if (num_fields == 0) return; - - if (num_fields > (len - 3)) - { - proto_tree_add_text(tree, tvb, offset, 1, - "Missing %d octet(s) for number of fields", - (num_fields + 3) - len); - - return; - } - - other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0x7f, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Most significant bits of first field", - ansi_637_bigbuf); - - offset++; - oct = oct2; - - i = 0; - while (i < num_fields) - { - ansi_637_bigbuf[i] = (oct & 0x7f) << 1; - ansi_637_bigbuf[i] |= ((oct = tvb_get_guint8(tvb, offset+i)) & 0x80) >> 7; - i++; - } - ansi_637_bigbuf[i] = '\0'; - - proto_tree_add_text(tree, tvb, offset, num_fields - 1, - "Number: %s", - ansi_637_bigbuf); - - offset += (num_fields - 1); - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x80, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Least significant bit of last field", - ansi_637_bigbuf); - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x7f, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reserved", - ansi_637_bigbuf); - } + if (oct & 0x40) + { + switch ((oct & 0x38) >> 3) + { + case 0: str = "Unknown"; break; + case 1: str = "Internet Protocol (RFC 791)"; break; + case 2: str = "Internet Email Address (RFC 822)"; email_addr = TRUE; break; + default: + str = "Reserved"; + break; + } + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x38, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Type of number: %s (%d)", + ansi_637_bigbuf, + str, + (oct & 0x38) >> 3); + + offset += 1; + num_fields = (oct & 0x07) << 5; + oct2 = tvb_get_guint8(tvb, offset); + num_fields |= ((oct2 & 0xf8) >> 3); + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x07, 8); + proto_tree_add_text(tree, tvb, offset-1, 1, + "%s : Number of fields (MSB): (%d)", + ansi_637_bigbuf, + num_fields); + + other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0xf8, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Number of fields (LSB)", + ansi_637_bigbuf); + + if (num_fields == 0) return; + + if (num_fields > (len - 2)) + { + proto_tree_add_text(tree, tvb, offset, 1, + "Missing %d octet(s) for number of fields", + (num_fields + 2) - len); + + return; + } + + other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0x07, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Most significant bits of first field", + ansi_637_bigbuf); + + offset += 1; + oct = oct2; + + i = 0; + while (i < num_fields) + { + ansi_637_bigbuf[i] = (oct & 0x07) << 5; + ansi_637_bigbuf[i] |= ((oct = tvb_get_guint8(tvb, offset+i)) & 0xf8) >> 3; + i += 1; + } + ansi_637_bigbuf[i] = '\0'; + + if (email_addr) + { + proto_tree_add_text(tree, tvb, offset, num_fields - 1, + "Number: %s", + ansi_637_bigbuf); + } + else + { + proto_tree_add_bytes(tree, hf_ansi_637_trans_bin_addr, tvb, offset, num_fields - 1, + (guint8*)ansi_637_bigbuf); + } + + offset += (num_fields - 1); + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xf8, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Least significant bits of last field", + ansi_637_bigbuf); + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x07, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Reserved", + ansi_637_bigbuf); + } + else + { + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x38, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Type of number: (%d)", + ansi_637_bigbuf, + (oct & 0x38) >> 3); + + oct2 = tvb_get_guint8(tvb, offset + 1); + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x07, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Numbering plan (MSB): (%d)", + ansi_637_bigbuf, + ((oct & 0x07) << 1) | ((oct2 & 0x80) >> 7)); + + offset += 1; + oct = oct2; + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x80, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Numbering plan (LSB)", + ansi_637_bigbuf); + + offset += 1; + num_fields = (oct & 0x7f) << 1; + oct2 = tvb_get_guint8(tvb, offset); + num_fields |= ((oct2 & 0x80) >> 7); + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x7f, 8); + proto_tree_add_text(tree, tvb, offset-1, 1, + "%s : Number of fields (MSB): (%d)", + ansi_637_bigbuf, + num_fields); + + other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0x80, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Number of fields (LSB)", + ansi_637_bigbuf); + + if (num_fields == 0) return; + + if (num_fields > (len - 3)) + { + proto_tree_add_text(tree, tvb, offset, 1, + "Missing %d octet(s) for number of fields", + (num_fields + 3) - len); + + return; + } + + other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0x7f, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Most significant bits of first field", + ansi_637_bigbuf); + + offset += 1; + oct = oct2; + + i = 0; + while (i < num_fields) + { + ansi_637_bigbuf[i] = (oct & 0x7f) << 1; + ansi_637_bigbuf[i] |= ((oct = tvb_get_guint8(tvb, offset+i)) & 0x80) >> 7; + i += 1; + } + ansi_637_bigbuf[i] = '\0'; + + proto_tree_add_text(tree, tvb, offset, num_fields - 1, + "Number: %s", + ansi_637_bigbuf); + + offset += (num_fields - 1); + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x80, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Least significant bit of last field", + ansi_637_bigbuf); + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x7f, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Reserved", + ansi_637_bigbuf); + } } else { - offset++; - num_fields = (oct & 0x3f) << 2; - oct2 = tvb_get_guint8(tvb, offset); - num_fields |= ((oct2 & 0xc0) >> 6); - - other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x3f, 8); - proto_tree_add_text(tree, tvb, offset-1, 1, - "%s : Number of fields (MSB): (%d)", - ansi_637_bigbuf, - num_fields); - - other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0xc0, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Number of fields (LSB)", - ansi_637_bigbuf); - - oct = oct2; - odd = FALSE; - - if (num_fields > 0) - { - i = (num_fields - 1) * 4; - required_octs = (i / 8) + ((i % 8) ? 1 : 0); - - if (required_octs + 2 > len) - { - proto_tree_add_text(tree, tvb, offset, 1, - "Missing %d octet(s) for number of fields", - (required_octs + 2) - len); - - return; - } - - odd = num_fields & 0x01; - memset((void *) ansi_637_bigbuf, 0, sizeof(ansi_637_bigbuf)); - saved_offset = offset; - offset++; - - i = 0; - while (i < num_fields) - { - ansi_637_bigbuf[i] = - air_digits[(oct & 0x3c) >> 2]; - - i++; - if (i >= num_fields) break; - - oct2 = tvb_get_guint8(tvb, offset); - offset++; - - ansi_637_bigbuf[i] = - air_digits[((oct & 0x03) << 2) | ((oct2 & 0xc0) >> 6)]; - - oct = oct2; - - i++; - } - - proto_tree_add_text(tree, tvb, saved_offset, offset - saved_offset, - "Number: %s", - ansi_637_bigbuf); - } - - other_decode_bitfield_value(ansi_637_bigbuf, oct, odd ? 0x03: 0x3f, 8); - proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reserved", - ansi_637_bigbuf); + offset += 1; + num_fields = (oct & 0x3f) << 2; + oct2 = tvb_get_guint8(tvb, offset); + num_fields |= ((oct2 & 0xc0) >> 6); + + other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x3f, 8); + proto_tree_add_text(tree, tvb, offset-1, 1, + "%s : Number of fields (MSB): (%d)", + ansi_637_bigbuf, + num_fields); + + other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0xc0, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Number of fields (LSB)", + ansi_637_bigbuf); + + oct = oct2; + odd = FALSE; + + if (num_fields > 0) + { + i = (num_fields - 1) * 4; + required_octs = (i / 8) + ((i % 8) ? 1 : 0); + + if (required_octs + 2 > len) + { + proto_tree_add_text(tree, tvb, offset, 1, + "Missing %d octet(s) for number of fields", + (required_octs + 2) - len); + + return; + } + + odd = num_fields & 0x01; + memset((void *) ansi_637_bigbuf, 0, sizeof(ansi_637_bigbuf)); + saved_offset = offset; + offset += 1; + + i = 0; + while (i < num_fields) + { + ansi_637_bigbuf[i] = + air_digits[(oct & 0x3c) >> 2]; + + i += 1; + if (i >= num_fields) break; + + oct2 = tvb_get_guint8(tvb, offset); + offset += 1; + + ansi_637_bigbuf[i] = + air_digits[((oct & 0x03) << 2) | ((oct2 & 0xc0) >> 6)]; + + oct = oct2; + + i += 1; + } + + proto_tree_add_text(tree, tvb, saved_offset, offset - saved_offset, + "Number: %s", + ansi_637_bigbuf); + } + + other_decode_bitfield_value(ansi_637_bigbuf, oct, odd ? 0x03: 0x3f, 8); + proto_tree_add_text(tree, tvb, offset, 1, + "%s : Reserved", + ansi_637_bigbuf); } } static void trans_param_subaddress(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, gchar *add_string _U_, int string_len _U_) { - guint8 oct, oct2, num_fields; - guint32 i; - const gchar *str; + guint8 oct, oct2, num_fields; + guint32 i; + const gchar *str; SHORT_DATA_CHECK(len, 2); @@ -1646,115 +1645,115 @@ trans_param_subaddress(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offse case 0: str = "NSAP (CCITT Recommendation X.213 or ISO 8348 AD2)"; break; case 1: str = "User-specified"; break; default: - str = "Reserved"; - break; + str = "Reserved"; + break; } other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xe0, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Type: %s", - ansi_637_bigbuf, - str); + "%s : Type: %s", + ansi_637_bigbuf, + str); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x10, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Odd", - ansi_637_bigbuf); + "%s : Odd", + ansi_637_bigbuf); - offset++; + offset += 1; num_fields = (oct & 0x0f) << 4; oct2 = tvb_get_guint8(tvb, offset); num_fields |= ((oct2 & 0xf0) >> 4); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x0f, 8); proto_tree_add_text(tree, tvb, offset-1, 1, - "%s : Number of fields (MSB): (%d)", - ansi_637_bigbuf, - num_fields); + "%s : Number of fields (MSB): (%d)", + ansi_637_bigbuf, + num_fields); other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0xf0, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Number of fields (LSB)", - ansi_637_bigbuf); + "%s : Number of fields (LSB)", + ansi_637_bigbuf); if (num_fields == 0) return; if (num_fields > (len - 2)) { - proto_tree_add_text(tree, tvb, offset, 1, - "Missing %d octet(s) for number of fields", - (num_fields + 2) - len); + proto_tree_add_text(tree, tvb, offset, 1, + "Missing %d octet(s) for number of fields", + (num_fields + 2) - len); - return; + return; } other_decode_bitfield_value(ansi_637_bigbuf, oct2, 0x0f, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Most significant bits of first field", - ansi_637_bigbuf); + "%s : Most significant bits of first field", + ansi_637_bigbuf); - offset++; + offset += 1; oct = oct2; i = 0; while (i < num_fields) { - ansi_637_bigbuf[i] = (oct & 0x0f) << 4; - ansi_637_bigbuf[i] |= ((oct = tvb_get_guint8(tvb, offset+i)) & 0xf0) >> 4; - i++; + ansi_637_bigbuf[i] = (oct & 0x0f) << 4; + ansi_637_bigbuf[i] |= ((oct = tvb_get_guint8(tvb, offset+i)) & 0xf0) >> 4; + i += 1; } ansi_637_bigbuf[i] = '\0'; proto_tree_add_bytes(tree, hf_ansi_637_trans_bin_addr, tvb, offset, num_fields - 1, - (guint8*)ansi_637_bigbuf); + (guint8*)ansi_637_bigbuf); offset += (num_fields - 1); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xf0, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Least significant bits of last field", - ansi_637_bigbuf); + "%s : Least significant bits of last field", + ansi_637_bigbuf); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x0f, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reserved", - ansi_637_bigbuf); + "%s : Reserved", + ansi_637_bigbuf); } static void trans_param_bearer_reply_opt(tvbuff_t *tvb, proto_tree *tree, guint len _U_, guint32 offset, gchar *add_string, int string_len) { - guint8 oct; + guint8 oct; oct = tvb_get_guint8(tvb, offset); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xfc, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reply Sequence Number: %d", - ansi_637_bigbuf, - (oct & 0xfc) >> 2); + "%s : Reply Sequence Number: %d", + ansi_637_bigbuf, + (oct & 0xfc) >> 2); g_snprintf(add_string, string_len, " - Reply Sequence Number (%d)", (oct & 0xfc) >> 2); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x03, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reserved", - ansi_637_bigbuf); + "%s : Reserved", + ansi_637_bigbuf); } static void trans_param_cause_codes(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, gchar *add_string, int string_len) { - guint8 oct; - const gchar *str = NULL; + guint8 oct; + const gchar *str = NULL; oct = tvb_get_guint8(tvb, offset); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0xfc, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Reply Sequence Number: %d", - ansi_637_bigbuf, - (oct & 0xfc) >> 2); + "%s : Reply Sequence Number: %d", + ansi_637_bigbuf, + (oct & 0xfc) >> 2); switch (oct & 0x03) { @@ -1762,19 +1761,19 @@ trans_param_cause_codes(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offs case 0x02: str = "Temporary Condition"; break; case 0x03: str = "Permanent Condition"; break; default: - str = "Reserved"; - break; + str = "Reserved"; + break; } g_snprintf(add_string, string_len, " - Reply Sequence Number (%d)", (oct & 0xfc) >> 2); other_decode_bitfield_value(ansi_637_bigbuf, oct, 0x03, 8); proto_tree_add_text(tree, tvb, offset, 1, - "%s : Error Class: %s", - ansi_637_bigbuf, - str); + "%s : Error Class: %s", + ansi_637_bigbuf, + str); - offset++; + offset += 1; if (!(oct & 0x03)) return; @@ -1784,29 +1783,29 @@ trans_param_cause_codes(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offs switch (oct) { - case 0: str = "Address vacant"; break; - case 1: str = "Address translation failure"; break; - case 2: str = "Network resource shortage"; break; - case 3: str = "Network failure"; break; - case 4: str = "Invalid Teleservice ID"; break; - case 5: str = "Other network problem"; break; - case 6: str = "Unsupported network interface"; break; - case 32: str = "No page response"; break; - case 33: str = "Destination busy"; break; - case 34: str = "No acknowledgement"; break; - case 35: str = "Destination resource shortage"; break; - case 36: str = "SMS delivery postponed"; break; - case 37: str = "Destination out of service"; break; - case 38: str = "Destination no longer at this address"; break; - case 39: str = "Other terminal problem"; break; - case 64: str = "Radio interface resource shortage"; break; - case 65: str = "Radio interface incompatibility"; break; - case 66: str = "Other radio interface problem"; break; - case 67: str = "Unsupported Base Station Capability"; break; - case 96: str = "Encoding problem"; break; - case 97: str = "Service origination denied"; break; - case 98: str = "Service termination denied"; break; - case 99: str = "Supplementary service not supported"; break; + case 0: str = "Address vacant"; break; + case 1: str = "Address translation failure"; break; + case 2: str = "Network resource shortage"; break; + case 3: str = "Network failure"; break; + case 4: str = "Invalid Teleservice ID"; break; + case 5: str = "Other network problem"; break; + case 6: str = "Unsupported network interface"; break; + case 32: str = "No page response"; break; + case 33: str = "Destination busy"; break; + case 34: str = "No acknowledgement"; break; + case 35: str = "Destination resource shortage"; break; + case 36: str = "SMS delivery postponed"; break; + case 37: str = "Destination out of service"; break; + case 38: str = "Destination no longer at this address"; break; + case 39: str = "Other terminal problem"; break; + case 64: str = "Radio interface resource shortage"; break; + case 65: str = "Radio interface incompatibility"; break; + case 66: str = "Other radio interface problem"; break; + case 67: str = "Unsupported Base Station Capability"; break; + case 96: str = "Encoding problem"; break; + case 97: str = "Service origination denied"; break; + case 98: str = "Service termination denied"; break; + case 99: str = "Supplementary service not supported"; break; case 100: str = "Service not supported"; break; case 101: str = "Reserved"; break; case 102: str = "Missing expected parameter"; break; @@ -1817,26 +1816,26 @@ trans_param_cause_codes(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offs case 107: str = "Other general problems"; break; case 108: str = "Session not active"; break; default: - if ((oct >= 7) && (oct <= 31)) { str = "Reserved, treat as Other network problem"; } - else if ((oct >= 40) && (oct <= 47)) { str = "Reserved, treat as Other terminal problem"; } - else if ((oct >= 48) && (oct <= 63)) { str = "Reserved, treat as SMS delivery postponed"; } - else if ((oct >= 68) && (oct <= 95)) { str = "Reserved, treat as Other radio interface problem"; } - else if ((oct >= 109) && (oct <= 223)) { str = "Reserved, treat as Other general problems"; } - else { str = "Reserved for protocol extension, treat as Other general problems"; } - break; + if ((oct >= 7) && (oct <= 31)) { str = "Reserved, treat as Other network problem"; } + else if ((oct >= 40) && (oct <= 47)) { str = "Reserved, treat as Other terminal problem"; } + else if ((oct >= 48) && (oct <= 63)) { str = "Reserved, treat as SMS delivery postponed"; } + else if ((oct >= 68) && (oct <= 95)) { str = "Reserved, treat as Other radio interface problem"; } + else if ((oct >= 109) && (oct <= 223)) { str = "Reserved, treat as Other general problems"; } + else { str = "Reserved for protocol extension, treat as Other general problems"; } + break; } proto_tree_add_text(tree, tvb, offset, 1, - "%s", str); + "%s", str); } static void trans_param_bearer_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, gchar *add_string _U_, int string_len _U_) { - tvbuff_t *tele_tvb; + tvbuff_t *tele_tvb; proto_tree_add_text(tree, tvb, offset, len, - "Bearer Data"); + "Bearer Data"); /* * dissect the embedded teleservice data @@ -1844,25 +1843,25 @@ trans_param_bearer_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offs tele_tvb = tvb_new_subset(tvb, offset, len, len); dissector_try_uint(tele_dissector_table, ansi_637_trans_tele_id, - tele_tvb, g_pinfo, g_tree); + tele_tvb, g_pinfo, g_tree); } -#define NUM_TRANS_PARAM (sizeof(ansi_trans_param_strings)/sizeof(value_string)) +#define NUM_TRANS_PARAM (sizeof(ansi_trans_param_strings)/sizeof(value_string)) static gint ett_ansi_637_trans_param[NUM_TRANS_PARAM]; static void (*ansi_637_trans_param_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset, gchar *add_string, int string_len) = { - trans_param_tele_id, /* Teleservice Identifier */ - trans_param_srvc_cat, /* Service Category */ - trans_param_address, /* Originating Address */ - trans_param_subaddress, /* Originating Subaddress */ - trans_param_address, /* Destination Address */ - trans_param_subaddress, /* Destination Subaddress */ - trans_param_bearer_reply_opt, /* Bearer Reply Option */ - trans_param_cause_codes, /* Cause Codes */ - trans_param_bearer_data, /* Bearer Data */ - NULL, /* NONE */ + trans_param_tele_id, /* Teleservice Identifier */ + trans_param_srvc_cat, /* Service Category */ + trans_param_address, /* Originating Address */ + trans_param_subaddress, /* Originating Subaddress */ + trans_param_address, /* Destination Address */ + trans_param_subaddress, /* Destination Subaddress */ + trans_param_bearer_reply_opt, /* Bearer Reply Option */ + trans_param_cause_codes, /* Cause Codes */ + trans_param_bearer_data, /* Bearer Data */ + NULL, /* NONE */ }; -#define NUM_TRANS_MSG_TYPE (sizeof(ansi_trans_msg_type_strings)/sizeof(value_string)) +#define NUM_TRANS_MSG_TYPE (sizeof(ansi_trans_msg_type_strings)/sizeof(value_string)) static gint ett_ansi_637_trans_msg[NUM_TRANS_MSG_TYPE]; /* GENERIC IS-637 DISSECTOR FUNCTIONS */ @@ -1870,14 +1869,14 @@ static gint ett_ansi_637_trans_msg[NUM_TRANS_MSG_TYPE]; static gboolean dissect_ansi_637_tele_param(tvbuff_t *tvb, proto_tree *tree, guint32 *offset) { - void (*param_fcn)(tvbuff_t *, proto_tree *, guint, guint32) = NULL; - guint8 oct; - guint8 len; - guint32 curr_offset; - gint ett_param_idx, idx; - proto_tree *subtree; - proto_item *item; - const gchar *str = NULL; + void (*param_fcn)(tvbuff_t *, proto_tree *, guint, guint32) = NULL; + guint8 oct; + guint8 len; + guint32 curr_offset; + gint ett_param_idx, idx; + proto_tree *subtree; + proto_item *item; + const gchar *str = NULL; curr_offset = *offset; @@ -1887,44 +1886,44 @@ dissect_ansi_637_tele_param(tvbuff_t *tvb, proto_tree *tree, guint32 *offset) if (NULL == str) { - return(FALSE); + return(FALSE); } ett_param_idx = ett_ansi_637_tele_param[idx]; param_fcn = ansi_637_tele_param_fcn[idx]; item = - proto_tree_add_text(tree, tvb, curr_offset, -1, "%s", str); + proto_tree_add_text(tree, tvb, curr_offset, -1, "%s", str); subtree = proto_item_add_subtree(item, ett_param_idx); proto_tree_add_uint(subtree, hf_ansi_637_tele_subparam_id, - tvb, curr_offset, 1, oct); + tvb, curr_offset, 1, oct); - curr_offset++; + curr_offset += 1; len = tvb_get_guint8(tvb, curr_offset); proto_item_set_len(item, (curr_offset - *offset) + len + 1); proto_tree_add_uint(subtree, hf_ansi_637_tele_length, - tvb, curr_offset, 1, len); + tvb, curr_offset, 1, len); - curr_offset++; + curr_offset += 1; if (len > 0) { - if (param_fcn == NULL) - { - proto_tree_add_text(subtree, tvb, curr_offset, - len, "Parameter Data"); - } - else - { - (*param_fcn)(tvb, subtree, len, curr_offset); - } - - curr_offset += len; + if (param_fcn == NULL) + { + proto_tree_add_text(subtree, tvb, curr_offset, + len, "Parameter Data"); + } + else + { + (*param_fcn)(tvb, subtree, len, curr_offset); + } + + curr_offset += len; } *offset = curr_offset; @@ -1935,31 +1934,31 @@ dissect_ansi_637_tele_param(tvbuff_t *tvb, proto_tree *tree, guint32 *offset) static void dissect_ansi_637_tele_message(tvbuff_t *tvb, proto_tree *ansi_637_tree) { - guint8 len; - guint32 curr_offset; + guint8 len; + guint32 curr_offset; curr_offset = 0; len = tvb_length(tvb); while ((len - curr_offset) > 0) { - if (!dissect_ansi_637_tele_param(tvb, ansi_637_tree, &curr_offset)) - { - proto_tree_add_text(ansi_637_tree, tvb, curr_offset, len - curr_offset, - "Unknown Parameter Data"); - break; - } + if (!dissect_ansi_637_tele_param(tvb, ansi_637_tree, &curr_offset)) + { + proto_tree_add_text(ansi_637_tree, tvb, curr_offset, len - curr_offset, + "Unknown Parameter Data"); + break; + } } } static void dissect_ansi_637_tele(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_item *ansi_637_item; - proto_tree *ansi_637_tree = NULL; - const gchar *str = NULL; - guint32 value; - void* pd_save; + proto_item *ansi_637_item; + proto_tree *ansi_637_tree = NULL; + const gchar *str = NULL; + guint32 value; + void *pd_save; col_set_str(pinfo->cinfo, COL_PROTOCOL, ansi_proto_name_short); @@ -1968,110 +1967,110 @@ dissect_ansi_637_tele(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) */ if (tree) { - pd_save = pinfo->private_data; - pinfo->private_data = NULL; - g_pinfo = pinfo; - g_tree = tree; - - value = pinfo->match_uint; - - /* - * create the ansi_637 protocol tree - */ - str = try_val_to_str(value, ansi_tele_id_strings); - - if (NULL == str) - { - switch (value) - { - case 1: - str = "Reserved for maintenance"; - break; - case 4102: - str = "CDMA Service Category Programming Teleservice (SCPT)"; - break; - case 4103: - str = "CDMA Card Application Toolkit Protocol Teleservice (CATPT)"; - break; - case 32513: - str = "TDMA Cellular Messaging Teleservice"; - break; - case 32514: - str = "TDMA Cellular Paging Teleservice (CPT-136)"; - break; - case 32515: - str = "TDMA Over-the-Air Activation Teleservice (OATS)"; - break; - case 32520: - str = "TDMA System Assisted Mobile Positioning through Satellite (SAMPS)"; - break; - case 32584: - str = "TDMA Segmented System Assisted Mobile Positioning Service"; - break; - default: - if ((value >= 2) && (value <= 4095)) - { - str = "Reserved for assignment by TIA-41"; - } - else if ((value >= 4104) && (value <= 4113)) - { - str = "Reserved for GSM1x Teleservice (CDMA)"; - } - else if ((value >= 4114) && (value <= 32512)) - { - str = "Reserved for assignment by TIA-41"; - } - else if ((value >= 32521) && (value <= 32575)) - { - str = "Reserved for assignment by this Standard for TDMA MS-based SMEs"; - } - else if ((value >= 49152) && (value < 65535)) - { - str = "Reserved for carrier specific teleservices"; - } - else if (value == 65535) - { - /* - * supposed to be "Reserved for carrier specific teleservices" - * but we are using it to key SMS Broadcast dissection where - * there is no teleservice ID - */ - str = "(Reserved) Being used for Broadcast"; - } - else - { - str = "Unrecognized Teleservice ID"; - } - break; - } - } - - ansi_637_item = - proto_tree_add_protocol_format(tree, proto_ansi_637_tele, tvb, 0, -1, - "%s - %s (%d)", - ansi_proto_name_tele, - str, - pinfo->match_uint); - - ansi_637_tree = - proto_item_add_subtree(ansi_637_item, ett_ansi_637_tele); - - dissect_ansi_637_tele_message(tvb, ansi_637_tree); - pinfo->private_data = pd_save; + pd_save = pinfo->private_data; + pinfo->private_data = NULL; + g_pinfo = pinfo; + g_tree = tree; + + value = pinfo->match_uint; + + /* + * create the ansi_637 protocol tree + */ + str = try_val_to_str(value, ansi_tele_id_strings); + + if (NULL == str) + { + switch (value) + { + case 1: + str = "Reserved for maintenance"; + break; + case 4102: + str = "CDMA Service Category Programming Teleservice (SCPT)"; + break; + case 4103: + str = "CDMA Card Application Toolkit Protocol Teleservice (CATPT)"; + break; + case 32513: + str = "TDMA Cellular Messaging Teleservice"; + break; + case 32514: + str = "TDMA Cellular Paging Teleservice (CPT-136)"; + break; + case 32515: + str = "TDMA Over-the-Air Activation Teleservice (OATS)"; + break; + case 32520: + str = "TDMA System Assisted Mobile Positioning through Satellite (SAMPS)"; + break; + case 32584: + str = "TDMA Segmented System Assisted Mobile Positioning Service"; + break; + default: + if ((value >= 2) && (value <= 4095)) + { + str = "Reserved for assignment by TIA-41"; + } + else if ((value >= 4104) && (value <= 4113)) + { + str = "Reserved for GSM1x Teleservice (CDMA)"; + } + else if ((value >= 4114) && (value <= 32512)) + { + str = "Reserved for assignment by TIA-41"; + } + else if ((value >= 32521) && (value <= 32575)) + { + str = "Reserved for assignment by this Standard for TDMA MS-based SMEs"; + } + else if ((value >= 49152) && (value < 65535)) + { + str = "Reserved for carrier specific teleservices"; + } + else if (value == 65535) + { + /* + * supposed to be "Reserved for carrier specific teleservices" + * but we are using it to key SMS Broadcast dissection where + * there is no teleservice ID + */ + str = "(Reserved) Being used for Broadcast"; + } + else + { + str = "Unrecognized Teleservice ID"; + } + break; + } + } + + ansi_637_item = + proto_tree_add_protocol_format(tree, proto_ansi_637_tele, tvb, 0, -1, + "%s - %s (%d)", + ansi_proto_name_tele, + str, + pinfo->match_uint); + + ansi_637_tree = + proto_item_add_subtree(ansi_637_item, ett_ansi_637_tele); + + dissect_ansi_637_tele_message(tvb, ansi_637_tree); + pinfo->private_data = pd_save; } } static gboolean dissect_ansi_637_trans_param(tvbuff_t *tvb, proto_tree *tree, guint32 *offset) { - void (*param_fcn)(tvbuff_t *, proto_tree *, guint, guint32, gchar *, int) = NULL; - guint8 oct; - guint8 len; - guint32 curr_offset; - gint ett_param_idx, idx; - proto_tree *subtree; - proto_item *item; - const gchar *str = NULL; + void (*param_fcn)(tvbuff_t *, proto_tree *, guint, guint32, gchar *, int) = NULL; + guint8 oct; + guint8 len; + guint32 curr_offset; + gint ett_param_idx, idx; + proto_tree *subtree; + proto_item *item; + const gchar *str = NULL; curr_offset = *offset; @@ -2080,53 +2079,53 @@ dissect_ansi_637_trans_param(tvbuff_t *tvb, proto_tree *tree, guint32 *offset) if (NULL == str) { - return(FALSE); + return(FALSE); } ett_param_idx = ett_ansi_637_trans_param[idx]; param_fcn = ansi_637_trans_param_fcn[idx]; item = - proto_tree_add_text(tree, tvb, curr_offset, -1, "%s", str); + proto_tree_add_text(tree, tvb, curr_offset, -1, "%s", str); subtree = proto_item_add_subtree(item, ett_param_idx); proto_tree_add_uint(subtree, hf_ansi_637_trans_param_id, - tvb, curr_offset, 1, oct); + tvb, curr_offset, 1, oct); - curr_offset++; + curr_offset += 1; len = tvb_get_guint8(tvb, curr_offset); proto_item_set_len(item, (curr_offset - *offset) + len + 1); proto_tree_add_uint(subtree, hf_ansi_637_trans_length, - tvb, curr_offset, 1, len); + tvb, curr_offset, 1, len); - curr_offset++; + curr_offset += 1; if (len > 0) { - if (param_fcn == NULL) - { - proto_tree_add_text(subtree, tvb, curr_offset, - len, "Parameter Data"); - } - else - { + if (param_fcn == NULL) + { + proto_tree_add_text(subtree, tvb, curr_offset, + len, "Parameter Data"); + } + else + { gchar *ansi_637_add_string; - ansi_637_add_string = (gchar *)wmem_alloc(wmem_packet_scope(), 1024); - ansi_637_add_string[0] = '\0'; - (*param_fcn)(tvb, subtree, len, curr_offset, ansi_637_add_string, 1024); + ansi_637_add_string = (gchar *)wmem_alloc(wmem_packet_scope(), 1024); + ansi_637_add_string[0] = '\0'; + (*param_fcn)(tvb, subtree, len, curr_offset, ansi_637_add_string, 1024); - if (ansi_637_add_string[0] != '\0') - { - proto_item_append_text(item, "%s", ansi_637_add_string); - } - } + if (ansi_637_add_string[0] != '\0') + { + proto_item_append_text(item, "%s", ansi_637_add_string); + } + } - curr_offset += len; + curr_offset += len; } *offset = curr_offset; @@ -2138,14 +2137,14 @@ dissect_ansi_637_trans_param(tvbuff_t *tvb, proto_tree *tree, guint32 *offset) static void dissect_ansi_637_trans(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_item *ansi_637_item; - proto_tree *ansi_637_tree = NULL; - guint32 curr_offset; - gint idx; - const gchar *str = NULL; - guint8 oct; - guint8 len; - void* pd_save; + proto_item *ansi_637_item; + proto_tree *ansi_637_tree = NULL; + guint32 curr_offset; + gint idx; + const gchar *str = NULL; + guint8 oct; + guint8 len; + void *pd_save; col_set_str(pinfo->cinfo, COL_PROTOCOL, ansi_proto_name_short); @@ -2154,71 +2153,71 @@ dissect_ansi_637_trans(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) */ if (tree) { - pd_save = pinfo->private_data; - pinfo->private_data = NULL; - g_pinfo = pinfo; - g_tree = tree; - - /* - * reset the teleservice ID for each dissection - */ - ansi_637_trans_tele_id = 0; - - /* - * create the ansi_637 protocol tree - */ - oct = tvb_get_guint8(tvb, 0); - - str = try_val_to_str_idx(oct, ansi_trans_msg_type_strings, &idx); - - if (NULL == str) - { - ansi_637_item = - proto_tree_add_protocol_format(tree, proto_ansi_637_trans, tvb, 0, -1, - "%s - Unrecognized Transport Layer Message Type (%d)", - ansi_proto_name_trans, - oct); - - ansi_637_tree = - proto_item_add_subtree(ansi_637_item, ett_ansi_637_trans); - } - else - { - ansi_637_item = - proto_tree_add_protocol_format(tree, proto_ansi_637_trans, tvb, 0, -1, - "%s - %s", - ansi_proto_name_trans, - str); - - ansi_637_tree = - proto_item_add_subtree(ansi_637_item, ett_ansi_637_trans_msg[idx]); - - if (oct == ANSI_TRANS_MSG_TYPE_BROADCAST) - { - /* - * there is no teleservice ID for Broadcast but we want the - * bearer data to be dissected - * - * using a reserved value to key dissector port - */ - ansi_637_trans_tele_id = 65535; - } - } - - curr_offset = 1; - - len = tvb_length(tvb); - - while ((len - curr_offset) > 0) - { - if (!dissect_ansi_637_trans_param(tvb, ansi_637_tree, &curr_offset)) - { - proto_tree_add_text(ansi_637_tree, tvb, curr_offset, len - curr_offset, - "Unknown Parameter Data"); - break; - } - } - pinfo->private_data = pd_save; + pd_save = pinfo->private_data; + pinfo->private_data = NULL; + g_pinfo = pinfo; + g_tree = tree; + + /* + * reset the teleservice ID for each dissection + */ + ansi_637_trans_tele_id = 0; + + /* + * create the ansi_637 protocol tree + */ + oct = tvb_get_guint8(tvb, 0); + + str = try_val_to_str_idx(oct, ansi_trans_msg_type_strings, &idx); + + if (NULL == str) + { + ansi_637_item = + proto_tree_add_protocol_format(tree, proto_ansi_637_trans, tvb, 0, -1, + "%s - Unrecognized Transport Layer Message Type (%d)", + ansi_proto_name_trans, + oct); + + ansi_637_tree = + proto_item_add_subtree(ansi_637_item, ett_ansi_637_trans); + } + else + { + ansi_637_item = + proto_tree_add_protocol_format(tree, proto_ansi_637_trans, tvb, 0, -1, + "%s - %s", + ansi_proto_name_trans, + str); + + ansi_637_tree = + proto_item_add_subtree(ansi_637_item, ett_ansi_637_trans_msg[idx]); + + if (oct == ANSI_TRANS_MSG_TYPE_BROADCAST) + { + /* + * there is no teleservice ID for Broadcast but we want the + * bearer data to be dissected + * + * using a reserved value to key dissector port + */ + ansi_637_trans_tele_id = 65535; + } + } + + curr_offset = 1; + + len = tvb_length(tvb); + + while ((len - curr_offset) > 0) + { + if (!dissect_ansi_637_trans_param(tvb, ansi_637_tree, &curr_offset)) + { + proto_tree_add_text(ansi_637_tree, tvb, curr_offset, len - curr_offset, + "Unknown Parameter Data"); + break; + } + } + pinfo->private_data = pd_save; } } /* Dissect SMS embedded in SIP */ @@ -2233,74 +2232,74 @@ dissect_ansi_637_trans_app(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) void proto_register_ansi_637(void) { - guint i; + guint i; /* Setup list of header fields */ static hf_register_info hf_trans[] = { #if 0 - { &hf_ansi_637_trans_msg_type, - { "Message Type", - "ansi_637_trans.msg_type", - FT_UINT24, BASE_DEC, VALS(ansi_trans_msg_type_strings), 0xf00000, - NULL, HFILL }}, + { &hf_ansi_637_trans_msg_type, + { "Message Type", + "ansi_637_trans.msg_type", + FT_UINT24, BASE_DEC, VALS(ansi_trans_msg_type_strings), 0xf00000, + NULL, HFILL }}, #endif - { &hf_ansi_637_trans_param_id, - { "Transport Param ID", "ansi_637_trans.param_id", - FT_UINT8, BASE_DEC, VALS(ansi_trans_param_strings), 0, - NULL, HFILL }}, - { &hf_ansi_637_trans_length, - { "Length", "ansi_637_trans.len", - FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_ansi_637_trans_bin_addr, - { "Binary Address", "ansi_637_trans.bin_addr", - FT_BYTES, BASE_NONE, 0, 0, - NULL, HFILL }}, - }; + { &hf_ansi_637_trans_param_id, + { "Transport Param ID", "ansi_637_trans.param_id", + FT_UINT8, BASE_DEC, VALS(ansi_trans_param_strings), 0, + NULL, HFILL }}, + { &hf_ansi_637_trans_length, + { "Length", "ansi_637_trans.len", + FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_ansi_637_trans_bin_addr, + { "Binary Address", "ansi_637_trans.bin_addr", + FT_BYTES, BASE_NONE, 0, 0, + NULL, HFILL }}, + }; static hf_register_info hf_tele[] = { - { &hf_ansi_637_tele_msg_type, - { "Message Type", - "ansi_637_tele.msg_type", - FT_UINT24, BASE_DEC, VALS(ansi_tele_msg_type_strings), 0xf00000, - NULL, HFILL }}, - { &hf_ansi_637_tele_msg_id, - { "Message ID", - "ansi_637_tele.msg_id", - FT_UINT24, BASE_DEC, NULL, 0x0ffff0, - NULL, HFILL }}, - { &hf_ansi_637_tele_msg_status, - { "Message Status", - "ansi_637_tele.msg_status", - FT_UINT8, BASE_DEC, VALS(ansi_tele_msg_status_strings), 0, - NULL, HFILL }}, - { &hf_ansi_637_tele_msg_ind, - { "Header Indicator", - "ansi_637_tele.msg_ind", - FT_UINT24, BASE_DEC, NULL, 0x000008, - NULL, HFILL }}, - { &hf_ansi_637_tele_msg_rsvd, - { "Reserved", - "ansi_637_tele.msg_rsvd", - FT_UINT24, BASE_DEC, NULL, 0x000007, - NULL, HFILL }}, - { &hf_ansi_637_tele_length, - { "Length", "ansi_637_tele.len", - FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL }}, - { &hf_ansi_637_tele_subparam_id, - { "Teleservice Subparam ID", "ansi_637_tele.subparam_id", - FT_UINT8, BASE_DEC, VALS(ansi_tele_param_strings), 0, - NULL, HFILL }}, - { &hf_ansi_637_tele_user_data_text, - { "Encoded user data", "ansi_637_tele.user_data.text", - FT_STRING, BASE_NONE, NULL, 0, - NULL, HFILL }}, + { &hf_ansi_637_tele_msg_type, + { "Message Type", + "ansi_637_tele.msg_type", + FT_UINT24, BASE_DEC, VALS(ansi_tele_msg_type_strings), 0xf00000, + NULL, HFILL }}, + { &hf_ansi_637_tele_msg_id, + { "Message ID", + "ansi_637_tele.msg_id", + FT_UINT24, BASE_DEC, NULL, 0x0ffff0, + NULL, HFILL }}, + { &hf_ansi_637_tele_msg_status, + { "Message Status", + "ansi_637_tele.msg_status", + FT_UINT8, BASE_DEC, VALS(ansi_tele_msg_status_strings), 0, + NULL, HFILL }}, + { &hf_ansi_637_tele_msg_ind, + { "Header Indicator", + "ansi_637_tele.msg_ind", + FT_UINT24, BASE_DEC, NULL, 0x000008, + NULL, HFILL }}, + { &hf_ansi_637_tele_msg_rsvd, + { "Reserved", + "ansi_637_tele.msg_rsvd", + FT_UINT24, BASE_DEC, NULL, 0x000007, + NULL, HFILL }}, + { &hf_ansi_637_tele_length, + { "Length", "ansi_637_tele.len", + FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_ansi_637_tele_subparam_id, + { "Teleservice Subparam ID", "ansi_637_tele.subparam_id", + FT_UINT8, BASE_DEC, VALS(ansi_tele_param_strings), 0, + NULL, HFILL }}, + { &hf_ansi_637_tele_user_data_text, + { "Encoded user data", "ansi_637_tele.user_data.text", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL }}, }; /* Setup protocol subtree array */ -#define NUM_INDIVIDUAL_PARAMS 3 +#define NUM_INDIVIDUAL_PARAMS 3 gint *ett[NUM_INDIVIDUAL_PARAMS+NUM_TELE_PARAM+NUM_TRANS_MSG_TYPE+NUM_TRANS_PARAM]; memset((void *) ett, 0, sizeof(ett)); @@ -2311,28 +2310,28 @@ proto_register_ansi_637(void) for (i=0; i < NUM_TELE_PARAM; i++) { - ett_ansi_637_tele_param[i] = -1; - ett[NUM_INDIVIDUAL_PARAMS+i] = &ett_ansi_637_tele_param[i]; + ett_ansi_637_tele_param[i] = -1; + ett[NUM_INDIVIDUAL_PARAMS+i] = &ett_ansi_637_tele_param[i]; } for (i=0; i < NUM_TRANS_MSG_TYPE; i++) { - ett_ansi_637_trans_msg[i] = -1; - ett[NUM_INDIVIDUAL_PARAMS+NUM_TELE_PARAM+i] = &ett_ansi_637_trans_msg[i]; + ett_ansi_637_trans_msg[i] = -1; + ett[NUM_INDIVIDUAL_PARAMS+NUM_TELE_PARAM+i] = &ett_ansi_637_trans_msg[i]; } for (i=0; i < NUM_TRANS_PARAM; i++) { - ett_ansi_637_trans_param[i] = -1; - ett[NUM_INDIVIDUAL_PARAMS+NUM_TELE_PARAM+NUM_TRANS_MSG_TYPE+i] = &ett_ansi_637_trans_param[i]; + ett_ansi_637_trans_param[i] = -1; + ett[NUM_INDIVIDUAL_PARAMS+NUM_TELE_PARAM+NUM_TRANS_MSG_TYPE+i] = &ett_ansi_637_trans_param[i]; } /* Register the protocol name and description */ proto_ansi_637_tele = - proto_register_protocol(ansi_proto_name_tele, "ANSI IS-637-A Teleservice", "ansi_637_tele"); + proto_register_protocol(ansi_proto_name_tele, "ANSI IS-637-A Teleservice", "ansi_637_tele"); proto_ansi_637_trans = - proto_register_protocol(ansi_proto_name_trans, "ANSI IS-637-A Transport", "ansi_637_trans"); + proto_register_protocol(ansi_proto_name_trans, "ANSI IS-637-A Transport", "ansi_637_trans"); ansi_637_tele_handle = register_dissector("ansi_637_tele", dissect_ansi_637_tele, proto_ansi_637_tele); ansi_637_trans_handle = register_dissector("ansi_637_trans", dissect_ansi_637_trans, proto_ansi_637_trans); @@ -2343,16 +2342,16 @@ proto_register_ansi_637(void) proto_register_subtree_array(ett, array_length(ett)); tele_dissector_table = - register_dissector_table("ansi_637.tele_id", - "ANSI IS-637-A Teleservice ID", FT_UINT8, BASE_DEC); + register_dissector_table("ansi_637.tele_id", + "ANSI IS-637-A Teleservice ID", FT_UINT8, BASE_DEC); } void proto_reg_handoff_ansi_637(void) { - dissector_handle_t ansi_637_trans_app_handle; - guint i; + dissector_handle_t ansi_637_trans_app_handle; + guint i; ansi_637_trans_app_handle = create_dissector_handle(dissect_ansi_637_trans_app, proto_ansi_637_trans); @@ -2366,15 +2365,15 @@ proto_reg_handoff_ansi_637(void) */ for (i=0; i < ((sizeof(ansi_tele_id_strings)/sizeof(value_string))-1); i++) { - /* - * ANSI MAP dissector will push out teleservice ids - */ - dissector_add_uint("ansi_map.tele_id", ansi_tele_id_strings[i].value, ansi_637_tele_handle); - - /* - * we will push out teleservice ids after Transport layer decode - */ - dissector_add_uint("ansi_637.tele_id", ansi_tele_id_strings[i].value, ansi_637_tele_handle); + /* + * ANSI MAP dissector will push out teleservice ids + */ + dissector_add_uint("ansi_map.tele_id", ansi_tele_id_strings[i].value, ansi_637_tele_handle); + + /* + * we will push out teleservice ids after Transport layer decode + */ + dissector_add_uint("ansi_637.tele_id", ansi_tele_id_strings[i].value, ansi_637_tele_handle); } /* |