import os, logging
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error

class pktgen(test.test):
    version = 1

    def execute(self, eth='eth0', count=50000, clone_skb=1,
                dst_ip='192.168.210.210', dst_mac='01:02:03:04:05:07',
                num_iterations=1):
        if not os.path.exists('/proc/net/pktgen'):
            utils.system('/sbin/modprobe pktgen')
        if not os.path.exists('/proc/net/pktgen'):
            raise error.TestError('pktgen not loaded')

        for i in xrange(num_iterations):
            logging.info('Adding %s (iteration %d)' % (eth, i))
            self.pgdev = '/proc/net/pktgen/kpktgend_0'

            self.pgset('rem_device_all')
            self.pgset('add_device ' + eth)
            self.pgset('max_before_softirq 10000')

            # Configure the individual devices
            logging.info('Configuring %s (iteration %d)' % (eth, i))

            self.ethdev='/proc/net/pktgen/' + eth
            self.pgdev=self.ethdev

            if clone_skb:
                self.pgset('clone_skb %d' % (count))
            self.pgset('min_pkt_size 60')
            self.pgset('max_pkt_size 60')
            self.pgset('dst ' + dst_ip)
            self.pgset('dst_mac ' + dst_mac)
            self.pgset('count %d' % (count))

            # Time to run
            self.pgdev='/proc/net/pktgen/pgctrl'
            self.pgset('start')

            output = os.path.join(self.resultsdir, eth)
            logging.info('Completed %s (iteration %d)' % (eth, i))
            utils.system('cp %s %s_%05d' % (self.ethdev, output, i))

    def pgset(self, command):
        file = open(self.pgdev, 'w')
        file.write(command + '\n');
        file.close

        if not utils.grep('Result: OK', self.pgdev):
            if not utils.grep('Result: NA', self.pgdev):
                utils.system('cat ' + self.pgdev)
