class Scriptroute::Tulip::Train2
train2 ##############
Attributes
dsts[R]
intertrain[R]
intratrain[R]
num_losses[R]
numpackets[R]
numtrains[R]
packets[R]
psizes[R]
reverse_ttls[R]
ttls[R]
types[R]
Public Class Methods
new(dsts, numpackets, intratrain, types, ttls, psizes, numtrains, intertrain)
click to toggle source
# File lib/scriptroute/tulip/helper.rb, line 475 def initialize(dsts, numpackets, intratrain, types, ttls, psizes, numtrains, intertrain) @dsts, @numpackets, @intratrain, @types, @ttls, @psizes, @numtrains, @intertrain = dsts, numpackets, intratrain, types, ttls, psizes, numtrains, intertrain; @reverse_ttls, @rem_srcs, @num_losses, @packets = Hash.new(), Hash.new(), Array.new(), Array.new(); ##forget the MAX_TRAIN complication for this part; delayedPackets = Array.new(); (0..@numtrains-1).each { |i| delay = (i==0)? 0 : intertrain; (0..@numpackets-1).each { |j| probe = getProbe(i,j); #puts "#{i} #{delay}\n"; delayedPackets.push(Struct::DelayedPacket.new(delay, probe)); delay = intratrain; delay = (j==@numpackets-2)? 0.003 : 0.0005; } } @responsesPackets = Scriptroute::send_train(delayedPackets); ##check sanity of the train and insert it into @packets and @num_losses (0..@numtrains-1).each { |i| @packets[i] = Array.new(); @num_losses[i] = 0; (0..@numpackets-1).each { |j| index = i*@numpackets + j; pkt = @responsesPackets[index]; @packets[i].push(pkt); dst = (@dsts[j])? @dsts[j] : @dsts[0]; ttl = (@ttls[j])? @ttls[j] : @ttls[0]; key = "#{dst}::#{ttl}"; if (!@reverse_ttls[key]) @reverse_ttls[key] = Hash.new(0); @rem_srcs[key] = Hash.new(0); end if (pkt) if (pkt.probe and pkt.probe.time) if (pkt.response) rttl = pkt.response.packet.ip_ttl; src = pkt.response.packet.ip_src; @reverse_ttls[key][rttl] += 1; @rem_srcs[key][src] += 1; else @num_losses[i]+=1; end ##check the probe sort order npkt = @responsesPackets[index+1]; if (npkt and npkt.probe and npkt.probe.time and pkt.probe.time > npkt.probe.time) STDERR.puts "ERROR: packets not in probe sorted order. \n%s %d %.3f\n%s %d %.3f\n" % [pkt.probe.packet.ip_dst, pkt.probe.packet.ip_ttl, pkt.probe.time.to_f*1000, npkt.probe.packet.ip_dst, npkt.probe.packet.ip_ttl, npkt.probe.time.to_f*1000]; end end else raise "ERROR: there are null responses\n"; end } } @reverse_ttls.each_key { |key| if (@reverse_ttls[key].keys.length > 1) puts "WARNING: too many reverse TTLs for #{key}. #{@reverse_ttls[key].keys.join(" ")} #{@reverse_ttls[key].values.join(" ")} "; end if (@rem_srcs[key].keys.length > 1) puts "WARNING: too many sources. #{@rem_srcs[key].keys.join(" ")} #{@rem_srcs[key].values.join(" ")} "; end } end
Public Instance Methods
getProbe(i,j)
click to toggle source
# File lib/scriptroute/tulip/helper.rb, line 438 def getProbe (i,j) dst = (@dsts[j])? @dsts[j] : @dsts[0]; ttl = (@ttls[j])? @ttls[j] : @ttls[0]; type = (@types[j])? @types[j] : @types[0]; psize = (@psizes[j])? @psizes[j] : @psizes[0]; probe = nil; case type when "udp" psize = (psize==-1)? 12 : psize; probe = Scriptroute::UDP.new(psize); probe.uh_dport = 33444; when "tcp" psize = (psize==-1)? 0 : psize; probe = Scriptroute::TCP.new(psize); probe.th_dport=80; probe.th_win=1024; else # "echo" or "tstamp" psize = (psize==-1)? 0 : psize; probe = Scriptroute::ICMP.new(psize); if (type == "echo") probe.icmp_type = Scriptroute::ICMP::ICMP_ECHO; elsif (type == "tstamp") probe.icmp_type = Scriptroute::ICMP::ICMP_TSTAMP; else raise "ERROR: unsupported packettype #{i} #{j} #{type}\n"; end probe.icmp_code = 0; probe.icmp_seq = i*numpackets + j; end probe.ip_ttl = ttl; probe.ip_dst = dst; return probe; end
simple_to_s()
click to toggle source
# File lib/scriptroute/tulip/helper.rb, line 570 def simple_to_s str = ""; (0..@numtrains-1).each { |i| (0..@numpackets-1).each { |j| pr = @packets[i][j]; src = (pr.response)? pr.response.packet.ip_src : -1; stime = pr.probe.time.to_f * 1000; ipid = (pr.response)? pr.response.packet.ip_id : -1; str += "%.3f %d " %[stime, ipid]; } str += "\n"; } return str; end
to_s()
click to toggle source
# File lib/scriptroute/tulip/helper.rb, line 548 def to_s str = "train: #{@dsts} #{@numpackets} #{@intratrain} (#{@types}) (#{@ttls})\n"; (0..@numtrains-1).each { |i| str += "train #{i}\n"; (0..@numpackets-1).each { |j| pr = @packets[i][j]; src = (pr.response)? pr.response.packet.ip_src : -1; srcid = pr.probe.packet.ip_id; stime = pr.probe.time.to_f * 1000; rtt = (pr.probe and pr.response) ? (pr.response.time - pr.probe.time) * 1000 : -1; ipid = (pr.response)? pr.response.packet.ip_id : -1; str += "#{src} %d %.3f %d " %[rtt, stime, ipid]; if (@types[j] == "tstamp") then rem_time = (pr.response)? pr.response.packet.icmp_ttime : 0; str += "#{rem_time} "; end } str += "\n"; } return str; end