Use pdml format for test traces
git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7856 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
@@ -1,33 +1,5 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
################################################################################
|
||||
# OpenAirInterface
|
||||
# Copyright(c) 1999 - 2014 Eurecom
|
||||
#
|
||||
# OpenAirInterface is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
#
|
||||
# OpenAirInterface is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with OpenAirInterface.The full GNU General Public License is
|
||||
# included in this distribution in the file called "COPYING". If not,
|
||||
# see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Contact Information
|
||||
# OpenAirInterface Admin: openair_admin@eurecom.fr
|
||||
# OpenAirInterface Tech : openair_tech@eurecom.fr
|
||||
# OpenAirInterface Dev : openair4g-devel@eurecom.fr
|
||||
#
|
||||
# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||
#
|
||||
################################################################################
|
||||
import sys
|
||||
import subprocess
|
||||
import re
|
||||
@@ -36,175 +8,69 @@ import datetime
|
||||
from datetime import date
|
||||
import os, errno
|
||||
import argparse
|
||||
import tempfile
|
||||
from xml.dom.minidom import parse, parseString
|
||||
#from xml.etree.ElementTree import ElementTree
|
||||
|
||||
|
||||
|
||||
|
||||
#####################
|
||||
# program arguments
|
||||
#####################
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--pcap_file", "-p", type=str,help="input pcap file to be translated")
|
||||
args = parser.parse_args()
|
||||
|
||||
pcap_file = args.pcap_file.strip()
|
||||
#####################
|
||||
# get xml document from pcap
|
||||
#####################
|
||||
orig_pcap_file_name = args.pcap_file.strip()
|
||||
orig_pdml_string = subprocess.check_output(["tshark", '-T', 'pdml', '-r', orig_pcap_file_name])
|
||||
|
||||
pcap_dissected_file = subprocess.check_output(["tshark", '-V', '-r' , pcap_file], stderr=subprocess.STDOUT)
|
||||
pcap_hex_file = subprocess.check_output(["tshark", '-x', '-O', 'sctp', '-r', pcap_file])
|
||||
pcap_dissected_list = []
|
||||
orig_dom = parseString(orig_pdml_string)
|
||||
#orig_etree = ElementTree()
|
||||
#orig_etree.parse(orig_pcap_pdml_file.name)
|
||||
|
||||
# split file content in lines
|
||||
lines = pcap_dissected_file.splitlines()
|
||||
message = {}
|
||||
item_index = 0;
|
||||
item_string = " "
|
||||
fsm_state="search_frame"
|
||||
#####################
|
||||
# filtering unwanted packets
|
||||
#####################
|
||||
#cases = orig_etree.findall(".//proto[@name='sctp']")
|
||||
packets = orig_dom.getElementsByTagName("packet")
|
||||
for packet in packets:
|
||||
found_sctp = False
|
||||
found_s1ap = False
|
||||
protos = packet.getElementsByTagName("proto")
|
||||
for proto in protos:
|
||||
attrs = proto.attributes
|
||||
urlnode = attrs['name']
|
||||
if urlnode.nodeValue == 'sctp':
|
||||
found_sctp = True
|
||||
elif urlnode.nodeValue == 's1ap':
|
||||
found_s1ap = True
|
||||
elif urlnode.nodeValue == 'geninfo':
|
||||
packet.removeChild(proto)
|
||||
elif urlnode.nodeValue == 'eth':
|
||||
packet.removeChild(proto)
|
||||
if found_s1ap == False:
|
||||
# hopefully it seems to work (remove iterated packet)
|
||||
packet.parentNode.removeChild(packet)
|
||||
|
||||
#####################
|
||||
# dom to xml string
|
||||
#####################
|
||||
filtered_pdml_string = orig_dom.toxml()
|
||||
cleaned_pdml_string = ""
|
||||
#####################
|
||||
# remove blank lines in xml string
|
||||
#####################
|
||||
lines = filtered_pdml_string.splitlines()
|
||||
for line in lines:
|
||||
print ("INPUT LINE: %s " % line)
|
||||
line = line.strip()
|
||||
if line != "":
|
||||
if fsm_state == "search_frame":
|
||||
if line.startswith("Frame"):
|
||||
message = {}
|
||||
partition = line.split(' ',3)
|
||||
message['frame'] = int(partition[1].strip(':'))
|
||||
fsm_state = "search_ip"
|
||||
print("Found Frame %d" % (message['frame']))
|
||||
|
||||
elif fsm_state == "search_ip":
|
||||
if line.startswith("Internet Protocol Version"):
|
||||
fsm_state = "fill_ip"
|
||||
message['ip_fields'] = 0
|
||||
print("Found in Frame %d IP" % (message['frame']))
|
||||
|
||||
elif fsm_state == "fill_ip":
|
||||
if line.startswith("Header length"):
|
||||
partition = line.split(' ',4)
|
||||
message['ip_header_length'] = int(partition[2])
|
||||
message['ip_fields'] += 1
|
||||
print("Found in Frame %d IP header length %d" % (message['frame'], int(partition[2])))
|
||||
if line.startswith("Total Length"):
|
||||
partition = line.split(' ',4)
|
||||
message['ip_total_length'] = int(partition[2])
|
||||
message['ip_fields'] += 1
|
||||
print("Found in Frame %d IP Total Length %d" % (message['frame'], int(partition[2])))
|
||||
if line.startswith("Protocol"):
|
||||
partition = line.split(' ',4)
|
||||
if partition[1] != "SCTP":
|
||||
print("Error did not found in Frame %d SCTP" % (message['frame'])))
|
||||
fsm_state="search_frame"
|
||||
continue
|
||||
else:
|
||||
message['ip_protocol'] = partition[1]
|
||||
message['ip_fields'] += 1
|
||||
print("Found in Frame %d SCTP" % (message['frame'])))
|
||||
if message['ip_fields'] == 3:
|
||||
fsm_state = "search_sctp"
|
||||
print("in Frame %d searching S1AP" % (message['frame'])))
|
||||
|
||||
elif fsm_state == "search_sctp":
|
||||
if line.startswith("Internet Protocol Version"):
|
||||
fsm_state = "fill_sctp"
|
||||
message['sctp_fields'] = 0
|
||||
|
||||
elif fsm_state == "fill_sctp":
|
||||
if line.startswith("Source port"):
|
||||
partition = line.split(' ',4)
|
||||
message['Source port'] = int(partition[2])
|
||||
message['sctp_fields'] += 1
|
||||
elif line.startswith("Destination port"):
|
||||
partition = line.split(' ',4)
|
||||
message['Destination port'] = int(partition[2])
|
||||
message['sctp_fields'] += 1
|
||||
elif line.startswith("Chunk length"):
|
||||
partition = line.split(' ',4)
|
||||
message['Chunk length'] = int(partition[2])
|
||||
message['sctp_fields'] += 1
|
||||
elif line.startswith("Stream Identifier"):
|
||||
partition = line.split(' ',4)
|
||||
message['Stream Identifier'] = int(partition[2])
|
||||
message['sctp_fields'] += 1
|
||||
elif line.startswith("Stream sequence number"):
|
||||
partition = line.split(' ',4)
|
||||
message['Stream sequence number'] = int(partition[3])
|
||||
message['sctp_fields'] += 1
|
||||
elif line.startswith("Chunk padding"):
|
||||
partition = line.split(' ',4)
|
||||
message['Chunk padding'] = int(partition[2])
|
||||
message['sctp_fields'] += 1
|
||||
if message['sctp_fields'] == 6:
|
||||
fsm_state = "search_s1ap"
|
||||
|
||||
elif fsm_state == "search_s1ap":
|
||||
if line.startswith("S1 Application Protocol"):
|
||||
fsm_state = "fill_s1ap"
|
||||
message['s1ap_fields'] = 0
|
||||
print("in Frame %d Filling S1AP" % (message['frame'])))
|
||||
|
||||
elif fsm_state == "fill_s1ap":
|
||||
if line.startswith("S1AP-PDU:"):
|
||||
partition = line.split(' ')
|
||||
message['Pdu'] = partition[1]
|
||||
message['s1ap_fields'] += 1
|
||||
elif line.startswith("procedureCode:"):
|
||||
partition = line.split(' ')
|
||||
message['procedureCode:'] = partition[1]
|
||||
message['s1ap_fields'] += 1
|
||||
elif line.startswith("protocolIEs"):
|
||||
partition = line.split(' ')
|
||||
message['protocolIEs'] = int(partition[1])
|
||||
message['items'] = {}
|
||||
elif line.startswith("Item"):
|
||||
partition = line.split(' ')
|
||||
item_index = partition[1].trim(':')
|
||||
item_string = partition[2]
|
||||
message['items'][item_string] = ' '
|
||||
print("Found in Frame %d S1AP Item %d %s" % (message['frame'], item_index, item_string)))
|
||||
if item_string == id-E-RABToBeSetupListCtxtSUReq:
|
||||
elif item_string == id-E-RABToBeSetupListCtxtSUReq:
|
||||
elif line.startswith("nAS-PDU"):
|
||||
partition = line.split(' ')
|
||||
nas_bytes = partition[1].trim('.')
|
||||
message['items'].append
|
||||
print("Found in Frame %d Stream sequence number" % (message['frame'], int(partition[3])))
|
||||
|
||||
if message['s1ap_fields'] == 6:
|
||||
pcap_dissected_list.append(message)
|
||||
fsm_state = "search_frame"
|
||||
|
||||
for message in pcap_dissected_list:
|
||||
print("Message:\n" )
|
||||
print(" %s" % (message))
|
||||
|
||||
lines = pcap_hex_file.splitlines()
|
||||
message = {}
|
||||
message_index = 0
|
||||
fsm_state="search_frame"
|
||||
for line in lines:
|
||||
print ("INPUT LINE: %s " % line)
|
||||
line = line.strip()
|
||||
if line != "":
|
||||
if fsm_state == "search_frame":
|
||||
if line.startswith("Frame"):
|
||||
partition = line.split(' ',3)
|
||||
fsm_state = "search_s1ap"
|
||||
|
||||
elif fsm_state == "search_s1ap":
|
||||
if line.startswith("S1 Application Protocol"):
|
||||
fsm_state = "fill_s1ap"
|
||||
message = pcap_dissected_list[message_index]
|
||||
message['s1ap_byte_offset'] = 0
|
||||
message['dumped'] = []
|
||||
message_index += 1
|
||||
|
||||
elif fsm_state == "fill_s1ap":
|
||||
if not line.startswith("Frame"):
|
||||
bytes = line.split(' ')
|
||||
byte_index = int(bytes[0],16)
|
||||
if byte_index == message['s1ap_byte_offset']:
|
||||
message['s1ap_byte_offset'] += 16
|
||||
for byte in bytes:
|
||||
message['dumped'].append(byte)
|
||||
message['s1ap_byte_offset'] += 1
|
||||
else:
|
||||
fsm_state="search_frame"
|
||||
|
||||
print (" %s " % ( pcap_dissected_list ) )
|
||||
if line[:-1]:
|
||||
cleaned_pdml_string += line + '\r\n'
|
||||
#print "'%s'" % cleaned_pdml_string
|
||||
#####################
|
||||
# write xml string to pdml file
|
||||
#####################
|
||||
out_pdml_file_name = os.path.dirname(orig_pcap_file_name) + os.path.splitext(os.path.basename(orig_pcap_file_name))[0] + '.pdml'
|
||||
out_file = open(out_pdml_file_name, "w")
|
||||
out_file.write(cleaned_pdml_string)
|
||||
out_file.close()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user