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