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>
This commit is contained in:
Sylvain Munaut 2015-01-03 01:36:19 +01:00 committed by Pascal Quantin
parent a22ea3dc52
commit 98ba63005c
1 changed files with 76 additions and 33 deletions

View File

@ -301,12 +301,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);
@ -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]);
rv = 0;
done = 0;
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]);
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;