Commit b4e29f3e authored by gauthier's avatar gauthier

Use pdml format for test traces

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7856 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent 0f2dd8c3
#!/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()
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 = []
# split file content in lines
lines = pcap_dissected_file.splitlines()
message = {}
item_index = 0;
item_string = " "
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"):
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])))
#####################
# 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])
if message['s1ap_fields'] == 6:
pcap_dissected_list.append(message)
fsm_state = "search_frame"
orig_dom = parseString(orig_pdml_string)
#orig_etree = ElementTree()
#orig_etree.parse(orig_pcap_pdml_file.name)
for message in pcap_dissected_list:
print("Message:\n" )
print(" %s" % (message))
#####################
# 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)
lines = pcap_hex_file.splitlines()
message = {}
message_index = 0
fsm_state="search_frame"
#####################
# 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"):
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()
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment