def _do_arp_request(self, event): arpp = event.parsed.find('arp') if not arpp: self.log.warn("Expected ARP packet wasn't ARP") return port = self._ports.get(event.port) if port is None: self.log.warn("Got ARP from non-existent port") return port.arp_table.rx_arp(arpp) if arpp.protodst not in port.ips: # This shouldn't happen since we install table entries specifically # for our own ports! self.log.warn("Got ARP with wrong IP address") return send_arp_reply(event, True) self._add_arp_entry(arpp)
def _handle_openflow_PacketIn(self, event): #def _handle_PacketIn (self, event): dpid = event.dpid inport = event.port packet = event.parsed #log.info('Pacote de '+ str(self.dpid_to_mac(dpid))) net = packet.next # Camada de rede transp = packet.next.next # Camada de transporte if not packet.parsed: log.info("Pacote not Parsed") return #if packet.type == ethernet.LLDPTYPE: #.info("Pacote LLDPTYPE") #return if isinstance(net, ipv4): #log.info("Pacote IPv4") #log.info("Evento gerado na porta ="+str(inport)) if (inport == 1 or inport == 2): #if() lista = [] for i in self.arpTableServidores: lista.append(i) if str(net.dstip) not in lista: #Faz nada return else: #if (str(transp.dstport) == '1234'): #Eventos foram gerados por hosts conectados ao swtich if str(net.dstip) in lista and str( transp.dstport) != '12320': if str( self.dpid_to_mac(dpid) ) == '00:00:00:00:00:03': # Switch onde esta os servidores S3 msg = of.ofp_flow_mod() #msg.match.dl_src = EthAddr('00:00:00:00:01:01') #msg.match.dl_dst = EthAddr('00:00:00:00:03:11') msg.match.dl_type = 0x800 msg.match.nw_src = IPAddr("10.0.0.11") msg.match.nw_dst = IPAddr(str(net.dstip)) msg.priority = 50001 #seta uma prioridade maior para regra msg.actions.append( of.ofp_action_output(port=17) ) #Nao tem ninguem conectado a essa porta event.connection.send(msg) log.info("Regra de Drop Adicionada!!" ) # Supoe que drop o pacote ''' Adiciona o IP do servidor multicast a tabela ''' lista_Portas = [] if str(net.dstip) not in self.tableIPServidores: self.tableIPServidores.append(str(net.dstip)) lista_Portas = [17] info = {str(net.dstip): lista_Portas} self.tableSwtichFluxo[str( self.dpid_to_mac(dpid) )].append( info ) #Adiciona o IP e a porta que ele esta saido na tabela de Fluxo do Switch else: log.info("IP Servidor ja registrado!!") return elif str(self.dpid_to_mac( dpid)) == '00:00:00:00:00:01': # Swithc s1 ''' Fazer as regras aqui!! ''' log.debug( "Chegou pacote do S1 para o grupo multicast") #Verificar se o swtich ja possui o fluxo requerido l = self.tableSwtichFluxo[str( self.dpid_to_mac(dpid))] k = {} for i in l: for j in i: if str(j) == str(net.dstip): k = i a = [] if len(k) != 0: a = k[str( net.dstip )] #lista de portas que estao com fluxo swtich if len(a) != 0: #Levar o fluxo para a porta entao log.debug('Switch ja possui o Fluxo') p = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip ) #Lista de portas que contem o fluxo if inport == 1: comando2 = 'ovs-ofctl mod-flows s1 priority=50002,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.2,mod_dl_dst:00:00:00:00:01:02,output:' + p + ',1' self.executaComandosOVS(comando2) a.append(1) else: comando2 = 'ovs-ofctl mod-flows s1 priority=50002,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.1,mod_dl_dst:00:00:00:00:01:01,output:' + p + ',2' self.executaComandosOVS(comando2) a.append(2) return else: log.debug('Switch ainda nao possui o Fluxo') #Trazer o fluxo para o switch #comando = 'ovs-ofctl mod-flows s3 priority=5001,dl_type=0x800,nw_src=10.0.0.11,nw_dst='+str(net.dstip)+',actions=output:11' #comando = 'ovs-ofctl mod-flows s3 priority=50001,dl_type=0x800,nw_src=10.0.0.11,nw_dst='+str(net.dstip)+',actions=output:11' #self.executaComandosOVS(comando) #p = self.retornaStringListaPortas(str(self.dpid_to_mac(dpid)),net.dstip) p = self.retornaStringListaPortas( '00:00:00:00:00:03', net.dstip ) #Lista de portas que contem o fluxo comando = 'ovs-ofctl mod-flows s3 priority=5001,dl_type=0x800,nw_src=10.0.0.11,nw_dst=' + str( net.dstip) + ',actions=output:' + p + ',11' self.executaComandosOVS(comando) l = self.tableSwtichFluxo['00:00:00:00:00:03'] k = {} for i in l: for j in i: if str(j) == str(net.dstip): k = i #log.info(k) lista_portas = k[str( net.dstip )] #lista de portas que estao com fluxo swtich lista_portas.append( 11) #Porta que vai para o S1 #Verifico de qual porta veio para fazer a rescrita de cabecalho if inport == 1: comando2 = 'ovs-ofctl mod-flows s1 priority=5001,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.1,mod_dl_dst:00:00:00:00:01:01,output:1' self.executaComandosOVS(comando2) lista_Portas = [1] info = {str(net.dstip): lista_Portas} self.tableSwtichFluxo[str( self.dpid_to_mac(dpid) )].append( info ) #Adiciona o IP e a porta que ele esta saido na tabela de Fluxo do Switch else: comando2 = 'ovs-ofctl mod-flows s1 priority=5001,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.2,mod_dl_dst:00:00:00:00:01:02,output:2' self.executaComandosOVS(comando2) lista_Portas = [2] info = {str(net.dstip): lista_Portas} self.tableSwtichFluxo[str( self.dpid_to_mac(dpid) )].append( info ) #Adiciona o IP e a porta que ele esta saido na tabela de Fluxo do Switch return #comando2 = 'ovs-ofctl mod-flows s1 priority=50010,dl_type=0x800,nw_dst='+str(net.dstip)+',actions=mod_nw_dst:10.0.0.1,mod_dl_dst:00:00:00:00:01:01,output:1' #comando3 = 'ovs-ofctl add-flow s1 priority=5001,dl_type=0x800,nw_src=10.0.0.11,tp_dst=1236,actions=mod_nw_dst:10.0.0.1,mod_dl_dst:00:00:00:00:01:01,output:1' #self.executaComandosOVS(comando2) #self.executaComandosOVS(comando3) elif str(self.dpid_to_mac( dpid)) == '00:00:00:00:00:02': #Switch s2 ''' Fazer as regras aqui!! ''' log.debug( "Chegou pacote do S2 para o grupo multicast") #Verificar se o swtich ja possui o fluxo requerido l = self.tableSwtichFluxo[str( self.dpid_to_mac(dpid))] k = {} for i in l: for j in i: if str(j) == str(net.dstip): k = i a = [] if len(k) != 0: a = k[str( net.dstip )] #lista de portas que estao com fluxo swtich if len(a) != 0: log.debug('Switch ja possui o Fluxo') #Levar o fluxo para a porta entao p = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip ) #Lista de portas que contem o fluxo if inport == 1: comando2 = 'ovs-ofctl mod-flows s2 priority=50002,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.4,mod_dl_dst:00:00:00:00:02:04,output:' + p + ',1' self.executaComandosOVS(comando2) a.append(1) else: comando2 = 'ovs-ofctl mod-flows s2 priority=50002,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.3,mod_dl_dst:00:00:00:00:02:03,output:' + p + ',2' self.executaComandosOVS(comando2) a.append(2) return else: log.debug('Switch ainda nao possui o Fluxo') #Trazer o fluxo para o switch #comando = 'ovs-ofctl mod-flows s3 priority=5001,dl_type=0x800,nw_src=10.0.0.11,nw_dst='+str(net.dstip)+',actions=output:11' #comando = 'ovs-ofctl mod-flows s3 priority=50001,dl_type=0x800,nw_src=10.0.0.11,nw_dst='+str(net.dstip)+',actions=output:11' #self.executaComandosOVS(comando) #p = self.retornaStringListaPortas(str(self.dpid_to_mac(dpid)),net.dstip) p = self.retornaStringListaPortas( '00:00:00:00:00:03', net.dstip ) #Lista de portas que contem o fluxo comando = 'ovs-ofctl mod-flows s3 priority=5001,dl_type=0x800,nw_src=10.0.0.11,nw_dst=' + str( net.dstip) + ',actions=output:' + p + ',12' self.executaComandosOVS(comando) l = self.tableSwtichFluxo['00:00:00:00:00:03'] k = {} for i in l: for j in i: if str(j) == str(net.dstip): k = i #log.info(k) lista_portas = k[str( net.dstip )] #lista de portas que estao com fluxo swtich lista_portas.append( 12) #Porta que vai para o S2 #Verifico de qual porta veio para fazer a rescrita de cabecalho if inport == 1: comando2 = 'ovs-ofctl mod-flows s2 priority=49999,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.3,mod_dl_dst:00:00:00:00:02:03,output:1' self.executaComandosOVS(comando2) lista_Portas = [1] info = {str(net.dstip): lista_Portas} self.tableSwtichFluxo[str( self.dpid_to_mac(dpid) )].append( info ) #Adiciona o IP e a porta que ele esta saido na tabela de Fluxo do Switch else: comando2 = 'ovs-ofctl mod-flows s2 priority=49999,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.4,mod_dl_dst:00:00:00:00:02:04,output:2' self.executaComandosOVS(comando2) lista_Portas = [2] info = {str(net.dstip): lista_Portas} self.tableSwtichFluxo[str( self.dpid_to_mac(dpid) )].append( info ) #Adiciona o IP e a porta que ele esta saido na tabela de Fluxo do Switch return elif str(self.dpid_to_mac( dpid)) == '00:00:00:00:00:04': #Swtich s4 ''' Fazer as regras aqui!! ''' log.debug( "Chegou pacote do S4 para o grupo multicast") #Verificar se o swtich ja possui o fluxo requerido l = self.tableSwtichFluxo[str( self.dpid_to_mac(dpid))] k = {} for i in l: for j in i: if str(j) == str(net.dstip): k = i a = [] if len(k) != 0: a = k[str( net.dstip )] #lista de portas que estao com fluxo swtich if len(a) != 0: log.debug('Switch ja possui o Fluxo') #Levar o fluxo para a porta entao p = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip ) #Lista de portas que contem o fluxo if inport == 1: comando2 = 'ovs-ofctl mod-flows s4 priority=50002,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.6,mod_dl_dst:00:00:00:00:04:06,output:' + p + ',1' self.executaComandosOVS(comando2) a.append(1) else: comando2 = 'ovs-ofctl mod-flows s4 priority=50002,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.3,mod_dl_dst:00:00:00:00:04:05,output:' + p + ',2' self.executaComandosOVS(comando2) a.append(2) return else: log.debug('Switch ainda nao possui o Fluxo') #Trazer o fluxo para o switch #comando = 'ovs-ofctl mod-flows s3 priority=5001,dl_type=0x800,nw_src=10.0.0.11,nw_dst='+str(net.dstip)+',actions=output:11' #comando = 'ovs-ofctl mod-flows s3 priority=50001,dl_type=0x800,nw_src=10.0.0.11,nw_dst='+str(net.dstip)+',actions=output:11' #self.executaComandosOVS(comando) #p = self.retornaStringListaPortas(str(self.dpid_to_mac(dpid)),net.dstip) p = self.retornaStringListaPortas( '00:00:00:00:00:03', net.dstip ) #Lista de portas que contem o fluxo comando = 'ovs-ofctl mod-flows s3 priority=5001,dl_type=0x800,nw_src=10.0.0.11,nw_dst=' + str( net.dstip) + ',actions=output:' + p + ',14' self.executaComandosOVS(comando) l = self.tableSwtichFluxo['00:00:00:00:00:03'] k = {} for i in l: for j in i: if str(j) == str(net.dstip): k = i #log.info(k) lista_portas = k[str( net.dstip )] #lista de portas que estao com fluxo swtich lista_portas.append( 14) #Porta que vai para o S4 #Verifico de qual porta veio para fazer a rescrita de cabecalho if inport == 1: comando2 = 'ovs-ofctl mod-flows s4 priority=49999,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.5,mod_dl_dst:00:00:00:00:04:05,output:1' self.executaComandosOVS(comando2) lista_Portas = [1] info = {str(net.dstip): lista_Portas} self.tableSwtichFluxo[str( self.dpid_to_mac(dpid) )].append( info ) #Adiciona o IP e a porta que ele esta saido na tabela de Fluxo do Switch else: comando2 = 'ovs-ofctl mod-flows s4 priority=49999,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.6,mod_dl_dst:00:00:00:00:04:06,output:2' self.executaComandosOVS(comando2) lista_Portas = [2] info = {str(net.dstip): lista_Portas} self.tableSwtichFluxo[str( self.dpid_to_mac(dpid) )].append( info ) #Adiciona o IP e a porta que ele esta saido na tabela de Fluxo do Switch return else: #Pedido para sair do Grupo Multicast ''' Pedido para sair do Grupo Multicast ''' log.info('IP = ' + str(net.srcip) + ' quer sair do Grupo Multicast ' + str(net.dstip)) ip_fluxo = net.dstip l = self.tableSwtichFluxo[str(self.dpid_to_mac(dpid))] k = {} for i in l: for j in i: if str(j) == str(ip_fluxo): k = i #log.info(k) t = k[ str(ip_fluxo )] #lista de portas que estao com fluxo swtich log.debug(t) if str(self.dpid_to_mac( dpid)) == '00:00:00:00:00:01': # Swithc s1 ''' Fazer as regras aqui!! ''' p = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip) #Lista de portas que contem o fluxo if len(t) == 1: #Tem somente um fluno no switch #Retiro o fluxo da porta em s3 l = self.tableSwtichFluxo['00:00:00:00:00:03'] k = {} for i in l: for j in i: if str(j) == str(ip_fluxo): k = i #log.info(k) lista_portas = k[str( ip_fluxo )] #lista de portas que estao com fluxo swtich lista_portas.remove(11) b = self.retornaStringListaPortas( '00:00:00:00:00:03', net.dstip ) #Lista de portas que contem o fluxo comando2 = 'ovs-ofctl mod-flows s3 priority=5001,dl_type=0x800,nw_src=10.0.0.11,nw_dst=' + str( net.dstip) + ',actions=output:' + b self.executaComandosOVS(comando2) del t[:] #Apaga lista de portas do fluxo no swtich else: #Retiro somente o fluxo da porta if inport == 1: l = self.tableSwtichFluxo[ '00:00:00:00:00:01'] k = {} for i in l: for j in i: if str(j) == str(ip_fluxo): k = i #log.info(k) lista_portas = k[str( ip_fluxo )] #lista de portas que estao com fluxo swtich lista_portas.remove(1) b = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip ) #Lista de portas que contem o fluxo comando2 = 'ovs-ofctl mod-flows s1 priority=49999,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.1,mod_dl_dst:00:00:00:00:01:02,output:' + b #comando2 = 'ovs-ofctl mod-flows s1 priority=49999,dl_type=0x800,nw_dst='+str(net.dstip)+',actions=output:'+b log.debug(comando2) self.executaComandosOVS(comando2) else: l = self.tableSwtichFluxo[ '00:00:00:00:00:01'] k = {} for i in l: for j in i: if str(j) == str(ip_fluxo): k = i #log.info(k) lista_portas = k[str( ip_fluxo )] #lista de portas que estao com fluxo swtich lista_portas.remove(2) b = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip ) #Lista de portas que contem o fluxo comando2 = 'ovs-ofctl mod-flows s1 priority=49999,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.1,mod_dl_dst:00:00:00:00:01:01,output:' + b #comando2 = 'ovs-ofctl mod-flows s1 priority=49999,dl_type=0x800,nw_dst='+str(net.dstip)+',actions=output:'+b log.debug(comando2) self.executaComandosOVS(comando2) return return elif str(self.dpid_to_mac( dpid)) == '00:00:00:00:00:02': # Swithc s2 ''' Fazer as regras aqui!! ''' p = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip) #Lista de portas que contem o fluxo if len(t) == 1: #Tem somente um fluno no switch #Retiro o fluxo da porta em s3 l = self.tableSwtichFluxo['00:00:00:00:00:03'] k = {} for i in l: for j in i: if str(j) == str(ip_fluxo): k = i #log.info(k) lista_portas = k[str( ip_fluxo )] #lista de portas que estao com fluxo swtich lista_portas.remove(12) b = self.retornaStringListaPortas( '00:00:00:00:00:03', net.dstip ) #Lista de portas que contem o fluxo comando2 = 'ovs-ofctl mod-flows s3 priority=5001,dl_type=0x800,nw_src=10.0.0.11,nw_dst=' + str( net.dstip) + ',actions=output:' + b self.executaComandosOVS(comando2) del t[:] #Apaga lista de portas do fluxo no swtich else: #Retiro somente o fluxo da porta if inport == 1: l = self.tableSwtichFluxo[ '00:00:00:00:00:02'] k = {} for i in l: for j in i: if str(j) == str(ip_fluxo): k = i #log.info(k) lista_portas = k[str( ip_fluxo )] #lista de portas que estao com fluxo swtich lista_portas.remove(1) b = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip ) #Lista de portas que contem o fluxo comando2 = 'ovs-ofctl mod-flows s2 priority=49999,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.4,mod_dl_dst:00:00:00:00:02:04,output:' + b #comando2 = 'ovs-ofctl mod-flows s2 priority=49999,dl_type=0x800,nw_dst='+str(net.dstip)+',actions=output:'+b self.executaComandosOVS(comando2) else: l = self.tableSwtichFluxo[ '00:00:00:00:00:02'] k = {} for i in l: for j in i: if str(j) == str(ip_fluxo): k = i #log.info(k) lista_portas = k[str( ip_fluxo )] #lista de portas que estao com fluxo swtich lista_portas.remove(2) b = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip ) #Lista de portas que contem o fluxo comando2 = 'ovs-ofctl mod-flows s2 priority=49999,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.3,mod_dl_dst:00:00:00:00:02:03,output:' + b #comando2 = 'ovs-ofctl mod-flows s2 priority=49999,dl_type=0x800,nw_dst='+str(net.dstip)+',actions=output:'+b self.executaComandosOVS(comando2) return return elif str(self.dpid_to_mac( dpid)) == '00:00:00:00:00:04': # Swithc s4 ''' Fazer as regras aqui!! ''' p = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip) #Lista de portas que contem o fluxo if len(t) == 1: #Tem somente um fluno no switch #Retiro o fluxo da porta em s3 l = self.tableSwtichFluxo['00:00:00:00:00:03'] k = {} for i in l: for j in i: if str(j) == str(ip_fluxo): k = i #log.info(k) lista_portas = k[str( ip_fluxo )] #lista de portas que estao com fluxo swtich lista_portas.remove(14) b = self.retornaStringListaPortas( '00:00:00:00:00:03', net.dstip ) #Lista de portas que contem o fluxo comando2 = 'ovs-ofctl mod-flows s3 priority=5001,dl_type=0x800,nw_src=10.0.0.11,nw_dst=' + str( net.dstip) + ',actions=output:' + b #comando2 = 'ovs-ofctl mod-flows s3 priority=49999,dl_type=0x800,nw_dst='+str(net.dstip)+',actions=output:'+b self.executaComandosOVS(comando2) del t[:] #Apaga lista de portas do fluxo no swtich else: #Retiro somente o fluxo da porta if inport == 1: l = self.tableSwtichFluxo[ '00:00:00:00:00:04'] k = {} for i in l: for j in i: if str(j) == str(ip_fluxo): k = i #log.info(k) lista_portas = k[str( ip_fluxo )] #lista de portas que estao com fluxo swtich lista_portas.remove(1) b = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip ) #Lista de portas que contem o fluxo comando2 = 'ovs-ofctl mod-flows s4 priority=49999,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.6,mod_dl_dst:00:00:00:00:04:06,output:' + b #comando2 = 'ovs-ofctl mod-flows s4 priority=49999,dl_type=0x800,nw_dst='+str(net.dstip)+',actions=output:'+b self.executaComandosOVS(comando2) else: l = self.tableSwtichFluxo[ '00:00:00:00:00:04'] k = {} for i in l: for j in i: if str(j) == str(ip_fluxo): k = i #log.info(k) lista_portas = k[str( ip_fluxo )] #lista de portas que estao com fluxo swtich lista_portas.remove(2) b = self.retornaStringListaPortas( str(self.dpid_to_mac(dpid)), net.dstip ) #Lista de portas que contem o fluxo comando2 = 'ovs-ofctl mod-flows s4 priority=49999,dl_type=0x800,nw_dst=' + str( net.dstip ) + ',actions=mod_nw_dst:10.0.0.5,mod_dl_dst:00:00:00:00:04:05,output:' + b #comando2 = 'ovs-ofctl mod-flows s4 priority=49999,dl_type=0x800,nw_dst='+str(net.dstip)+',actions=output:'+b self.executaComandosOVS(comando2) return return else: return return elif isinstance(net, arp): log.info("Protocolo ARP") mac_resp = self.arpTableServidores[str(net.protodst)] arp_helper.send_arp_reply(event, mac_resp) return else: #log.info("Aconteceu nada!!") return