aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-dvbci.c
diff options
context:
space:
mode:
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>2011-07-20 22:34:57 +0000
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>2011-07-20 22:34:57 +0000
commit36d9374d1012603020d73559e2d4790339db0a9a (patch)
tree47ca7c09acb23b122d92103d737abb4b870c8a5e /epan/dissectors/packet-dvbci.c
parent3eef460d37b8f0324ddd65052cb4a442d8418c27 (diff)
From Martin Kaiser:
Add support for the ca_pmt_reply apdu as defined in section 8.4.3.5 of the DVB-CI standard (EN 50221). Also some new apdu tags and their descriptions are added for completeness. After applying this patch, DVB-CI support is complete except for reassembly https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6132 git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@38137 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-dvbci.c')
-rw-r--r--epan/dissectors/packet-dvbci.c109
1 files changed, 102 insertions, 7 deletions
diff --git a/epan/dissectors/packet-dvbci.c b/epan/dissectors/packet-dvbci.c
index af3d1754fd..39388b4a8c 100644
--- a/epan/dissectors/packet-dvbci.c
+++ b/epan/dissectors/packet-dvbci.c
@@ -169,6 +169,12 @@
#define CA_DESC_TAG 0x9
+#define CA_ENAB_DESC_OK 0x01
+#define CA_ENAB_DESC_OK_PURCHASE 0x02
+#define CA_ENAB_DESC_OK_TECH 0x03
+#define CA_ENAB_DESC_NG_ENTITLEMENT 0x71
+#define CA_ENAB_DESC_NG_TECH 0x73
+
/* mmi resource */
#define CLOSE_MMI_CMD_ID_IMMEDIATE 0x0
#define CLOSE_MMI_CMD_ID_DELAY 0x1
@@ -196,7 +202,6 @@
/* used for answer_text_length, choice_nb and item_nb */
#define NB_UNKNOWN 0xFF
-
/* character tables, DVB-SI spec annex A.2 */
#define CHAR_TBL_8859_5 0x01
#define CHAR_TBL_8859_6 0x02
@@ -214,6 +219,7 @@
#define TEXT_CTRL_EMPH_OFF 0x87
#define TEXT_CTRL_CRLF 0x8A
+
/* application layer */
#define APDU_TAG_SIZE 3
@@ -271,6 +277,7 @@ dissect_dvbci_payload_mmi(guint32 tag, gint len_field,
#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
@@ -289,12 +296,17 @@ dissect_dvbci_payload_mmi(guint32 tag, gint len_field,
#define T_LIST_MORE 0x9F880D
/* the following apdus are recognized but not dissected in this release */
-#define T_CA_PMT_REPLY 0x9F8033
+#define T_COMMS_CMD 0x9F8C00
+#define T_COMMS_REPLY 0x9F8C02
+#define T_COMMS_SEND_LAST 0x9F8C03
+#define T_COMMS_SEND_MORE 0x9F8C04
+#define T_COMMS_RCV_LAST 0x9F8C05
+#define T_COMMS_RCV_MORE 0x9F8C06
/* these are no real apdus, they just use the same format */
-#define T_TEXT_LAST 0x9F8803
-#define T_TEXT_MORE 0x9F8804
-
+#define T_TEXT_LAST 0x9F8803
+#define T_TEXT_MORE 0x9F8804
+#define T_CONNECTION_DESCRIPTOR 0x9F8C01
#define IS_MENU_APDU(t) (t==T_MENU_MORE || t==T_MENU_LAST)
@@ -310,6 +322,7 @@ static const apdu_info_t apdu_info[] = {
{T_CA_INFO_ENQ, 0, 0, DATA_HOST_TO_CAM, NULL},
{T_CA_INFO, 0, LEN_FIELD_ANY, DATA_CAM_TO_HOST, dissect_dvbci_payload_ca},
{T_CA_PMT, 6, LEN_FIELD_ANY, DATA_HOST_TO_CAM, dissect_dvbci_payload_ca},
+ {T_CA_PMT_REPLY, 8, LEN_FIELD_ANY, DATA_CAM_TO_HOST, dissect_dvbci_payload_ca},
{T_TUNE, 0, 8, DATA_CAM_TO_HOST, dissect_dvbci_payload_hc},
{T_REPLACE, 0, 5, DATA_CAM_TO_HOST, dissect_dvbci_payload_hc},
@@ -360,6 +373,12 @@ static const value_string dvbci_apdu_tag[] = {
{ 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" },
{ 0, NULL }
};
@@ -411,6 +430,8 @@ static int hf_dvbci_es_info_len = -1;
static int hf_dvbci_ca_pmt_cmd_id = -1;
static int hf_dvbci_descr_len = -1;
static int hf_dvbci_ca_pid = -1;
+static int hf_dvbci_ca_enable_flag = -1;
+static int hf_dvbci_ca_enable = -1;
static int hf_dvbci_network_id = -1;
static int hf_dvbci_original_network_id = -1;
static int hf_dvbci_transport_stream_id = -1;
@@ -578,6 +599,18 @@ static const value_string dvbci_ca_pmt_cmd_id[] = {
{ CMD_ID_NOT_SELECTED, "not selected" },
{ 0, NULL }
};
+static const value_string dvbci_ca_enable[] = {
+ { CA_ENAB_DESC_OK, "descrambling possible" },
+ { CA_ENAB_DESC_OK_PURCHASE,
+ "descrambling possible under conditions (purchase dialogue)" },
+ { CA_ENAB_DESC_OK_TECH,
+ "descrambling possible under conditions (technical dialogue)" },
+ { CA_ENAB_DESC_NG_ENTITLEMENT,
+ "descrambling not possible (because no entitlement)" },
+ { CA_ENAB_DESC_NG_TECH,
+ "descrambling not possible (for technical reasons)" },
+ { 0, NULL }
+};
static const value_string dvbci_close_mmi_cmd_id[] = {
{ CLOSE_MMI_CMD_ID_IMMEDIATE, "immediate close" },
{ CLOSE_MMI_CMD_ID_DELAY, "delayed close" },
@@ -636,7 +669,6 @@ static const value_string dvbci_ans_id[] = {
-
static guint16 buf_size_cam; /* buffer size proposal by the CAM */
/* buffer size proposal by the host == negotiated buffer size */
static guint16 buf_size_host;
@@ -707,6 +739,31 @@ dissect_si_string(tvbuff_t *tvb, gint offset, gint str_len,
}
+/* dissect ca_enable_flag and ca_enable fields in the ca_pmt_reply
+ * return true if descrambling is possible, false otherwise */
+static gboolean
+dissect_ca_enable(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_,
+ proto_tree *tree)
+{
+ gboolean desc_ok = FALSE;
+ guint8 byte, ca_enab;
+
+ byte = tvb_get_guint8(tvb,offset);
+ proto_tree_add_item(tree, hf_dvbci_ca_enable_flag, tvb, offset, 1, ENC_NA);
+ if (byte&0x80) {
+ ca_enab = byte & ~0x80;
+ proto_tree_add_item(tree, hf_dvbci_ca_enable, tvb, offset, 1, ENC_NA);
+ if (ca_enab==CA_ENAB_DESC_OK ||
+ ca_enab==CA_ENAB_DESC_OK_PURCHASE ||
+ ca_enab==CA_ENAB_DESC_OK_TECH) {
+ desc_ok = TRUE;
+ }
+ }
+
+ return desc_ok;
+}
+
+
/* dissect a ca descriptor in the ca_pmt */
static gint
dissect_ca_desc(tvbuff_t *tvb, gint offset, packet_info *pinfo,
@@ -961,6 +1018,8 @@ dissect_dvbci_payload_ca(guint32 tag, gint len_field,
guint prog_info_len;
gint es_info_len, all_len;
gint ca_desc_len;
+ proto_tree *es_tree = NULL;
+ gboolean desc_ok = FALSE;
if (tag==T_CA_INFO) {
@@ -1025,6 +1084,36 @@ dissect_dvbci_payload_ca(guint32 tag, gint len_field,
offset += es_info_len;
}
}
+ else if (tag==T_CA_PMT_REPLY) {
+ prog_num = tvb_get_ntohs(tvb, offset);
+ col_append_sep_fstr(
+ pinfo->cinfo, COL_INFO, NULL, "Program number %x", prog_num);
+ proto_tree_add_item(
+ tree, hf_dvbci_prog_num, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ byte = tvb_get_guint8(tvb,offset);
+ proto_tree_add_text(tree, tvb, offset, 1,
+ "Version number: 0x%x, Current-next indicator: 0x%x",
+ (byte&0x3E) >> 1, byte&0x01);
+ offset++;
+ desc_ok |= dissect_ca_enable(tvb, offset, pinfo, tree);
+ offset++;
+ while (tvb_reported_length_remaining(tvb, offset) > 0) {
+ /* there's no need to check for tree==NULL */
+ pi = proto_tree_add_text(tree, tvb, offset, 3, "Elementary Stream");
+ es_tree = proto_item_add_subtree(pi, ett_dvbci_application);
+
+ proto_tree_add_item(es_tree, hf_dvbci_es_pid,
+ tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ desc_ok |= dissect_ca_enable(tvb, offset, pinfo, es_tree);
+ offset++;
+ }
+ if (desc_ok) {
+ col_append_sep_fstr(
+ pinfo->cinfo, COL_INFO, NULL, "descrambling possible");
+ }
+ }
}
@@ -2183,7 +2272,13 @@ proto_register_dvbci(void)
{ &hf_dvbci_ca_pid,
{ "CA PID", "dvbci.ca_pid", FT_UINT16, BASE_HEX,
NULL, 0x1FFF, NULL, HFILL } },
- { &hf_dvbci_network_id,
+ { &hf_dvbci_ca_enable_flag,
+ { "CA enable flag", "dvbci.ca_enable_flag", FT_UINT8, BASE_HEX,
+ NULL, 0x80, NULL, HFILL } },
+ { &hf_dvbci_ca_enable,
+ { "CA enable", "dvbci.ca_enable", FT_UINT8, BASE_HEX,
+ VALS(dvbci_ca_enable), 0x7F, NULL, HFILL } },
+ { &hf_dvbci_network_id,
{ "Network ID", "dvbci.hc.nid", FT_UINT16, BASE_HEX,
NULL, 0, NULL, HFILL } },
{ &hf_dvbci_original_network_id,