module Scriptroute::Tulip

Public Instance Methods

computeFWMedCing(triplets) click to toggle source
# File lib/scriptroute/tulip/queuing.rb, line 88
def computeFWMedCing (triplets) 
  #  triplets = Array.new();
  oldsend, oldrcv = 0,0;
  #  stamps.each { |stamp|
  #    triplets.push(stamp);
  #  }
  
  ENV['datalinepattern'] ="newexp";
  ENV['fieldseparator'] = ":";
  ENV['hostfieldnum'] = "3";
  ENV['sentfieldnum'] = "6";
  ENV['receivedfieldnum'] = "7";
  ENV['bouncedfieldnum'] = "9";
  ENV['segmentsecs'] = "12";
  ENV['writefixeddir'] = "./";
  ENV['sourceskew'] = "-";
  ENV['target'] = "1.1.1.1";
  ENV['showquality'] = "1";
  
  pid = Process.pid;
  tmp = File.new("/tmp/fixLC.#{pid}", "w");
  
  if (triplets.length == 0) then
    return -100;
  end
  
  base = triplets[0][0];
  triplets.each_index { |j| 
    tup = triplets[j];
    tmp.puts "0.000:newexp:1.1.1.1:%u:0:%u:%u:0:%u" %[j, tup[0] - base, tup[1], tup[2] - base];
  }
  tmp.close();
  cmd = sprintf("#{FIXCLOCK} /tmp/fixLC.#{pid}");
  output = `#{cmd}`.split("\n");
  match = nil;
  quality = [nil, nil];
  output.each { |o|
    if ( o =~ "inferred stdroundtrip" ) then
      words = o.split;
      quality = [words[4], words[6]];
    end
  }
  
  otts = Array.new();
  rejected = 0;
  tmp = File.new("./fixLC.#{pid}.fix");
  tmp.each { |line| 
    words = line.split(":");
    snd,rem,zero,rcv = words[5..8].map { |i| i.to_i; }
    #    if (snd <= rem and rem <= rcv) then
    otts.push(rem - snd);
    #    else
    #      rejected += 1;
    #    end
  }
  tmp.close();
  File.delete("/tmp/fixLC.#{pid}", "./fixLC.#{pid}.fix", "./fixLC.#{pid}.rej");
  
  #puts "conglib-warning: rejected #{rejected} cing corrections\n" if (rejected > 0);

  otts.sort!;
  #STDERR.puts "WARNING: too few ott samples: #{otts.length}" if (otts.length < 5);
  
  medianDiff = (otts.length > 0)? (otts[otts.length/2] - otts[0]) : -100;
  #puts "otts (#{otts.length}, #{medianDiff}): #{otts.join(" ")}";
  return [[medianDiff, otts.last], quality];
end
computeRTMed(stamps) click to toggle source
# File lib/scriptroute/tulip/queuing.rb, line 74
def computeRTMed (stamps) 
  rtts = Array.new();
  stamps.each { |stamp|
    rtts.push(stamp[2] - stamp[0]);
  }
  rtts.sort!;
  if (rtts.length > 0) 
    medianDiff = rtts[rtts.length/2] - rtts[0];
    return [medianDiff, rtts.first, rtts.last];
  else
    return -100;
  end
end
convertByteOrder(wrong) click to toggle source
# File lib/scriptroute/tulip/queuing.rb, line 43
def convertByteOrder(wrong)
  right = Array.new();
  right[0], right[1], right[2], right[3] =  wrong & 255, 
                                           (wrong & (255 << 8)) >> 8, 
                                           (wrong & (255 << 16)) >> 16, 
                                           (wrong & (255 << 24)) >> 24;
  out = ( (right[0] << 24) + (right[1] << 16) + (right[2] << 8) + right[3]);
  #puts "#{wrong} #{out} #{right.join(" ")}\n";
  return out;
end
fixByteOrder(stamps) click to toggle source
# File lib/scriptroute/tulip/queuing.rb, line 54
def fixByteOrder (stamps) 
  if (stamps.length > 4 and 
      (stamps[0][1] > stamps[1][1] or 
       stamps[1][1] > stamps[2][1] or 
       stamps[2][1] > stamps[3][1] or 
       stamps[3][1] > stamps[4][1] 
       ) 
      ) then
    triplets = Array.new();
    stamps.each_index { |i|
      triplets[i] = Array.new();
      triplets[i][0] = stamps[i][0];
      triplets[i][1] = convertByteOrder(stamps[i][1]);
      triplets[i][2] = stamps[i][2];                 ## a better way to do this would be to insert in converted byte order
    }
    return triplets;
  end
  return stamps;
end