This file is indexed.

/usr/include/ns3.27/ns3/des-metrics.h is in libns3-dev 3.27+dfsg-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
 * Copyright (c) 2016 LLNL
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation;
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Author: Peter D. Barnes, Jr. <pdbarnes@llnl.gov>
 */

#ifndef DESMETRICS_H
#define DESMETRICS_H

/**
 * @file
 * @ingroup simulator
 * ns3::DesMetrics declaration.
 */

#include "nstime.h"
#include "singleton.h"
#include "system-mutex.h"

#include <stdint.h>    // uint32_t
#include <fstream>
#include <string>

namespace ns3 {

/**
 * @ingroup simulator
 *
 * @brief Event trace data collector for the DES Metrics project.
 *
 * This feature generates a JSON file with event trace data,
 * including the source and destination context for each
 * event, and the (virtual) times when the event was scheduled and
 * when it will execute.
 *
 * See the DES Metrics Project page: https://wilseypa.github.io/desMetrics/
 * for more information and analysis tools.
 *
 * If enabled (see below), ns-3 scripts should use CommandLine to
 * parse arguments, which will open the JSON file with the same name
 * as the script, and write the JSON header.  Failure to use CommandLine when
 * DES Metrics is enabled will put the trace data in the file
 * \c desTraceFile.json instead. All examples accessible from \c test.py
 * use CommandLine, and so generate JSON files.
 *
 * Output from scripts ends up in the current working directory (normally the
 * top level directory). When \c test.py is used to run tests or examples
 * the trace files are generated in a time-stamped subdirectory of
 * \c testpy-output/,  which \c test.py normally deletes.
 * To keep the output of examples, use the \c --retain argument to \c test.py.
 *
 * The output file has the following form:
 * \verbatim
{
 "simulator_name" : "ns-3",
 "model_name" : "ipv4-raw",
 "capture_date" : "Fri May 27 00:34:27 2016",
 "command_line_arguments" : "ipv4-raw [ns3-dev-test-runner-debug] --test-name=ipv4-raw --stop-on-failure --fullness=QUICK --xml --tempdir=testpy-output/2016-05-27-04-33-35-CUT --out=testpy-output/2016-05-27-04-33-35-CUT/ipv4-raw.xml",
 "events" : [
  ["0",0,"0",0],
  ["1",0,"0",0],
  ["0",0,"0",0],
  ...
  ["0",0,"0",0]
 ]
} \endverbatim
 * The first few fields are self-explanatory. The \c event record consists of
 * the source context, the event send time, the destination context,
 * and the event execution time.  Times are given in the
 * current Time resolution.
 *
 * <b> Enabling DES Metrics </b>
 *
 * Enable DES Metrics at configure time with
 * \verbatim
   $ waf configure ... --enable-des-metrics \endverbatim
 *
 * <b> Working with DES Metrics </b>
 *
 * Some useful shell pipelines:
 *
 * \li Run everything, retaining the results directory: <br/>
 *   \code  ./test.py --nowaf --retain \endcode
 * \li Example traces end up in \c testpy-output/, so move there: <br/>
 *   \code cd testpy-output/$(date +"%F")*_/  \endcode 
 *   (Remove the `_', which is to work around a Doxygen limitation.)
 * \li Remove the traces with less than 10 events: <br/>
 *   \code wc -l *.json | sort -nr | grep "^ *[789] " | cut -d ' ' -f 9 | xargs rm -f \endcode
 * \li Show the largest file, and total number of trace files: <br/>
 *   \code wc -l *.json | sort -n | tail -2 \endcode
 *
 */
class DesMetrics : public Singleton<DesMetrics> 
{
public:

  /**
   * Open the DesMetrics trace file and print the header.
   *
   * The trace file will have the same base name as the main program, 
   * '.json' as the extension. 
   *
   * \param argc [in] Command line argument count.
   * \param argv [in] Command line arguments.
   * \param outDir [in] Directory where the trace file should be written.
   */
  void Initialize (int argc, char * argv[], std::string outDir = "");

  /**
   * Trace an event to self at the time it is scheduled.
   *
   * \param now [in] The local simulation time. 
   * \param delay [in] The delay to the event. 
   */
  void Trace (const Time & now, const Time & delay); 

  /**
   * Trace an event (with context) at the time it is scheduled.
   *
   * \param context [in] The context (NodeId) which will receive the event.
   * \param now [in] The local simulation time.
   * \param delay [in] The delay to the event.
   */
  void TraceWithContext (uint32_t context,  const Time & now, const Time & delay);

  /**
   * Destructor, closes the trace file.
   */
  ~DesMetrics (void);

private:

  /** Close the output file. */
  void Close (void);

  /**
   * Cache the last-used output directory.
   *
   * This is enables repeated/re-entrant use of CommandLine, for example
   * in \c command-line-test-suite.cc
   */
  static std::string m_outputDir;
  
  bool m_initialized;    //!< Have we been initialized.
  std::ofstream m_os;    //!< The output JSON trace file stream.
  char m_separator;      //!< The separator between event records.

  /** Mutex to control access to the output file. */
  SystemMutex m_mutex;
  
};  // class DesMetrics


} // namespace ns3

#endif /* DESMETRICS_H */