From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by dpdk.org (Postfix) with ESMTP id 5C9C31BC58 for ; Thu, 12 Apr 2018 11:53:06 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 64F6A1529; Thu, 12 Apr 2018 02:53:05 -0700 (PDT) Received: from phil-VirtualBox.shanghai.arm.com (unknown [10.169.108.188]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id BF09C3F487; Thu, 12 Apr 2018 02:53:04 -0700 (PDT) From: Phil Yang To: dts@dpdk.org Cc: nd@arm.com, yong.liu@intel.com Date: Thu, 12 Apr 2018 17:52:51 +0800 Message-Id: <1523526771-7437-1-git-send-email-phil.yang@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1522640786-26646-1-git-send-email-phil.yang@arm.com> References: <1522640786-26646-1-git-send-email-phil.yang@arm.com> Subject: [dts] [PATCH v4] framwork/packet: sniff_packet specify running target support X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 12 Apr 2018 09:53:06 -0000 If tester in crb file was not the machine which running dts, the sniff_packet process will not running on tester. Create a ssh connection to the tester and run tcpdump to make sure sniff_packet process running on the machine we expected. Removed load_sniff_packets function in packet module as it will be useless. Signed-off-by: Phil Yang Suggested-by: Marvin Liu --- framework/packet.py | 70 +++++++++++++++++++++-------------------------------- framework/tester.py | 37 ++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 42 deletions(-) diff --git a/framework/packet.py b/framework/packet.py index 976b82b..f99ead8 100755 --- a/framework/packet.py +++ b/framework/packet.py @@ -812,15 +812,30 @@ def get_filter_cmd(filters=[]): return "" -def sniff_packets(intf, count=0, timeout=5, filters=[]): +def sniff_packets(intf, count=0, timeout=5, filters=[], target=[]): """ sniff all packets for certain port in certain seconds """ param = "" direct_param = r"(\s+)\[ (\S+) in\|out\|inout \]" - tcpdump_help = subprocess.check_output("tcpdump -h; echo 0", - stderr=subprocess.STDOUT, - shell=True) + + # target[] contain the remote machine info for ssh connection + # target[0]: username + # target[1]: ip address + # target[2]: pass word + if target: + tcpdump_help_pipe = subprocess.Popen(["ssh", + "%s@%s" % (target[0], target[1]), + "tcpdump -h"], + stderr=subprocess.PIPE, + stdout=subprocess.PIPE, + shell=False) + tcpdump_help = "".join(tuple(tcpdump_help_pipe.communicate())) + tcpdump_help_pipe.wait() + else: + tcpdump_help = subprocess.check_output("tcpdump -h; echo 0", + stderr=subprocess.STDOUT, shell=True) + for line in tcpdump_help.split('\n'): m = re.match(direct_param, line) if m: @@ -850,9 +865,16 @@ def sniff_packets(intf, count=0, timeout=5, filters=[]): else: cmd = sniff_cmd % options - args = shlex.split(cmd) + if target: + pipe = subprocess.Popen(["ssh", + "%s@%s" % (target[0], target[1]), + cmd], + stdin=subprocess.PIPE, + shell=False) + else: + args = shlex.split(cmd) + pipe = subprocess.Popen(args) - pipe = subprocess.Popen(args) index = str(time.time()) SNIFF_PIDS[index] = (pipe, intf, timeout) time.sleep(1) @@ -886,42 +908,6 @@ def load_sniff_pcap(index=''): return "" -def load_sniff_packets(index=''): - """ - Stop sniffer and return packet objects - """ - pkts = [] - child_exit = False - if index in SNIFF_PIDS.keys(): - pipe, intf, timeout = SNIFF_PIDS[index] - time_elapse = int(time.time() - float(index)) - while time_elapse < timeout: - if pipe.poll() is not None: - child_exit = True - break - - time.sleep(1) - time_elapse += 1 - - if not child_exit: - pipe.send_signal(signal.SIGINT) - pipe.wait() - - # wait pcap file ready - time.sleep(1) - try: - cap_pkts = rdpcap("/tmp/sniff_%s.pcap" % intf) - for pkt in cap_pkts: - # packet gen should be scapy - packet = Packet(tx_port=intf) - packet.pktgen.assign_pkt(pkt) - pkts.append(packet) - except: - pass - - return pkts - - def load_pcapfile(filename=""): pkts = [] try: diff --git a/framework/tester.py b/framework/tester.py index a775f68..c787b89 100755 --- a/framework/tester.py +++ b/framework/tester.py @@ -35,6 +35,7 @@ Interface for bulk traffic generators. import re import subprocess +import os from time import sleep from settings import NICS, load_global_setting, PERF_SETTING from crb import Crb @@ -704,6 +705,42 @@ class Tester(Crb): self.proc.kill() self.proc = None + def tcpdump_sniff_packets(self, intf, count=0, timeout=5, filters=[]): + """ + Wrapper for packet module sniff_packets + """ + # load functions in packet module + module = __import__("packet") + sniff_f = getattr(module, "sniff_packets") + + target=[] + target.append(self.get_username()) + target.append(self.get_ip_address()) + target.append(self.get_password()) + return sniff_f(intf, count, timeout, filters, target) + + def load_tcpdump_sniff_pcap(self, index=''): + """ + Wrapper for packet module load_sniff_pcap + """ + # load functions in packet module + module = __import__("packet") + load_pcap_f = getattr(module, "load_sniff_pcap") + pcap = load_pcap_f(index) + self.session.copy_file_from(pcap) + + return pcap.split(os.sep)[-1] + + def load_tcpdump_sniff_packets(self, index=''): + """ + Wrapper for packet module load_sniff_packets + """ + # load functions in packet module + packet = __import__("packet") + file = self.load_tcpdump_sniff_pcap(index) + + return packet.load_pcapfile(file) + def kill_all(self, killall=False): """ Kill all scapy process or DPDK application on tester. -- 2.7.4