From bde7c0f545e7ee25d07f8ebed7995722ef12bd3c Mon Sep 17 00:00:00 2001 From: Anders Broman Date: Wed, 7 Sep 2011 04:46:43 +0000 Subject: [PATCH] From Martin Kaiser: DVB-CI / CI+ CAM upgrade resource https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6309 svn path=/trunk/; revision=38908 --- epan/dissectors/packet-dvbci.c | 277 ++++++++++++++++++++++++--------- 1 file changed, 202 insertions(+), 75 deletions(-) diff --git a/epan/dissectors/packet-dvbci.c b/epan/dissectors/packet-dvbci.c index 01367c3590..5c3a0b3751 100644 --- a/epan/dissectors/packet-dvbci.c +++ b/epan/dissectors/packet-dvbci.c @@ -227,6 +227,19 @@ #define TEXT_CTRL_CRLF 0x8A +/* cam upgrade resource */ +#define CUP_DELAYED 0x0 +#define CUP_IMMEDIATE 0x1 + +#define CUP_ANS_NO 0x0 +#define CUP_ANS_YES 0x1 +#define CUP_ANS_ASK 0x2 + +#define CUP_RESET_PCMCIA 0x0 +#define CUP_RESET_CMDIF 0x1 +#define CUP_RESET_NONE 0x2 + + /* application layer */ #define APDU_TAG_SIZE 3 @@ -276,41 +289,50 @@ static void dissect_dvbci_payload_hlc(guint32 tag, gint len_field _U_, tvbuff_t *tvb, gint offset, packet_info *pinfo, proto_tree *tree); +static void +dissect_dvbci_payload_cup(guint32 tag, gint len_field _U_, + tvbuff_t *tvb, gint offset, packet_info *pinfo, + proto_tree *tree); + /* apdu defines */ -#define T_PROFILE_ENQ 0x9F8010 -#define T_PROFILE 0x9F8011 -#define T_PROFILE_CHANGE 0x9F8012 -#define T_APP_INFO_ENQ 0x9F8020 -#define T_APP_INFO 0x9F8021 -#define T_ENTER_MENU 0x9F8022 -#define T_REQUEST_CICAM_RESET 0x9F8023 -#define T_DATARATE_INFO 0x9F8024 -#define T_CA_INFO_ENQ 0x9F8030 -#define T_CA_INFO 0x9F8031 -#define T_CA_PMT 0x9F8032 -#define T_CA_PMT_REPLY 0x9F8033 -#define T_TUNE 0x9F8400 -#define T_REPLACE 0x9F8401 -#define T_CLEAR_REPLACE 0x9F8402 -#define T_ASK_RELEASE 0x9F8403 -#define T_DATE_TIME_ENQ 0x9F8440 -#define T_DATE_TIME 0x9F8441 -#define T_CLOSE_MMI 0x9F8800 -#define T_DISPLAY_CONTROL 0x9F8801 -#define T_DISPLAY_REPLY 0x9F8802 -#define T_ENQ 0x9F8807 -#define T_ANSW 0x9F8808 -#define T_MENU_LAST 0x9F8809 -#define T_MENU_MORE 0x9F880A -#define T_MENU_ANSW 0x9F880B -#define T_LIST_LAST 0x9F880C -#define T_LIST_MORE 0x9F880D -#define T_HOST_COUNTRY_ENQ 0x9F8100 -#define T_HOST_COUNTRY 0x9F8101 -#define T_HOST_LANGUAGE_ENQ 0x9F8110 -#define T_HOST_LANGUAGE 0x9F8111 +#define T_PROFILE_ENQ 0x9F8010 +#define T_PROFILE 0x9F8011 +#define T_PROFILE_CHANGE 0x9F8012 +#define T_APP_INFO_ENQ 0x9F8020 +#define T_APP_INFO 0x9F8021 +#define T_ENTER_MENU 0x9F8022 +#define T_REQUEST_CICAM_RESET 0x9F8023 +#define T_DATARATE_INFO 0x9F8024 +#define T_CA_INFO_ENQ 0x9F8030 +#define T_CA_INFO 0x9F8031 +#define T_CA_PMT 0x9F8032 +#define T_CA_PMT_REPLY 0x9F8033 +#define T_TUNE 0x9F8400 +#define T_REPLACE 0x9F8401 +#define T_CLEAR_REPLACE 0x9F8402 +#define T_ASK_RELEASE 0x9F8403 +#define T_DATE_TIME_ENQ 0x9F8440 +#define T_DATE_TIME 0x9F8441 +#define T_CLOSE_MMI 0x9F8800 +#define T_DISPLAY_CONTROL 0x9F8801 +#define T_DISPLAY_REPLY 0x9F8802 +#define T_ENQ 0x9F8807 +#define T_ANSW 0x9F8808 +#define T_MENU_LAST 0x9F8809 +#define T_MENU_MORE 0x9F880A +#define T_MENU_ANSW 0x9F880B +#define T_LIST_LAST 0x9F880C +#define T_LIST_MORE 0x9F880D +#define T_HOST_COUNTRY_ENQ 0x9F8100 +#define T_HOST_COUNTRY 0x9F8101 +#define T_HOST_LANGUAGE_ENQ 0x9F8110 +#define T_HOST_LANGUAGE 0x9F8111 +#define T_CAM_FIRMWARE_UPGRADE 0x9F9D01 +#define T_CAM_FIRMWARE_UPGRADE_REPLY 0x9F9D02 +#define T_CAM_FIRMWARE_UPGRADE_PROGRESS 0x9F9D03 +#define T_CAM_FIRMWARE_UPGRADE_COMPLETE 0x9F9D04 /* the following apdus are recognized but not dissected in this release */ #define T_COMMS_CMD 0x9F8C00 @@ -365,50 +387,59 @@ static const apdu_info_t apdu_info[] = { {T_HOST_COUNTRY_ENQ, 0, 0, DATA_CAM_TO_HOST, NULL}, {T_HOST_COUNTRY, 0, 3, DATA_HOST_TO_CAM, dissect_dvbci_payload_hlc}, {T_HOST_LANGUAGE_ENQ, 0, 0, DATA_CAM_TO_HOST, NULL}, - {T_HOST_LANGUAGE, 0, 3, DATA_HOST_TO_CAM, dissect_dvbci_payload_hlc} + {T_HOST_LANGUAGE, 0, 3, DATA_HOST_TO_CAM, dissect_dvbci_payload_hlc}, + + {T_CAM_FIRMWARE_UPGRADE, 0, 3, DATA_CAM_TO_HOST, dissect_dvbci_payload_cup}, + {T_CAM_FIRMWARE_UPGRADE_REPLY, 0, 1, DATA_HOST_TO_CAM, dissect_dvbci_payload_cup}, + {T_CAM_FIRMWARE_UPGRADE_PROGRESS, 0, 1, DATA_CAM_TO_HOST, dissect_dvbci_payload_cup}, + {T_CAM_FIRMWARE_UPGRADE_COMPLETE, 0, 1, DATA_CAM_TO_HOST, dissect_dvbci_payload_cup} }; static const value_string dvbci_apdu_tag[] = { - { T_PROFILE_ENQ, "Profile enquiry" }, - { T_PROFILE, "Profile information" }, - { T_PROFILE_CHANGE, "Profile change notification" }, - { T_APP_INFO_ENQ, "Application info enquiry" }, - { T_APP_INFO, "Application info" }, - { T_ENTER_MENU, "Enter menu" }, - { T_REQUEST_CICAM_RESET, "Request CICAM reset" }, - { T_DATARATE_INFO, "Datarate info" }, - { T_CA_INFO_ENQ, "CA info enquiry" }, - { T_CA_INFO, "CA info" }, - { T_CA_PMT, "CA PMT" }, - { T_DATE_TIME_ENQ, "Date-Time enquiry" }, - { T_DATE_TIME, "Date-Time" }, - { T_CA_PMT_REPLY, "CA PMT reply" }, - { T_TUNE, "Tune" }, - { T_REPLACE, "Replace" }, - { T_CLEAR_REPLACE, "Clear replace" }, - { T_ASK_RELEASE, "Ask release" }, - { T_CLOSE_MMI, "Close MMI" }, - { T_DISPLAY_CONTROL, "Display control" }, - { T_DISPLAY_REPLY, "Display reply" }, - { T_TEXT_LAST, "Text last" }, - { T_TEXT_MORE, "Text more" }, - { T_ENQ, "Enquiry" }, - { T_ANSW, "Answer" }, - { T_MENU_LAST, "Menu last" }, - { T_MENU_MORE, "Menu more" }, - { T_MENU_ANSW, "Menu answer" }, - { T_LIST_LAST, "List last" }, - { T_LIST_MORE, "List more" }, - { T_COMMS_CMD, "Comms command" }, - { T_COMMS_REPLY, "Comms reply" }, - { T_COMMS_SEND_LAST, "Comms send last" }, - { T_COMMS_SEND_MORE, "Comms send more" }, - { T_COMMS_RCV_LAST, "Comms receive last" }, - { T_COMMS_RCV_MORE, "Comms receive more" }, - { T_HOST_COUNTRY_ENQ, "Host country enquiry" }, - { T_HOST_COUNTRY, "Host country" }, - { T_HOST_LANGUAGE_ENQ, "Host language enquiry" }, - { T_HOST_LANGUAGE, "Host language" }, + { T_PROFILE_ENQ, "Profile enquiry" }, + { T_PROFILE, "Profile information" }, + { T_PROFILE_CHANGE, "Profile change notification" }, + { T_APP_INFO_ENQ, "Application info enquiry" }, + { T_APP_INFO, "Application info" }, + { T_ENTER_MENU, "Enter menu" }, + { T_REQUEST_CICAM_RESET, "Request CICAM reset" }, + { T_DATARATE_INFO, "Datarate info" }, + { T_CA_INFO_ENQ, "CA info enquiry" }, + { T_CA_INFO, "CA info" }, + { T_CA_PMT, "CA PMT" }, + { T_DATE_TIME_ENQ, "Date-Time enquiry" }, + { T_DATE_TIME, "Date-Time" }, + { T_CA_PMT_REPLY, "CA PMT reply" }, + { T_TUNE, "Tune" }, + { T_REPLACE, "Replace" }, + { T_CLEAR_REPLACE, "Clear replace" }, + { T_ASK_RELEASE, "Ask release" }, + { T_CLOSE_MMI, "Close MMI" }, + { T_DISPLAY_CONTROL, "Display control" }, + { T_DISPLAY_REPLY, "Display reply" }, + { T_TEXT_LAST, "Text last" }, + { T_TEXT_MORE, "Text more" }, + { T_ENQ, "Enquiry" }, + { T_ANSW, "Answer" }, + { T_MENU_LAST, "Menu last" }, + { T_MENU_MORE, "Menu more" }, + { T_MENU_ANSW, "Menu answer" }, + { T_LIST_LAST, "List last" }, + { T_LIST_MORE, "List more" }, + { T_COMMS_CMD, "Comms command" }, + { T_COMMS_REPLY, "Comms reply" }, + { T_COMMS_SEND_LAST, "Comms send last" }, + { T_COMMS_SEND_MORE, "Comms send more" }, + { T_COMMS_RCV_LAST, "Comms receive last" }, + { T_COMMS_RCV_MORE, "Comms receive more" }, + { T_HOST_COUNTRY_ENQ, "Host country enquiry" }, + { T_HOST_COUNTRY, "Host country" }, + { T_HOST_LANGUAGE_ENQ, "Host language enquiry" }, + { T_HOST_LANGUAGE, "Host language" }, + { T_CAM_FIRMWARE_UPGRADE, "CAM firmware upgrade" }, + { T_CAM_FIRMWARE_UPGRADE_REPLY, "CAM firmware upgrade reply" }, + { T_CAM_FIRMWARE_UPGRADE_PROGRESS, "CAM firmware upgrade progress" }, + { T_CAM_FIRMWARE_UPGRADE_COMPLETE, "CAM firmware upgrade complete" }, { 0, NULL } }; @@ -512,6 +543,11 @@ static int hf_dvbci_choice_ref = -1; static int hf_dvbci_item_nb = -1; static int hf_dvbci_host_country = -1; static int hf_dvbci_host_language = -1; +static int hf_dvbci_cup_type = -1; +static int hf_dvbci_cup_download_time = -1; +static int hf_dvbci_cup_answer = -1; +static int hf_dvbci_cup_progress = -1; +static int hf_dvbci_cup_reset = -1; static GHashTable *tpdu_fragment_table = NULL; @@ -770,7 +806,23 @@ static const value_string dvbci_ans_id[] = { { ANSW_ID_ANSWER, "answer" }, { 0, NULL } }; - +static const value_string dvbci_cup_type[] = { + { CUP_DELAYED, "delayed" }, + { CUP_IMMEDIATE, "immediate" }, + { 0, NULL } +}; +static const value_string dvbci_cup_answer[] = { + { CUP_ANS_NO, "upgrade denied" }, + { CUP_ANS_YES, "upgrade allowed" }, + { CUP_ANS_ASK, "ask the user for permission" }, + { 0, NULL } +}; +static const value_string dvbci_cup_reset[] = { + { CUP_RESET_PCMCIA, "PCMCIA reset" }, + { CUP_RESET_CMDIF, "CI command interface reset" }, + { CUP_RESET_NONE, "no reset" }, + { 0, NULL } +}; @@ -1568,6 +1620,66 @@ dissect_dvbci_payload_hlc(guint32 tag, gint len_field _U_, } +static void +dissect_dvbci_payload_cup(guint32 tag, gint len_field _U_, + tvbuff_t *tvb, gint offset, packet_info *pinfo, + proto_tree *tree) +{ + guint8 upgrade_type; + guint16 download_time; + guint8 answer, progress; + proto_item *pi; + + switch(tag) { + case T_CAM_FIRMWARE_UPGRADE: + upgrade_type = tvb_get_guint8(tvb, offset); + proto_tree_add_item(tree, hf_dvbci_cup_type, tvb, offset, 1, ENC_NA); + col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "(%s)", + val_to_str(upgrade_type, dvbci_cup_type, "unknown")); + offset++; + download_time = tvb_get_ntohs(tvb, offset); + if (download_time == 0) { + proto_tree_add_uint_format(tree, hf_dvbci_cup_download_time, + tvb, offset, 2, download_time, + "estimated download time is unknown"); + } + else { + proto_tree_add_uint_format(tree, hf_dvbci_cup_download_time, + tvb, offset, 2, download_time, + "estimated download time is %d seconds", + download_time); + } + break; + case T_CAM_FIRMWARE_UPGRADE_REPLY: + answer = tvb_get_guint8(tvb, offset); + proto_tree_add_item(tree, hf_dvbci_cup_answer, tvb, offset, 1, ENC_NA); + col_append_sep_fstr(pinfo->cinfo, COL_INFO, ": ", "%s", + val_to_str(answer, dvbci_cup_answer, "unknown")); + break; + case T_CAM_FIRMWARE_UPGRADE_PROGRESS: + progress = tvb_get_guint8(tvb, offset); + if (progress > 100) { + pi = proto_tree_add_text(tree, tvb, offset, 1, + "Invalid value for progress"); + expert_add_info_format(pinfo, pi, PI_PROTOCOL, PI_WARN, + "progress is in percent, value must be between 0 and 100"); + } + else { + col_append_sep_fstr(pinfo->cinfo, COL_INFO, ": ", "%d%%", progress); + proto_tree_add_uint_format(tree, hf_dvbci_cup_progress, + tvb, offset, 1, progress, + "download progress %d%%", progress); + } + break; + case T_CAM_FIRMWARE_UPGRADE_COMPLETE: + proto_tree_add_item(tree, hf_dvbci_cup_reset, tvb, offset, 1, ENC_NA); + break; + default: + break; + } +} + + static void dissect_dvbci_apdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8 direction) @@ -2594,7 +2706,22 @@ proto_register_dvbci(void) NULL, 0, NULL, HFILL } }, { &hf_dvbci_host_language, { "Host language", "dvb-ci.hlc.language", FT_STRING, BASE_NONE, - NULL, 0, NULL, HFILL } } + NULL, 0, NULL, HFILL } }, + { &hf_dvbci_cup_type, + { "CAM upgrade type", "dvb-ci.cup.type", FT_UINT8, BASE_HEX, + VALS(dvbci_cup_type), 0, NULL, HFILL } }, + { &hf_dvbci_cup_download_time, + { "Download time", "dvb-ci.cup.download_time", FT_UINT16, BASE_HEX, + NULL, 0, NULL, HFILL } }, + { &hf_dvbci_cup_answer, + { "CAM upgrade answer", "dvb-ci.cup.answer", FT_UINT8, BASE_HEX, + VALS(dvbci_cup_answer), 0, NULL, HFILL } }, + { &hf_dvbci_cup_progress, + { "CAM upgrade progress", "dvb-ci.cup.progress", FT_UINT8, BASE_HEX, + NULL, 0, NULL, HFILL } }, + { &hf_dvbci_cup_reset, + { "requested CAM reset", "dvb-ci.cup.reset", FT_UINT8, BASE_HEX, + VALS(dvbci_cup_reset), 0, NULL, HFILL } } }; spdu_table = g_hash_table_new(g_direct_hash, g_direct_equal);