datagrama, next_hop = enlace.fila.pop() assert len(datagrama) == 20, 'O tamanho mudou ao ser encaminhado' dscp, ecn, identification, flags, frag_offset, ttl, proto, \ src_addr, dst_addr, payload = read_ipv4_header(datagrama, verify_checksum=True) assert dscp == 0 and ecn == 0 and identification == 0 and flags == 0 and frag_offset == 0 and \ ttl in {63, 64} and proto == IPPROTO_TCP and src_addr=='1.2.3.4' and dst_addr==dest and \ len(payload) == 0, 'Foram alteradas informações do datagrama original' return next_hop # Testa roteador com uma única rota padrão gw = rand_ip() myip = rand_ip() rede.definir_endereco_host(myip) rede.definir_tabela_encaminhamento([ ('0.0.0.0/0', gw), ]) used_ids = set() for i in range(64): dest = rand_ip() segmento = os.urandom(random.randint(0, 1024)) rede.enviar(segmento, dest) assert len( enlace.fila ) == 1, 'Só foi enviado um datagrama, mas foi encaminhado mais de um' datagrama, next_hop = enlace.fila.pop() assert len(datagrama) == 20 + len( segmento ), 'Datagrama com tamanho %d em vez de %d. Será que você inseriu um cabeçalho fora do tamanho padrão de 20 bytes?' % ( len(datagrama), 20 + len(segmento)) dscp, ecn, identification, flags, frag_offset, ttl, proto, \
enlace.fila ) == 1, 'Só foi recebido um datagrama, mas foi encaminhado mais de um' datagrama, next_hop = enlace.fila.pop() assert len(datagrama) == 20, 'O tamanho mudou ao ser encaminhado' dscp, ecn, identification, flags, frag_offset, ttl, proto, \ src_addr, dst_addr, payload = read_ipv4_header(datagrama, verify_checksum=True) assert dscp == 0 and ecn == 0 and identification == 0 and flags == 0 and frag_offset == 0 and \ ttl in {63, 64} and proto == IPPROTO_TCP and src_addr=='1.2.3.4' and dst_addr==dest and \ len(payload) == 0, 'Foram alteradas informações do datagrama original' return next_hop # Testa roteador com uma única rota padrão gw = rand_ip() rede.definir_tabela_encaminhamento([ ('0.0.0.0/0', gw), ]) for i in range(16): next_hop = enviar_datagrama(rand_ip()) assert next_hop == gw, 'Datagrama encaminhado para next_hop incorreto' # Testa máscaras /1 for i in range(16): gw1 = rand_ip() gw2 = rand_ip() rede.definir_tabela_encaminhamento([ ('0.0.0.0/1', gw1), ('128.0.0.0/1', gw2), ]) dest = rand_ip()
import asyncio from camadaenlace import CamadaEnlaceLinux from tcp import Servidor # copie o arquivo do Trabalho 2 from ip import IP def dados_recebidos(conexao, dados): if dados == b'': conexao.fechar() else: conexao.enviar(dados) # envia de volta def conexao_aceita(conexao): conexao.registrar_recebedor( dados_recebidos) # usa esse mesmo recebedor para toda conexão aceita enlace = CamadaEnlaceLinux() rede = IP(enlace) rede.definir_endereco_host( '192.168.0.123' ) # consulte o endereço IP da sua máquina com o comando: ip addr rede.definir_tabela_encaminhamento([ ('0.0.0.0/0', '192.168.0.1' ) # consulte sua rota padrão com o comando: ip route | grep default ]) servidor = Servidor(rede, 7000) servidor.registrar_monitor_de_conexoes_aceitas(conexao_aceita) asyncio.get_event_loop().run_forever()
assert dscp == 0 and ecn == 0 and identification == 0 and flags == 0 and frag_offset == 0 and \ ttl in {63, 64} and proto == IPPROTO_TCP and src_addr=='1.2.3.4' and dst_addr==dest and \ len(payload) == 0, 'Foram alteradas informações do datagrama original' return next_hop # Testa máscaras /1 for i in range(16): gw1 = rand_ip() gw2 = rand_ip() tbl = [ ('0.0.0.0/0', gw1), ('128.0.0.0/1', gw2), ] random.shuffle(tbl) rede.definir_tabela_encaminhamento(tbl) dest = rand_ip() next_hop = enviar_datagrama(dest) first_bit = int(dest.split('.')[0]) >> 7 if first_bit == 0: assert next_hop == gw1, 'Datagrama encaminhado para next_hop incorreto' else: assert next_hop == gw2, 'Datagrama encaminhado para next_hop incorreto' # Testa máscaras variadas com rota padrão definida for j in range(8): gw1, gw2, gw3, gw4, gw5, gw6, gw7, gw8, gw9, gw10 = \ tuple(rand_ip() for i in range(10)) tbl = [ ('200.0.0.0/7', gw1), ('201.0.0.0/8', gw2),
def dados_recebidos(conexao, dados): if dados == b'': conexao.fechar() else: conexao.enviar(dados) # envia de volta def conexao_aceita(conexao): conexao.registrar_recebedor( dados_recebidos) # usa esse mesmo recebedor para toda conexão aceita linha_serial = PTY() outra_ponta = '192.168.123.1' nossa_ponta = '192.168.123.2' print('Para conectar a outra ponta da camada física, execute:') print(' sudo slattach -v -p slip {}'.format(linha_serial.pty_name)) print(' sudo ifconfig sl0 {} pointopoint {}'.format(outra_ponta, nossa_ponta)) print() print('O serviço ficará acessível no endereço {}'.format(nossa_ponta)) print() enlace = CamadaEnlace({outra_ponta: linha_serial}) rede = IP(enlace) rede.definir_endereco_host(nossa_ponta) rede.definir_tabela_encaminhamento([('0.0.0.0/0', outra_ponta)]) servidor = Servidor(rede, 7000) servidor.registrar_monitor_de_conexoes_aceitas(conexao_aceita) asyncio.get_event_loop().run_forever()