Beispiel #1
0
def install_available_paths(prefix, config, ip):
    if config != "EMPTY":
        asn = ip_bgp_data.ip_to_asn(ip)

        available_paths_list = []
        available_paths = config.split("!")

        for i, path in enumerate(available_paths):
            available_paths_list.append(path)

        available_paths_list.sort()
        router_paths[prefix][asn][ip]["available_paths"] = "!".join(
            available_paths_list)
    else:
        router_paths[prefix][asn][ip]["available_paths"] = "-"
Beispiel #2
0
def install_all_paths(prefix, config, ip):
    if config != "EMPTY":
        asn = ip_bgp_data.ip_to_asn(ip)

        paths = config.split(":")
        router_paths[prefix][asn][ip]["best_path"] = paths[0]

        if asn == ip_bgp_data.local_asn:
            current_path[prefix] = paths[0]

        available_paths_list = []
        available_paths = paths[1].split("!")

        for i, path in enumerate(available_paths):
            available_paths_list.append(path)

        available_paths_list.sort()
        router_paths[prefix][asn][ip]["available_paths"] = "!".join(
            available_paths_list)
    else:
        router_paths[prefix][asn][ip]["best_path"] = "-"
        router_paths[prefix][asn][ip]["available_paths"] = "-"
Beispiel #3
0
def get_bgp_trace(trace):
    trace_split = trace.split('\n')[:-2]  # remove trailing newlines

    last_asn = ip_bgp_data.local_asn
    last_latency = 0.0

    bgp_data = []
    bgp_trace = [last_asn]
    latency = 0.0

    # parse every line in the trace
    for trace_line in trace_split:
        hop = parse_trace_line(trace_line).split("_")

        if hop[0] == "N/A":
            continue
        else:
            asn = ip_bgp_data.ip_to_asn(hop[0])
            bgp_trace.append(asn)

            if asn != "*":
                latency = float(hop[1])

                if asn != last_asn and last_asn != "*":
                    bgp_data.append([last_asn, asn, latency - last_latency])
                    last_latency = latency

            last_asn = asn

    bgp_trace_filtered = [x[0] for x in itertools.groupby(bgp_trace)]
    bgp_trace_str = " ".join(bgp_trace_filtered)

    #if "*" in bgp_trace_str:
    #print bgp_trace_str + ": " + trace

    return [bgp_data, bgp_trace_str, latency]
Beispiel #4
0
                if paths == "-":
                    paths = ""
                paths += as_path + "!"
    
        if paths == "-":
            return paths
        else:
            return paths[:-1]
    else:
        return "EMPTY"
    
if __name__ == '__main__':
    FLAGS = parse_FLAGS()
    print "forwarder_rcvd.py started"
    
    asn = ip_bgp_data.ip_to_asn(FLAGS.src_ip)
    if asn == "*":
        print "src_ip does not belong to an AS, exiting..."
        sys.exit(1)
    
    # create socket for sending data to localhost
    forward_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    # read from file continuously as new data is added
    process = subprocess.Popen(["tail", "-n", "0", "-F", FLAGS.logfile], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
    while True:
        # read logfile line, and get the relevant portion of it. example lines:
        # Announcement example: 2016/07/04 10:05:34.326 BGP: 20.0.3.2 rcvd UPDATE w/ attr: nexthop 20.0.3.2, origin i, path 900 1000 1100 1200 800
        #                       2016/07/04 10:05:34.326 BGP: 20.0.3.2 rcvd 10.0.8.0/24
        # Withdrawal example:   2016/07/04 10:48:05.088 BGP: 20.0.1.2 rcvd UPDATE about 10.0.3.0/24 -- withdrawn
Beispiel #5
0
                else:
                    best_path = as_path

        if paths == "-":
            return best_path + ":" + paths
        else:
            return best_path + ":" + paths[:-1]
    else:
        return "EMPTY"


if __name__ == '__main__':
    FLAGS = parse_flags()
    print "get_paths.py started"

    asn = ip_bgp_data.ip_to_asn(FLAGS.src_ip)
    if asn == "*":
        print "src_ip does not belong to an AS, exiting..."
        sys.exit(1)

    # create socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind((FLAGS.src_ip, FLAGS.src_port))

    # receive requests
    while True:
        try:
            data, (ip, port) = server_socket.recvfrom(1024)

            if data:
Beispiel #6
0
        }
        current_path[prefix] = "-"
        previous_path[prefix] = "-"
        last_updates[prefix] = {}
        last_updates_local[prefix] = {}
        path_decisions[prefix] = {}

        if prefix not in router_paths:
            router_paths[prefix] = {}

        for asn in FLAGS.used_ases:
            last_updates[prefix][asn] = []
            last_updates_local[prefix][asn] = []

        for ip in FLAGS.routers:
            asn = ip_bgp_data.ip_to_asn(ip)

            if asn not in router_paths[prefix]:
                router_paths[prefix][asn] = {}

            router_paths[prefix][asn][ip] = {
                "best_path": "-",
                "available_paths": "-"
            }

        print "added prefix \"" + prefix + "\""

    # initialize sockets
    upstream_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    upstream_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    upstream_socket.bind((FLAGS.src_ip, FLAGS.forwarder_port))