Exemplo n.º 1
0
class System(object):
    def __init__(self, listen_port, path):

        self._controller_listen_port = listen_port
        # Root directory of the controller
        self._sys_root = os.path.dirname(os.path.abspath(__file__))
        # Load system configuration
        self._system_conf = self._sys_root + "/" + path
        self._federazione = None
        self._customers = None
        self._dp_to_customer = {
        }  # chiave :(id datapath, ingress_port) valore: customer
        self._controller = None

        # Create parser object
        self._parser = Parser(self._controller_listen_port)

    def load_system_configuration(self):
        # Start parser
        self._parser.load(self._system_conf)
        self._federazione = self._parser.get_federazione()
        self._customers = self._parser.get_customers()
        self._controller = self._parser.get_controller()

    def get_controller_info(self):
        return self._controller

    def init(self, public_to_private_a, public_to_private_b):

        server = Server(self._controller_listen_port,
                        self._controller.get_ip(), self._controller,
                        public_to_private_a, public_to_private_b)
        eventlet.spawn(server.run)

    def add_node(self, datapath, ip):
        print "Controller : " + self._controller.get_name(
        ) + " ip: " + self._controller.get_ip(
        ) + " Pool ip pubblici: " + self._controller.get_public_subnet(
        ).__str__()
        for customer in self._controller.get_customers():
            # Identifico il datapath tramite l'ip
            if customer.get_ip_datapath() == ip:
                customer.set_datapath(datapath)
                self._dp_to_customer[datapath.id,
                                     customer.get_ingress_port()] = customer
                # print "Aggiunto datapath id: " + str(
                # datapath.id) + " ip: " + ip + " porta di ingresso: " + customer.get_ingress_port() + " al customer: " + customer.get_name()

        print "Federation: "
        print self._federazione
        print "Customer: "
        print self._customers
        #   print self._dp_to_customer
        #Ask ce MAC address to send DNS queries--->Habib
        cs = self._controller.get_customers()
        #print '-------cs-------' ,cs[0]
        # print 'ofproto', cs[0].get_datapath()
        if cs[0].get_ns_domain_name() is None:
            self.send_arp_request(cs[0].get_datapath(), cs[0].get_next_hop(),
                                  cs[0].get_ingress_port())
        else:
            self.send_arp_request(cs[0].get_datapath(), cs[0].get_next_hop(),
                                  cs[0].get_ingress_port())
            self.send_arp_request(cs[0].get_datapath(), cs[0].get_router(),
                                  cs[0].get_out_port())

    def handle_packet(self, pkt, dpid, in_port, data, datapath,
                      public_to_private_a, public_to_private_b):
        fph = FactoryPacketHandler.get_instance()
        handler = fph.create_handler(pkt, self._dp_to_customer, in_port, data,
                                     datapath, self._controller,
                                     self._federazione, public_to_private_a,
                                     public_to_private_b)
        # print '@@@@@@@@@@@@@@@@@@@@@@@ Handler', type(handler)
        handler.handle_packet()

    #Send arp request to get MAC for DNS packets --->Habib
    def send_arp_request(self, datapath, dstip, port):
        #Controller sends the DNS packet to destination name server via controller by creating a DNS query
        new_pkt = packet.Packet()
        new_pkt.add_protocol(
            ethernet.ethernet(ethertype=ether.ETH_TYPE_ARP,
                              src='9f:ff:ff:ff:ff:ff',
                              dst='ff:ff:ff:ff:ff:ff'))
        new_pkt.add_protocol(
            arp.arp(hwtype=1,
                    proto=0x800,
                    hlen=6,
                    plen=4,
                    opcode=arp.ARP_REQUEST,
                    src_mac='9f:ff:ff:ff:ff:ff',
                    dst_mac='ff:ff:ff:ff:ff:ff',
                    src_ip=self._controller.get_ip(),
                    dst_ip=dstip))
        self.send_arp_packet(datapath, new_pkt, port)

    #Send the DNS packet to the destination name server
    def send_arp_packet(self, datapath, pkt, port):
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser
        pkt.serialize()
        data = pkt.data
        actions = [parser.OFPActionOutput(port=int(port))]
        out = datapath.ofproto_parser.OFPPacketOut(
            datapath=datapath,
            buffer_id=ofproto.OFP_NO_BUFFER,
            in_port=datapath.ofproto.OFPP_CONTROLLER,
            actions=actions,
            data=data)
        datapath.send_msg(out)