1*c25ce589SFinn Behrens#!/usr/bin/env python3
27f071998SChris Mi
37f071998SChris Mi"""
47f071998SChris Mitdc_batch.py - a script to generate TC batch file
57f071998SChris Mi
67f071998SChris MiCopyright (C) 2017 Chris Mi <chrism@mellanox.com>
77f071998SChris Mi"""
87f071998SChris Mi
97f071998SChris Miimport argparse
107f071998SChris Mi
117f071998SChris Miparser = argparse.ArgumentParser(description='TC batch file generator')
127f071998SChris Miparser.add_argument("device", help="device name")
137f071998SChris Miparser.add_argument("file", help="batch file name")
147f071998SChris Miparser.add_argument("-n", "--number", type=int,
157f071998SChris Mi                    help="how many lines in batch file")
163b07270dSVlad Buslovparser.add_argument(
173b07270dSVlad Buslov    "-a",
183b07270dSVlad Buslov    "--handle_start",
193b07270dSVlad Buslov    type=int,
203b07270dSVlad Buslov    default=1,
213b07270dSVlad Buslov    help="start handle range from (default: 1)")
227f071998SChris Miparser.add_argument("-o", "--skip_sw",
237f071998SChris Mi                    help="skip_sw (offload), by default skip_hw",
247f071998SChris Mi                    action="store_true")
257f071998SChris Miparser.add_argument("-s", "--share_action",
267f071998SChris Mi                    help="all filters share the same action",
277f071998SChris Mi                    action="store_true")
287f071998SChris Miparser.add_argument("-p", "--prio",
297f071998SChris Mi                    help="all filters have different prio",
307f071998SChris Mi                    action="store_true")
313b07270dSVlad Buslovparser.add_argument(
323b07270dSVlad Buslov    "-e",
333b07270dSVlad Buslov    "--operation",
343b07270dSVlad Buslov    choices=['add', 'del', 'replace'],
353b07270dSVlad Buslov    default='add',
363b07270dSVlad Buslov    help="operation to perform on filters"
373b07270dSVlad Buslov    "(default: add filter)")
383b07270dSVlad Buslovparser.add_argument(
393b07270dSVlad Buslov    "-m",
403b07270dSVlad Buslov    "--mac_prefix",
413b07270dSVlad Buslov    type=int,
423b07270dSVlad Buslov    default=0,
433b07270dSVlad Buslov    choices=range(0, 256),
443b07270dSVlad Buslov    help="third byte of source MAC address of flower filter"
453b07270dSVlad Buslov    "(default: 0)")
467f071998SChris Miargs = parser.parse_args()
477f071998SChris Mi
487f071998SChris Midevice = args.device
497f071998SChris Mifile = open(args.file, 'w')
507f071998SChris Mi
517f071998SChris Minumber = 1
527f071998SChris Miif args.number:
537f071998SChris Mi    number = args.number
547f071998SChris Mi
553b07270dSVlad Buslovhandle_start = args.handle_start
563b07270dSVlad Buslov
577f071998SChris Miskip = "skip_hw"
587f071998SChris Miif args.skip_sw:
597f071998SChris Mi    skip = "skip_sw"
607f071998SChris Mi
617f071998SChris Mishare_action = ""
627f071998SChris Miif args.share_action:
637f071998SChris Mi    share_action = "index 1"
647f071998SChris Mi
657f071998SChris Miprio = "prio 1"
667f071998SChris Miif args.prio:
677f071998SChris Mi    prio = ""
687f071998SChris Mi    if number > 0x4000:
697f071998SChris Mi        number = 0x4000
707f071998SChris Mi
713b07270dSVlad Buslovmac_prefix = args.mac_prefix
723b07270dSVlad Buslov
733b07270dSVlad Buslovdef format_add_filter(device, prio, handle, skip, src_mac, dst_mac,
743b07270dSVlad Buslov                      share_action):
750531b035SVlad Buslov    return ("filter add dev {} {} protocol ip ingress handle {} "
763b07270dSVlad Buslov            " flower {} src_mac {} dst_mac {} action drop {}".format(
773b07270dSVlad Buslov                device, prio, handle, skip, src_mac, dst_mac, share_action))
783b07270dSVlad Buslov
793b07270dSVlad Buslov
803b07270dSVlad Buslovdef format_rep_filter(device, prio, handle, skip, src_mac, dst_mac,
813b07270dSVlad Buslov                      share_action):
820531b035SVlad Buslov    return ("filter replace dev {} {} protocol ip ingress handle {} "
833b07270dSVlad Buslov            " flower {} src_mac {} dst_mac {} action drop {}".format(
843b07270dSVlad Buslov                device, prio, handle, skip, src_mac, dst_mac, share_action))
853b07270dSVlad Buslov
863b07270dSVlad Buslov
873b07270dSVlad Buslovdef format_del_filter(device, prio, handle, skip, src_mac, dst_mac,
883b07270dSVlad Buslov                      share_action):
890531b035SVlad Buslov    return ("filter del dev {} {} protocol ip ingress handle {} "
903b07270dSVlad Buslov            "flower".format(device, prio, handle))
913b07270dSVlad Buslov
923b07270dSVlad Buslov
933b07270dSVlad Buslovformatter = format_add_filter
943b07270dSVlad Buslovif args.operation == "del":
953b07270dSVlad Buslov    formatter = format_del_filter
963b07270dSVlad Buslovelif args.operation == "replace":
973b07270dSVlad Buslov    formatter = format_rep_filter
983b07270dSVlad Buslov
997f071998SChris Miindex = 0
1007f071998SChris Mifor i in range(0x100):
1017f071998SChris Mi    for j in range(0x100):
1027f071998SChris Mi        for k in range(0x100):
1033adc1c63SBTaskaya            mac = ("{:02x}:{:02x}:{:02x}".format(i, j, k))
1043b07270dSVlad Buslov            src_mac = "e4:11:{:02x}:{}".format(mac_prefix, mac)
1057f071998SChris Mi            dst_mac = "e4:12:00:" + mac
1063b07270dSVlad Buslov            cmd = formatter(device, prio, handle_start + index, skip, src_mac,
1073b07270dSVlad Buslov                            dst_mac, share_action)
1083adc1c63SBTaskaya            file.write("{}\n".format(cmd))
1097f071998SChris Mi            index += 1
1107f071998SChris Mi            if index >= number:
1117f071998SChris Mi                file.close()
1127f071998SChris Mi                exit(0)
113