added Python script to generate streams for fe.cfg file 65/2765/1
authorMohammad Abdul Awal <mohammad.abdul.awal@intel.com>
Tue, 6 Sep 2016 13:42:17 +0000 (14:42 +0100)
committerMohammad Abdul Awal <mohammad.abdul.awal@intel.com>
Fri, 9 Sep 2016 15:31:41 +0000 (16:31 +0100)
This script allows to generate streams for frontend config file
with different parameters, including, number of streams, ipv4/ipv6
port in decimal or hex, FE/BE on same lcore or separate lcore etc.

Change-Id: I8a7e0137ef62363b272756ed4b8811804d4f9ec4
Signed-off-by: Mohammad Abdul Awal <mohammad.abdul.awal@intel.com>
examples/udpfwd/gen_fe_cfg.py [new file with mode: 0755]

diff --git a/examples/udpfwd/gen_fe_cfg.py b/examples/udpfwd/gen_fe_cfg.py
new file mode 100755 (executable)
index 0000000..dbb500b
--- /dev/null
@@ -0,0 +1,199 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2016 Intel Corporation.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+# generate FE config script
+#
+
+import sys, optparse, math
+
+def print_usage ():
+       print "Usage: " + sys.argv[0] + " [-f fe_lcore_list] [-b be_lcore_list]"
+       print "          [-p start_port] [-n number_of_streams]"
+       print "          [-m mode] [-q local_address] [-r remote_address]"
+       print "          [-s fwd_local_address] [-t fwd_remote_address]"
+       print "          [-l txlen] [-4/-6] [-H]"
+       print
+       print "Options"
+       print "   -f, --fe_lcore_list: list of lcores used for FE. Multiple " \
+                       "lcores are comma-separated, within double quote"
+       print "   -b, --be_lcore_list: list of lcores used for BE. Multiple " \
+                       "lcores are comma-separated, within double quote"
+       print "   -p, --start_port: starting UDP port number"
+       print "   -n, --number_of_streams: number of streams to be generated"
+       print "   -m, --mode: mode of the application. [echo, rx, tx, fwd]"
+       print "   -q, --local_address: local address of the stream"
+       print "   -r, --remote_address: remote address of the stream"
+       print "   -s, --fwd_local_address: forwarding local address of the stream"
+       print "   -t, --fwd_remote_address: forwarding remote address of the " \
+                       "stream"
+       print "   -l, --txlen: transmission length for rx/tx mode"
+       print "   -H: if port number to printed in hex format"
+       print "   -4/-6: if default ip addresses to be printed in ipv4/ipv6 format"
+
+def align_power_of_2(x):
+       return 2**(x-1).bit_length()
+
+def print_stream(mode, la, ra, fwd_la, fwd_ra, lcore, belcore, lport,
+               fwrport, txlen):
+       if support_hex != 0:
+               lport_str = str(format(lport, '#x'))
+               fwrport_str = str(format(fwrport, '#x'))
+       else:
+               lport_str = str(lport)
+               fwrport_str = str(fwrport)
+
+       stream = "lcore=" + str(lcore) + ",belcore=" + str(belcore) + ",op=" + mode
+       stream += ",laddr=" + la + ",lport=" + lport_str
+       stream += ",raddr=" + ra + ",rport=0"
+
+       if mode == 'fwd':
+               stream += ",fwladdr=" + fwd_la + ",fwlport=0,fwraddr=" + fwd_ra
+               stream += ",fwrport=" + fwrport_str
+
+       if mode == 'rx' or mode == 'tx':
+               stream += ",txlen=" + str(txlen)
+
+       print stream
+
+parser = optparse.OptionParser()
+parser.add_option("-b", "--be_lcore_list", dest = "be_lcore_list",
+       help = "BE lcore lists.")
+parser.add_option("-f", "--fe_lcore_list", dest = "fe_lcore_list",
+       help = "FE lcore lists.")
+parser.add_option("-p", "--start_port", dest = "start_port",
+       help = "start port.")
+parser.add_option("-n", "--number_of_streams", dest = "number_of_streams",
+       help = "number of streams.")
+parser.add_option("-m", "--mode", dest = "mode",
+       help = "mode (op, rx, tx, fwd).")
+parser.add_option("-q", "--local_address", dest = "local_address",
+       help = "local_address.")
+parser.add_option("-r", "--remote_address", dest = "remote_address",
+       help = "remote_address.")
+parser.add_option("-s", "--fwd_local_address", dest = "fwd_local_address",
+       help = "fwd_local_address.")
+parser.add_option("-t", "--fwd_remote_address", dest = "fwd_remote_address",
+       help = "fwd_remote_address.")
+parser.add_option("-l", "--txlen", dest = "txlen", help = "txlen.")
+parser.add_option("-4", action = "store_false", dest = "ipv6",
+       help = "IPv4/IPv6")
+parser.add_option("-6", action = "store_true", dest = "ipv6",
+       help = "IPv4/IPv6")
+parser.add_option("-H", action = "store_true", dest = "support_hex",
+       help = "print ports in hexa format")
+
+(options, args) = parser.parse_args()
+
+if len(sys.argv) == 1:
+       print
+       print_usage()
+       print
+       sys.exit()
+
+supported_modes = ['echo', 'rx', 'tx', 'fwd']
+support_hex = 0
+txlen = 72
+
+if options.ipv6 == True:
+       la = '::'
+       ra = '::'
+       fwd_la = '::'
+       fwd_ra = '::'
+else:
+       la = '0.0.0.0'
+       ra = '0.0.0.0'
+       fwd_la = '0.0.0.0'
+       fwd_ra = '0.0.0.0'
+
+if options.support_hex == True:
+       support_hex = 1
+
+if options.txlen != None:
+       txlen = options.txlen
+
+if options.fe_lcore_list != None:
+       felcore_list = list(map(int, options.fe_lcore_list.split(",")))
+       felcore_list.sort()
+else:
+       felcore_list = []
+
+if options.be_lcore_list != None:
+       belcore_list = list(map(int, options.be_lcore_list.split(",")))
+       belcore_list.sort()
+else:
+       print "default BE lcore list = [ 1 ]"
+       belcore_list = [1]
+
+if options.mode != None:
+       mode = options.mode
+       if mode not in supported_modes:
+               print "Supported modes: " + str(supported_modes)
+               print "Provided mode \"" + mode + "\" is not supported. Terminating..."
+               sys.exit()
+else:
+       print "default mode = echo"
+       mode = "echo"
+
+if options.start_port != None:
+       start_port = int(options.start_port)
+else:
+       print "default start_port = 32768"
+       start_port = 32768
+
+if options.number_of_streams != None:
+       number_of_streams = int(options.number_of_streams)
+else:
+       print "default number_of_streams = 1"
+       number_of_streams = 1
+
+fwd_start_port = 53248
+
+if options.local_address != None:
+       la = options.local_address
+
+if options.remote_address != None:
+       ra = options.remote_address
+
+if options.fwd_local_address != None:
+       fwd_la = options.fwd_local_address
+
+if options.fwd_remote_address != None:
+       fwd_ra = options.fwd_remote_address
+
+belcore_count = len(belcore_list)
+align_belcore_count = align_power_of_2(belcore_count)
+nb_bits = int(math.log(align_belcore_count, 2))
+
+felcore_count = len(felcore_list)
+if felcore_count != 0:
+       if number_of_streams % felcore_count == 0:
+               nb_stream_per_flc = number_of_streams / felcore_count
+       else:
+               nb_stream_per_flc = (number_of_streams / felcore_count) + 1
+
+for i in range(start_port, start_port + number_of_streams):
+       k = i - start_port
+       align_belcore_count = align_power_of_2(belcore_count)
+       blc_indx = (i % align_belcore_count) % belcore_count
+       belcore = belcore_list[blc_indx]
+       if felcore_count != 0:
+               flc_indx = k / nb_stream_per_flc
+               felcore = felcore_list[flc_indx]
+       else:
+               felcore = belcore
+
+       print_stream(mode, la, ra, fwd_la, fwd_ra, felcore, belcore, i,
+               fwd_start_port + k, txlen)