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

通讯编程

开发平台:

Visual C++

  1. #
  2. # pingdemo.tcl
  3. #
  4. # demonstration of the emulation facilities using the icmp
  5. # echo responder (also uses the arp responder)
  6. #
  7. # K Fall, 10/11/98
  8. # kfall@cs.berkeley.edu
  9. #
  10. # Instructions:
  11. # 1> first compile 'nse', the ns simulator with emulation
  12. # 2> change the 'myname' var below to the name of some machine
  13. # that isn't being used right now,
  14. # and set ifname to the relevant interface
  15. # 3> run this script (nse pingdemo.tcl)
  16. # 4> run a 'ping' from some host to the name chosen in step 2
  17. # 5> ping output should indicate the various functions exercised by
  18. # the tests below
  19. #
  20. Class PingDemo
  21. PingDemo instproc init {} {
  22. $self next
  23. $self instvar myname myaddr dotrace stoptime owdelay ifname delay_list next_delay_list
  24. $self instvar traceallfile tracenamfile
  25. #
  26. # These parameters are system specific.
  27. #
  28. switch [exec hostname] {
  29. pollytto* {
  30. set myname "dash-w.isi.edu"
  31. set ifname cnw0
  32. set dotrace 0
  33. }
  34. kfalls-host* {
  35. set myname "bit.ee.lbl.gov"
  36. set ifname fxp0
  37. set dotrace 1
  38. }
  39. default {
  40. puts "error: running on an unknown host; edit PingDemo::init"
  41. exit 1
  42. }
  43. }
  44. set myaddr [exec host $myname | sed "s/.*address //"]
  45. set stoptime 200.0
  46. set owdelay 1000ms
  47. set delay_list {0.5 0.1 0.01 0.001}
  48. set next_delay_list ""
  49. set traceallfile em-all.tr
  50. set tracenamfile em.nam
  51. puts ""
  52. }
  53. PingDemo instproc syssetup {} {
  54. puts "turning off IP forwarding and ICMP redirect generation."
  55. exec sysctl -w net.inet.ip.forwarding=0 net.inet.ip.redirect=0
  56. }
  57. PingDemo instproc emsetup {} {
  58. $self instvar myname myaddr dotrace stoptime owdelay ifname
  59. $self instvar traceallfile tracenamfile ns
  60. puts "I am $myname with IP address $myaddr."
  61. set ns [new Simulator]
  62. if { $dotrace } {
  63. exec rm -f $traceallfile $tracenamfile
  64. set allchan [open $traceallfile w]
  65. $ns trace-all $allchan
  66. set namchan [open $tracenamfile w]
  67. $ns namtrace-all $namchan
  68. }
  69. $ns use-scheduler RealTime
  70. set bpf2 [new Network/Pcap/Live]; # used to read IP info
  71. $bpf2 set promisc_ true
  72. set dev2 [$bpf2 open readonly $ifname]
  73. set ipnet [new Network/IP];  # used to write IP pkts
  74. $ipnet open writeonly
  75. set arpagent [new ArpAgent]
  76. $arpagent config $ifname
  77. set myether [$arpagent set myether_]
  78. puts "Arranging to proxy ARP for $myaddr on my ethernet $myether."
  79. $arpagent insert $myaddr $myether publish
  80. #
  81. # try to filter out unwanted stuff like netbios pkts, dns, etc
  82. #
  83. $bpf2 filter "icmp and dst $myaddr"
  84. set pfa1 [new Agent/Tap]
  85. set pfa2 [new Agent/Tap]
  86. set ipa [new Agent/Tap]
  87. set echoagent [new Agent/PingResponder]
  88. $pfa2 set fid_ 0
  89. $ipa set fid_ 1
  90. $pfa2 network $bpf2
  91. $ipa network $ipnet
  92. #
  93. # topology creation
  94. #
  95. set node0 [$ns node]
  96. set node1 [$ns node]
  97. set node2 [$ns node]
  98. $ns simplex-link $node0 $node1 1Mb $owdelay DropTail
  99. $ns simplex-link $node1 $node0 1Mb $owdelay DropTail
  100. $ns simplex-link $node0 $node2 1Mb $owdelay DropTail
  101. $ns simplex-link $node2 $node0 1Mb $owdelay DropTail
  102. $ns simplex-link $node1 $node2 1Mb $owdelay DropTail
  103. $ns simplex-link $node2 $node1 1Mb $owdelay DropTail
  104. $self instvar explink1 explink2; # link to experiment with
  105. set explink1 [$ns link $node0 $node2]
  106. set explink2 [$ns link $node2 $node1]
  107. #
  108. # attach-agent winds up calling $node attach $agent which does
  109. # these things:
  110. # append agent to list of agents in the node
  111. # sets target in the agent to the entry of the node
  112. # sets the node_ field of the agent to the node
  113. # if not yet created,
  114. # create port demuxer in node (Addr classifier),
  115. # put in dmux_
  116. # call "$self add-route $id_ $dmux_"
  117. # installs id<->dmux mapping in classifier_
  118. # allocate a port
  119. # set agent's port id and address
  120. # install port-agent mapping in dmux_
  121. #
  122. #
  123. $ns attach-agent $node0 $pfa2; # packet filter agent
  124. $ns attach-agent $node1 $ipa; # ip agent (for sending)
  125. $ns attach-agent $node2 $echoagent
  126. $ns simplex-connect $pfa2 $echoagent
  127. $ns simplex-connect $echoagent $ipa
  128. }
  129. PingDemo instproc newowdelay delay {
  130. $self instvar explink1 explink2 ns owdelay
  131. set owdelay $delay
  132. set lnk [$explink1 link]
  133. puts "[$ns now]: change 1-way delay from [$lnk set delay_] to $delay sec."
  134. $lnk set delay_ $delay
  135. set lnk [$explink2 link]
  136. $lnk set delay_ $delay
  137. }
  138. # eternally cycle through the delays in delay_list
  139. PingDemo instproc newowdelay_cycle {} {
  140. $self instvar delay_list next_delay_list
  141. if { "$next_delay_list" == "" } {
  142. set next_delay_list $delay_list
  143. }
  144. set next_delay [lindex $next_delay_list 0]
  145. set next_delay_list [lrange $next_delay_list 1]
  146. $self newowdelay $next_delay
  147. $ns at [expr [$ns now] + 10] "$self newowdelay_cycle"
  148. }
  149. PingDemo instproc run {} {
  150. $self instvar ns myaddr owdelay ifname explink
  151. $self syssetup
  152. $self emsetup
  153. puts "listening for pings on addr $myaddr, 1-way link delay: $owdelayn"
  154. $ns at 10.5 "$self newowdelay_cycle"
  155. $ns run
  156. }
  157. PingDemo thisdemo
  158. thisdemo run