TNSM_Latency_Prediction / UDPServer / BPF / main.py
main.py
Raw
from bcc import BPF
from bcc.utils import printb
import multiprocessing
import os, datetime


parser = argparse.ArgumentParser(description='Process some integers.')

parser.add_argument('-i', '--interface', type=str, help='Interface to listen on')
parser.add_argument('-f', '--filename', type=str, help='Filename')
parser.add_argument('-r', '--resultpath', type=str, help='Path for result files')
parser.add_argument('-s', '--staticpath', type=str, help='')


args = parser.parse_args()


ret = "XDP_DROP"
ctxtype = "xdp_md"
mode = BPF.XDP


def main():

    if args.interface:
        ethernetParams = [p for p in args.ethernet.split(',')]

    if args.rnd:
        rndParams = [p for p in args.rnd.split(',')]

    if args.vlan:

    #b = BPF(src_file="ts_picker.c", cflags=["-DNUM_CPUS=%d" % multiprocessing.cpu_count()])
    b = BPF(src_file="ts_picker.c", cflags=["-w", "-DRETURNCODE=%s" % ret, "-DCTXTYPE=%s" % ctxtype])
    fn = b.load_func("timestamp_picker", mode) #4
    b.attach_xdp(args.interface, fn, 0) #5

    ingress_lat_cnt = b.get_table("ingress_lat_cnt")
    egress_lat_cnt = b.get_table("egress_lat_cnt")
    e2e_lat_cnt = b.get_table("e2e_lat_cnt")

    try:
        b.trace_print() #6
    except KeyboardInterrupt: #7

        #pktCounter = b.get_table("pkt_counter")

        #for k, v in pktCounter.items():
        #    print("Packet Counter %10d" % v.value)

        total = 0

        mydir = ""

        nameIngress = "ingressLatency"
        nameIngress = "egressLatency"
        nameE = "e2eLatency"


        if not args.staticpath:
            mydir = os.path.join(args.resultpath, args.filename, datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
        else:
            mydir = args.staticpath
    

        myfile = os.path.join(mydir,"results_"+nameIngress+args.filename+".txt")
        for k, v in ingress_lat_cnt.items():
            #print("INGRESS -> TIME: %d, COUNT: %d" % (k.value, v.value))
             myfile.write("%d,%d\n" % (k.value, v.value))
            total = total + v.value
        print("Writen to ingress latency file.")
        myfile.close()

        myfile = os.path.join(mydir,"results_"+nameEgress+args.filename+".txt")
        for k, v in egress_lat_cnt.items():
            #print("EGRESS -> TIME: %d, COUNT: %d" % (k.value, v.value))
            myfile.write("%d,%d\n" % (k.value, v.value))
        print("Writen to egress latency file.")
        myfile.close()

        myfile = os.path.join(mydir,"results_"+nameEgress+args.filename+".txt")
        for k, v in e2e_lat_cnt.items():
            #print("E2E -> TIME: %d, COUNT: %d" % (k.value, v.value))
            myfile.write("%d,%d\n" % (k.value, v.value))
        print("Writen to egress latency file.")
        myfile.close()
        
        print("Total ingress latency probes: %10d" % total)

    b.remove_xdp(device) #11

if __name__ == '__main__':
    main()