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

通讯编程

开发平台:

Visual C++

  1. # Nam filter: Processing ns nam tracefile to produce info for namgraph
  2. set analysis_OK 0
  3. set analysis_ready 0
  4. # color database
  5. set colorname(0) black
  6. set colorname(1) dodgerblue
  7. set colorname(2) cornflowerblue
  8. set colorname(3) blue
  9. set colorname(4) deepskyblue
  10. set colorname(5) steelblue
  11. set colorname(6) navy
  12. set colorname(7) darkolivegreen
  13. set fcolorname(0) red
  14. set fcolorname(1) brown
  15. set fcolorname(2) purple
  16. set fcolorname(3) orange
  17. set fcolorname(4) chocolate
  18. set fcolorname(5) salmon
  19. set fcolorname(6) greenyellow
  20. set fcolorname(7) gold
  21. set fcolorname(8) red
  22. set fcolorname(9) brown
  23. set fcolorname(10) purple
  24. set fcolorname(11) orange
  25. set fcolorname(12) chocolate
  26. set fcolorname(13) salmon
  27. set fcolorname(14) greenyellow
  28. set fcolorname(15) gold
  29. # get trace item
  30. proc get_trace_item { tag traceevent} {
  31.     set next 0
  32.     foreach item $traceevent {
  33.         if { $next == 1 } {
  34.             return $item
  35.         }   
  36.         if { $item == $tag } {
  37.             set next 1
  38.         }
  39.     }   
  40.     return ""
  41. }
  42. # process version info
  43. proc handle_version { line } {
  44.     global analysis_OK nam_version analysis_ready
  45.     
  46.     set nam_version [get_trace_item "-v" $line]
  47.     if { $nam_version >= "1.0a5" } {
  48.         set analysis_OK 1
  49.     }
  50.     set analysis_ready [get_trace_item "-a" $line]
  51. }
  52. # preanalysis
  53. # return
  54. # 0: no filter can be applied
  55. # 1: filters have been applied
  56. # 2: Applying filters
  57. proc nam_analysis { tracefile } {
  58.     global analysis_OK nam_version analysis_ready
  59.     set file [open $tracefile "r"]
  60.     set line [gets $file]
  61.     set time [get_trace_item "-t" $line]
  62.     # skip all beginning non "*" events
  63.     while {([eof $file]==0)&&([string compare $time "*"]!=0)} {
  64. set line [gets $file]
  65. set time [get_trace_item "-t" $line]
  66.     }
  67.     while {([eof $file]==0)&&([string compare $time "*"]==0) } {
  68.         set cmd [lindex $line 0]
  69.         switch "$cmd" {
  70.             "V" {
  71.                  handle_version $line
  72.                  break
  73.             }
  74.         }
  75.         set line [gets $file]
  76.         set time [get_trace_item "-t" $line]
  77.     }
  78.     close $file
  79.     # old nam, skip it
  80.     if { $analysis_OK == 0 } {
  81.          puts "You are using the tracefile format older than 1.0b5"
  82.          puts "which will not allow you to run namgraph"
  83.          return 0
  84.     }
  85.     # check if analysis ready
  86.     if { $analysis_ready == 1 } {
  87. puts "Filters have been applied to the tracefile before"
  88. return 1
  89.     } else {
  90.   return 2
  91.     }
  92. }
  93. proc nam_prefilter { tracefile } {
  94.     # it only supports tcp & srm so far
  95.     global colorname colorindex session_id highest_seq colorset groupmember 
  96.     global proto_id
  97.     set file [open $tracefile "r"]
  98.     set file2 [open $tracefile.tmp "w"]
  99.     set colorindex 0
  100.     # set color value
  101.     while {[eof $file]==0} {
  102.         set line [gets $file]
  103.         set time [get_trace_item "-t" $line]
  104. set prot [get_trace_item "-p" $line]
  105.     
  106.         if { [string compare $time "*"]==0 } {
  107.     puts $file2 $line
  108.     continue
  109.         }
  110.     
  111.         # get extended info after -x
  112.         set extinfo [get_trace_item "-x" $line]
  113.     
  114.         if {$extinfo==""} {
  115.     puts $file2 $line
  116.     continue
  117.   }
  118.     
  119.         # find the biggest tcp sequence number for the specific session
  120.         #set tmp_seq [lindex $extinfo 2]
  121.         #if { ($highest_seq < $tmp_seq) && ([string compare $prot "tcp"] == 0 
  122. #    || [string compare $prot "ack"] == 0) } {
  123.         #    set highest_seq $tmp_seq
  124.         #}
  125.         set src  [lindex $extinfo 0]
  126.         set dst  [lindex $extinfo 1]
  127. set subtype [lindex $extinfo 4]  
  128. set subtype_s [split $subtype "_"]
  129. set srm_flag [lindex $subtype_s 0]
  130. # tcp packet
  131.         if {(![info exists colorset($src.$dst)]) && (![info exists colorset($dst.$src)]) 
  132.     && ([string compare $prot "tcp"] == 0 || [string compare $prot "ack"] == 0) } {
  133.             set colorset($src.$dst) $colorindex
  134.             set colorset($dst.$src) $colorindex
  135.     
  136.             set protocol [get_trace_item "-p" $line]
  137.             set session_id($colorindex) "TCP session 
  138.                 between node $src and node $dst"
  139.     set proto_id($colorindex) "TCP"
  140.             incr colorindex
  141. }
  142.    # SRM packet
  143. if { [string compare $srm_flag "SRM"] == 0 } {
  144.     if { ![info exists colorset($dst)] } {
  145.         set colorset($dst) $colorindex
  146. set groupmember($dst) ""
  147. set session_id($colorindex) SRM-$dst
  148.         incr colorindex
  149.     }
  150.     set matchflag 0
  151.     foreach member $groupmember($dst) {
  152.   if { [string compare $member $src] == 0 } {
  153.     set matchflag 1
  154. }
  155.     }
  156.     if { $matchflag == 0 } {
  157. lappend groupmember($dst) $src
  158.     }
  159. }
  160. #set specific color
  161.         set attrindex [lsearch $line -a]
  162.         incr attrindex
  163.   if { [string compare $srm_flag "SRM"] == 0 } {
  164.             set line2 [lreplace $line $attrindex $attrindex $colorset($dst)]
  165.             set line "$line2 -S $colorset($dst)"
  166. } else {
  167.     if { [string compare $prot "tcp"] == 0 || 
  168. [string compare $prot "ack"] == 0 } {
  169.                 set line2 [lreplace $line $attrindex $attrindex $colorset($src.$dst)]
  170.                 set line "$line2 -S $colorset($src.$dst)"
  171.     }
  172. }
  173.     puts $file2 $line 
  174.     }
  175.     close $file
  176.     close $file2
  177.     exec mv $tracefile.tmp $tracefile 
  178. #    set fcnt $colorindex
  179. }
  180. proc nam_filter { tracefile } {
  181.     global filters filter_num colorindex colorname mcnt
  182.     # set color value in the tracefile
  183.     set tracefilebackup $tracefile.tmp    
  184.     set file [open $tracefile "r"]
  185.     set file2 [open $tracefilebackup "w"]
  186.     
  187.     # define color value in the tracefile
  188.     
  189.     #for {set i 0} {$i < $colorindex} {incr i} {
  190.     #    puts $file2 "c -t * -i $i -n $colorname($i)"
  191.     #}
  192.     
  193.     while {[eof $file]==0} {
  194.     
  195.         set line [gets $file]
  196.         set cmd [lindex $line 0]
  197.     
  198.         if {$line==""} {continue}
  199. # Apply filters here
  200. for {set i 0} {$i < $filter_num} {incr i} {
  201.     set filtercmd [list $filters($i) $line]
  202.     set line [eval $filtercmd] 
  203. # puts $file2 $result
  204.         }
  205.  
  206. puts $file2 $line
  207.     }
  208.     close $file
  209.     close $file2
  210.     
  211.     exec mv $tracefile.tmp $tracefile
  212. }
  213. # Filter srm packet
  214. proc srm_filter {event} {
  215.     global colorset fname fcnt mcnt colorindex srmdata_s srmsess_s srmrqst_s 
  216. srmrepr_s srmdata_r srmsess_r srmrqst_r srmrepr_r srmrqst_rf srmrepr_rf 
  217. srmrepr_sf srmrqst_sf groupmember
  218.     set extinfo [get_trace_item "-x" $event]
  219.     set type [lindex $event 0]
  220.     if {$extinfo!=""} {
  221.         #get srm flags
  222.         set flagitem [lindex $extinfo 4]
  223.         #filter tcp packet
  224.         set protocol [get_trace_item "-p" $event]
  225.         set cmd  [lindex $event 0]
  226.     
  227.         #1. SRM_DATA 
  228.         #2. SRM_SESS
  229.         #3. SRM_RQST
  230.         #4. SRM_REPR
  231.     
  232.         if {[string compare $flagitem "SRM_DATA"] == 0 } {
  233.     set src [get_trace_item "-s" $event]
  234.     set ssrc [lindex $extinfo 0]
  235.       set ssrcs [split $ssrc "."]
  236.     set ssrc0 [lindex $ssrcs 0]
  237.     # sending SRM_DATA from the source
  238.     
  239.     if { [string compare $src $ssrc0 ] == 0  && 
  240. [string compare $type "h" ] == 0} {
  241.                 if { ![info exists srmdata_s] } {
  242.                     set srmdata_s $mcnt
  243.                     set fname($mcnt) "SRM_DATA_SEND"
  244.                     incr mcnt
  245.                 }
  246.         
  247.                 set fbit [get_trace_item "-f" $event]
  248. set sid [get_trace_item "-S" $event]
  249.                 if { $fbit == "" } {
  250.                     set event "$event -f $sid -m $srmdata_s"
  251.                 } 
  252.             }
  253.     set ddst [lindex $extinfo 1]
  254.     set dst [get_trace_item "-d" $event]
  255.     set cnt 0
  256.     
  257.             foreach value $groupmember($ddst) {
  258.              set ddsts [split $value "."]
  259.              set ddst0 [lindex $ddsts 0]
  260. if { [string compare $ddst0 $dst] == 0 } {
  261.     set cnt 1
  262.     break
  263. }
  264.             }
  265.  
  266.     if { $cnt == 1 && [string compare $type "r" ] == 0 } {
  267. if { ![info exists srmdata_r] } {
  268.     set srmdata_r $mcnt
  269.                     set fname($mcnt) "SRM_DATA_RECV"
  270.                     incr mcnt
  271.                 }
  272.                 set fbit [get_trace_item "-f" $event]
  273.                 set sid [get_trace_item "-S" $event]
  274.                 if { $fbit == "" } {
  275.                     set event "$event -f $sid -m $srmdata_r"
  276.                 }
  277.             }
  278.         }     
  279. # SRM_SESSION
  280.         if {[string compare $flagitem "SRM_SESS"] == 0 } {
  281.     set ddst [lindex $extinfo 1]
  282.             set src [get_trace_item "-s" $event]
  283.             set cnt 0
  284.             foreach value $groupmember($ddst) {
  285.                 set ddsts [split $value "."]
  286.                 set ddst0 [lindex $ddsts 0]
  287.                 if { [string compare $ddst0 $src] == 0 } {
  288.                     set cnt 1
  289.                     break
  290.                 }
  291.             }
  292.         
  293.             # sending SESSION from the source
  294.             if { $cnt == 1 && [string compare $type "h" ] == 0 } {
  295.                 if { ![info exists srmsess_s] } {
  296.                     set srmsess_s $mcnt
  297.                     set fname($mcnt) "SRM_SESS_SEND"
  298.                     incr mcnt
  299.                 }
  300.                 set fbit [get_trace_item "-f" $event]
  301.                 set sid [get_trace_item "-S" $event]
  302.                 if { $fbit == "" } { 
  303.                     set event "$event -f $sid -m $srmsess_s"
  304.                 }
  305.             }   
  306.             set ddst [lindex $extinfo 1]
  307.             set dst [get_trace_item "-d" $event]
  308.             set cnt 0
  309.             foreach value $groupmember($ddst) {
  310.                 set ddsts [split $value "."]
  311.                 set ddst0 [lindex $ddsts 0]
  312.                 if { [string compare $ddst0 $dst] == 0 } {
  313.                     set cnt 1
  314.                     break
  315.                 }
  316.             }
  317.             if { $cnt == 1 && [string compare $type "r" ] == 0 } {
  318.                 if { ![info exists srmsess_r] } {
  319.                     set srmsess_r $mcnt
  320.                     set fname($mcnt) "SRM_SESS_RECV"
  321.                     incr mcnt
  322.                 }
  323.                 set fbit [get_trace_item "-f" $event]
  324.                 set sid [get_trace_item "-S" $event]
  325.                 if { $fbit == "" } {
  326.                     set event "$event -f $sid -m $srmsess_r"
  327.                 }
  328.             }
  329.         }
  330.         # RQST
  331.         if {[string compare $flagitem "SRM_RQST"] == 0 } {
  332.             set ddst [lindex $extinfo 1]
  333.             set src [get_trace_item "-s" $event]
  334.             set cnt 0
  335.             foreach value $groupmember($ddst) {
  336.                 set ddsts [split $value "."]
  337.                 set ddst0 [lindex $ddsts 0]
  338.                 if { [string compare $ddst0 $src] == 0 } {
  339.                     set cnt 1
  340.                     break
  341.                 }
  342.             }
  343.             if { $cnt == 1 && [string compare $type "h" ] == 0 } {
  344.                 if { ![info exists srmrqst_s] } {
  345.                     set srmrqst_s $mcnt
  346.     set srmrqst_sf $fcnt
  347.                     set fname($mcnt.$fcnt) "SRM_RQST_SEND"
  348.                     incr mcnt
  349.     incr fcnt
  350.                 }
  351.                 set fbit [get_trace_item "-f" $event]
  352.                 set sid [get_trace_item "-S" $event]
  353.                 if { $fbit == "" } {
  354.                     set event "$event -f $srmrqst_sf -m $srmrqst_s"
  355.                 }
  356.             }  
  357.             set ddst [lindex $extinfo 1]
  358.             set dst [get_trace_item "-d" $event]
  359.             set cnt 0
  360.             foreach value $groupmember($ddst) {
  361.                 set ddsts [split $value "."]
  362.                 set ddst0 [lindex $ddsts 0]
  363.                 if { [string compare $ddst0 $dst] == 0 } {
  364.                     set cnt 1
  365.                     break
  366.                 }
  367.             }
  368.             if { $cnt == 1 && [string compare $type "r" ] == 0 } {
  369.                 if { ![info exists srmrqst_r] } {
  370.     set srmrqst_rf $fcnt
  371.                     set srmrqst_r $mcnt
  372.                     set fname($mcnt.$fcnt) "SRM_RQST_RECV"
  373.                     incr mcnt
  374.     incr fcnt
  375.                 }
  376.                 set fbit [get_trace_item "-f" $event]
  377.                 set sid [get_trace_item "-S" $event]
  378.                 if { $fbit == "" } {
  379.                     set event "$event -f $srmrqst_rf -m $srmrqst_r"
  380.                 }
  381.             }
  382.         }
  383. # REPR
  384.         if {[string compare $flagitem "SRM_REPR"] == 0 } {
  385.             set ddst [lindex $extinfo 1]
  386.             set src [get_trace_item "-s" $event]
  387.             set cnt 0
  388.             foreach value $groupmember($ddst) {
  389.                 set ddsts [split $value "."]
  390.                 set ddst0 [lindex $ddsts 0]
  391.                 if { [string compare $ddst0 $src] == 0 } {
  392.                     set cnt 1
  393.                     break
  394.                 }
  395.             }
  396.             if { $cnt == 1 && [string compare $type "h" ] == 0 } {
  397.                 if { ![info exists srmrepr_s] } {
  398.                     set srmrepr_s $mcnt
  399.                     set srmrepr_sf $fcnt
  400.                     set fname($mcnt.$fcnt) "SRM_REPR_SEND"
  401.                     incr mcnt
  402.                     incr fcnt
  403.                 }
  404.                 set fbit [get_trace_item "-f" $event]
  405.                 set sid [get_trace_item "-S" $event]
  406.                 if { $fbit == "" } {
  407.                     set event "$event -f $srmrepr_sf -m $srmrepr_s"
  408.                 }
  409.             }
  410.             set ddst [lindex $extinfo 1]
  411.             set dst [get_trace_item "-d" $event]
  412.             set cnt 0
  413.             foreach value $groupmember($ddst) {
  414.                 set ddsts [split $value "."]
  415.                 set ddst0 [lindex $ddsts 0]
  416.                 if { [string compare $ddst0 $dst] == 0 } {
  417.                     set cnt 1
  418.                     break
  419.                 }
  420.             }
  421.             if { $cnt == 1 && [string compare $type "r" ] == 0 } {
  422.                 if { ![info exists srmrepr_r] } {
  423.                     set srmrepr_rf $fcnt
  424.                     set srmrepr_r $mcnt
  425.                     set fname($mcnt.$fcnt) "SRM_REPR_RECV"
  426.                     incr mcnt
  427.                     incr fcnt 
  428.                 }
  429.                 set fbit [get_trace_item "-f" $event]
  430.                 set sid [get_trace_item "-S" $event]
  431.                 if { $fbit == "" } {
  432.                     set event "$event -f $srmrepr_rf -m $srmrepr_r"
  433.                 }
  434.             }
  435.         }
  436.     }
  437.     return $event
  438. }
  439. # Filter tcp packet
  440. proc tcp_filter { event } {
  441.     global colorset fname fcnt mcnt highest_seq tcpmark
  442.     set extinfo [get_trace_item "-x" $event]
  443.     if {$extinfo!=""} {
  444. #get tcp flags
  445. set flagitem [lindex $extinfo 3]
  446. set tcpflags [split $flagitem "-"]
  447.   #filter tcp packet
  448. set protocol [get_trace_item "-p" $event]
  449. set cmd  [lindex $event 0]
  450.         set src  [lindex $extinfo 0]
  451.         set dst  [lindex $extinfo 1]
  452.  
  453.         set lsrc [get_trace_item "-s" $event]
  454.         set ldst [get_trace_item "-d" $event]
  455.         set rsrc [lindex [split $src .] 0]
  456.         set rdst [lindex [split $dst .] 0]
  457. set sid [get_trace_item "-S" $event]
  458.         if {([string compare $protocol "tcp"] == 0) && 
  459.             ([string compare $cmd "+"] == 0) 
  460.     && ([string compare $lsrc $rsrc] == 0) } { 
  461.       if {![info exists tcpmark]} {
  462.           set tcpmark $mcnt
  463.           set fname($mcnt) "tcp"
  464.           incr mcnt
  465.       }
  466.       set event "$event -f $sid -m $tcpmark"
  467.       set sid [get_trace_item "-S" $event]
  468.       set seqno [lindex $extinfo 2]
  469.       if {![info exists highest_seq($sid)]} {
  470.       set highest_seq($sid) $seqno
  471.       }
  472.       if { $seqno > $highest_seq($sid) } {
  473.   set highest_seq($sid) $seqno
  474.       }
  475.   }
  476.     }
  477.     return $event
  478. }
  479. #Filter ack packet
  480. proc ack_filter { event } {
  481.     global colorset fname fcnt mcnt ackmark
  482.     set extinfo [get_trace_item "-x" $event]
  483.    
  484.     if {$extinfo!=""} {
  485.         #get tcp flags
  486.         set flagitem [lindex $extinfo 3]
  487.         set tcpflags [split $flagitem "-"]
  488.  
  489.         set is_ecn [lsearch $tcpflags "E"]
  490.         set is_echo [lsearch $tcpflags "C"]
  491.         #filter ack packet 
  492.         set protocol [get_trace_item "-p" $event]
  493.         set cmd  [lindex $event 0]
  494.         set src  [lindex $extinfo 0]
  495.         set dst  [lindex $extinfo 1]
  496.     
  497.         set lsrc [get_trace_item "-s" $event]
  498.         set ldst [get_trace_item "-d" $event]
  499.         set rsrc [lindex [split $src .] 0]
  500.         set rdst [lindex [split $dst .] 0]
  501. set sid [get_trace_item "-S" $event]
  502.         if {([string compare $protocol "ack"] == 0) && 
  503.             ([string compare $cmd "-"] == 0) && 
  504.     ([string compare $ldst $rdst] == 0)} { 
  505.             if {![info exists ackmark]} {
  506.                 set ackmark $mcnt
  507.           set fname($mcnt) "ack" 
  508.                 incr mcnt
  509.             }
  510.             set event "$event -f $sid -m $ackmark"
  511.         }   
  512.     }
  513.     return $event
  514. }
  515. #ecn filter
  516. proc ecn_filter { event } {
  517.     global colorset fname fcnt tcpecn tcpcong ackecho ackecn colorindex mcnt 
  518.    tcpecn_m tcpcong_m ackecho_m ackecn_m mcnt
  519.     set extinfo [get_trace_item "-x" $event]
  520.     if {$extinfo!=""} {
  521.         #get tcp flags
  522.         set flagitem [lindex $extinfo 3]
  523.         set tcpflags [split $flagitem "-"]
  524.         set is_ecn [lsearch $tcpflags "E"]
  525.         set is_cong [lsearch $tcpflags "A"]
  526.         set is_echo [lsearch $tcpflags "C"]
  527.         #filter tcp packet
  528.         set protocol [get_trace_item "-p" $event]
  529.         set cmd  [lindex $event 0]
  530. #1. tcp ecn
  531. #2. tcp cong
  532. #3. ack echo
  533. #4. ack ecn
  534.         if {([string compare $protocol "tcp"] == 0) && 
  535.     ($is_ecn != -1)} {
  536.  
  537.             if { ![info exists tcpecn] } {
  538.                 set tcpecn $fcnt
  539. set tcpecn_m $mcnt
  540.                 set fname($mcnt.$fcnt) "tcp_ecn"
  541.                 incr fcnt
  542. incr mcnt
  543.             }
  544.             set fbit [get_trace_item "-f" $event]
  545.       
  546.     if { $fbit == "" } {
  547.         set event "$event -f $tcpecn -m $tcpecn_m"
  548.     } else {
  549. set findex [lsearch $event -f]
  550.    incr findex
  551. set line2 [lreplace $event $findex $findex $tcpecn]
  552. set event $line2
  553. set mindex [lsearch $event -m]
  554. incr mindex 
  555. set line2 [lreplace $event $mindex $mindex $tcpecn_m]
  556. set event $line2
  557.     }
  558.   }
  559. if {([string compare $protocol "tcp"] == 0) && 
  560.             ($is_cong != -1)} {
  561.  
  562.             if { ![info exists tcpcong] } {   
  563.                 set tcpcong $fcnt
  564. set tcpcong_m $mcnt
  565.                 set fname($mcnt.$fcnt) "tcp_cong"
  566.                 incr fcnt
  567. incr mcnt
  568.             }
  569.             
  570.             set fbit [get_trace_item "-f" $event]
  571.             
  572.             if { $fbit == "" } {
  573.                 set event "$event -f $tcpcong"
  574.             } else {
  575.                 
  576.                 set findex [lsearch $event -f]
  577.                 incr findex
  578.                 set line2 [lreplace $event $findex $findex $tcpcong]
  579.                 set event $line2
  580.                 set mindex [lsearch $event -m]
  581.                 incr mindex 
  582.                 set line2 [lreplace $event $mindex $mindex $tcpcong_m]
  583.                 set event $line2
  584.             
  585.             }
  586.         }
  587. if {([string compare $protocol "ack"] == 0) && 
  588.             ($is_echo != -1)} {
  589.  
  590.             if { ![info exists ackecho] } {   
  591.                 set ackecho $fcnt
  592. set ackecho_m $mcnt
  593.                 set fname($mcnt.$fcnt) "ack_echo"
  594.                 incr fcnt
  595. incr mcnt
  596.             }
  597.             
  598.             set fbit [get_trace_item "-f" $event]
  599.             
  600.             if { $fbit == "" } {
  601.                 set event "$event -f $ackecho"
  602.             } else {
  603.                 
  604.                 set findex [lsearch $event -f]
  605.                 incr findex
  606.                 set line2 [lreplace $event $findex $findex $ackecho]
  607.                 set event $line2
  608.                 set mindex [lsearch $event -m]
  609.                 incr mindex 
  610.                 set line2 [lreplace $event $mindex $mindex $ackecho_m]
  611.                 set event $line2
  612.             
  613.             }
  614.         }
  615. if {([string compare $protocol "ack"] == 0) && 
  616.             ($is_ecn != -1)} {
  617.  
  618.             if { ![info exists ackecn] } {   
  619.                 set ackecn $fcnt
  620. set ackecn_m $mcnt
  621.                 set fname($mcnt.$fcnt) "ack_ecn"
  622.                 incr fcnt
  623. incr mcnt
  624.             }
  625.             
  626.             set fbit [get_trace_item "-f" $event]
  627.             
  628.             if { $fbit == "" } {
  629.                 set event "$event -f $tcpecn"
  630.             } else {
  631.                 
  632.                 set findex [lsearch $event -f]
  633.                 incr findex
  634.                 set line2 [lreplace $event $findex $findex $ackecn]
  635.                 set event $line2
  636.                 set mindex [lsearch $event -m]
  637.                 incr mindex 
  638.                 set line2 [lreplace $event $mindex $mindex $ackecn_m]
  639.                 set event $line2
  640.             
  641.             }
  642.         }
  643.     }
  644.     return $event
  645. }
  646. proc nam_afterfilter { tracefile } {
  647.     global colorindex colorname nam_version session_id highest_seq fcolorname 
  648.    fcnt fname groupmember mcnt proto_id
  649.    
  650.     set tracefilebackup $tracefile.tmp
  651.     set file [open $tracefile "r"]
  652.     set file2 [open $tracefilebackup "w"]
  653.     #set SRM session info
  654.     for {set i 0} {$i < $colorindex} {incr i} {
  655.         set items [split $session_id($i) "-"] 
  656. set item1 [lindex $items 0]
  657. # set item1 [lindex $session_id($i) 0 ]
  658. if { [string compare $item1 "SRM" ] == 0 } {
  659.     set item2 [lindex $items 1]
  660.     set session_id($i) "SRM session with 
  661.     members: $groupmember($item2)"
  662.     set proto_id($i) "SRM"
  663.     set memberlist($i) $groupmember($item2)
  664.     set cnt 1
  665.     foreach value $groupmember($item2) {
  666. set groupindex($i.$value) $cnt
  667. lappend groupm($i) $value
  668. incr cnt
  669.     }
  670.     set highest_seq($i) $cnt
  671.     
  672.         }
  673.     }
  674.     #Write nam version info first
  675.     #set realf [expr $fcnt-$colorindex]
  676.     puts $file2 "V -t * -v $nam_version -a 1 -c $colorindex -F $fcnt -M $mcnt"
  677.     # Write color info
  678.     for {set i 0} {$i < $colorindex} {incr i} {
  679.         puts $file2 "c -t * -i $i -n $colorname($i)"
  680.     }
  681.     # write color info for filters
  682.     for {set i $colorindex } {$i < $fcnt} {incr i} {
  683.         set fid [expr $i-$colorindex]
  684. puts $file2 "c -t * -i $i -n $fcolorname($fid)"
  685.     }
  686.     # Write session info
  687.     for {set i 0} {$i < $colorindex} {incr i} {
  688. #   puts $file2 "N -t * -S $i -n {$session_id($i)}"
  689. if ![ info exists memberlist($i) ] {
  690.     set memberlist($i) ""
  691. }
  692. puts $file2 "N -t * -S $i -n {$session_id($i)} -p $proto_id($i) 
  693.      -m {$memberlist($i)}"
  694.     }
  695.     # Write y mark if necessary
  696.     for {set i 0} {$i < $colorindex} {incr i} {
  697. if { [info exists groupm($i)] } {
  698.     for {set j 0} { $j < [llength $groupm($i)]} {incr j} {
  699.         puts $file2 "N -t * -S $i -m [lindex $groupm($i) $j]"
  700.     }
  701. }
  702.     }
  703.     # Write highest y value for each session
  704.     for {set i 0} {$i < $colorindex} {incr i} {
  705.         puts $file2 "N -t * -S $i -h $highest_seq($i)"
  706.     }
  707.     # Write Filter info
  708.     foreach index [array names fname] {
  709. set fids [split $index "."]
  710. set fid [lindex $fids 1]
  711. set mid [lindex $fids 0]
  712. if { $fid == ""} {
  713.     puts $file2 "N -t * -F 0 -M $mid -n $fname($index)"
  714. } else {
  715.     puts $file2 "N -t * -F $fid -M $mid -n $fname($index)"
  716. }
  717.     }
  718.     while {[eof $file]==0} {
  719.         set line [gets $file]
  720.         set cmd [lindex $line 0]
  721.         #ignore the original color value & version info
  722.         if { [string compare $cmd "c"]==0 } {continue}
  723. if { [string compare $cmd "V"]==0 } {continue}
  724.         if {$line==""} {continue} 
  725. set timev [get_trace_item "-t" $line]
  726. if {[string compare $timev "*"]==0 } {
  727.     puts $file2 $line
  728.     continue
  729. }
  730. # color match
  731. set fv [get_trace_item "-f" $line]
  732. if { $fv > 1 } {
  733.             set attrindex [lsearch $line -a]
  734.             incr attrindex
  735.  
  736.             set line2 [lreplace $line $attrindex $attrindex $fv]
  737.  
  738.             set line $line2
  739. }
  740. # group setting
  741. set extinfo [get_trace_item "-x" $line]
  742. set srmflag [lindex $extinfo 4]
  743. set srmvalues [split $srmflag "_"]
  744. set srmvalue [lindex $srmvalues 0]
  745. if { [string compare $srmvalue "SRM"] == 0 } {
  746.     set sid [get_trace_item "-S" $line]
  747.     set src [lindex $extinfo 0]
  748.     set newseq $groupindex($sid.$src)
  749.     set newindex [lreplace $extinfo 2 2 $newseq]
  750.       set extindex [lsearch $line -x]
  751.     incr extindex
  752.     set line2 [lreplace $line $extindex $extindex $newindex]
  753.     set line $line2
  754. }
  755. #  define y val in nam graph
  756. set sess_id [get_trace_item "-S" $line]
  757. if [info exists proto_id($sess_id)] {
  758.     set extinfo [get_trace_item "-x" $line]
  759.     set yval [lindex $extinfo 2]
  760.     switch -exact -- $proto_id($sess_id) {
  761.         TCP {
  762.     set ymark $yval
  763.         }
  764.         SRM {
  765.     set ymark [lindex $extinfo 0]
  766.         }
  767.         default {
  768.     puts "Unknown protocol event found!"
  769.     set ymark $yval
  770.        }
  771.     }
  772.     set line "$line -y {$yval $ymark}"
  773. }
  774. #filter out -x 
  775.    set extinfo [get_trace_item "-x" $line]
  776. if { $extinfo != "" } {
  777.     set xindex [lsearch $line -x]
  778.     incr xindex
  779.     set line2 [lreplace $line $xindex $xindex]
  780.     set line $line2
  781.     set xindex [expr $xindex-1]
  782.     set line2 [lreplace $line $xindex $xindex]
  783.     set line $line2
  784. }
  785. puts $file2 $line
  786.     }
  787.     close $file
  788.     close $file2
  789.     exec mv $tracefile.tmp $tracefile
  790. }
  791. #---------------------------------------------
  792. #main starts here
  793. if { $argc < 1 } {
  794.     puts "Usage: namfilter tracefile-name"
  795.     exit
  796. }
  797. set tracefile [lindex $argv 0]
  798. # save filter name
  799. # CUSTOMIZED PLACE START
  800. set filters(0) tcp_filter
  801. set filters(1) ack_filter
  802. set filters(2) ecn_filter
  803. set filters(3) srm_filter
  804. set filter_num 4
  805. # END OF CUSTOMIZED 
  806. set fcnt 0
  807. set mcnt 0
  808. global fname
  809. if [catch { open $tracefile r } file] {
  810.     puts stderr "Cannot open $tracefile: $fileId"
  811.     exit
  812. close $file
  813. set filtering_flag [nam_analysis $tracefile]
  814. if { $filtering_flag != 2 } {exit}
  815. # Decide how many flows (TCP only so far)
  816. nam_prefilter $tracefile
  817. set fcnt [expr $fcnt+$colorindex]
  818. # Applying filters
  819. nam_filter $tracefile
  820. #Add control info to the head of the tracefile
  821. nam_afterfilter $tracefile
  822. puts "Filters have been applied to the tracefile: $tracefile"
  823. exit
  824. #---- end of the filter --- #