5 # see license for license details
9 import vstf.agent.perf.utils as utils
10 import vstf.common.decorator as deco
11 from vstf.common.utils import my_popen
13 LOG = logging.getLogger(__name__)
18 utils.modprobe_pktgen()
19 self._send_processes = []
21 def _psetpg(self, dev):
24 def _vsetpg(self, key, value=''):
25 with open(self._dev, 'w') as f:
26 txt = "%(key)s %(value)s\n" % {'key': key, 'value': value}
28 LOG.info("write(%s) to %s", txt.strip(), self._dev)
31 cmd = 'echo start > /proc/net/pktgen/pgctrl'
32 process = my_popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
33 LOG.info('running pid:%s', process.pid)
38 self._send_processes.append(process)
39 error_str = "start pktgen send success"
41 error_str = "start pktgen send failed, stdout:%s,stderr:%s" % (process.stdout.read(), process.stderr.read())
45 def _rem_device_all(self):
46 cpu_num = utils.get_cpu_num()
47 for thread in range(0, cpu_num - 1):
48 self._psetpg("/proc/net/pktgen/kpktgend_%s" % thread)
49 self._vsetpg('rem_device_all')
52 @deco.check("protocol", choices=['udp_bw'], defaults='udp_bw')
53 @deco.check("namespace", defaults=None)
56 @deco.check("size", defaults=64)
57 @deco.check("threads", defaults=utils.get_default_threads())
58 @deco.check("clone_skb", defaults=1)
59 @deco.check("count", defaults=0)
60 @deco.check("ratep", defaults=0)
61 def send_start(self, **kwargs):
62 # ensure that all sends is exit
65 interface_num = len(kwargs['src'])
67 for i in range(interface_num):
68 device = kwargs['src'][i]['iface']
69 interfaces.append(device)
70 utils.iface_up(device)
72 self._rem_device_all()
74 threads = kwargs['threads']
75 for i in range(interface_num):
77 dev_max = (i + 1) * threads
78 device = interfaces[i]
79 for dev_id in range(dev_min, dev_max):
80 queue_id = dev_id % threads
81 self._psetpg("/proc/net/pktgen/kpktgend_%s" % dev_id)
82 self._vsetpg('add_device', "%s@%s" % (device, queue_id))
83 self._psetpg("/proc/net/pktgen/%s@%s" % (device, queue_id))
84 self._vsetpg('pkt_size', kwargs['size'])
85 self._vsetpg('clone_skb', kwargs['clone_skb'])
86 self._vsetpg('dst_mac', kwargs['dst'][i]['mac'])
87 self._vsetpg('src_mac', kwargs['src'][i]['mac'])
88 self._vsetpg('count', kwargs['count'])
90 self._vsetpg('ratep', kwargs['ratep'])
93 def send_stop(self, **kwargs):
96 for process in self._send_processes:
99 LOG.info("process.kill(pktgen:%s)", process.pid)
100 results.append((ret, process.stdout.read()))
101 self._send_processes = []
104 def receive_start(self, **kwargs):
106 error_str = "%s pktgen neednt receive start" % (self.__class__)
108 return ret, error_str
110 def receive_stop(self, **kwargs):
112 error_str = "pktgen neednt receive stop"
114 return ret, error_str
120 def force_clean(self):
121 LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
127 print perf.receive_start()
130 {"iface": 'eth4', "mac": "90:e2:ba:20:1f:d8"}
133 {"mac": '90:e2:ba:20:1f:d9'}
139 print perf.send_start(**send)
141 print perf.send_stop()
142 print perf.receive_stop()
145 if __name__ == "__main__":
146 from vstf.common.log import setup_logging
148 setup_logging(level=logging.DEBUG, log_file="/var/log/vstf/vstf-pktgen.log", clevel=logging.DEBUG)