#!/usr/bin/env python
# Copyright (c) 2007, 2009 Arista Networks, Inc.  All rights reserved.
# Arista Networks, Inc. Confidential and Proprietary.
import os, sys, ManagedSubprocess

intfa = sys.argv[1]
intfb = sys.argv[2]
if len( sys.argv ) >= 4:
   count = int( sys.argv[3] )
else:
   count = 10000

verbose=False
if verbose:
   print "sending traffic on", intfa, "expecting it to show up on", intfb

def counters( intf ):
   result = {}
   counters = os.listdir( '/sys/class/net/%s/statistics' % intf )
   for i in counters:
      result[i] = int( file( '/sys/class/net/%s/statistics/%s' % (intf,i)).read() )
   return result

def macAddress( intf ):
   # read the mac addr and chop the trailing slash
   addr = file( '/sys/class/net/%s/address' % intf ).read()
   return addr[:-1]

a0 = counters( intfa )
b0 = counters( intfb )

addrb = macAddress( intfb )

# guts of ethxmit goes here
cmd = ["ethxmit", "-s","64",intfa,"-D",addrb,
       "-b","100","--sleep",".01","-n", str(count)]
p = ManagedSubprocess.Popen(argv=cmd,prefix="")
p.wait()

a1 = counters( intfa )
b1 = counters( intfb )

adiff = {}
bdiff = {}
for i in a1:  adiff[i] = a1[i] - a0[i]
for i in b1:  bdiff[i] = b1[i] - b0[i]

tx = adiff['tx_packets']
rx = bdiff['rx_packets']

exitCode = 0
if ((tx - rx) / count) > .05:
   print "Error: packet loss exceeded 5 percent"
   exitCode = 1

if verbose or exitCode:
   print "tx packets on %s: %s" % (intfa, tx)
   print "rx packets on %s: %s" % (intfb, rx)

sys.exit( exitCode )
