162306a36Sopenharmony_ci#!/usr/bin/env python3 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci""" 462306a36Sopenharmony_citdc_batch.py - a script to generate TC batch file 562306a36Sopenharmony_ci 662306a36Sopenharmony_ciCopyright (C) 2017 Chris Mi <chrism@mellanox.com> 762306a36Sopenharmony_ci""" 862306a36Sopenharmony_ci 962306a36Sopenharmony_ciimport argparse 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ciparser = argparse.ArgumentParser(description='TC batch file generator') 1262306a36Sopenharmony_ciparser.add_argument("device", help="device name") 1362306a36Sopenharmony_ciparser.add_argument("file", help="batch file name") 1462306a36Sopenharmony_ciparser.add_argument("-n", "--number", type=int, 1562306a36Sopenharmony_ci help="how many lines in batch file") 1662306a36Sopenharmony_ciparser.add_argument( 1762306a36Sopenharmony_ci "-a", 1862306a36Sopenharmony_ci "--handle_start", 1962306a36Sopenharmony_ci type=int, 2062306a36Sopenharmony_ci default=1, 2162306a36Sopenharmony_ci help="start handle range from (default: 1)") 2262306a36Sopenharmony_ciparser.add_argument("-o", "--skip_sw", 2362306a36Sopenharmony_ci help="skip_sw (offload), by default skip_hw", 2462306a36Sopenharmony_ci action="store_true") 2562306a36Sopenharmony_ciparser.add_argument("-s", "--share_action", 2662306a36Sopenharmony_ci help="all filters share the same action", 2762306a36Sopenharmony_ci action="store_true") 2862306a36Sopenharmony_ciparser.add_argument("-p", "--prio", 2962306a36Sopenharmony_ci help="all filters have different prio", 3062306a36Sopenharmony_ci action="store_true") 3162306a36Sopenharmony_ciparser.add_argument( 3262306a36Sopenharmony_ci "-e", 3362306a36Sopenharmony_ci "--operation", 3462306a36Sopenharmony_ci choices=['add', 'del', 'replace'], 3562306a36Sopenharmony_ci default='add', 3662306a36Sopenharmony_ci help="operation to perform on filters" 3762306a36Sopenharmony_ci "(default: add filter)") 3862306a36Sopenharmony_ciparser.add_argument( 3962306a36Sopenharmony_ci "-m", 4062306a36Sopenharmony_ci "--mac_prefix", 4162306a36Sopenharmony_ci type=int, 4262306a36Sopenharmony_ci default=0, 4362306a36Sopenharmony_ci choices=range(0, 256), 4462306a36Sopenharmony_ci help="third byte of source MAC address of flower filter" 4562306a36Sopenharmony_ci "(default: 0)") 4662306a36Sopenharmony_ciargs = parser.parse_args() 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cidevice = args.device 4962306a36Sopenharmony_cifile = open(args.file, 'w') 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cinumber = 1 5262306a36Sopenharmony_ciif args.number: 5362306a36Sopenharmony_ci number = args.number 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cihandle_start = args.handle_start 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ciskip = "skip_hw" 5862306a36Sopenharmony_ciif args.skip_sw: 5962306a36Sopenharmony_ci skip = "skip_sw" 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cishare_action = "" 6262306a36Sopenharmony_ciif args.share_action: 6362306a36Sopenharmony_ci share_action = "index 1" 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ciprio = "prio 1" 6662306a36Sopenharmony_ciif args.prio: 6762306a36Sopenharmony_ci prio = "" 6862306a36Sopenharmony_ci if number > 0x4000: 6962306a36Sopenharmony_ci number = 0x4000 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cimac_prefix = args.mac_prefix 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cidef format_add_filter(device, prio, handle, skip, src_mac, dst_mac, 7462306a36Sopenharmony_ci share_action): 7562306a36Sopenharmony_ci return ("filter add dev {} {} protocol ip ingress handle {} " 7662306a36Sopenharmony_ci " flower {} src_mac {} dst_mac {} action drop {}".format( 7762306a36Sopenharmony_ci device, prio, handle, skip, src_mac, dst_mac, share_action)) 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cidef format_rep_filter(device, prio, handle, skip, src_mac, dst_mac, 8162306a36Sopenharmony_ci share_action): 8262306a36Sopenharmony_ci return ("filter replace dev {} {} protocol ip ingress handle {} " 8362306a36Sopenharmony_ci " flower {} src_mac {} dst_mac {} action drop {}".format( 8462306a36Sopenharmony_ci device, prio, handle, skip, src_mac, dst_mac, share_action)) 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cidef format_del_filter(device, prio, handle, skip, src_mac, dst_mac, 8862306a36Sopenharmony_ci share_action): 8962306a36Sopenharmony_ci return ("filter del dev {} {} protocol ip ingress handle {} " 9062306a36Sopenharmony_ci "flower".format(device, prio, handle)) 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ciformatter = format_add_filter 9462306a36Sopenharmony_ciif args.operation == "del": 9562306a36Sopenharmony_ci formatter = format_del_filter 9662306a36Sopenharmony_cielif args.operation == "replace": 9762306a36Sopenharmony_ci formatter = format_rep_filter 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ciindex = 0 10062306a36Sopenharmony_cifor i in range(0x100): 10162306a36Sopenharmony_ci for j in range(0x100): 10262306a36Sopenharmony_ci for k in range(0x100): 10362306a36Sopenharmony_ci mac = ("{:02x}:{:02x}:{:02x}".format(i, j, k)) 10462306a36Sopenharmony_ci src_mac = "e4:11:{:02x}:{}".format(mac_prefix, mac) 10562306a36Sopenharmony_ci dst_mac = "e4:12:00:" + mac 10662306a36Sopenharmony_ci cmd = formatter(device, prio, handle_start + index, skip, src_mac, 10762306a36Sopenharmony_ci dst_mac, share_action) 10862306a36Sopenharmony_ci file.write("{}\n".format(cmd)) 10962306a36Sopenharmony_ci index += 1 11062306a36Sopenharmony_ci if index >= number: 11162306a36Sopenharmony_ci file.close() 11262306a36Sopenharmony_ci exit(0) 113