#!/usr/bin/env python3

"""
tdc_batch.py - a script to generate TC batch file

Copyright (C) 2017 Chris Mi <chrism@mellanox.com>
"""

import argparse

parser = argparse.ArgumentParser(description='TC batch file generator')
parser.add_argument("device", help="device name")
parser.add_argument("file", help="batch file name")
parser.add_argument("-n", "--number", type=int,
                    help="how many lines in batch file")
parser.add_argument(
    "-a",
    "--handle_start",
    type=int,
    default=1,
    help="start handle range from (default: 1)")
parser.add_argument("-o", "--skip_sw",
                    help="skip_sw (offload), by default skip_hw",
                    action="store_true")
parser.add_argument("-s", "--share_action",
                    help="all filters share the same action",
                    action="store_true")
parser.add_argument("-p", "--prio",
                    help="all filters have different prio",
                    action="store_true")
parser.add_argument(
    "-e",
    "--operation",
    choices=['add', 'del', 'replace'],
    default='add',
    help="operation to perform on filters"
    "(default: add filter)")
parser.add_argument(
    "-m",
    "--mac_prefix",
    type=int,
    default=0,
    choices=range(0, 256),
    help="third byte of source MAC address of flower filter"
    "(default: 0)")
args = parser.parse_args()

device = args.device
file = open(args.file, 'w')

number = 1
if args.number:
    number = args.number

handle_start = args.handle_start

skip = "skip_hw"
if args.skip_sw:
    skip = "skip_sw"

share_action = ""
if args.share_action:
    share_action = "index 1"

prio = "prio 1"
if args.prio:
    prio = ""
    if number > 0x4000:
        number = 0x4000

mac_prefix = args.mac_prefix

def format_add_filter(device, prio, handle, skip, src_mac, dst_mac,
                      share_action):
    return ("filter add dev {} {} protocol ip ingress handle {} "
            " flower {} src_mac {} dst_mac {} action drop {}".format(
                device, prio, handle, skip, src_mac, dst_mac, share_action))


def format_rep_filter(device, prio, handle, skip, src_mac, dst_mac,
                      share_action):
    return ("filter replace dev {} {} protocol ip ingress handle {} "
            " flower {} src_mac {} dst_mac {} action drop {}".format(
                device, prio, handle, skip, src_mac, dst_mac, share_action))


def format_del_filter(device, prio, handle, skip, src_mac, dst_mac,
                      share_action):
    return ("filter del dev {} {} protocol ip ingress handle {} "
            "flower".format(device, prio, handle))


formatter = format_add_filter
if args.operation == "del":
    formatter = format_del_filter
elif args.operation == "replace":
    formatter = format_rep_filter

index = 0
for i in range(0x100):
    for j in range(0x100):
        for k in range(0x100):
            mac = ("{:02x}:{:02x}:{:02x}".format(i, j, k))
            src_mac = "e4:11:{:02x}:{}".format(mac_prefix, mac)
            dst_mac = "e4:12:00:" + mac
            cmd = formatter(device, prio, handle_start + index, skip, src_mac,
                            dst_mac, share_action)
            file.write("{}\n".format(cmd))
            index += 1
            if index >= number:
                file.close()
                exit(0)
