diff options
author | Bill Meier <wmeier@newsguy.com> | 2013-12-13 00:44:32 +0000 |
---|---|---|
committer | Bill Meier <wmeier@newsguy.com> | 2013-12-13 00:44:32 +0000 |
commit | 721b5d266a3db568a56fde2fae9fa59bcd45b1ea (patch) | |
tree | 0daea49b9d012e380c20318c813ccf9faa4908e2 /epan/dissectors/packet-mq-pcf.c | |
parent | 2fd6bb79ea184478fb195a3882c9cfa2122b3aa5 (diff) | |
download | wireshark-721b5d266a3db568a56fde2fae9fa59bcd45b1ea.tar.gz |
Do one or more of the following:
- Convert "4 space tabs" to spaces;
- Remove some unneeded initializers;
- 'offset++' --> 'offset += 1' for consistency;
- Reformat hf[] entries;
- Rework/add whitespace;
- Adjust editor modelines (set tab-width to 8).
svn path=/trunk/; revision=54005
Diffstat (limited to 'epan/dissectors/packet-mq-pcf.c')
-rw-r--r-- | epan/dissectors/packet-mq-pcf.c | 1291 |
1 files changed, 695 insertions, 596 deletions
diff --git a/epan/dissectors/packet-mq-pcf.c b/epan/dissectors/packet-mq-pcf.c index 3be5ae118e..adedb31c70 100644 --- a/epan/dissectors/packet-mq-pcf.c +++ b/epan/dissectors/packet-mq-pcf.c @@ -98,627 +98,726 @@ static gint ett_mqpcf_cfh = -1; guint32 dissect_mqpcf_getDigits(guint uCnt) { - return (guint) log10(uCnt) + 1; + return (guint) log10(uCnt) + 1; } guint8 *dissect_mqpcf_parm_getintval(guint uPrm, guint uVal) { - value_string *pVs; - pVs = (value_string *)try_val_to_str(uPrm, GET_VALSV(MQCFINT_Parse)); - - if (pVs) - { - return (guint8 *)try_val_to_str(uVal, pVs); - } - return NULL; + value_string *pVs; + pVs = (value_string *)try_val_to_str(uPrm, GET_VALSV(MQCFINT_Parse)); + + if (pVs) + { + return (guint8 *)try_val_to_str(uVal, pVs); + } + return NULL; } void dissect_mqpcf_parm_int(tvbuff_t *tvb, proto_tree *tree, guint offset, guint uPrm, - guint uVal, int hfindex, guint iCnt, guint iMaxCnt, guint iDigit, gboolean bParse) + guint uVal, int hfindex, guint iCnt, guint iMaxCnt, guint iDigit, gboolean bParse) { - header_field_info *hfinfo; - guint8 *pVal = NULL; - - if (bParse) - pVal = dissect_mqpcf_parm_getintval(uPrm, uVal); - - hfinfo = proto_registrar_get_nth(hfindex); - - if (iMaxCnt > 1) - { - if (pVal) - { - proto_tree_add_int_format(tree, hfindex, tvb, offset, 4, uVal, - "%s[%*d]: %8d-%s", hfinfo->name, iDigit, iCnt, uVal, pVal); - } - else - { - proto_tree_add_int_format(tree, hfindex, tvb, offset, 4, uVal, - "%s[%*d]: %8x-%d", hfinfo->name, iDigit, iCnt, uVal, uVal); - } - } - else - { - if (pVal) - { - proto_tree_add_int_format_value(tree, hfindex, tvb, offset, 4, uVal, - "%8d-%s", uVal, pVal); - } - else - { - proto_tree_add_int_format_value(tree, hfindex, tvb, offset, 4, uVal, - "%8x-%d", uVal, uVal); - } - } + header_field_info *hfinfo; + guint8 *pVal = NULL; + + if (bParse) + pVal = dissect_mqpcf_parm_getintval(uPrm, uVal); + + hfinfo = proto_registrar_get_nth(hfindex); + + if (iMaxCnt > 1) + { + if (pVal) + { + proto_tree_add_int_format(tree, hfindex, tvb, offset, 4, uVal, + "%s[%*d]: %8d-%s", hfinfo->name, iDigit, iCnt, uVal, pVal); + } + else + { + proto_tree_add_int_format(tree, hfindex, tvb, offset, 4, uVal, + "%s[%*d]: %8x-%d", hfinfo->name, iDigit, iCnt, uVal, uVal); + } + } + else + { + if (pVal) + { + proto_tree_add_int_format_value(tree, hfindex, tvb, offset, 4, uVal, + "%8d-%s", uVal, pVal); + } + else + { + proto_tree_add_int_format_value(tree, hfindex, tvb, offset, 4, uVal, + "%8x-%d", uVal, uVal); + } + } } static void dissect_mqpcf_parm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *mq_tree, - guint offset, guint32 uCount, guint bLittleEndian, gboolean bParse) + guint offset, guint32 uCount, guint bLittleEndian, gboolean bParse) { - guint32 u = 0; - guint32 tOfs = 0; - guint32 uLenF; - char strPrm[256]; - guint32 uTyp; - guint32 uLen = 0; - guint32 uPrm; - guint32 uCnt; - guint32 uCCS; - guint32 uSLn; - guint32 uVal; - guint64 uVal64; - guint32 uDig; - - const char sMaxLst[] = " Max # of List reached. DECODE interrupted (actual %u of %u)"; - const char sPrmLn0[] = " MQPrm[%3u] has a zero length. DECODE Failed (MQPrm Count: %u)"; - const char sMaxPrm[] = " Max # of Parm reached. DECODE interrupted (actual %u of %u)"; - const char sPrmCnt[] = " Cnt=-1 and Length(%u) < 16. DECODE interrupted for elem %u"; - - proto_item *ti = NULL; - proto_tree *tree = NULL; - - if (uCount == (guint32)-1) - { - guint32 xOfs = offset; - - uCnt = 0; - while (tvb_length_remaining(tvb, xOfs) >= 16) - { - uLen = tvb_get_guint32_endian(tvb, xOfs + 4, bLittleEndian); - if (uLen < 16) - { - ti = proto_tree_add_text(mq_tree, tvb, xOfs, 16, sPrmCnt, uLen, uCnt); - expert_add_info(pinfo, ti, &ei_mq_pcf_PrmCnt); - break; - } - uCnt++; - xOfs += uLen; - } - uCount = uCnt; - } - - uDig = dissect_mqpcf_getDigits(uCount); - - for (u = 0; u < uCount && u < mq_pcf_maxprm; u++) - { - tOfs = offset; - uTyp = tvb_get_guint32_endian(tvb, offset , bLittleEndian); - uLen = tvb_get_guint32_endian(tvb, offset + 4, bLittleEndian); - if (uLen == 0) - { - ti = proto_tree_add_text(mq_tree, tvb, offset, 12, sPrmLn0, u+1, uCount); - expert_add_info(pinfo, ti, &ei_mq_pcf_prmln0); - u = uCount; - break; - } - uPrm = tvb_get_guint32_endian(tvb, offset + 8, bLittleEndian); - uLenF = 12; - - if (bParse) - g_snprintf(strPrm, (gulong)sizeof(strPrm) - 1, " %-s[%*u] {%2d-%-15.15s} %8x/%5d-%-30.30s", - "MQPrm", uDig, u+1, - uTyp, val_to_str_const(uTyp, GET_VALSV(PrmTyp), " Unknown") + 6, - uPrm, uPrm, val_to_str_const(uPrm, GET_VALSV(PrmId), "Unknown")); - else - g_snprintf(strPrm, (gulong)sizeof(strPrm) - 1, " %-s[%*u] {%2d-%-15.15s} %8x/%5d", - "XtraD", uDig, u+1, - uTyp, val_to_str_const(uTyp, GET_VALSV(PrmTyp), " Unknown") + 6, - uPrm, uPrm); - - switch (uTyp) - { - case MQ_MQCFT_NONE: - break; - case MQ_MQCFT_COMMAND: - break; - case MQ_MQCFT_RESPONSE: - break; - case MQ_MQCFT_INTEGER: - { - guint8 *pVal = NULL; - uVal = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); - if (bParse) - pVal = dissect_mqpcf_parm_getintval(uPrm, uVal); - if (pVal) - { - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %d-%s", - strPrm, uVal, pVal); - } - else - { - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %8x-%d", - strPrm, uVal, uVal); - } - tree = proto_item_add_subtree(ti, ett_mqpcf_prm); - proto_tree_add_item(tree, hf_mq_pcf_prmtyp, tvb, offset , 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmlen, tvb, offset + 4, 4, bLittleEndian); - proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); - - dissect_mqpcf_parm_int(tvb, tree, offset+uLenF, uPrm, uVal, hf_mq_pcf_int, 0, 0, 0, bParse); - } - break; - case MQ_MQCFT_STRING: - { - guint8 *sStr; - - uCCS = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); - uSLn = tvb_get_guint32_endian(tvb, offset + uLenF + 4, bLittleEndian); - sStr = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 8, - uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC); - if (*sStr) - strip_trailing_blanks(sStr, uSLn); - if (*sStr) - format_text_chr(sStr, strlen(sStr), '.'); - - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %s", strPrm, sStr); - tree = proto_item_add_subtree(ti, ett_mqpcf_prm); - - proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); - proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmccsid , tvb, offset + 12, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmstrlen, tvb, offset + 16, 4, bLittleEndian); - - proto_tree_add_item(tree, hf_mq_pcf_string, tvb, offset + uLenF + 8, uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC); - } - break; - case MQ_MQCFT_INTEGER_LIST: - { - guint32 u2; - guint32 uDigit = 0; - - uCnt = tvb_get_guint32_endian(tvb, offset+uLenF, bLittleEndian); - uDigit = dissect_mqpcf_getDigits(uCnt); - - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s Cnt(%d)", strPrm, uCnt); - tree = proto_item_add_subtree(ti, ett_mqpcf_prm); - - proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); - proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmcount, tvb, offset + 12, 4, bLittleEndian); - - offset += uLenF+4; - for (u2 = 0; u2 < uCnt && u2 < mq_pcf_maxlst; u2++) - { - uVal = tvb_get_guint32_endian(tvb, offset, bLittleEndian); - dissect_mqpcf_parm_int(tvb, tree, offset, uPrm, uVal, hf_mq_pcf_intlist, u2+1, uCnt, uDigit, bParse); - offset += 4; - } - if (u2 != uCnt) - { - ti = proto_tree_add_text(tree, tvb, offset, uLen, sMaxLst, u2, uCnt); - expert_add_info(pinfo, ti, &ei_mq_pcf_MaxInt); - } - } - break; - case MQ_MQCFT_STRING_LIST: - { - guint32 u2; - guint32 uDigit; - guint8 *sStr; - header_field_info *hfinfo; - - hfinfo = proto_registrar_get_nth(hf_mq_pcf_stringlist); - - uCCS = tvb_get_guint32_endian(tvb, offset + uLenF , bLittleEndian); - uCnt = tvb_get_guint32_endian(tvb, offset + uLenF + 4, bLittleEndian); - uSLn = tvb_get_guint32_endian(tvb, offset + uLenF + 8, bLittleEndian); - - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s Cnt(%d)", strPrm, uCnt); - - tree = proto_item_add_subtree(ti, ett_mqpcf_prm); - proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); - proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmccsid , tvb, offset + 12, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmcount , tvb, offset + 16, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmstrlen, tvb, offset + 20, 4, bLittleEndian); - - uDigit = dissect_mqpcf_getDigits(uCnt); - - offset += uLenF+12; - for (u2 = 0; u2 < uCnt && u2 < mq_pcf_maxlst; u2++) - { - sStr = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, - uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC); - if (*sStr) - strip_trailing_blanks(sStr, uSLn); - if (*sStr) - format_text_chr(sStr, strlen(sStr), '.'); - - proto_tree_add_string_format(tree, hf_mq_pcf_stringlist, tvb, offset, uSLn, sStr, - "%s[%*d]: %s", hfinfo->name, uDigit, u2+1, sStr); - offset += uSLn; - } - if (u2 != uCnt) - { - ti = proto_tree_add_text(tree, tvb, offset, uLen, sMaxLst, u2, uCnt); - expert_add_info(pinfo, ti, &ei_mq_pcf_MaxStr); - } - } - break; - case MQ_MQCFT_EVENT: - break; - case MQ_MQCFT_USER: - { - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s", strPrm); - tree = proto_item_add_subtree(ti, ett_mqpcf_prm); - - proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); - - proto_tree_add_item(tree, hf_mq_pcf_bytestring, tvb, offset + 8, uLen - 8, bLittleEndian); - } - break; - case MQ_MQCFT_BYTE_STRING: - { - uSLn = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); - if (uSLn) - { - guint8 *sStrA = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 4, uSLn, ENC_ASCII) , uSLn, '.'); - guint8 *sStrE = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 4, uSLn, ENC_EBCDIC), uSLn, '.'); - if (uSLn > 35) - { - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s [Truncated] A(%-.35s) E(%-.35s)", strPrm, sStrA, sStrE); - } - else - { - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s A(%s) E(%s)", strPrm, sStrA, sStrE); - } - } - else - { - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s <MISSING>", strPrm); - } - tree = proto_item_add_subtree(ti, ett_mqpcf_prm); - - proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); - proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmstrlen, tvb, offset + 12, 4, bLittleEndian); - - proto_tree_add_item(tree, hf_mq_pcf_bytestring, tvb, offset + uLenF + 4 , uSLn, bLittleEndian); - } - break; - case MQ_MQCFT_TRACE_ROUTE: - break; - case MQ_MQCFT_REPORT: - break; - case MQ_MQCFT_INTEGER_FILTER: - { - guint32 uOpe; - - uOpe = tvb_get_guint32_endian(tvb, offset + uLenF , bLittleEndian); - uVal = tvb_get_guint32_endian(tvb, offset + uLenF + 4, bLittleEndian); - - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %s %d", - strPrm, val_to_str(uOpe, GET_VALSV(FilterOP), " Unknown (0x%02x)")+7, uVal); - tree = proto_item_add_subtree(ti, ett_mqpcf_prm); - - proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); - proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_filterop , tvb, offset + 12, 4, bLittleEndian); - - proto_tree_add_item(tree, hf_mq_pcf_int, tvb, offset + uLenF + 4, 4, bLittleEndian); - } - break; - case MQ_MQCFT_STRING_FILTER: - { - guint8 *sStr; - guint32 uOpe; - - uOpe = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); - uCCS = tvb_get_guint32_endian(tvb, offset + uLenF + 4, bLittleEndian); - uSLn = tvb_get_guint32_endian(tvb, offset + uLenF + 8, bLittleEndian); - sStr = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 12, uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC), uSLn, '.'); - strip_trailing_blanks(sStr, uSLn); - - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %s %s", - strPrm, val_to_str(uOpe, GET_VALSV(FilterOP), " Unknown (0x%02x)")+7, sStr); - tree = proto_item_add_subtree(ti, ett_mqpcf_prm); - - proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); - proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_filterop , tvb, offset + 12, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmccsid , tvb, offset + 16, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmstrlen, tvb, offset + 20, 4, bLittleEndian); - - proto_tree_add_item(tree, hf_mq_pcf_string, tvb, offset + uLenF + 12, uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC); - } - break; - case MQ_MQCFT_BYTE_STRING_FILTER: - { - guint32 uOpe; - uOpe = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); - uSLn = tvb_get_guint32_endian(tvb, offset + uLenF + 4, bLittleEndian); - if (uSLn) - { - guint8 *sStrA = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 8, uSLn, ENC_ASCII), uSLn, '.'); - guint8 *sStrE = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 8, uSLn, ENC_EBCDIC), uSLn, '.'); - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %s A(%s) E(%s)", - strPrm, val_to_str(uOpe, GET_VALSV(FilterOP), " Unknown (0x%02x)")+7, sStrA, sStrE); - } - else - { - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %s <MISSING>", - strPrm, val_to_str(uOpe, GET_VALSV(FilterOP), " Unknown (0x%02x)")+7); - } - tree = proto_item_add_subtree(ti, ett_mqpcf_prm); - - proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); - proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_filterop , tvb, offset + 12, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmstrlen, tvb, offset + 16, 4, bLittleEndian); - - proto_tree_add_item(tree, hf_mq_pcf_bytestring, tvb, offset + uLenF + 8 , uSLn, bLittleEndian); - } - break; - case MQ_MQCFT_COMMAND_XR: - break; - case MQ_MQCFT_XR_MSG: - break; - case MQ_MQCFT_XR_ITEM: - break; - case MQ_MQCFT_XR_SUMMARY: - break; - case MQ_MQCFT_GROUP: - break; - case MQ_MQCFT_STATISTICS: - break; - case MQ_MQCFT_ACCOUNTING: - break; - case MQ_MQCFT_INTEGER64: - { - uVal64 = tvb_get_guint64_endian(tvb, offset + uLenF + 4, bLittleEndian); - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %" G_GINT64_MODIFIER "x (%" G_GINT64_MODIFIER "d)", - strPrm, uVal64, uVal64); - tree = proto_item_add_subtree(ti, ett_mqpcf_prm); - - proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); - proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmunused, tvb, offset + 12, 4, bLittleEndian); - - proto_tree_add_item(tree, hf_mq_pcf_int64, tvb, offset + uLenF + 4, 8, bLittleEndian); - } - break; - case MQ_MQCFT_INTEGER64_LIST: - { - guint32 u2; - guint32 uDigit; - header_field_info *hfinfo; - - hfinfo = proto_registrar_get_nth(hf_mq_pcf_int64list); - - uCnt = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s Cnt(%d)", strPrm, uCnt); - tree = proto_item_add_subtree(ti, ett_mqpcf_prm); - uDigit = dissect_mqpcf_getDigits(uCnt); - - proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); - proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); - proto_tree_add_item(tree, hf_mq_pcf_prmcount, tvb, offset + 12, 4, bLittleEndian); - - offset += uLenF + 4; - for (u2 = 0; u2 < uCnt && u2 < mq_pcf_maxlst; u2++) - { - uVal64 = tvb_get_guint64_endian(tvb, offset, bLittleEndian); - proto_tree_add_int64_format(tree, hf_mq_pcf_int64list, tvb, offset, 8, uVal64, - "%s[%*d]: %" G_GINT64_MODIFIER "d", hfinfo->name, uDigit, u2+1, uVal64); - offset += 8; - } - if (u2 != uCnt) - { - ti = proto_tree_add_text(tree, tvb, offset, uLen, sMaxLst, u2, uCnt); - expert_add_info(pinfo, ti, &ei_mq_pcf_MaxI64); - } - } - break; - } - offset = tOfs+uLen; - } - if (u != uCount) - { - ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, sMaxPrm, u, uCount); - expert_add_info(pinfo, ti, &ei_mq_pcf_MaxPrm); - } + guint32 u = 0; + guint32 tOfs = 0; + guint32 uLenF; + char strPrm[256]; + guint32 uTyp; + guint32 uLen = 0; + guint32 uPrm; + guint32 uCnt; + guint32 uCCS; + guint32 uSLn; + guint32 uVal; + guint64 uVal64; + guint32 uDig; + + const char sMaxLst[] = " Max # of List reached. DECODE interrupted (actual %u of %u)"; + const char sPrmLn0[] = " MQPrm[%3u] has a zero length. DECODE Failed (MQPrm Count: %u)"; + const char sMaxPrm[] = " Max # of Parm reached. DECODE interrupted (actual %u of %u)"; + const char sPrmCnt[] = " Cnt=-1 and Length(%u) < 16. DECODE interrupted for elem %u"; + + proto_item *ti = NULL; + proto_tree *tree = NULL; + + if (uCount == (guint32)-1) + { + guint32 xOfs = offset; + + uCnt = 0; + while (tvb_length_remaining(tvb, xOfs) >= 16) + { + uLen = tvb_get_guint32_endian(tvb, xOfs + 4, bLittleEndian); + if (uLen < 16) + { + ti = proto_tree_add_text(mq_tree, tvb, xOfs, 16, sPrmCnt, uLen, uCnt); + expert_add_info(pinfo, ti, &ei_mq_pcf_PrmCnt); + break; + } + uCnt++; + xOfs += uLen; + } + uCount = uCnt; + } + + uDig = dissect_mqpcf_getDigits(uCount); + + for (u = 0; u < uCount && u < mq_pcf_maxprm; u++) + { + tOfs = offset; + uTyp = tvb_get_guint32_endian(tvb, offset , bLittleEndian); + uLen = tvb_get_guint32_endian(tvb, offset + 4, bLittleEndian); + if (uLen == 0) + { + ti = proto_tree_add_text(mq_tree, tvb, offset, 12, sPrmLn0, u+1, uCount); + expert_add_info(pinfo, ti, &ei_mq_pcf_prmln0); + u = uCount; + break; + } + uPrm = tvb_get_guint32_endian(tvb, offset + 8, bLittleEndian); + uLenF = 12; + + if (bParse) + g_snprintf(strPrm, (gulong)sizeof(strPrm) - 1, " %-s[%*u] {%2d-%-15.15s} %8x/%5d-%-30.30s", + "MQPrm", uDig, u+1, + uTyp, val_to_str_const(uTyp, GET_VALSV(PrmTyp), " Unknown") + 6, + uPrm, uPrm, val_to_str_const(uPrm, GET_VALSV(PrmId), "Unknown")); + else + g_snprintf(strPrm, (gulong)sizeof(strPrm) - 1, " %-s[%*u] {%2d-%-15.15s} %8x/%5d", + "XtraD", uDig, u+1, + uTyp, val_to_str_const(uTyp, GET_VALSV(PrmTyp), " Unknown") + 6, + uPrm, uPrm); + + switch (uTyp) + { + case MQ_MQCFT_NONE: + break; + case MQ_MQCFT_COMMAND: + break; + case MQ_MQCFT_RESPONSE: + break; + case MQ_MQCFT_INTEGER: + { + guint8 *pVal = NULL; + uVal = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); + if (bParse) + pVal = dissect_mqpcf_parm_getintval(uPrm, uVal); + if (pVal) + { + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %d-%s", + strPrm, uVal, pVal); + } + else + { + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %8x-%d", + strPrm, uVal, uVal); + } + tree = proto_item_add_subtree(ti, ett_mqpcf_prm); + proto_tree_add_item(tree, hf_mq_pcf_prmtyp, tvb, offset , 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmlen, tvb, offset + 4, 4, bLittleEndian); + proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); + + dissect_mqpcf_parm_int(tvb, tree, offset+uLenF, uPrm, uVal, hf_mq_pcf_int, 0, 0, 0, bParse); + } + break; + case MQ_MQCFT_STRING: + { + guint8 *sStr; + + uCCS = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); + uSLn = tvb_get_guint32_endian(tvb, offset + uLenF + 4, bLittleEndian); + sStr = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 8, + uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC); + if (*sStr) + strip_trailing_blanks(sStr, uSLn); + if (*sStr) + format_text_chr(sStr, strlen(sStr), '.'); + + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %s", strPrm, sStr); + tree = proto_item_add_subtree(ti, ett_mqpcf_prm); + + proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); + proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmccsid , tvb, offset + 12, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmstrlen, tvb, offset + 16, 4, bLittleEndian); + + proto_tree_add_item(tree, hf_mq_pcf_string, tvb, offset + uLenF + 8, uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC); + } + break; + case MQ_MQCFT_INTEGER_LIST: + { + guint32 u2; + guint32 uDigit = 0; + + uCnt = tvb_get_guint32_endian(tvb, offset+uLenF, bLittleEndian); + uDigit = dissect_mqpcf_getDigits(uCnt); + + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s Cnt(%d)", strPrm, uCnt); + tree = proto_item_add_subtree(ti, ett_mqpcf_prm); + + proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); + proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmcount, tvb, offset + 12, 4, bLittleEndian); + + offset += uLenF+4; + for (u2 = 0; u2 < uCnt && u2 < mq_pcf_maxlst; u2++) + { + uVal = tvb_get_guint32_endian(tvb, offset, bLittleEndian); + dissect_mqpcf_parm_int(tvb, tree, offset, uPrm, uVal, hf_mq_pcf_intlist, u2+1, uCnt, uDigit, bParse); + offset += 4; + } + if (u2 != uCnt) + { + ti = proto_tree_add_text(tree, tvb, offset, uLen, sMaxLst, u2, uCnt); + expert_add_info(pinfo, ti, &ei_mq_pcf_MaxInt); + } + } + break; + case MQ_MQCFT_STRING_LIST: + { + guint32 u2; + guint32 uDigit; + guint8 *sStr; + header_field_info *hfinfo; + + hfinfo = proto_registrar_get_nth(hf_mq_pcf_stringlist); + + uCCS = tvb_get_guint32_endian(tvb, offset + uLenF , bLittleEndian); + uCnt = tvb_get_guint32_endian(tvb, offset + uLenF + 4, bLittleEndian); + uSLn = tvb_get_guint32_endian(tvb, offset + uLenF + 8, bLittleEndian); + + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s Cnt(%d)", strPrm, uCnt); + + tree = proto_item_add_subtree(ti, ett_mqpcf_prm); + proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); + proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmccsid , tvb, offset + 12, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmcount , tvb, offset + 16, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmstrlen, tvb, offset + 20, 4, bLittleEndian); + + uDigit = dissect_mqpcf_getDigits(uCnt); + + offset += uLenF+12; + for (u2 = 0; u2 < uCnt && u2 < mq_pcf_maxlst; u2++) + { + sStr = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, + uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC); + if (*sStr) + strip_trailing_blanks(sStr, uSLn); + if (*sStr) + format_text_chr(sStr, strlen(sStr), '.'); + + proto_tree_add_string_format(tree, hf_mq_pcf_stringlist, tvb, offset, uSLn, sStr, + "%s[%*d]: %s", hfinfo->name, uDigit, u2+1, sStr); + offset += uSLn; + } + if (u2 != uCnt) + { + ti = proto_tree_add_text(tree, tvb, offset, uLen, sMaxLst, u2, uCnt); + expert_add_info(pinfo, ti, &ei_mq_pcf_MaxStr); + } + } + break; + case MQ_MQCFT_EVENT: + break; + case MQ_MQCFT_USER: + { + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s", strPrm); + tree = proto_item_add_subtree(ti, ett_mqpcf_prm); + + proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); + + proto_tree_add_item(tree, hf_mq_pcf_bytestring, tvb, offset + 8, uLen - 8, bLittleEndian); + } + break; + case MQ_MQCFT_BYTE_STRING: + { + uSLn = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); + if (uSLn) + { + guint8 *sStrA = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 4, uSLn, ENC_ASCII) , uSLn, '.'); + guint8 *sStrE = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 4, uSLn, ENC_EBCDIC), uSLn, '.'); + if (uSLn > 35) + { + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s [Truncated] A(%-.35s) E(%-.35s)", strPrm, sStrA, sStrE); + } + else + { + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s A(%s) E(%s)", strPrm, sStrA, sStrE); + } + } + else + { + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s <MISSING>", strPrm); + } + tree = proto_item_add_subtree(ti, ett_mqpcf_prm); + + proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); + proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmstrlen, tvb, offset + 12, 4, bLittleEndian); + + proto_tree_add_item(tree, hf_mq_pcf_bytestring, tvb, offset + uLenF + 4 , uSLn, bLittleEndian); + } + break; + case MQ_MQCFT_TRACE_ROUTE: + break; + case MQ_MQCFT_REPORT: + break; + case MQ_MQCFT_INTEGER_FILTER: + { + guint32 uOpe; + + uOpe = tvb_get_guint32_endian(tvb, offset + uLenF , bLittleEndian); + uVal = tvb_get_guint32_endian(tvb, offset + uLenF + 4, bLittleEndian); + + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %s %d", + strPrm, val_to_str(uOpe, GET_VALSV(FilterOP), " Unknown (0x%02x)")+7, uVal); + tree = proto_item_add_subtree(ti, ett_mqpcf_prm); + + proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); + proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_filterop , tvb, offset + 12, 4, bLittleEndian); + + proto_tree_add_item(tree, hf_mq_pcf_int, tvb, offset + uLenF + 4, 4, bLittleEndian); + } + break; + case MQ_MQCFT_STRING_FILTER: + { + guint8 *sStr; + guint32 uOpe; + + uOpe = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); + uCCS = tvb_get_guint32_endian(tvb, offset + uLenF + 4, bLittleEndian); + uSLn = tvb_get_guint32_endian(tvb, offset + uLenF + 8, bLittleEndian); + sStr = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 12, uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC), uSLn, '.'); + strip_trailing_blanks(sStr, uSLn); + + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %s %s", + strPrm, val_to_str(uOpe, GET_VALSV(FilterOP), " Unknown (0x%02x)")+7, sStr); + tree = proto_item_add_subtree(ti, ett_mqpcf_prm); + + proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); + proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_filterop , tvb, offset + 12, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmccsid , tvb, offset + 16, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmstrlen, tvb, offset + 20, 4, bLittleEndian); + + proto_tree_add_item(tree, hf_mq_pcf_string, tvb, offset + uLenF + 12, uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC); + } + break; + case MQ_MQCFT_BYTE_STRING_FILTER: + { + guint32 uOpe; + uOpe = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); + uSLn = tvb_get_guint32_endian(tvb, offset + uLenF + 4, bLittleEndian); + if (uSLn) + { + guint8 *sStrA = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 8, uSLn, ENC_ASCII), uSLn, '.'); + guint8 *sStrE = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 8, uSLn, ENC_EBCDIC), uSLn, '.'); + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %s A(%s) E(%s)", + strPrm, val_to_str(uOpe, GET_VALSV(FilterOP), " Unknown (0x%02x)")+7, sStrA, sStrE); + } + else + { + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %s <MISSING>", + strPrm, val_to_str(uOpe, GET_VALSV(FilterOP), " Unknown (0x%02x)")+7); + } + tree = proto_item_add_subtree(ti, ett_mqpcf_prm); + + proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); + proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_filterop , tvb, offset + 12, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmstrlen, tvb, offset + 16, 4, bLittleEndian); + + proto_tree_add_item(tree, hf_mq_pcf_bytestring, tvb, offset + uLenF + 8 , uSLn, bLittleEndian); + } + break; + case MQ_MQCFT_COMMAND_XR: + break; + case MQ_MQCFT_XR_MSG: + break; + case MQ_MQCFT_XR_ITEM: + break; + case MQ_MQCFT_XR_SUMMARY: + break; + case MQ_MQCFT_GROUP: + break; + case MQ_MQCFT_STATISTICS: + break; + case MQ_MQCFT_ACCOUNTING: + break; + case MQ_MQCFT_INTEGER64: + { + uVal64 = tvb_get_guint64_endian(tvb, offset + uLenF + 4, bLittleEndian); + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s %" G_GINT64_MODIFIER "x (%" G_GINT64_MODIFIER "d)", + strPrm, uVal64, uVal64); + tree = proto_item_add_subtree(ti, ett_mqpcf_prm); + + proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); + proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmunused, tvb, offset + 12, 4, bLittleEndian); + + proto_tree_add_item(tree, hf_mq_pcf_int64, tvb, offset + uLenF + 4, 8, bLittleEndian); + } + break; + case MQ_MQCFT_INTEGER64_LIST: + { + guint32 u2; + guint32 uDigit; + header_field_info *hfinfo; + + hfinfo = proto_registrar_get_nth(hf_mq_pcf_int64list); + + uCnt = tvb_get_guint32_endian(tvb, offset + uLenF, bLittleEndian); + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, "%s Cnt(%d)", strPrm, uCnt); + tree = proto_item_add_subtree(ti, ett_mqpcf_prm); + uDigit = dissect_mqpcf_getDigits(uCnt); + + proto_tree_add_item(tree, hf_mq_pcf_prmtyp , tvb, offset , 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmlen , tvb, offset + 4, 4, bLittleEndian); + proto_tree_add_item(tree, (bParse) ? hf_mq_pcf_prmid : hf_mq_pcf_prmidnovals, tvb, offset + 8, 4, bLittleEndian); + proto_tree_add_item(tree, hf_mq_pcf_prmcount, tvb, offset + 12, 4, bLittleEndian); + + offset += uLenF + 4; + for (u2 = 0; u2 < uCnt && u2 < mq_pcf_maxlst; u2++) + { + uVal64 = tvb_get_guint64_endian(tvb, offset, bLittleEndian); + proto_tree_add_int64_format(tree, hf_mq_pcf_int64list, tvb, offset, 8, uVal64, + "%s[%*d]: %" G_GINT64_MODIFIER "d", hfinfo->name, uDigit, u2+1, uVal64); + offset += 8; + } + if (u2 != uCnt) + { + ti = proto_tree_add_text(tree, tvb, offset, uLen, sMaxLst, u2, uCnt); + expert_add_info(pinfo, ti, &ei_mq_pcf_MaxI64); + } + } + break; + } + offset = tOfs+uLen; + } + if (u != uCount) + { + ti = proto_tree_add_text(mq_tree, tvb, offset, uLen, sMaxPrm, u, uCount); + expert_add_info(pinfo, ti, &ei_mq_pcf_MaxPrm); + } } static void dissect_mqpcf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, mq_parm_t* p_mq_parm) { - gint offset = 0; - gboolean bLittleEndian; - - bLittleEndian = ((p_mq_parm->mq_cur_ccsid.encod & MQ_MQENC_INTEGER_MASK) == MQ_MQENC_INTEGER_REVERSED) ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN; - - if (tvb_length(tvb) >= 36) - { - gint iSizeMQCFH = 36; - guint32 iCommand = tvb_get_guint32_endian(tvb, offset + 12, bLittleEndian); - - if (tree) - { - proto_item *ti; - proto_tree *mq_tree; - proto_tree *mqroot_tree; - char sTmp[256]; - guint32 uCnt; - guint32 uTyp; - guint32 uCmd; - guint32 uCC; - guint32 uRC; - - uTyp = tvb_get_guint32_endian(tvb, offset , bLittleEndian); - uCmd = tvb_get_guint32_endian(tvb, offset + 12, bLittleEndian); - uCC = tvb_get_guint32_endian(tvb, offset + 24, bLittleEndian); - uRC = tvb_get_guint32_endian(tvb, offset + 28, bLittleEndian); - uCnt = tvb_get_guint32_endian(tvb, offset + 32, bLittleEndian); - - if (uCC || uRC) - { - g_snprintf(sTmp, (gulong)sizeof(sTmp)-1, " %-s [%d-%s] {%d-%s} PrmCnt(%d) CC(%d-%s) RC(%d-%s)", - MQ_TEXT_CFH, - uTyp, val_to_str_const(uTyp, GET_VALSV(mqcft), "Unknown"), - uCmd, val_to_str_const(uCmd, GET_VALSV(mqcmd), "Unknown"), - uCnt, - uCC, val_to_str_const(uCC, GET_VALSV(mqcc), "Unknown"), - uRC, val_to_str_const(uRC, GET_VALSV(mqrc), "Unknown")); - } - else - { - g_snprintf(sTmp, (gulong)sizeof(sTmp)-1, " %-s [%d-%s] {%d-%s} PrmCnt(%d)", - MQ_TEXT_CFH, - uTyp, val_to_str_const(uTyp, GET_VALSV(mqcft), "Unknown"), - uCmd, val_to_str_const(uCmd, GET_VALSV(mqcmd), "Unknown"), - uCnt); - } - - ti = proto_tree_add_item(tree, proto_mqpcf, tvb, offset, -1, ENC_NA); - - proto_item_append_text(ti, " (%s)", val_to_str(iCommand, GET_VALSV(mqcmd), "Unknown (0x%02x)")); - mqroot_tree = proto_item_add_subtree(ti, ett_mqpcf); - - ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeMQCFH, "%s", sTmp); - mq_tree = proto_item_add_subtree(ti, ett_mqpcf_cfh); - - proto_tree_add_item(mq_tree, hf_mqpcf_cfh_type , tvb, offset + 0, 4, bLittleEndian); - proto_tree_add_item(mq_tree, hf_mqpcf_cfh_length , tvb, offset + 4, 4, bLittleEndian); - proto_tree_add_item(mq_tree, hf_mqpcf_cfh_version , tvb, offset + 8, 4, bLittleEndian); - proto_tree_add_item(mq_tree, hf_mqpcf_cfh_command , tvb, offset + 12, 4, bLittleEndian); - proto_tree_add_item(mq_tree, hf_mqpcf_cfh_MsgSeqNbr, tvb, offset + 16, 4, bLittleEndian); - proto_tree_add_item(mq_tree, hf_mqpcf_cfh_control , tvb, offset + 20, 4, bLittleEndian); - proto_tree_add_item(mq_tree, hf_mqpcf_cfh_compcode , tvb, offset + 24, 4, bLittleEndian); - proto_tree_add_item(mq_tree, hf_mqpcf_cfh_reason , tvb, offset + 28, 4, bLittleEndian); - proto_tree_add_item(mq_tree, hf_mqpcf_cfh_ParmCount, tvb, offset + 32, 4, bLittleEndian); - dissect_mqpcf_parm(tvb, pinfo, mqroot_tree, offset + iSizeMQCFH, uCnt, bLittleEndian, TRUE); - } - } + gint offset = 0; + gboolean bLittleEndian; + + bLittleEndian = ((p_mq_parm->mq_cur_ccsid.encod & MQ_MQENC_INTEGER_MASK) == MQ_MQENC_INTEGER_REVERSED) ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN; + + if (tvb_length(tvb) >= 36) + { + gint iSizeMQCFH = 36; + guint32 iCommand = tvb_get_guint32_endian(tvb, offset + 12, bLittleEndian); + + if (tree) + { + proto_item *ti; + proto_tree *mq_tree; + proto_tree *mqroot_tree; + char sTmp[256]; + guint32 uCnt; + guint32 uTyp; + guint32 uCmd; + guint32 uCC; + guint32 uRC; + + uTyp = tvb_get_guint32_endian(tvb, offset , bLittleEndian); + uCmd = tvb_get_guint32_endian(tvb, offset + 12, bLittleEndian); + uCC = tvb_get_guint32_endian(tvb, offset + 24, bLittleEndian); + uRC = tvb_get_guint32_endian(tvb, offset + 28, bLittleEndian); + uCnt = tvb_get_guint32_endian(tvb, offset + 32, bLittleEndian); + + if (uCC || uRC) + { + g_snprintf(sTmp, (gulong)sizeof(sTmp)-1, " %-s [%d-%s] {%d-%s} PrmCnt(%d) CC(%d-%s) RC(%d-%s)", + MQ_TEXT_CFH, + uTyp, val_to_str_const(uTyp, GET_VALSV(mqcft), "Unknown"), + uCmd, val_to_str_const(uCmd, GET_VALSV(mqcmd), "Unknown"), + uCnt, + uCC, val_to_str_const(uCC, GET_VALSV(mqcc), "Unknown"), + uRC, val_to_str_const(uRC, GET_VALSV(mqrc), "Unknown")); + } + else + { + g_snprintf(sTmp, (gulong)sizeof(sTmp)-1, " %-s [%d-%s] {%d-%s} PrmCnt(%d)", + MQ_TEXT_CFH, + uTyp, val_to_str_const(uTyp, GET_VALSV(mqcft), "Unknown"), + uCmd, val_to_str_const(uCmd, GET_VALSV(mqcmd), "Unknown"), + uCnt); + } + + ti = proto_tree_add_item(tree, proto_mqpcf, tvb, offset, -1, ENC_NA); + + proto_item_append_text(ti, " (%s)", val_to_str(iCommand, GET_VALSV(mqcmd), "Unknown (0x%02x)")); + mqroot_tree = proto_item_add_subtree(ti, ett_mqpcf); + + ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeMQCFH, "%s", sTmp); + mq_tree = proto_item_add_subtree(ti, ett_mqpcf_cfh); + + proto_tree_add_item(mq_tree, hf_mqpcf_cfh_type , tvb, offset + 0, 4, bLittleEndian); + proto_tree_add_item(mq_tree, hf_mqpcf_cfh_length , tvb, offset + 4, 4, bLittleEndian); + proto_tree_add_item(mq_tree, hf_mqpcf_cfh_version , tvb, offset + 8, 4, bLittleEndian); + proto_tree_add_item(mq_tree, hf_mqpcf_cfh_command , tvb, offset + 12, 4, bLittleEndian); + proto_tree_add_item(mq_tree, hf_mqpcf_cfh_MsgSeqNbr, tvb, offset + 16, 4, bLittleEndian); + proto_tree_add_item(mq_tree, hf_mqpcf_cfh_control , tvb, offset + 20, 4, bLittleEndian); + proto_tree_add_item(mq_tree, hf_mqpcf_cfh_compcode , tvb, offset + 24, 4, bLittleEndian); + proto_tree_add_item(mq_tree, hf_mqpcf_cfh_reason , tvb, offset + 28, 4, bLittleEndian); + proto_tree_add_item(mq_tree, hf_mqpcf_cfh_ParmCount, tvb, offset + 32, 4, bLittleEndian); + dissect_mqpcf_parm(tvb, pinfo, mqroot_tree, offset + iSizeMQCFH, uCnt, bLittleEndian, TRUE); + } + } } static gboolean dissect_mqpcf_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { - if (tvb_length(tvb) >= 36) - { - mq_parm_t *p_mq_parm = (mq_parm_t *)data; - if (strncmp((const char*)p_mq_parm->mq_format, MQ_MQFMT_ADMIN, 8) == 0 - || strncmp((const char*)p_mq_parm->mq_format, MQ_MQFMT_EVENT, 8) == 0 - || strncmp((const char*)p_mq_parm->mq_format, MQ_MQFMT_PCF, 8) == 0) - { - /* Dissect the packet */ - dissect_mqpcf(tvb, pinfo, tree, p_mq_parm); - return TRUE; - } - if (strncmp((const char *)p_mq_parm->mq_format, "LPOO", 4) == 0) - { - gboolean bLittleEndian; - bLittleEndian = ((p_mq_parm->mq_cur_ccsid.encod & MQ_MQENC_INTEGER_MASK) == MQ_MQENC_INTEGER_REVERSED) ? ENC_LITTLE_ENDIAN:ENC_BIG_ENDIAN; - dissect_mqpcf_parm(tvb, pinfo, tree, 0, (guint32)-1, bLittleEndian, FALSE); - return TRUE; - } - } - return FALSE; + if (tvb_length(tvb) >= 36) + { + mq_parm_t *p_mq_parm = (mq_parm_t *)data; + if (strncmp((const char*)p_mq_parm->mq_format, MQ_MQFMT_ADMIN, 8) == 0 + || strncmp((const char*)p_mq_parm->mq_format, MQ_MQFMT_EVENT, 8) == 0 + || strncmp((const char*)p_mq_parm->mq_format, MQ_MQFMT_PCF, 8) == 0) + { + /* Dissect the packet */ + dissect_mqpcf(tvb, pinfo, tree, p_mq_parm); + return TRUE; + } + if (strncmp((const char *)p_mq_parm->mq_format, "LPOO", 4) == 0) + { + gboolean bLittleEndian; + bLittleEndian = ((p_mq_parm->mq_cur_ccsid.encod & MQ_MQENC_INTEGER_MASK) == MQ_MQENC_INTEGER_REVERSED) ? ENC_LITTLE_ENDIAN:ENC_BIG_ENDIAN; + dissect_mqpcf_parm(tvb, pinfo, tree, 0, (guint32)-1, bLittleEndian, FALSE); + return TRUE; + } + } + return FALSE; } void proto_register_mqpcf(void) { - expert_module_t *expert_mqpcf; - - static hf_register_info hf[] = - { - { &hf_mqpcf_cfh_type , { "Type.....", "mqpcf.cfh.type", FT_UINT32, BASE_DEC, VALS(&GET_VALSV(mqcft)), 0x0, "CFH type", HFILL }}, - { &hf_mqpcf_cfh_length , { "Length...", "mqpcf.cfh.length", FT_UINT32, BASE_DEC, NULL, 0x0, "CFH length", HFILL }}, - { &hf_mqpcf_cfh_version , { "Version..", "mqpcf.cfh.version", FT_UINT32, BASE_DEC, NULL, 0x0, "CFH version", HFILL }}, - { &hf_mqpcf_cfh_command , { "Command..", "mqpcf.cfh.command", FT_UINT32, BASE_DEC, VALS(&GET_VALSV(mqcmd)), 0x0, "CFH command", HFILL }}, - { &hf_mqpcf_cfh_MsgSeqNbr, { "MsgSeqNbr", "mqpcf.cfh.MsgSeqNbr", FT_UINT32, BASE_DEC, NULL, 0x0, "CFH message sequence number", HFILL }}, - { &hf_mqpcf_cfh_control , { "Control..", "mqpcf.cfh.control", FT_UINT32, BASE_DEC, NULL, 0x0, "CFH control", HFILL }}, - { &hf_mqpcf_cfh_compcode , { "CompCode.", "mqpcf.cfh.compcode", FT_UINT32, BASE_DEC, VALS(&GET_VALSV(mqcc)), 0x0, "CFH completion code", HFILL }}, - { &hf_mqpcf_cfh_reason , { "ReasCode.", "mqpcf.cfh.reasoncode", FT_UINT32, BASE_DEC, VALS(&GET_VALSV(mqrc)), 0x0, "CFH reason code", HFILL }}, - { &hf_mqpcf_cfh_ParmCount, { "ParmCount", "mqpcf.cfh.ParmCount", FT_UINT32, BASE_DEC, NULL, 0x0, "CFH parameter count", HFILL }}, - - { &hf_mq_pcf_prmtyp , { "ParmTyp..", "mqpcf.parm.type", FT_UINT32, BASE_DEC, VALS(&GET_VALSV(PrmTyp)), 0x0, "MQPCF parameter type", HFILL }}, - { &hf_mq_pcf_prmlen , { "ParmLen..", "mqpcf.parm.len", FT_UINT32, BASE_DEC, NULL, 0x0, "MQPCF parameter length", HFILL }}, - { &hf_mq_pcf_prmid , { "ParmID...", "mqpcf.parm.id", FT_UINT32, BASE_DEC, VALS(&GET_VALSV(PrmId)), 0x0, "MQPCF parameter id", HFILL }}, - { &hf_mq_pcf_prmidnovals , { "ParmID...", "mqpcf.parm.idNoVals", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MQPCF parameter id No Vals", HFILL }}, - { &hf_mq_pcf_filterop , { "FilterOP.", "mqpcf.filter.op", FT_UINT32, BASE_DEC, VALS(&GET_VALSV(FilterOP)), 0x0, "MQPCF Filter operator", HFILL }}, - { &hf_mq_pcf_prmccsid , { "ParmCCSID", "mqpcf.parm.ccsid", FT_UINT32, BASE_DEC | BASE_RANGE_STRING, RVALS(&GET_VALRV(ccsid)), 0x0, "MQPCF parameter ccsid", HFILL }}, - { &hf_mq_pcf_prmstrlen , { "ParmStrLn", "mqpcf.parm.strlen", FT_UINT32, BASE_DEC, NULL, 0x0, "MQPCF parameter strlen", HFILL }}, - { &hf_mq_pcf_prmcount , { "ParmCount", "mqpcf.parm.count", FT_UINT32, BASE_DEC, NULL, 0x0, "MQPCF parameter count", HFILL }}, - { &hf_mq_pcf_prmunused , { "ParmUnuse", "mqpcf.parm.unused", FT_UINT32, BASE_DEC, NULL, 0x0, "MQPCF parameter unused", HFILL }}, - { &hf_mq_pcf_string , { "String...", "mqpcf.parm.string", FT_STRINGZ, BASE_NONE, NULL, 0x0, "MQPCF parameter string", HFILL }}, - { &hf_mq_pcf_stringlist , { "StrList..", "mqpcf.parm.stringlist", FT_STRINGZ, BASE_NONE, NULL, 0x0, "MQPCF parameter string list", HFILL }}, - { &hf_mq_pcf_int , { "Integer..", "mqpcf.parm.int", FT_INT32, BASE_DEC, NULL, 0x0, "MQPCF parameter int", HFILL }}, - { &hf_mq_pcf_intlist , { "IntList..", "mqpcf.parm.intlist", FT_INT32, BASE_DEC, NULL, 0x0, "MQPCF parameter int list", HFILL }}, - { &hf_mq_pcf_bytestring , { "ByteStr..", "mqpcf.parm.bytestring", FT_BYTES, BASE_NONE, NULL, 0x0, "MQPCF parameter byte string", HFILL }}, - { &hf_mq_pcf_int64 , { "Int64....", "mqpcf.parm.int64", FT_INT64, BASE_DEC, NULL, 0x0, "MQPCF parameter int64", HFILL }}, - { &hf_mq_pcf_int64list , { "Int64List", "mqpcf.parm.int64list", FT_INT64, BASE_DEC, NULL, 0x0, "MQPCF parameter int64 list", HFILL }}, - }; - static gint *ett[] = - { - &ett_mqpcf, - &ett_mqpcf_prm, - &ett_mqpcf_cfh, - }; - static ei_register_info ei[] = - { - { &ei_mq_pcf_prmln0, { "mqpcf.parm.len0", PI_MALFORMED, PI_ERROR, "MQPCF Parameter length is 0", EXPFILL }}, - { &ei_mq_pcf_MaxInt, { "mqpcf.parm.IntList", PI_UNDECODED, PI_WARN, "MQPCF Parameter Integer list exhausted", EXPFILL }}, - { &ei_mq_pcf_MaxStr, { "mqpcf.parm.StrList", PI_UNDECODED, PI_WARN, "MQPCF Parameter String list exhausted", EXPFILL }}, - { &ei_mq_pcf_MaxI64, { "mqpcf.parm.Int64List", PI_UNDECODED, PI_WARN, "MQPCF Parameter Int64 list exhausted", EXPFILL }}, - { &ei_mq_pcf_MaxPrm, { "mqpcf.parm.MaxPrm", PI_UNDECODED, PI_WARN, "MQPCF Max number of parameter exhausted", EXPFILL }}, - { &ei_mq_pcf_PrmCnt, { "mqpcf.parm.PrmCnt", PI_UNDECODED, PI_WARN, "MQPCF Unkn Parm Cnt Length invalid", EXPFILL }}, - }; - - module_t *mq_pcf_module; - - proto_mqpcf = proto_register_protocol("WebSphere MQ Programmable Command Formats", "MQ PCF", "mqpcf"); - proto_register_field_array(proto_mqpcf, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - - expert_mqpcf = expert_register_protocol(proto_mqpcf); - expert_register_field_array(expert_mqpcf, ei, array_length(ei)); - - mq_pcf_module = prefs_register_protocol(proto_mqpcf, NULL); - prefs_register_uint_preference(mq_pcf_module, "maxprm", - "Set the maximun number of parameter in the PCF to decode", - "When dissecting PCF there can be a lot of parameters." - " You can limit the number of parameter decoded, before it continue with the next PCF.", - 10, &mq_pcf_maxprm); - prefs_register_uint_preference(mq_pcf_module, "maxlst", - "Set the maximun number of Parameter List that are displayed", - "When dissecting a parameter of a PCFm, if it is a StringList, IntegerList or Integer64 List, " - " You can limit the number of element displayed, before it continue with the next Parameter.", - 10, &mq_pcf_maxlst); + expert_module_t *expert_mqpcf; + + static hf_register_info hf[] = { + { &hf_mqpcf_cfh_type , + { "Type.....", "mqpcf.cfh.type", + FT_UINT32, BASE_DEC, VALS(&GET_VALSV(mqcft)), 0x0, + "CFH type", HFILL } + }, + { &hf_mqpcf_cfh_length , + { "Length...", "mqpcf.cfh.length", + FT_UINT32, BASE_DEC, NULL, 0x0, + "CFH length", HFILL } + }, + { &hf_mqpcf_cfh_version , + { "Version..", "mqpcf.cfh.version", + FT_UINT32, BASE_DEC, NULL, 0x0, + "CFH version", HFILL } + }, + { &hf_mqpcf_cfh_command , + { "Command..", "mqpcf.cfh.command", + FT_UINT32, BASE_DEC, VALS(&GET_VALSV(mqcmd)), 0x0, + "CFH command", HFILL } + }, + { &hf_mqpcf_cfh_MsgSeqNbr, + { "MsgSeqNbr", "mqpcf.cfh.MsgSeqNbr", + FT_UINT32, BASE_DEC, NULL, 0x0, + "CFH message sequence number", HFILL } + }, + { &hf_mqpcf_cfh_control , + { "Control..", "mqpcf.cfh.control", + FT_UINT32, BASE_DEC, NULL, 0x0, + "CFH control", HFILL } + }, + { &hf_mqpcf_cfh_compcode , + { "CompCode.", "mqpcf.cfh.compcode", + FT_UINT32, BASE_DEC, VALS(&GET_VALSV(mqcc)), 0x0, + "CFH completion code", HFILL } + }, + { &hf_mqpcf_cfh_reason , + { "ReasCode.", "mqpcf.cfh.reasoncode", + FT_UINT32, BASE_DEC, VALS(&GET_VALSV(mqrc)), 0x0, + "CFH reason code", HFILL } + }, + { &hf_mqpcf_cfh_ParmCount, + { "ParmCount", "mqpcf.cfh.ParmCount", + FT_UINT32, BASE_DEC, NULL, 0x0, + "CFH parameter count", HFILL } + }, + + { &hf_mq_pcf_prmtyp , + { "ParmTyp..", "mqpcf.parm.type", + FT_UINT32, BASE_DEC, VALS(&GET_VALSV(PrmTyp)), 0x0, + "MQPCF parameter type", HFILL } + }, + { &hf_mq_pcf_prmlen , + { "ParmLen..", "mqpcf.parm.len", + FT_UINT32, BASE_DEC, NULL, 0x0, + "MQPCF parameter length", HFILL } + }, + { &hf_mq_pcf_prmid , + { "ParmID...", "mqpcf.parm.id", + FT_UINT32, BASE_DEC, VALS(&GET_VALSV(PrmId)), 0x0, + "MQPCF parameter id", HFILL } + }, + { &hf_mq_pcf_prmidnovals , + { "ParmID...", "mqpcf.parm.idNoVals", + FT_UINT32, BASE_HEX_DEC, NULL, 0x0, + "MQPCF parameter id No Vals", HFILL } + }, + { &hf_mq_pcf_filterop , + { "FilterOP.", "mqpcf.filter.op", + FT_UINT32, BASE_DEC, VALS(&GET_VALSV(FilterOP)), 0x0, + "MQPCF Filter operator", HFILL } + }, + { &hf_mq_pcf_prmccsid , + { "ParmCCSID", "mqpcf.parm.ccsid", + FT_UINT32, BASE_DEC | BASE_RANGE_STRING, RVALS(&GET_VALRV(ccsid)), 0x0, + "MQPCF parameter ccsid", HFILL } + }, + { &hf_mq_pcf_prmstrlen , + { "ParmStrLn", "mqpcf.parm.strlen", + FT_UINT32, BASE_DEC, NULL, 0x0, + "MQPCF parameter strlen", HFILL } + }, + { &hf_mq_pcf_prmcount , + { "ParmCount", "mqpcf.parm.count", + FT_UINT32, BASE_DEC, NULL, 0x0, + "MQPCF parameter count", HFILL } + }, + { &hf_mq_pcf_prmunused , + { "ParmUnuse", "mqpcf.parm.unused", + FT_UINT32, BASE_DEC, NULL, 0x0, + "MQPCF parameter unused", HFILL } + }, + { &hf_mq_pcf_string , + { "String...", "mqpcf.parm.string", + FT_STRINGZ, BASE_NONE, NULL, 0x0, + "MQPCF parameter string", HFILL } + }, + { &hf_mq_pcf_stringlist , + { "StrList..", "mqpcf.parm.stringlist", + FT_STRINGZ, BASE_NONE, NULL, 0x0, + "MQPCF parameter string list", HFILL } + }, + { &hf_mq_pcf_int , + { "Integer..", "mqpcf.parm.int", + FT_INT32, BASE_DEC, NULL, 0x0, + "MQPCF parameter int", HFILL } + }, + { &hf_mq_pcf_intlist , + { "IntList..", "mqpcf.parm.intlist", + FT_INT32, BASE_DEC, NULL, 0x0, + "MQPCF parameter int list", HFILL } + }, + { &hf_mq_pcf_bytestring , + { "ByteStr..", "mqpcf.parm.bytestring", + FT_BYTES, BASE_NONE, NULL, 0x0, + "MQPCF parameter byte string", HFILL } + }, + { &hf_mq_pcf_int64 , + { "Int64....", "mqpcf.parm.int64", + FT_INT64, BASE_DEC, NULL, 0x0, + "MQPCF parameter int64", HFILL } + }, + { &hf_mq_pcf_int64list , + { "Int64List", "mqpcf.parm.int64list", + FT_INT64, BASE_DEC, NULL, 0x0, + "MQPCF parameter int64 list", HFILL } + }, + }; + static gint *ett[] = + { + &ett_mqpcf, + &ett_mqpcf_prm, + &ett_mqpcf_cfh, + }; + static ei_register_info ei[] = + { + { &ei_mq_pcf_prmln0, { "mqpcf.parm.len0", PI_MALFORMED, PI_ERROR, "MQPCF Parameter length is 0", EXPFILL }}, + { &ei_mq_pcf_MaxInt, { "mqpcf.parm.IntList", PI_UNDECODED, PI_WARN, "MQPCF Parameter Integer list exhausted", EXPFILL }}, + { &ei_mq_pcf_MaxStr, { "mqpcf.parm.StrList", PI_UNDECODED, PI_WARN, "MQPCF Parameter String list exhausted", EXPFILL }}, + { &ei_mq_pcf_MaxI64, { "mqpcf.parm.Int64List", PI_UNDECODED, PI_WARN, "MQPCF Parameter Int64 list exhausted", EXPFILL }}, + { &ei_mq_pcf_MaxPrm, { "mqpcf.parm.MaxPrm", PI_UNDECODED, PI_WARN, "MQPCF Max number of parameter exhausted", EXPFILL }}, + { &ei_mq_pcf_PrmCnt, { "mqpcf.parm.PrmCnt", PI_UNDECODED, PI_WARN, "MQPCF Unkn Parm Cnt Length invalid", EXPFILL }}, + }; + + module_t *mq_pcf_module; + + proto_mqpcf = proto_register_protocol("WebSphere MQ Programmable Command Formats", "MQ PCF", "mqpcf"); + proto_register_field_array(proto_mqpcf, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + + expert_mqpcf = expert_register_protocol(proto_mqpcf); + expert_register_field_array(expert_mqpcf, ei, array_length(ei)); + + mq_pcf_module = prefs_register_protocol(proto_mqpcf, NULL); + prefs_register_uint_preference(mq_pcf_module, "maxprm", + "Set the maximun number of parameter in the PCF to decode", + "When dissecting PCF there can be a lot of parameters." + " You can limit the number of parameter decoded, before it continue with the next PCF.", + 10, &mq_pcf_maxprm); + prefs_register_uint_preference(mq_pcf_module, "maxlst", + "Set the maximun number of Parameter List that are displayed", + "When dissecting a parameter of a PCFm, if it is a StringList, IntegerList or Integer64 List, " + " You can limit the number of element displayed, before it continue with the next Parameter.", + 10, &mq_pcf_maxlst); } void proto_reg_handoff_mqpcf(void) { - heur_dissector_add("mq", dissect_mqpcf_heur, proto_mqpcf); + heur_dissector_add("mq", dissect_mqpcf_heur, proto_mqpcf); } /* @@ -726,10 +825,10 @@ void proto_reg_handoff_mqpcf(void) * * Local variables: * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: t + * tab-width: 8 + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=4 tabstop=4 noexpandtab: - * :indentSize=4:tabSize=4:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ |