int dsmcc_GroupInfoIndication (int v, u_char *b, u_int len_org) { int len = len_org; int n_groups; int i; int len2; // -- due to some misbehavior of some service providers // -- we do a simple plausi check for group_counts_min_bytes > len i = getBits (b, 0, 0, 16); // group_counts i = i * 8 + 2; if (i > len_org) { // this is no GroupInfo print_databytes (v,"Data Bytes (non-standard):", b, len_org); return len_org; } out_nl (v,"GroupInfoIndication:"); indent (+1); n_groups = outBit_Sx_NL (v,"NumberOfGroups: ", b, 0, 16); b += 2; len -= 2; for (i=0; i < n_groups; i++) { out_NL (v); if (len <= 0) { out_nl (v, "... => strange len <= 0 and still group count > 0 (abort)"); break; } out_nl (v, "Group (%d):",i); indent (+1); outBit_Sx_NL (v,"GroupId: ", b, 0, 32); outBit_Sx_NL (v,"GroupSize: ", b, 32, 32); b += 8; len -= 8; // GroupCompatibility() len2 = dsmcc_CompatibilityDescriptor (b); b += len2; len -= len2; len2 = outBit_Sx_NL (v,"GroupInfoLength: ", b, 0, 16); // print_databytes (v, "GroupInfoBytes: ", b+2, len2); // $$$ TODO dsmcc_CarouselDescriptor_Loop ("GroupInfo", b+2, len2); b += 2+len2; len -= 2+len2; len2 = outBit_Sx_NL (v,"PrivateDataLength: ", b, 0, 16); print_private_data (v, b+2, len2); // $$$ What to do here? b += 2+len2; len -= 2+len2; indent (-1); } indent (-1); out_NL (v); return len_org; }
void section_DSMCC (u_char *b, int len) { /* TR 101 202 */ int len1; u_int table_id; u_int section_length; u_int section_syntax_indicator; u_int private_indicator; u_int sect_nr; u_int last_sect_nr; out_nl (3,"DSM-CC-decoding...."); table_id = outBit_S2x_NL (3,"Table_ID: ", b, 0, 8, (char *(*)(u_long))dvbstrTableID ); if (table_id < 0x3a || table_id > 0x3e) { out_nl (3,"wrong Table ID"); return; } section_syntax_indicator = outBit_Sx_NL (4,"Section_syntax_indicator: ", b, 8, 1); private_indicator = outBit_Sx_NL (4,"private_indicator: ", b, 9, 1); outBit_Sx_NL (6,"reserved_1: ", b,10, 2); section_length = outBit_Sx_NL (5,"dsmcc_section_length: ", b,12,12); outBit_Sx_NL (3,"table_id_extension: ", b,24,16); outBit_Sx_NL (6,"reserved_3: ", b,40, 2); outBit_Sx_NL (3,"Version_number: ", b,42, 5); outBit_S2x_NL(3,"Current_next_indicator: ", b,47, 1, (char *(*)(u_long))dvbstrCurrentNextIndicator ); sect_nr = outBit_Sx_NL (3,"Section_number: ", b,48, 8); last_sect_nr = outBit_Sx_NL (3,"Last_section_number: ", b,56, 8); b += 8; len1 = section_length - 5 - 4; // -4 == CRC/Checksum if (table_id == 0x3A) { llc_snap (3,b); // ISO/IEC 8802-2 } else if (table_id == 0x3B) { dsmcc_UserNetworkMessage (4, b, len1); } else if (table_id == 0x3C) { dsmcc_DownloadDataMessage (4, b, len1); } else if (table_id == 0x3D) { DSMCC_descriptor_list (b,len1); } else if (table_id == 0x3E) { // $$$ Remark: DVB defines 0x3E as datagram!! print_private_data (4, b, len1); } b += len1; outBit_Sx_NL (5, (section_syntax_indicator) ?"CRC: " :"Checksum: ", b,0,32); }