Esempio n. 1
0
def create_ofg_server(port, recv_callback):
    """Starts a server which listens for OFG clients on the specified port.

    @param port  the port to listen on
    @param recv_callback  the function to call with received message content
                         (takes two arguments: transport, msg)

    @return returns the new LTTwistedServer
    """
    from ltprotocol.ltprotocol import LTTwistedServer
    server = LTTwistedServer(OFG_PROTOCOL, recv_callback)
    server.listen(port)
    return server
Esempio n. 2
0
def create_vns_server(port, recv_callback, new_conn_callback, lost_conn_callback, verbose=True):
    """Starts a server which listens for VNS clients on the specified port.

    @param port  the port to listen on
    @param recv_callback  the function to call with received message content
                         (takes two arguments: transport, msg)
    @param new_conn_callback   called with one argument (a LTProtocol) when a connection is started
    @param lost_conn_callback  called with one argument (a LTProtocol) when a connection is lost
    @param verbose        whether to print messages when they are sent

    @return returns the new LTTwistedServer
    """
    server = LTTwistedServer(VNS_PROTOCOL, recv_callback, new_conn_callback, lost_conn_callback, verbose)
    server.listen(port)
    return server
Esempio n. 3
0
    if len(sys.argv) < 2:
        print >> sys.stderr, "usage: ./test_ltprotocol.py TYPE"
        sys.exit(-1)

    what = sys.argv[1]
    if what != "client" and what != "server":
        print >> sys.stderr, "TYPE must be client or server"
        sys.exit(-1)

    # periodically sends some messages
    def periodic_send(proto):
        if proto.connected:
            print 'sending ...'
            proto.send(NumMsg(200))
            proto.send(StrMsg("hello world!"))
            proto.send(NumMsg(7))
            reactor.callLater(1, lambda : periodic_send(proto))

    if what == "client":
        client = LTTwistedClient(TEST_PROTOCOL,
                                 lambda p, m : print_ltm('client', p, m))
        client.connect('127.0.0.1', 9999)
    else:
        server = LTTwistedServer(TEST_PROTOCOL,
                                 lambda p, m : print_ltm('server', p, m),
                                 periodic_send,
                                 print_disconnect)
        server.listen(9999)

    reactor.run()
Esempio n. 4
0
def test():
    def ip_to_dpid(ip):
	ip_re = re.compile("(\d+)\.(\d+)\.(\d+)\.(\d+)")
	ip_group = ip_re.search(ip)
	if ip_group is not None:
	    dpid = long(0)
	    for i in range(1,5):
		dpid = long(dpid)*256 + long(ip_group.group(i))
	    return dpid
	return 0

    def get_port(name):
	return int(name[-1:])

    def get_nbr_iface(nbr, check_disabled=True):
	for r in rtrs:
	    if(r.getRouterID() == nbr.getNeighborID()):
		for i in r.interfaces:
		    if((i.ip == nbr.getNeighborIP())):
			if((not check_disabled) or i.isLinkUp()):
			    return get_port(i.name)
	return (-1)

    def get_host_nbr(rtr_ip):
	for r in rtrs:
	    for i in r.interfaces:
		if(i.ip == rtr_ip):
		    return (ip_to_dpid(r.routerID), get_port(i.name),)
	return (-1, -1,)

    def get_host_of_rtr(iface):
	for h in hosts:
	    if (h.nbr == iface.ip):
		return (ip_to_dpid(h.ip), 0,)
	return (-1, -1,)

    # simply print out all received messages
    def print_ltm(xport, ltm):
        if ltm is not None:
            print 'recv: %s' % str(ltm)
            t = ltm.get_type()
            if t==LinksAdd.get_type() or t==LinksDel.get_type():
                # got request to add/del a link: tell the GUI we've done so
                xport.write(MPFR_PROTOCOL.pack_with_header(ltm))

    def receive_ltm(xport, ltm):
        if ltm is not None:
            print 'recv: %s' % str(ltm)
            t = ltm.get_type()
            if t==LinksAdd.get_type() or t==LinksDel.get_type():
                # got request to add/del a link: tell the GUI we've done so
                xport.write(MPFR_PROTOCOL.pack_with_header(ltm))
	    elif t == SetMPFR.get_type():
		if(ltm.get_subtype() == SetMPFR.TYPE_MP): 
		    for r in rtrs:
			r.setMultipath(ltm.val)
		elif(ltm.get_subtype() == SetMPFR.TYPE_FR): 
		    for r in rtrs:
			r.setFastReroute(ltm.val)

    from ltprotocol.ltprotocol import LTTwistedServer

    def close_conn_callback(conn):
	print "close_conn_callback: Connection closed\n"
	while len(rtrs) > 0:
	    rtr = rtrs.pop()
	    print "Deleting router " + rtr.routerID
	    print str(len(rtrs)) + " routers left"
	    del(rtr)

    def update_rtrs(conn):
	print "Calling update_rtrs"
	if(len(rtrs) == 0):
	    print "No routers left in the list - I'm done with this session"
	    return

	print str(time.time())+ "\tUpdating the status of all routers"
	for r in rtrs:
	    r.checkLinkStatus()
	    r.updateNeighbors()
	    r.getStats()

	for r in rtrs:
	    print "Router :" + r.routerID
	    src_node = Node(Node.TYPE_OPENFLOW_SWITCH, ip_to_dpid(r.routerID))
	    del_links = []
	    add_linkspecs = []
	    del_flows = []
	    add_flows = []
	    for i in r.interfaces:
		src_port = get_port(i.name)
		old_nbrs = i.getOldNeighbors()
		new_nbrs  = i.getNeighbors()

		#if neighbors have changed or link status has changed
		if(i.haveChangedNeighbors() or i.hasChangedLinkStatus()):
		    #if there was an old nbr and active link, delete link and flow
		    if((len(old_nbrs) > 0) and i.wasLinkUp()):
			dst_node = Node(Node.TYPE_OPENFLOW_SWITCH, ip_to_dpid(old_nbrs[0].getNeighborID()))
			dst_port = get_nbr_iface(old_nbrs[0], False)
			if(dst_port >= 0):
			    del_links.append(Link(Link.TYPE_WIRE, src_node, src_port, dst_node, dst_port))
			    # if there was a flow delete it
			    if(i.getOldStatsOUTChange()):
				xput = int(i.getStatsChangeOUT()*8/(1000*POLL_INTERVAL))
				del_flows.append(Flow(Flow.TYPE_UNKNOWN, ip_to_dpid(i.ip), xput, src_node, src_port, dst_node, dst_port, list()))

		    # if there is a new nbr and the link is up, add link and flow
		    if((len(new_nbrs) > 0) and i.isLinkUp()):
			dst_node = Node(Node.TYPE_OPENFLOW_SWITCH, ip_to_dpid(new_nbrs[0].getNeighborID()))
			dst_port = get_nbr_iface(new_nbrs[0])
			if(dst_port >= 0):
			    add_linkspecs.append(LinkSpec(Link.TYPE_WIRE, src_node, src_port, dst_node, dst_port, GIGABIT))

		(host_id, host_port) = get_host_of_rtr(i)
		# if there is a flow going out add it
		if(i.haveChangedStatsOUT()):
		    # if there is a flow to a router add it
		    if(len(new_nbrs) > 0):
			dst_node = Node(Node.TYPE_OPENFLOW_SWITCH, ip_to_dpid(new_nbrs[0].getNeighborID()))
			dst_port = get_nbr_iface(new_nbrs[0])
			if(dst_port >= 0):
			    xput = int(i.getStatsChangeOUT()*8/(1000*POLL_INTERVAL))
			    add_flows.append(Flow(Flow.TYPE_UNKNOWN, ip_to_dpid(i.ip), xput, src_node, src_port, dst_node, dst_port, list()))
		    # if there is a flow to a host add it
		    elif(host_id > 0):
			dst_node = Node(Node.TYPE_HOST, host_id)
			dst_port = host_port
			xput = int(i.getStatsChangeOUT()*8/(1000*POLL_INTERVAL))
			add_flows.append(Flow(Flow.TYPE_UNKNOWN, ip_to_dpid(i.ip), xput, src_node, src_port, dst_node, dst_port, list()))

		# else delete it
		else:
		    # if there is no flow to a router delete it
		    if(len(old_nbrs) > 0):
			dst_node = Node(Node.TYPE_OPENFLOW_SWITCH, ip_to_dpid(old_nbrs[0].getNeighborID()))
			dst_port = get_nbr_iface(old_nbrs[0], False)
			if(dst_port >= 0):
			    del_flows.append(Flow(Flow.TYPE_UNKNOWN, ip_to_dpid(i.ip), 0, src_node, src_port, dst_node, dst_port, list()))
		    # if there is no flow to a host delete it
		    elif(host_id > 0):
			dst_node = Node(Node.TYPE_HOST, host_id)
			dst_port = host_port
			del_flows.append(Flow(Flow.TYPE_UNKNOWN, ip_to_dpid(i.ip), 0, src_node, src_port, dst_node, dst_port, list()))

		if(host_id > 0):
		    host_node = Node(Node.TYPE_HOST, host_id)
		    # if there is a flow from a host add it
		    if(i.haveChangedStatsIN()):
			xput = int(i.getStatsChangeIN()*8/(1000*POLL_INTERVAL))
			add_flows.append(Flow(Flow.TYPE_UNKNOWN, host_id, xput, host_node, host_port, src_node, src_port, list()))
		    # else delete it
		    else:
			del_flows.append(Flow(Flow.TYPE_UNKNOWN, host_id, 0, host_node, host_port, src_node, src_port, list()))

	    if(len(del_links) > 0):
		server.send_msg_to_client(conn, LinksDel(del_links))
		for link in del_links:
		    print "Deleting link: " + str(link.src_node.id) + ":" + str(link.src_port) + " -> " + str(link.dst_node.id) + ":" + str(link.dst_port)
	    if(len(add_linkspecs) > 0):
		server.send_msg_to_client(conn, LinksAdd(add_linkspecs))
		for link in add_linkspecs:
		    print "Adding link: " + str(link.src_node.id) + ":" + str(link.src_port) + " -> " + str(link.dst_node.id) + ":" + str(link.dst_port)
	    if(len(del_flows) > 0):
		server.send_msg_to_client(conn, FlowsDel(del_flows))
		for flow in del_flows:
		    print "Deleting flow " + str(flow.flow_id) + ": " + str(flow.src_node.id) + ":" + str(flow.src_port) + " -> " + str(flow.dst_node.id) + ":" + str(flow.dst_port)
	    if(len(add_flows) > 0):
		server.send_msg_to_client(conn, FlowsAdd(add_flows))
		for flow in add_flows:
		    print "Adding flow " + str(flow.flow_id) + ": " + str(flow.src_node.id) + ":" + str(flow.src_port) + " -> " + str(flow.dst_node.id) + ":" + str(flow.dst_port)

	reactor.callLater(POLL_INTERVAL, lambda: update_rtrs(conn))
	return


    # when the gui connects, tell it about the modules and nodes
    def new_conn_callback(conn):
	# read in router information
	try:
	    f = open('routers.txt', 'r')
	except IOError:
	    print "Could not open routers.txt for reading!"
	    return
	lines = f.readlines()
	f.close()
	rtr_re = re.compile("(\S+)\s+(\d+)")

	for line in lines:
	    res = rtr_re.search(line)
	    if res is not None:
		rtr = Router(res.group(1), res.group(2))
		print "Parsed router " + res.group(1) + ":" + res.group(2) + ", dpid " + str(ip_to_dpid(rtr.routerID))
		if rtr is not None:
		    rtrs.append(rtr)

	# Get updates the first time (do it 2 times! to get flow info)
	for r in rtrs:
	    print "Updating router " + r.routerID
	    r.checkLinkStatus()
	    r.updateNeighbors()
	    r.getStats()
	time.sleep(2)
	for r in rtrs:
	    r.checkLinkStatus()
	    r.updateNeighbors()
	    r.getStats()

	#draw the router nodes first
        nodes = []
	for r in rtrs:
	    print "Drawing router " + r.routerID
	    nodes.append(Node(Node.TYPE_OPENFLOW_SWITCH, ip_to_dpid(r.routerID)))
	if(len(nodes) > 0):
	    server.send_msg_to_client(conn, NodesAdd(nodes))

	# read in host information
	# draw hosts and links
	try:
	    f = open('hosts.txt', 'r')
	except IOError:
	    print "Could not open hosts.txt for reading!"
	    return
	lines = f.readlines()
	f.close()
	hosts_list = []
	host_linkspecs = []
	host_re = re.compile("(\d+\.\d+\.\d+\.\d+)\s+(\d+\.\d+\.\d+\.\d+)")
	for line in lines:
	    res = host_re.search(line)
	    if res is not None:
		host_ip = res.group(1)
		src_node = Node(Node.TYPE_HOST, ip_to_dpid(host_ip))
		src_port = 0
		rtr_ip = res.group(2)
		hosts.append(Host(host_ip, rtr_ip))
		print "Drawing node and flows for host " + host_ip
		(dst_dpid, dst_port) = get_host_nbr(rtr_ip)
		if(dst_dpid > 0 and dst_port >= 0):
		    host_linkspecs.append(LinkSpec(Link.TYPE_WIRE, src_node, src_port, Node(Node.TYPE_OPENFLOW_SWITCH, dst_dpid), dst_port, GIGABIT))
		    host_linkspecs.append(LinkSpec(Link.TYPE_WIRE, Node(Node.TYPE_OPENFLOW_SWITCH, dst_dpid), dst_port, src_node, src_port, GIGABIT))
		    print host_ip + ":" + str(src_port) + " -> " + rtr_ip + ":" + str(dst_port)
		    print rtr_ip + ":" + str(dst_port) + " -> " + host_ip + ":" + str(src_port)
	if(len(hosts) > 0):
	    for h in hosts:
		hosts_list.append(Node(Node.TYPE_HOST, ip_to_dpid(h.ip)))
	    server.send_msg_to_client(conn, NodesAdd(hosts_list))
	if(len(host_linkspecs) > 0):
	    server.send_msg_to_client(conn, LinksAdd(host_linkspecs))

	#draw the router links
	for r in rtrs:
	    print "Drawing links and flows for router " + r.routerID
	    linkspecs = []
	    flows = []
	    src_node = Node(Node.TYPE_OPENFLOW_SWITCH, ip_to_dpid(r.routerID))
	    for i in r.interfaces:
		print "\tInterface : " + i.name
		if(i.isLinkUp() and (len(i.neighbors) > 0)):
		    print "\t\tLink is up : neighbor " + i.neighbors[0].getNeighborID()
		    src_port = get_port(i.name)
		    dst_node = Node(Node.TYPE_OPENFLOW_SWITCH, ip_to_dpid(i.neighbors[0].getNeighborID()))
		    dst_port = get_nbr_iface(i.neighbors[0])
		    print "\t\tdst_port = " + str(dst_port)
		    if(dst_port >= 0):
			print r.routerID + ":" + str(src_port) + " -> " + i.neighbors[0].getNeighborID() + ":" + str(dst_port)
			linkspecs.append(LinkSpec(Link.TYPE_WIRE, src_node, src_port, dst_node, dst_port, GIGABIT))
			if(i.haveChangedStatsOUT()):
			    xput = int(i.getStatsChangeOUT()*8/(1000*POLL_INTERVAL))
			    flow = Flow(Flow.TYPE_UNKNOWN, ip_to_dpid(i.ip), xput, src_node, src_port, dst_node, dst_port, list())
			    flows.append(flow)
			    print "Adding flow " + str(flow.flow_id) + ": " + str(flow.src_node.id) + ":" + str(flow.src_port) + " -> " + str(flow.dst_node.id) + ":" + str(flow.dst_port)
	    if(len(linkspecs) > 0):
		server.send_msg_to_client(conn, LinksAdd(linkspecs))
	    if(len(flows) > 0):
		server.send_msg_to_client(conn, FlowsAdd(flows))

	#thread.start_new_thread(update_rtrs, (conn,))
	reactor.callLater(0, lambda: update_rtrs(conn))

    #server = LTTwistedServer(MPFR_PROTOCOL, print_ltm, new_conn_callback, close_conn_callback)
    server = LTTwistedServer(MPFR_PROTOCOL, receive_ltm, new_conn_callback, close_conn_callback)
    server.listen(OFG_DEFAULT_PORT)
    reactor.run()