static void dissect_dvb_tdt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint offset = 0; proto_item *ti; proto_tree *dvb_tdt_tree; nstime_t utc_time; col_set_str(pinfo->cinfo, COL_INFO, "Time and Date Table (TDT)"); ti = proto_tree_add_item(tree, proto_dvb_tdt, tvb, offset, -1, ENC_NA); dvb_tdt_tree = proto_item_add_subtree(ti, ett_dvb_tdt); offset += packet_mpeg_sect_header(tvb, offset, dvb_tdt_tree, NULL, NULL); if (packet_mpeg_sect_mjd_to_utc_time(tvb, offset, &utc_time) < 0) { proto_tree_add_text(dvb_tdt_tree, tvb, offset, 5, "Unparseable time"); } else { proto_tree_add_time_format(dvb_tdt_tree, hf_dvb_tdt_utc_time, tvb, offset, 5, &utc_time, "UTC Time : %s UTC", abs_time_to_str(&utc_time, ABSOLUTE_TIME_UTC, FALSE)); } offset += 5; proto_item_set_len(ti, offset); }
/* convert ccsds embedded time to a human readable string - NOT THREAD SAFE */ static const char* embedded_time_to_string ( int coarse_time, int fine_time ) { static int utcdiff = 0; nstime_t t; int yr; int fraction; int multiplier = 1000; /* compute the static constant difference in seconds * between midnight 5-6 January 1980 (GPS time) and * seconds since 1/1/1970 (UTC time) just this once */ if ( 0 == utcdiff ) { for ( yr=1970; yr < 1980; ++yr ) { utcdiff += ( Leap(yr) ? 366 : 365 ) * 24 * 60 * 60; } utcdiff += 5 * 24 * 60 * 60; /* five days of January 1980 */ } t.secs = coarse_time + utcdiff; fraction = ( multiplier * ( (int)fine_time & 0xff ) ) / 256; t.nsecs = fraction*1000000; /* msecs to nsecs */ return abs_time_to_str(&t, ABSOLUTE_TIME_DOY_UTC, TRUE); }
static void absolute_val_to_repr(fvalue_t *fv, ftrepr_t rtype _U_, char *buf) { sprintf(buf, "\"%s\"", abs_time_to_str(&fv->value.time, ABSOLUTE_TIME_LOCAL, rtype == FTREPR_DISPLAY)); }
static int absolute_val_repr_len(fvalue_t *fv, ftrepr_t rtype _U_) { gchar *rep; rep = abs_time_to_str(&fv->value.time); return (int)strlen(rep) + 2; /* 2 for opening and closing quotes */ }
static int absolute_val_repr_len(fvalue_t *fv, ftrepr_t rtype _U_) { gchar *rep; rep = abs_time_to_str(&fv->value.time, ABSOLUTE_TIME_LOCAL, rtype == FTREPR_DISPLAY); return (int)strlen(rep) + 2; /* 2 for opening and closing quotes */ }
WSLUA_FUNCTION wslua_format_date(lua_State* LS) { /* Formats an absolute timestamp into a human readable date */ #define WSLUA_ARG_format_date_TIMESTAMP 1 /* A timestamp value to convert. */ lua_Number timestamp = luaL_checknumber(LS,WSLUA_ARG_format_date_TIMESTAMP); nstime_t then; gchar* str; then.secs = (guint32)floor(timestamp); then.nsecs = (guint32) ( (timestamp-(double)(then.secs))*1000000000); str = abs_time_to_str(&then, ABSOLUTE_TIME_LOCAL, TRUE); lua_pushstring(LS,str); WSLUA_RETURN(1); /* A string with the formated date */ }
static int absolute_val_repr_len(fvalue_t *fv, ftrepr_t rtype, int field_display _U_) { gchar *rep; int ret; rep = abs_time_to_str(NULL, &fv->value.time, ABSOLUTE_TIME_LOCAL, rtype == FTREPR_DISPLAY); ret = (int)strlen(rep) + ((rtype == FTREPR_DFILTER) ? 2 : 0); /* 2 for opening and closing quotes */ wmem_free(NULL, rep); return ret; }
static void absolute_val_to_repr(fvalue_t *fv, ftrepr_t rtype, int field_display _U_, char *buf) { gchar *rep = abs_time_to_str(NULL, &fv->value.time, ABSOLUTE_TIME_LOCAL, rtype == FTREPR_DISPLAY); if (rtype == FTREPR_DFILTER) { *buf++ = '\"'; } strcpy(buf, rep); if (rtype == FTREPR_DFILTER) { buf += strlen(rep); *buf++ = '\"'; *buf++ = '\0'; } wmem_free(NULL, rep); }
/* convert smex PB5 header time to a human readable string - NOT THREAD SAFE * * note: this is not true PB5 time either, but a tsi specific version, although it is similar */ static const char * smex_time_to_string (int pb5_days_since_midnight_9_10_oct_1995, int pb5_seconds, int pb5_milliseconds) { static int utcdiff = 0; nstime_t t; static int Days[2][13] = { { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; int yr; int ix, days, month; /* compute the static constant difference in seconds * between midnight 9-10 October 1995 (PB5 time) and * seconds since 1/1/1970 (UTC time) just this once */ if (0 == utcdiff) { for (yr=1970; yr < 1995; ++yr) { utcdiff += (Leap(yr) ? 366 : 365) * 24 * 60 * 60; } days = 0; ix = (Leap(1995) ? 1 : 0); for (month=1; month < 10; ++month) { days += Days[ix][month]; } days += 9; /* this gets us up to midnight october 9-10 */ utcdiff += days * 24 * 60 * 60; /* add days in 1995 prior to October 10 */ } t.secs = (pb5_days_since_midnight_9_10_oct_1995 * 86400) + pb5_seconds + utcdiff; t.nsecs = pb5_milliseconds*1000000; /* msecs to nsecs */ return abs_time_to_str(wmem_packet_scope(), &t, ABSOLUTE_TIME_DOY_UTC, TRUE); }
static void dissect_dvb_tot(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint offset = 0; guint descriptor_len; proto_item *ti; proto_tree *dvb_tot_tree; nstime_t utc_time; col_set_str(pinfo->cinfo, COL_INFO, "Time Offset Table (TOT)"); ti = proto_tree_add_item(tree, proto_dvb_tot, tvb, offset, -1, ENC_NA); dvb_tot_tree = proto_item_add_subtree(ti, ett_dvb_tot); offset += packet_mpeg_sect_header(tvb, offset, dvb_tot_tree, NULL, NULL); if (packet_mpeg_sect_mjd_to_utc_time(tvb, offset, &utc_time) < 0) { proto_tree_add_text(dvb_tot_tree, tvb, offset, 5, "UTC Time : Unparseable time"); } else { proto_tree_add_time_format(dvb_tot_tree, hf_dvb_tot_utc_time, tvb, offset, 5, &utc_time, "UTC Time : %s UTC", abs_time_to_str(&utc_time, ABSOLUTE_TIME_UTC, FALSE)); } offset += 5; descriptor_len = tvb_get_ntohs(tvb, offset) & DVB_TOT_DESCRIPTORS_LOOP_LENGTH_MASK; proto_tree_add_item(dvb_tot_tree, hf_dvb_tot_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(dvb_tot_tree, hf_dvb_tot_descriptors_loop_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; offset += proto_mpeg_descriptor_loop_dissect(tvb, offset, descriptor_len, dvb_tot_tree); offset += packet_mpeg_sect_crc(tvb, pinfo, dvb_tot_tree, 0, offset); proto_item_set_len(ti, offset); }
/* Print info for a 'geninfo' pseudo-protocol. This is required by * the PDML spec. The information is contained in Wireshark's 'frame' protocol, * but we produce a 'geninfo' protocol in the PDML to conform to spec. * The 'frame' protocol follows the 'geninfo' protocol in the PDML. */ static void print_pdml_geninfo(proto_tree *tree, FILE *fh) { guint32 num, len, caplen; nstime_t *timestamp; GPtrArray *finfo_array; field_info *frame_finfo; /* Get frame protocol's finfo. */ finfo_array = proto_find_finfo(tree, proto_frame); if (g_ptr_array_len(finfo_array) < 1) { return; } frame_finfo = (field_info *)finfo_array->pdata[0]; g_ptr_array_free(finfo_array, TRUE); /* frame.number --> geninfo.num */ finfo_array = proto_find_finfo(tree, hf_frame_number); if (g_ptr_array_len(finfo_array) < 1) { return; } num = fvalue_get_uinteger(&((field_info*)finfo_array->pdata[0])->value); g_ptr_array_free(finfo_array, TRUE); /* frame.frame_len --> geninfo.len */ finfo_array = proto_find_finfo(tree, hf_frame_len); if (g_ptr_array_len(finfo_array) < 1) { return; } len = fvalue_get_uinteger(&((field_info*)finfo_array->pdata[0])->value); g_ptr_array_free(finfo_array, TRUE); /* frame.cap_len --> geninfo.caplen */ finfo_array = proto_find_finfo(tree, hf_frame_capture_len); if (g_ptr_array_len(finfo_array) < 1) { return; } caplen = fvalue_get_uinteger(&((field_info*)finfo_array->pdata[0])->value); g_ptr_array_free(finfo_array, TRUE); /* frame.time --> geninfo.timestamp */ finfo_array = proto_find_finfo(tree, hf_frame_arrival_time); if (g_ptr_array_len(finfo_array) < 1) { return; } timestamp = (nstime_t *)fvalue_get(&((field_info*)finfo_array->pdata[0])->value); g_ptr_array_free(finfo_array, TRUE); /* Print geninfo start */ fprintf(fh, " <proto name=\"geninfo\" pos=\"0\" showname=\"General information\" size=\"%u\">\n", frame_finfo->length); /* Print geninfo.num */ fprintf(fh, " <field name=\"num\" pos=\"0\" show=\"%u\" showname=\"Number\" value=\"%x\" size=\"%u\"/>\n", num, num, frame_finfo->length); /* Print geninfo.len */ fprintf(fh, " <field name=\"len\" pos=\"0\" show=\"%u\" showname=\"Frame Length\" value=\"%x\" size=\"%u\"/>\n", len, len, frame_finfo->length); /* Print geninfo.caplen */ fprintf(fh, " <field name=\"caplen\" pos=\"0\" show=\"%u\" showname=\"Captured Length\" value=\"%x\" size=\"%u\"/>\n", caplen, caplen, frame_finfo->length); /* Print geninfo.timestamp */ fprintf(fh, " <field name=\"timestamp\" pos=\"0\" show=\"%s\" showname=\"Captured Time\" value=\"%d.%09d\" size=\"%u\"/>\n", abs_time_to_str(timestamp, ABSOLUTE_TIME_LOCAL, TRUE), (int) timestamp->secs, timestamp->nsecs, frame_finfo->length); /* Print geninfo end */ fprintf(fh, " </proto>\n"); }
static void dissect_dvb_eit(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint offset = 0, length = 0; guint descriptor_len, descriptor_end; guint16 evt_id; proto_item *ti; proto_tree *dvb_eit_tree; proto_item *ei; proto_tree *dvb_eit_event_tree; proto_item *duration_item; nstime_t start_time; col_set_str(pinfo->cinfo, COL_INFO, "Event Information Table (EIT)"); ti = proto_tree_add_item(tree, proto_dvb_eit, tvb, offset, -1, ENC_NA); dvb_eit_tree = proto_item_add_subtree(ti, ett_dvb_eit); offset += packet_mpeg_sect_header(tvb, offset, dvb_eit_tree, &length, NULL); length -= 4; proto_tree_add_item(dvb_eit_tree, hf_dvb_eit_service_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; proto_tree_add_item(dvb_eit_tree, hf_dvb_eit_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(dvb_eit_tree, hf_dvb_eit_version_number, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(dvb_eit_tree, hf_dvb_eit_current_next_indicator, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; proto_tree_add_item(dvb_eit_tree, hf_dvb_eit_section_number, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; proto_tree_add_item(dvb_eit_tree, hf_dvb_eit_last_section_number, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; proto_tree_add_item(dvb_eit_tree, hf_dvb_eit_transport_stream_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; proto_tree_add_item(dvb_eit_tree, hf_dvb_eit_original_network_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; proto_tree_add_item(dvb_eit_tree, hf_dvb_eit_segment_last_section_number, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; proto_tree_add_item(dvb_eit_tree, hf_dvb_eit_last_table_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; if (offset >= length) { packet_mpeg_sect_crc(tvb, pinfo, dvb_eit_tree, 0, offset); return; } /* Parse all the events */ while (offset < length) { evt_id = tvb_get_ntohs(tvb, offset); ei = proto_tree_add_text(dvb_eit_tree, tvb, offset, 12, "Event 0x%04hx", evt_id); dvb_eit_event_tree = proto_item_add_subtree(ei, ett_dvb_eit_event); proto_tree_add_item(dvb_eit_event_tree, hf_dvb_eit_event_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; if (tvb_memeql(tvb, offset, "\xFF\xFF\xFF\xFF\xFF", 5)) { if (packet_mpeg_sect_mjd_to_utc_time(tvb, offset, &start_time) < 0) { proto_tree_add_text(tree, tvb, offset, 5, "Unparseable time"); } else { proto_tree_add_time_format(dvb_eit_event_tree, hf_dvb_eit_start_time, tvb, offset, 5, &start_time, "Start Time: %s UTC", abs_time_to_str(&start_time, ABSOLUTE_TIME_UTC, FALSE)); } } else { proto_tree_add_text(tree, tvb, offset, 5, "Start Time: Undefined (0xFFFFFFFFFF)"); } offset += 5; duration_item = proto_tree_add_item(dvb_eit_event_tree, hf_dvb_eit_duration, tvb, offset, 3, ENC_BIG_ENDIAN); proto_item_append_text(duration_item, " (%02u:%02u:%02u)", MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset)), MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset + 1)), MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset + 2))); offset += 3; proto_tree_add_item(dvb_eit_event_tree, hf_dvb_eit_running_status, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(dvb_eit_event_tree, hf_dvb_eit_free_ca_mode, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(dvb_eit_event_tree, hf_dvb_eit_descriptors_loop_length, tvb, offset, 2, ENC_BIG_ENDIAN); descriptor_len = tvb_get_ntohs(tvb, offset) & DVB_EIT_DESCRIPTORS_LOOP_LENGTH_MASK; offset += 2; descriptor_end = offset + descriptor_len; while (offset < descriptor_end) offset += proto_mpeg_descriptor_dissect(tvb, offset, dvb_eit_event_tree); } offset += packet_mpeg_sect_crc(tvb, pinfo, dvb_eit_tree, 0, offset); proto_item_set_len(ti, offset); }
static void absolute_val_to_repr(fvalue_t *fv, ftrepr_t rtype _U_, char *buf) { sprintf(buf, "\"%s\"", abs_time_to_str(&fv->value.time)); }