self.fila = b'' def registrar_recebedor(self, callback): self.callback = callback def enviar(self, dados): self.fila += dados def rand_ip(): return '%d.%d.%d.%d' % tuple(random.randint(1, 255) for i in range(4)) next_hop = rand_ip() linha_serial = LinhaSerial() enlace = CamadaEnlace({next_hop: linha_serial}) def caso(datagrama): enlace.enviar(datagrama, next_hop) assert linha_serial.fila == b'\xc0' + datagrama + b'\xc0', 'O início e o fim do quadro devem ser delimitados com o byte 0xC0' linha_serial.fila = b'' caso(b'\x01') caso(b'\x00\x01') caso(b'ABCDEF') caso(b'\x10\x20\x30\x40\x50') caso(128 * b' ') caso(1024 * b' ') caso(1500 * b' ')
self.fila = b'' def registrar_recebedor(self, callback): self.callback = callback def enviar(self, dados): self.fila += dados def rand_ip(): return '%d.%d.%d.%d' % tuple(random.randint(1, 255) for i in range(4)) next_hop = rand_ip() linha_serial = LinhaSerial() enlace = CamadaEnlace({next_hop: linha_serial}) datagramas = [] def recebedor(datagrama): datagramas.append(datagrama) enlace.registrar_recebedor(recebedor) def caso(entrada, saida): for datum in entrada: linha_serial.callback(datum) assert datagramas == saida, 'Ao receber os dados %r pela linha serial, deveriam ter sido reconhecidos os datagramas %r, mas foram reconhecidos %r' % ( entrada, saida, datagramas)
server = Server() # Integração com as demais camadas driver = ZyboSerialDriver() linha_serial = driver.obter_porta(4) pty = driver.expor_porta_ao_linux(5) outra_ponta = '192.168.123.1' nossa_ponta = '192.168.123.2' porta_tcp = 7000 print('Conecte o RX da porta 4 com o TX da porta 5 e vice-versa.') print('Para conectar a outra ponta da camada física, execute:') print() print('sudo slattach -vLp slip {}'.format(pty.pty_name)) print('sudo ifconfig sl0 {} pointopoint {} mtu 1500'.format( outra_ponta, nossa_ponta)) print() print('Acesse o serviço com o comando: nc {} {}'.format(nossa_ponta, porta_tcp)) print() enlace = CamadaEnlace({outra_ponta: linha_serial}) rede = CamadaRede(enlace) rede.definir_endereco_host(nossa_ponta) rede.definir_tabela_encaminhamento([ ('0.0.0.0/0', outra_ponta) ]) tcp = Tcp(rede, porta_tcp) tcp.registrar_monitor_de_conexoes_aceitas(server.conexao_aceita) asyncio.get_event_loop().run_forever()
serial3 = driver.obter_porta(6) pty3 = driver.expor_porta_ao_linux(7) print() print('sudo slattach -vLp slip {}'.format(pty1.pty_name)) print('sudo slattach -vLp slip {}'.format(pty2.pty_name)) print('sudo slattach -vLp slip {}'.format(pty3.pty_name)) print() # Os endereços IP que especificamos abaixo são os endereços da outra ponta do # enlace. No caso do teste montado de acordo as mensagens acima, são os # endereços atribuídos às interface de rede do Linux. enlace = CamadaEnlace({ '192.168.123.1': serial1, '192.168.124.1': serial2, '192.168.125.1': serial3 }) rede = CamadaRede(enlace) # Este é o endereço IP do nosso roteador. Como os enlaces são ponto-a-ponto, # ele não precisa estar em uma mesma subrede que os endereços IP atribuídos # às interfaces do Linux. rede.definir_endereco_host('192.168.122.1') # A tabela de encaminhamento define através que qual enlace o nosso # roteador pode alcançar cada faixa de endereços IP. rede.definir_tabela_encaminhamento([ ('192.168.123.0/24', '192.168.123.1'), ('192.168.124.0/24', '192.168.124.1'),