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