namtrace.tex
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:30k
源码类别:

通讯编程

开发平台:

Visual C++

  1. chapter{Nam Trace}
  2. label{chap:namtrace}
  3. Nam is a Tcl/Tk based animation tool that is used to visualize the ns
  4. simulations and real world packet trace data. The first step to use nam is
  5. to produce a nam trace file. The nam trace file should contain topology
  6. information like nodes, links, queues, node connectivity etc as well as
  7. packet trace information. In this chapter we shall describe the nam trace
  8. format and simple ns commands/APIs that can be used to produce topology 
  9. configurations and control animation in nam.
  10. The underlying design constraints for nam were that it is able to handle large amounts of trace data and that its animation primitives be adaptable so that it may be used in different types of network visualization. As a result, internally nam reads information from a file and keeps only a minimum amount of animation event information in memory.  Its animation event has a fairly simple and consistent structure so that it can many different visualization situations. 
  11. section{Nam Trace Format}
  12. label{sec:namtraceformat}
  13. The C++ class Trace used for ns tracing is used for nam tracing as
  14. well. Description of this class may be found under section
  15. ref{sec:tracemoncplus}. The method Trace::format() defines nam 
  16. format used in nam trace files which are used by nam for
  17. visualization of ns simulations. Trace class method Trace::format() is
  18. described in section ref{sec:traceformat} of chapter ref{chap:trace}. If
  19. the macro NAM_TRACE has been defined (by default it is defined in
  20. trace.h), then the following code is executed as part of the
  21. Trace::format() function:
  22. begin{program}
  23.         if (namChan_ != 0)
  24.                 sprintf(nwrk_,
  25.                         "%c -t "TIME_FORMAT" -s %d -d %d -p %s -e %d -c %d
  26. -i %d -a %d -x {%s.%s %s.%s %d %s %s}",
  27.                         tt,
  28.                         Scheduler::instance().clock(),
  29.                         s,
  30.                         d,
  31.                         name,
  32.                         th->size(),
  33.                         iph->flowid(),
  34.                         th->uid(),
  35.                         iph->flowid(),
  36.                         src_nodeaddr,
  37.                         src_portaddr,
  38.                         dst_nodeaddr,
  39.                         dst_portaddr,
  40.                         seqno,flags,sname);
  41. end{program}
  42. A nam trace file has a basic format to it. Each line is a nam event. The first character on the line defines the type of event and is followed by several flags to set options on that event. Each event is terminated by a newline character.
  43. begin{verbatim}
  44. <event-type> -t <time> <more flags>...
  45. end{verbatim}
  46. Depending on the event type, there are different flags following the
  47. time flag. 
  48. There are 2 sections in that file, static intial configuration events and animation events.  All events with -t * in them are configuration events and should be at the beginning of the file.  One thing to note is that nam can also be fed the trace file from a stream which enables it to be used with realtime applications.  See the section textbf{Using Streams with Realtime Applications} for more information.
  49. Following we describe nam trace file format for different classes events and animation objects.
  50. subsection {Initialization Events}
  51. The first section of a trace file must contain initialization information. All initialization events will have the flag code{-t *}.  This tells nam that this event needs to be parsed before any animation has started. 
  52. begin{description}
  53. item[Version]
  54.   The following line define the nam version as required to visualize
  55.   the given trace:
  56. begin{verbatim}
  57. V -t <time> -v <version> -a <attr>
  58. end{verbatim}
  59.   Normally there is only one version string in a given tracefile, and
  60.   it is usually the first line of the file.
  61. An example is the following:
  62. begin{program}
  63. V -t * -v 1.0a5 -a 0
  64. end{program}
  65. The flag code{-v 1.0a5} tells nam that this script requires a version of nam > 1.0a5.  For more information on this event look at the file tcl/stats.tcl under the procedure nam_analysis.
  66. item[Wireless]
  67. If you want to use wireless nodes in nam you need the wireless intialization event.
  68. begin{program}
  69. W -t * -x 600 -y 600
  70. end{program}
  71. This gives nam the size of the layout for the wireless world.  The -x value is the width and -y is height. For more information look at the file animator.tcl in the procedure infer-network-model.
  72. item[Hierarchy] Hierarchical address information is defined by:
  73.   code{A -t <time> -n <levels> -o <address-space size> -c <mcastshift> -a <mcastmask> -h <nth level> -m <mask in nth level> -s <shift in nth level>}\
  74.   
  75.   This trace gives the details of hierarchy, if hierarchical
  76.   addressing is being used for simulation. 
  77.   Flag {tt -n <levels>}
  78.   indicate the total number of hierarchical tiers, which is 1 for flat
  79.   addressing, 2 for a 2-level hierarchy etc. 
  80.   Flag {tt -o <address-space size>} 
  81.   denotes the total number of bits used for addressing. 
  82.   Flag {tt -h <nth level>} specifies the level of the address
  83.   hierarchy. 
  84.   Flag {tt -m <mask>} and {tt -s <shift>} describes the address mask
  85.   and the bit shift of a given level in the address hierarchy,
  86.   respectively. 
  87.   Here is an example of a trace for topology with 3 level hierachy:
  88. begin{program}
  89. A -t * -n 3 -p 0 -o 0xffffffff -c 31 -a 1
  90. A -t * -h 1 -m 1023 -s 22
  91. A -t * -h 2 -m 2047 -s 11
  92. A -t * -h 3 -m 2047 -s 0 
  93. end{program}
  94. Look at tcl/netModel.tcl under the nam_addressing procedure for more information.
  95. item[Color Table Entry]
  96. A table of color entries can be built using:\
  97. code{c -t <time> -i <color id> -n <color name>}\
  98. Nam allows one to associate color names with
  99. integers. This is very useful in coloring packets. The flow id of
  100. a packet is used to color the packet using the corresponding color
  101. table entry color.
  102. Notice the color name should be one of the names
  103. listed in color database in X11 (/usr/X11/lib/rgb.txt). 
  104. end{description}
  105. In addition to the above node and link layout events are also included in the initialization section.
  106. subsection{Nodes}
  107. The nam trace format defining node state is:\
  108. code{n -t <time> -a <src-addr> -s <src-id> -S <state> -v <shape> -c <color> -i <l-color> -o <color>}\
  109. "n" denotes the node state.\
  110. Flags "-t" indicates time and "-a" and "-s" denotes the node address and id.\
  111. "-S" gives the node state transition. The possible state transition values are: 
  112. begin{itemize}
  113. item UP, DOWN indicates node recovery and failure.
  114. item COLOR indicates node color change. If COLOR is given, a
  115.   following {tt -c <color>} is expected which gives the new color
  116.   value. Also, flag {tt -o} is expected so that backtracing can
  117.   restore the old color of a node. 
  118. item DLABEL indicates addition of label to node. If DLABEL is
  119.   given, a following -l <old-label> -L <new-label> is expected that gives
  120.   the old-label, if any (for backtracing) and current label. Shape gives
  121.   the node shape. The color of a node label can be specified via the
  122.   {tt -i} flag. 
  123. end{itemize}
  124. "-v" is the shape of the node. The possible values are:
  125. begin{itemize}
  126. item circle
  127. item box
  128. item hexagon
  129. end{itemize}
  130. As an example, the line\
  131. code{n -t * -a 4 -s 4 -S UP -v circle -c tan -i tan}\
  132. defines a node with address and id of 4 that has the shape of a
  133. circle, and color of tan and label-color (-i) of tan.
  134. subsection{Links}
  135. The nam trace for link states is given by:\
  136. code{l -t <time> -s <src> -d <dst> -S <state> -c <color> -o orientation -r <bw> -D <delay>}\
  137. where {tt <state>} and {tt <color>} indicate the same attributes
  138. (and the same format) as described above in the node state traces. 
  139. Flag {tt -o} gives the link orientation (angle between link and
  140. the horizon).  Valid orientation values are:
  141. begin{itemize}
  142. item up
  143. item down
  144. item right
  145. item left
  146. item up-right
  147. item down-right
  148. item up-left
  149. item down-left
  150. item angle between 0 and 2pi
  151. end{itemize}
  152. Flags {tt -r} and {tt -D} give the bandwidth (in Mb) and delay (in
  153. ms), respectively.
  154. An example of a link trace is:
  155. begin{program}
  156. l -t * -s 0 -d 1 -S UP -r 1500000 -D 0.01 -c black -o right
  157. end{program}
  158. subsection{Queues}
  159. The nam trace queue states is given by:\
  160. code{q -t <time> -s <src> -d <dst> -a <attr>}\
  161. Queues are visualized in nam as a straight line along which packets
  162. (small squares) are packed.
  163. In queue trace events, the flag {tt -a} specifies the orientation of the
  164. line of the queue (angle between the queue line and the horizontal
  165. line, counter-clockwise). 
  166. For example, the following line specifies a queue that grows
  167. vertically upwards with respect to the screen (here {tt 0.5} means
  168. the angle of the queue line is pi/2):
  169. begin{program}
  170. q -t * -s 0 -d 1 -a 0.5
  171. end{program}
  172. subsection{Packets}
  173. When a trace line describes a packet, the event type may be
  174.  + (enqueue), - (dequeue), r (receive), d (drop), 
  175. or h (hop). 
  176. code{<type> -t <time> -e <extent> -s <source id> -d <destination id> -c <conv> -i <id>}\
  177. code{<type>} is one of:
  178. begin{description}
  179. item[h] Hop: The packet started to be transmitted on the link from
  180. <source id> to <destination id> and is forwarded to the next hop.
  181. item[r] Receive: The packet finished transmission and started to be
  182. received at the destination.
  183. item[d] Drop: The packet was dropped from the queue or link from <source id> 
  184. to <destination id>. Drop here doesn't distinguish between dropping from queue or
  185. link. This is decided by the drop time.  
  186. item[+] Enter queue: The packet entered the queue from <source id> to
  187. <destination id>.
  188. item[-] Leave queue: The packet left the queue from <source id> to
  189. <destination id>.  
  190. end{description}
  191. The other flags have the following meaning:
  192. begin{description}
  193. item[-t <time>] is the time the event occurred.
  194. item[-s <source id>] is the originating node.
  195. item[-d <destination id>] is the destination node.
  196. item[-p <pkt-type>] is the descriptive name of the type of packet seen.
  197. See section ref{sec:traceptype} for the different types of packets 
  198. supported in ns.
  199. item[-e <extent>] is the size (in bytes) of the packet.
  200. item[-c <conv>] is the conversation id or flow-id of that session.
  201. item[-i <id>] is the packet id in the conversation.
  202. item[-a <attr>] is the packet attribute, which is currently used as color
  203. id. 
  204. item[-x <src-na.pa> <dst-sa.na> <seq> <flags> <sname>] is taken from
  205. ns-traces and it gives the source and destination node and port
  206. addresses, sequence number, flags (if any) and the type of message.
  207. For example code{ -x {0.1 -2147483648.0 -1 ------- SRM_SESS} } denotes an
  208. SRM message being sent from node 0 (port 1).
  209. end{description}
  210. Additional flags may be added for some protocols.
  211. begin{description}
  212. item[-P <packet type>] gives an ASCII string specifying a comma separated list of packet types.
  213.      Some values  are:
  214.      begin{description}
  215.        item[TCP]  A  tcp  data  packet.
  216.        item[ACK]  Generic  acknowledgement.
  217.        item[NACK] Generic  negative acknowledgement.
  218.        item[SRM]  SRM data packet.
  219.      end{description}
  220. item[-n <sequence number>] gives the packet sequence number.
  221. end{description}
  222. subsection{Node Marking}
  223. Node marks are colored concentric circles, boxes, or hexagons around nodes. 
  224. They are created by:\
  225. code{m -t <time> -n <mark name> -s <node> -c <color> -h <shape> -o <color>}\
  226. and can be deleted by:\
  227. code{m -t <time> -n <mark name> -s <node> -X}\
  228. Note that once created, a node mark cannot change its shape. The possible
  229. choices for shapes are, circle, box, and hexagon. They are defined as 
  230. lowercase strings exactly as above. A nam trace showing a node mark is:
  231. begin{program}
  232. m -t 4 -s 0 -n m1 -c blue -h circle
  233. end{program}
  234. indicating node 0 is marked with a blue circle at time 4.0. The name of
  235. the mark is m1.
  236. subsection{Agent Tracing}
  237. Agent trace events are used to visualize protocol state.
  238. They are always associated with nodes. 
  239. An agent event has a name, which is a {it unique} identifier of the
  240. agent. 
  241. An agent is shown as a square with its name inside, and a line link
  242. the square to its associated node 
  243. Agent events are constructed using the following format:\
  244. code{a -t <time> -n <agent name> -s <src>}\
  245. Because in ns, agents may be detached from nodes, an agent may be 
  246. deleted in nam with:\
  247. code{a -t <time> -n <agent name> -s <src> -X}\
  248. For example, the following nam trace line creates an agent named {tt
  249.   srm(5)} associated with node 5 at time 0:
  250. begin{program}
  251. a -t 0.00000000000000000 -s 5 -n srm(5)
  252. end{program}
  253. subsection{Variable Tracing}
  254. To visualize state variables associated with a protocol agent, we use
  255. feature trace events.
  256. % three types of features: timers, lists and simple variable
  257. Currently we allow a feature to display a simple variable, i.e., a
  258. variable with a single value. 
  259. Notice that the value is simple treated as a string (without
  260. white space).
  261. Every feature is required to be associated with an agent. 
  262. Then, it can be added or modified at any time after its agent is created.
  263. The trace line to create a feature is:\
  264. code{f -t <time> -s <src> -a <agentname> -T <type> -n <varname> -v <value> -o <prev value>}\
  265. Flag {tt <type>} is 
  266. begin{description}
  267. item[v] for a simple variable
  268. item[l] for a list
  269. item[s] for a stopped timer
  270. item[u] for an up-counting timer
  271. item[d] for a down-counting timer.
  272. end{description}
  273. However, only {tt v} is implemented in ns. 
  274. Flag {tt -v <value>} gives the new value of the variable. 
  275. Variable values are simple ASCII strings obeying the TCL string
  276. quoting conventions. 
  277. List values obey the TCL list conventions. 
  278. Timer values are ASCII numeric. 
  279. Flag {tt -o <prev value>} gives the previous value of the variable. 
  280. This is used in backward animation.
  281. Here is an example of a simple feature event:\
  282. code{f -t 0.00000000000000000 -s 1 -n C1_ -a srm(1) -v 2.25000 -T v}\
  283. Features may be deleted using:\
  284. code{f -t <time> -a <agent name> -n <var name> -o <prev value> -X}\
  285. subsection{Executing Tcl Procedures and External Code from within Nam}
  286. There is a special event that can be put in a nam tracefile which allows us
  287. to run different tcl procedures. This event is represented by event type {tt v}.\
  288. code{v -t <time> -e <nam tcl procedure call>}\
  289. This event is very generic, in that it may execute several different procedures
  290. at a given time, as long as it is in one line (no more than 256 characters).
  291. There may be white spaces in the string which are passed as arguments to the tcl
  292. procedure.  Unlike other events, the order of flags and the tcl procedure
  293. call is important.
  294. Here are some examples of this event in use:
  295. subsubsection{Setting playback speed}
  296. Normally the user chooses a playback rate via the rate slider in the animation window.  A trace file may set the playback rate via the code{set_rate_ext} command:
  297. code{v -t <time> -e set_rate_ext <time> <update-peers?>}
  298. For example:\
  299. code{v -t 2.5 -e set_rate_ext 20ms 1}
  300. For compatibility with earlier versions of nam, the code{set_rate} command is also supported.  Instead of specifying the step size directly, you use $10timeslog_{10} textit{<time-in-seconds>}$.  For example:
  301. code{v -t 2.5 -16.9897000433602 1}
  302. In order to have more readable files, code{set_rate_ext} is preferred.
  303. subsubsection{Annotation}
  304. This procedure is used for displaying text annotation at specfic times:
  305. code{v -t <time> -e sim_annotation <time> <unique sequence id> <text to display>}\
  306. For example:\
  307. code{v -t 4 -e sim_annotation 4 3 node 0 added one mark}\
  308. This line calls a special tcl function {tt sim_annotation} in
  309. nam, which inserts the given string code{node 0 added one mark}
  310. into nam's annotation pane.  Look at  
  311. code{Animator instproc sim_annotation} in 
  312. tcl/annotation.tcl for the implementation details.
  313. subsubsection{Node Exec Button}
  314. In nam releases, version 1.0a10 and later there is support for running external
  315. userdefinable scripts or programs from nam by clicking on a node button.
  316. code{v -t 1.0 -e node_tclscript <node_id> <button label> <tcl script>}\
  317. This line when read in a tracefile will add an extra button to node objects that
  318. will execute a tcl script when clicked.
  319. For example:\
  320. code{v -t 1.0 -e node_tclscript 2 "Echo Hello" {puts [exec echo hello]}}\
  321. The above line adds a button to node 2's info window with the label 
  322. "Echo Hello" and when this button is pressed the shell command 
  323. "echo hello" will be run and it's output will be returned to nam and
  324. then output to the terminal via the tcl procedure puts.
  325. The functions that implement the different nam trace formats described
  326. above may be found in the following files: ns/trace.cc, 
  327. ns/trace.h, ns/tcl/lib/ns-namsupp.tcl.
  328. subsection{Using Streams for Realtime Applications}
  329. In addtion to reading from files nam can also read from a stream such as
  330. STDIN. Here is a little tutorial on how to send a nam trace stream to nam to
  331. make it operate with real-time data.  First some
  332. background on how nam works internally.  Basically, it thinks it is
  333. reading from a nam tracefile.  The file has a format to it.  Each line
  334. is a nam event.  The first character on the line defines the type of
  335. event and is followed by several flags to set options on that event.
  336. Each event is terminated by a newline character.  A nam tracefile has 2
  337. sections, static configuration events and animation events.  All events
  338. with -t * in them are configuration events and should be sent to nam in
  339. one burst.  Lines beginning with a # are comment lines.  Currently
  340. comments should only be place in the animation section of the file after
  341. the first animation event.
  342. First of all you need to pipe your data to nam's stdin and add the '-'
  343. flag to the nam command.
  344. For example:
  345. begin{program}
  346. % cat wireless.nam | nam -
  347. end{program}
  348. nam will read the information from stdin
  349. Following is a short wireless animation example.  The first part of the
  350. script has line with -t * which tells nam that these are initial
  351. configuration information.
  352. begin{program}
  353. V -t * -v 1.0a5 -a 0
  354. W -t * -x 600 -y 600
  355. end{program}
  356. The first 2 lines are used in the nam initialization.  They need to be
  357. the first 2 lines sent to nam from your program. V is the minimum nam
  358. version needed to correctly run this script.  W means this is script
  359. contains wireless nodes which will be within the canvas size of width x
  360. and height y.
  361. begin{program}
  362. n -t * -s 0 -x 0.0 -y 0.0 -z 20 -v circle -c black -w
  363. n -t * -s 1 -x 0.0 -y 200.0 -z 20 -v box -c black -w
  364. end{program}
  365. Next is the network layout information.  The first line n creates a
  366. wireless (-w) circular (-v circle) node with id 0 (-s 0) at position
  367. 0.0,0.0 (-x 0.0 -y 0.0). It's size (-z) is 20 and it's color (-c) is
  368. black.  The second is a wireless square (-v box) node with id 1 (-s 1)
  369. at 0.0,200.0.  Each node has to have a unique id number given by the -s
  370. flag.
  371. begin{program}
  372. A -t * -n 1 -p 0 -o 0xffffffff -c 31 -a 1
  373. A -t * -h 1 -m 2147483647 -s 0
  374. end{program}
  375. The A event line has to do with setting up hierarchical addressing in
  376. nam.  It is necessary in wireless nam because packets are treated as
  377. broadcast to every node.
  378. Now we are done with the configuration part of the nam file.  Next are
  379. the animation events.  In order for nam to operate in a close to
  380. real-time mode it needs to constantly receive updates.  As it is playing
  381. it will  keeps reading lines from the nam trace and playing them back.
  382. The sequence of events must be in chronological order.  For example the
  383. following lines change the color of node 1 from black to green back to
  384. black and then to black again.
  385. begin{program}
  386. n -t 0.0 -s 1 -S COLOR -c green -o black
  387. n -t 0.01 -s 1 -S COLOR -c black -o green
  388. n -t 0.02 -s 1 -S COLOR -c black -o black
  389. end{program}
  390. Notice that the "-t <time>" flags are always increasing.  You cannot
  391. issue one event at -t 0.2 and then another later on at -t 0.1.  Nam has
  392. an internal counter of time and it executes an event once it's time
  393. counter passes that event time.  It will execute events in chronological
  394. order but only if they are given to it in chronological order.  So the
  395. following WILL NOT work.
  396. begin{program}
  397. n -t 0.0 -s 1 -S COLOR -c black -o black
  398. n -t 0.02 -s 1 -S COLOR -c green -o black
  399. n -t 0.01 -s 1 -S COLOR -c black -o green
  400. end{program}
  401. Since nam has its own internal representation of time which is different
  402. than current real world time you have to try and synchronize them.
  403. There is no explicit and totally accurate way to do this but you can
  404. have a rough synchronization of time by having you application
  405. periodically send nam events even if nothing has happened. We have 
  406. created a dummy or "no-op" event (T) for this purpose.
  407. begin{program}
  408. T -t 0.5
  409. end{program}
  410. As described above, you MUST feed events to nam in non-decreasing
  411. timestamp order. Successive events at the same time are OK. 
  412. Before animating to a given time, nam needs to know that it's got all
  413. the events for that time, and so it actually has to read an event
  414. AFTER that time.  Therefore if you're driving nam from an external
  415. process in real-time it will refuse to animate time t until it sees an
  416. event at time t+i (for any i > 0).  To make nam play out events
  417. smoothly, you may therefore need to generate dummy events with
  418. intermediate timestamps (so that nam knows it can advance).  Events of
  419. type "T" are dummy events, so this stream would produce jerky
  420. animatation:
  421. begin{program}
  422. n -t 1.0 -s 1 -S COLOR -c green -o black
  423. n -t 2.0 -s 1 -S COLOR -c black -o green
  424. n -t 3.0 -s 1 -S COLOR -c black -o black
  425. end{program}
  426. while this would be animatated much smoother:
  427. begin{program}
  428. T -t 0.0
  429. T -t 0.5
  430. n -t 1.0 -s 1 -S COLOR -c green -o black
  431. T -t 1.5
  432. n -t 2.0 -s 1 -S COLOR -c black -o green
  433. T -t 2.5
  434. n -t 3.0 -s 1 -S COLOR -c black -o black
  435. T -t 3.5
  436. T -t 4.0
  437. ...
  438. end{program}
  439. If nam ever gets to the end of an
  440. event stream it will block and the program will appear as if it
  441. has frozen.  The screen will not be updated until it can read another event
  442. so you must be sure to feed events to nam faster than or as fast as it
  443. can read them.  This technique works pretty well and allows nam to look
  444. as if it is running in real-time although in reality there will be a
  445. slight delay which is usually acceptable.
  446. One other thing to remember is that your application should send these events
  447. based on it's representation of time from when the application started.
  448. Also, when sending events to nam they should be unbuffered so you 
  449. will want to fflush(stdout); after each event.
  450. Another event which you can keep sending to nam would be an note which
  451. will show a the bottom of the nam window.
  452. begin{program}
  453. v -t 0.08 -e sim_annotation 0.08 1 Time is 0.08
  454. v -t 0.09 -e sim_annotation 0.09 2 Time is 0.09
  455. v -t 0.10 -e sim_annotation 0.08 3 Time is 0.10
  456. end{program}
  457. The 'v' event means that you will execute a tcl script at time -t,
  458. everything after -e is the script to execute.  sim_annotation writes a
  459. note at the bottom of the screen.  The numbers after it are the time to
  460. write and a unique note id.  Notice how I incremented the note id with
  461. each successive note.   The remaining is what is written to the screen.
  462. For example "Time is 0.08" followed by "Time is 0.09", etc...
  463. That is the basic idea behind making nam work in a real-time fashion.
  464. Following are two examples on how to generate wireless packet animations
  465. when using nam.  To make a wireless broadcast which is shown as quickly
  466. expanding circle you can use the following.
  467. begin{program}
  468. + -t 0.16 -s 0 -d -1 -p AODV -e 100 -c 2 -a 0 -i 0 -k MAC
  469. - -t 0.16 -s 0 -d -1 -p AODV -e 100 -c 2 -a 0 -i 0 -k MAC
  470. h -t 0.16 -s 0 -d -1 -p AODV -e 100 -c 2 -a 0 -i 0 -k MAC
  471. end{program}
  472. '+' event puts the packet onto the transmission queue
  473. '-' event remove the packet from the queue and makes it ready to
  474. broadcast
  475. 'h' send the packet to the next hop which actually causes the animation
  476. Here are the meanings of the flags
  477.   -t time
  478.   -s transmitting node id
  479.   -d destination node id (-1 indicates broadcast to world)
  480.   -e size of transmission
  481.   -c ultimate destination of the packet
  482. To show a packet being send from one particular node to another use the
  483. following
  484. begin{program}
  485. r -t 0.255 -s 1 -d -1 -p MAC -e 512 -c 0 -a 0 -i 0 -k MAC
  486. + -t 0.255 -s 1 -d 0 -p AODV -e 512 -c 0 -a 0 -i 0 -k MAC
  487. - -t 0.255 -s 1 -d 0 -p AODV -e 512 -c 0 -a 0 -i 0 -k MAC
  488. h -t 0.255 -s 1 -d 0 -p AODV -e 512 -c 0 -a 0 -i 0 -k MAC
  489. r -t 0.255 -s 0 -d 1 -p AODV -e 512 -c 0 -a 0 -i 0 -k MAC
  490. end{program}
  491. First the packet is received ('r') from the wireless broadcast to node
  492. 1.  It is then added to the outgoing queue ('+') on node 1.  Next, it is
  493. removed from the queue('-') and ready to be sent to node 0.  Then the
  494. packet is sent to the next hop ('h') node 0.  This will trigger an
  495. animation of a line the length of the packet size moving from node 1 to
  496. node 0.  Finally it is received ('r') by node 0 from node 1.
  497. For more nam events you can look at the nam section in the ns manual
  498. Also, you can save a copy of the trace from a realtime
  499. source using the unix 'tee' command. For example:
  500. begin{program}
  501. % cat wireless.nam | tee saved_tracefile.nam | nam -
  502. end{program}
  503. Sometimes it is a bug in nam and sometimes it is a problem with the way
  504. your tracefile is formatted.  You may expect nam to do something that it
  505. won't do.  Part of the philosophy in the design of nam is that the detail of
  506. an animation is handled by the tracefile which makes nam more flexible
  507. but pushes some of the animation complexity on to the programmer
  508. generating the tracefile. 
  509. subsection{Nam Trace File Format Lookup Table}
  510. This is a listing of all possible nam trace event codes and the flags associated with them.  It was taken from the source code in the file parser.cc.  You can generate your own table by running code{nam -p}.
  511. input{nam_trace_format_table}
  512. section{Ns commands for creating and controlling nam animations}
  513. label{sec:namcommands}
  514. This section describes different APIs in ns that may be used to
  515. manipulate nam animations for objects like nodes, links, queues and
  516. agents. 
  517. The implementation of most of these APIs is contained in
  518. ns/tcl/lib/ns-namsupp.tcl.
  519. Demonstration of nam APIs may be found in ns/tcl/ex/nam-example.tcl.
  520. subsection{Node}
  521. Nodes are created from the ''n'' trace event in trace file. 
  522. Each node represents a host or a router. 
  523. Nam terminates if there are duplicate definitions of the same node.
  524. Attributes specific to node are color, shape, label, label-color,
  525. position of label and adding/deleting mark on the node.
  526. Each node can have 3 shapes: circle (default), square, or hexagon.
  527. But once created, the shape of a node cannot be changed during the
  528. simulation.
  529. Different node may have different colors, and its color may be changed
  530. during animation. 
  531. The following OTcl procedures are used to set node attributes, they
  532. are methods of the class Node:
  533. begin{program}
  534. $node color [color]      ;# sets color of node
  535. $node shape [shape]      ;# sets shape of node
  536. $node label [label]      ;# sets label on node
  537. $node label-color [lcolor]  ;# sets color of label
  538. $node label-at [ldirection] ;# sets position of label
  539. $node add-mark [name] [color] [shape]   ;# adds a mark to node
  540. $node delete-mark [name]    ;# deletes mark from node
  541. end{program} %$
  542. subsection{Link/Queue}
  543. Links are created between nodes to form a network topology. 
  544. nam links
  545. are internally simplex, but it is invisible to the users. The trace
  546. event ''l'' creates two simplex links and other necessary setups, hence
  547. it looks to users identical to a duplex link. Link may have many
  548. colors and it can change its color during animation. Queues are
  549. constructed in nam between two nodes. Unlike link, nam queue is
  550. associated to a simplex link.  The trace event ``q'' only creates a
  551. queue for a simplex link. In nam, queues are visualized as stacked
  552. packets. Packets are stacked along a line, and the angle between the
  553. line and the horizontal line can be specified in the trace event ``q''.
  554. Commands to setup different animation attributes of a link are as
  555. follows:
  556. code{$ns duplex-link-op <attribute> <value>} %$
  557. The <attribute> may be one of the following: orient, color, queuePos, label.
  558. Orient or the link orientation defines the angle between the link and
  559. horizontal. The optional orientation values may be difined in
  560. degrees or by text like right (0), right-up (45), right-down (-45), left
  561. (180), left-up (135), left-down (-135), up (90), down (-90). The queuePos
  562. or position of queue is defined as the angle of the queue line with
  563. horizontal. 
  564. Examples for each attribute are given as following : 
  565. begin{program}
  566. $ns duplex-link-op orient right      ;# orientation is set as right. The order
  567.                                      ;# in which links are created in nam
  568.                                      ;# depends on calling order of this function.
  569. $ns duplex-link-op color "green"
  570. $ns duplex-link-op queuePos 0.5
  571. $ns duplex-link-op label "A"
  572. end{program} %$
  573. subsection{Agent and Features}
  574. Agents are used to separate protocol states from nodes. They are always
  575. associated with nodes. An agent has a name, which is a unique identifier
  576. of the agent. It is shown as a square with its name inside, and a line
  577. link the square to its associated node. The following are commands that
  578. support agent tracing:
  579. begin{program}
  580. $ns add-agent-trace <agent> <name> <optional:tracefile>
  581. $ns delete-agent-trace <agent>
  582. $ns monitor-agent-trace <agent>
  583. end{program} %$
  584. Once the above command is used to create an agent in nam trace, the
  585. {tt tracevar} method of the ns agent can be used to create feature
  586. traces of a given variable in the agent. 
  587. For example, the following code segment creates traces of the variable
  588. {tt C1_} in an SRM agent {tt $srm(0)}:
  589. begin{program}
  590.         $ns attach-agent $n($i) $srm(0)
  591.         $ns add-agent-trace $srm($i) srm(0)
  592.         $ns monitor-agent-trace $srm(0) ;# turn nam monitor on from the start
  593.         $srm(0) tracevar C1_
  594. end{program} %$
  595. subsection{Some Generic Commands}
  596. code{$ns color <color-id>} %$
  597. defines color index for nam. Once
  598. specified, {tt color-id} can be used in place of the color name in
  599. nam traces.
  600. code{$ns trace-annotate <annotation>} %$
  601. inserts an annotation in nam. Notice that if {tt <annotation>} 
  602. contains white spaces, it must be quoted using the double quote.
  603. An example of this would be
  604. code{$ns at $time ''$ns trace-annotate ''Event A happened''''} %$
  605. This annotation appears in the nam window and is used to control
  606. playing of nam by events. 
  607. code{$ns set-animation-rate <timestep>} %$
  608. causes nam to set the animation playout rate to
  609. the given timestep value.
  610. Time is in seconds, with optional prefixes (for example, 1 is 1 second, or 2ms is 0.002 seconds).