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