diff options
author | Sylvain Munaut <tnt@246tNt.com> | 2015-01-03 01:36:19 +0100 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2015-01-04 10:51:49 +0000 |
commit | 98ba63005ca9de7f1f36baee469fc4b9bc37bdc2 (patch) | |
tree | 4deea9fbceb41d875dcd0fe3b5e664ad8029a37b /epan | |
parent | a22ea3dc52b8f19a155fb6e531bf548c05a3046b (diff) |
gmr1_rach: Fixup the MOC Dialled Number decoding
Turns out the special values 1023/1022/1021 can happen in any group
and not just the last one.
The last one is still special though with codes [1100->1209] being
exclusive to it.
Change-Id: If86d0260aaa2cc1215560b89d7fc57d7ef21f082
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Reviewed-on: https://code.wireshark.org/review/6290
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-gmr1_rach.c | 111 |
1 files changed, 77 insertions, 34 deletions
diff --git a/epan/dissectors/packet-gmr1_rach.c b/epan/dissectors/packet-gmr1_rach.c index 8f1e7e835e..298c2b1712 100644 --- a/epan/dissectors/packet-gmr1_rach.c +++ b/epan/dissectors/packet-gmr1_rach.c @@ -302,12 +302,6 @@ static const value_string rach_pd_vals[] = { static void rach_dialed_num_grp1234_fmt(gchar *s, guint32 v) { - g_snprintf(s, ITEM_LABEL_LENGTH, "%03d", v); -} - -static void -rach_dialed_num_grp5_fmt(gchar *s, guint32 v) -{ if (v <= 999) { g_snprintf(s, ITEM_LABEL_LENGTH, "%03d", v); } else if (v == 1023) { @@ -316,17 +310,25 @@ rach_dialed_num_grp5_fmt(gchar *s, guint32 v) } else if (v == 1022) { g_snprintf(s, ITEM_LABEL_LENGTH, "First two digits in the preceding group are valid, " - "and the third digit (i.e. 0) is padding(%d)", v); + "and the third digit (i.e. 0) is padding (%d)", v); } else if (v == 1021) { g_snprintf(s, ITEM_LABEL_LENGTH, "First digit in the preceding group is valid, and " - "the second and third 0s are padding(%d)", v); - } else if (v >= 1100 && v <= 1199) { + "the second and third 0s are padding (%d)", v); + } else { + g_snprintf(s, ITEM_LABEL_LENGTH, "Invalid (%d)", v); + } +} + +static void +rach_dialed_num_grp5_fmt(gchar *s, guint32 v) +{ + if (v >= 1100 && v <= 1199) { g_snprintf(s, ITEM_LABEL_LENGTH, "%02d (%d)", v - 1100, v); } else if (v >= 1200 && v <= 1209) { g_snprintf(s, ITEM_LABEL_LENGTH, "%01d (%d)", v - 1200, v); } else { - g_snprintf(s, ITEM_LABEL_LENGTH, "Invalid (%d)", v); + rach_dialed_num_grp1234_fmt(s, v); } } @@ -362,7 +364,7 @@ static int _parse_dialed_number(gchar *s, int slen, tvbuff_t *tvb, int offset) { guint16 grp[5]; - int rv; + int rv, i, done; grp[0] = ((tvb_get_guint8(tvb, offset+0) & 0x3f) << 4) | ((tvb_get_guint8(tvb, offset+1) & 0xf0) >> 4); @@ -375,29 +377,70 @@ _parse_dialed_number(gchar *s, int slen, tvbuff_t *tvb, int offset) grp[4] = ((tvb_get_guint8(tvb, offset+5) & 0x3f) << 5) | ((tvb_get_guint8(tvb, offset+6) & 0xf8) >> 3); - rv = g_snprintf(s, slen, "%03d%03d%03d", grp[0], grp[1], grp[2]); - - if (grp[4] <= 999) { - rv += g_snprintf(s + rv, ITEM_LABEL_LENGTH, - "%03d%03d", grp[3], grp[4]); - } else if (grp[4] == 1023) { - rv += g_snprintf(s + rv, ITEM_LABEL_LENGTH, - "%03d", grp[3]); - } else if (grp[4] == 1022) { - rv += g_snprintf(s + rv, ITEM_LABEL_LENGTH, - "%02d", grp[3] / 10); - } else if (grp[4] == 1021) { - rv += g_snprintf(s + rv, ITEM_LABEL_LENGTH, - "%01d", grp[3] / 100); - } else if (grp[4] >= 1100 && grp[4] <= 1199) { - rv += g_snprintf(s + rv, ITEM_LABEL_LENGTH, - "%03d%02d", grp[3], grp[4] - 1100); - } else if (grp[4] >= 1200 && grp[4] <= 1209) { - rv += g_snprintf(s + rv, ITEM_LABEL_LENGTH, - "%03d%01d", grp[3], grp[4] - 1200); - } else { - rv += g_snprintf(s + rv, ITEM_LABEL_LENGTH, - "%03d%03d (Invalid)", grp[3], grp[4]); + rv = 0; + done = 0; + + for (i=0; i<4; i++) + { + if (grp[i+1] <= 999) + { + /* All digits of group are valid */ + rv += g_snprintf(s + rv, slen - rv, "%03d", grp[i]); + } + else if (grp[i+1] == 1023) + { + /* Last group and all digits are valid */ + rv += g_snprintf(s + rv, slen - rv, "%03d", grp[i]); + done = 1; + break; + } + else if (grp[i+1] == 1022) + { + /* Last group and first two digits are valid */ + rv += g_snprintf(s + rv, slen - rv, "%02d", grp[i] / 10); + done = 1; + break; + } + else if (grp[i+1] == 1021) + { + /* Last group and first digit is valid */ + rv += g_snprintf(s + rv, slen - rv, "%01d", grp[i] / 100); + done = 1; + break; + } + else if ((i==3) && (grp[i+1] >= 1100) && (grp[i+1] <= 1209)) + { + /* All digits of group are valid */ + rv += g_snprintf(s + rv, slen - rv, "%03d", grp[i]); + } + else + { + /* Invalid */ + return g_snprintf(s, slen, "(Invalid)"); + } + } + + if (!done) { + if (grp[4] <= 999) + { + /* All digits are valid */ + rv += g_snprintf(s + rv, slen - rv, "%03d", grp[4]); + } + else if (grp[4] >= 1100 && grp[4] <= 1199) + { + /* Only two digits are valid */ + rv += g_snprintf(s + rv, slen - rv, "%02d", grp[4] - 1100); + } + else if (grp[4] >= 1200 && grp[4] <= 1209) + { + /* Only one digit is valid */ + rv += g_snprintf(s + rv, slen - rv, "%01d", grp[4] - 1200); + } + else + { + /* Invalid */ + return g_snprintf(s, slen, "(Invalid)"); + } } return rv; |