void section_DSMCC_DATAGRAM (u_char *b, int len) { /* EN 301 192 7.x */ // $$$ TODO this differs from ISO/IEC 13818-6:1998 AMD_1_2000_Cor_1_2002 typedef struct _DATAGRAM { u_int table_id; u_int section_syntax_indicator; u_int private_indicator; u_int reserved_1; u_int section_length; u_int MAC_addr6; u_int MAC_addr5; u_int reserved_2; u_int payload_scrambling_control; u_int address_scrambling_control; u_int LLC_SNAP_flag; u_int current_next_indicator; u_int section_number; u_int last_section_number; u_int MAC_addr4; u_int MAC_addr3; // MAC-Bits: MSB first order u_int MAC_addr2; u_int MAC_addr1; // conditional // LLC SNAP according ISO 8802-2 // N ip datagram bytes u_int ip_datagram_data_bytes; // conditional u_int stuffing_bytes; // conditional unsigned long crc_checksum; } DATAGRAM; DATAGRAM d; int len1; d.table_id = b[0]; d.section_syntax_indicator = getBits (b, 0, 8, 1); d.private_indicator = getBits (b, 0, 9, 1); // $$$ TODO error indicator d.reserved_1 = getBits (b, 0, 10, 2); d.section_length = getBits (b, 0, 12, 12); d.MAC_addr6 = getBits (b, 0, 24, 8); d.MAC_addr5 = getBits (b, 0, 32, 8); d.reserved_2 = getBits (b, 0, 40, 2); d.payload_scrambling_control = getBits (b, 0, 42, 2); d.address_scrambling_control = getBits (b, 0, 44, 2); d.LLC_SNAP_flag = getBits (b, 0, 46, 1); d.current_next_indicator = getBits (b, 0, 47, 1); d.section_number = getBits (b, 0, 48, 8); d.last_section_number = getBits (b, 0, 56, 8); d.MAC_addr4 = getBits (b, 0, 64, 8); d.MAC_addr3 = getBits (b, 0, 72, 8); d.MAC_addr2 = getBits (b, 0, 80, 8); d.MAC_addr1 = getBits (b, 0, 88, 8); // MAC-Bits: MSB first ! b += 12; len1 = d.section_length - 9; out_nl (3,"DSM-CC DATAGRAM-decoding...."); out_S2B_NL (3,"Table_ID: ",d.table_id, dvbstrTableID (d.table_id)); if (d.table_id != 0x3e) { out_nl (3,"wrong Table ID"); return; } out_SB_NL (3,"section_syntax_indicator: ",d.section_syntax_indicator); out_SB_NL (3,"private_indicator: ",d.private_indicator); out_SB_NL (6,"reserved_1: ",d.reserved_1); out_SW_NL (5,"Section_length: ",d.section_length); out_SB_NL (5,"MACaddrbyte/DevicdID 6: ",d.MAC_addr6); out_SB_NL (5,"MACaddrbyte/DeviceID 5: ",d.MAC_addr5); out_SB_NL (6,"reserved_2: ",d.reserved_2); out_S2B_NL (3,"payload_scrambling_control: ",d.payload_scrambling_control, dsmccStrPayload_scrambling_control(d.payload_scrambling_control)); out_S2B_NL (3,"address_scrambling_control: ",d.address_scrambling_control, dsmccStrAddress_scrambling_control(d.address_scrambling_control)); out_SB_NL (3,"LLC_SNAP_flag: ",d.LLC_SNAP_flag); out_S2B_NL(3,"current_next_indicator: ",d.current_next_indicator, dvbstrCurrentNextIndicator(d.current_next_indicator)); out_SB_NL (3,"Section_number: ",d.section_number); out_SB_NL (3,"Last_Section_number: ",d.last_section_number); out_SB_NL (5,"MACaddrbyte/DeviceID 4: ",d.MAC_addr4); out_SB_NL (5,"MACaddrbyte/DeviceID 3: ",d.MAC_addr3); out_SB_NL (5,"MACaddrbyte/DeviceID 2: ",d.MAC_addr2); out_SB (5,"MACaddrbyte/DeviceID 1: ",d.MAC_addr1); out_nl (3," => MAC-Address/DeviceID: %02x:%02x:%02x:%02x:%02x:%02x", d.MAC_addr1,d.MAC_addr2,d.MAC_addr3, d.MAC_addr4,d.MAC_addr5,d.MAC_addr6); if (d.LLC_SNAP_flag == 0x01) { /* ISO/IEC 8802-2 */ int k; k = llc_snap (4, b); } else { net_IP_data (4, b, len1-4); } b += (len1 - 4); outBit_Sx_NL (5, (d.section_syntax_indicator) ?"CRC: " :"Checksum: ", b,0,32); }
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); }