.\" -*- nroff -*- .\" Não modifique a primeira linha! Ela informa ao man que o tbl .\" é necessário. O copyright (C) desta página de man é de .\" Andi Kleen . Garante-se permissão para distribuir .\" cópias - modificadas ou não - desta página conqüanto este .\" cabeçalho seja mantido, e, se houverem modificações .\" substanciais, o autor e a data da modificação devem ser .\" acrescentados ao cabeçalho. .\" Favor enviar relatos de bugs, correções e sugestões para .\" $Id: raw.7,v 1.1 2000/10/20 13:05:11 ricardo Exp $ .TH RAW 7 "2/10/1998" "Página de Manual do Linux" "Manual do Programador Linux" .SH NOME raw, SOCK_RAW \- Sockets IPv4 raw .SH SINOPSE .B #include .br .B #include .br .BI "raw_socket = socket(PF_INET, SOCK_RAW, int " protocol ); .SH DESCRIÇÃO Sockets raw (não processados) permitem a implementação de novos protocolos sob o IPv4. Um socket raw recebe ou envia o datagrama bruto, sem incluir cabeçalhos de link. A camada IPv4 gera um cabeçalho IP ao enviar um pacote a menos que se ative a opção .B IP_HDRINCL do socket. Quando ela está habilitada, o pacote deve conter um cabeçalho IP. Um pacote IP que seja recebido terá sempre o cabeçalho IP. Apenas processos com user id efetivo de 0 ou com capacidade .B CAP_NET_RAW podem abrir sockets raw. Todos os pacotes ou erros relacionados ao número de .I protocolo especificado para o socket raw são passados para este socket. Para uma lista dos protocolos permitidos consulte o RFC 1700 e .BR getprotobyname (3). Um protocolo .B IPPROTO_RAW implica que o .B IP_HDRINCL está habilitado e recebe todos os protocolos IP. transmitir não é permitido. .TS tab(:) allbox; c s l l. Cabeçalhos IP são midificados quando enviados pelo IP_HDRINCL IP Checksum:Sempre preenchido. Source Address:Preenchido quando zero. Packet Id:Preenchido quando zero. Total Length:Sempre preenchido. .TE .PP Se for especificado .B IP_HDRINCL e o cabeçalho IP tiver um endereço de destino diferente de zero, este endereço é usado para rotear o pacote. Quando for especificado ,B MSG_DONTROUTE o endereço de destino deve apontar para uma interface local, caso contrário é feita uma consulta à tabela de roteamento, mas as rotas com gateways são ignoradas. Se não for especificado .B IP_HDRINCL as opções do cabeçalho IP podem ser ajustadas nos socker raw com .BR setsockopt (2); Ver .BR ip (7) para mais informações. No linux 2.2, todos as opções e campos de cabeçalho IP podem ser configuradas usando as opções para sockets IP. Isto significa que os sockets raw normalmente só são necessários para protocolos novos ou protocolos sem interface de usuário como o ICMP. Um pacote recebido é passado para quaisquer sockets raw que tenham sido atrelados ao seu protocolo antes de ser passado para outros handlers deste protocolo (ex. módulos de protocolo do kernel). .SH FORMATO DO ENDEREÇO Sockets raw usam a estrutura de endereço padrão .B sockaddr_in definida em .BR ip (7). O campo .B sin_port pode ser usado para especificar o número do protocolo IP, mas é ignorado pelo linux 2.2 e deve ser sempre ajustado para zero. (ver PROBLEMAS) O campo .B sin_port contém o número do protocolo de pacotes recebidos. Ver a lista de protocolos IP válidos em .B . .SH OPÇÕES DE SOCKET As opções de sockets raw podem ser ajustadas com .BR setsockopt (2) ou lidas com .BR getsockopt (2) passando-se o flag designador de família .I SOL_RAW . .TP .B ICMP_FILTER Habilita um filtro especial para sockets raw ligados ao protocolo .B IPPROTO_ICMP Cada bit deste campo designa um tipo de mensagem ICMP a ser excluída. O default é não filtrar nenhuma mensagem ICMP. .PP Além disso, todas as opções de socket .B SOL_IP .BR ip (7) válidas para sockets de datagrama são suportadas. .SH NOTAS Sockets raw fragmentam um pacote cujo tamanho total exceda o MTU da interface (veja, no entanto, a seção PROBLEMAS). Uma alternativa mais rápida e em sintonia com a rede é implementar a pesquisa do MTU do caminho na seção .B IP_PMTU_DISCOVER do .BR ip (7). Um socket raw pode ser ligado a um endereço local específico usando a chamada .BR bind (2) Caso contrário, todos os pacotes com o protocolo IP especificado são recebidos. Além disso, um socket RAW pode ser associado a um dispositivo de rede específico usando .B SO_BINDTODEVICE; Ver .BR socket (7). Um socket .B IPPROTO_RAW é transmissor apenas. Se você realmente quiser receber todos os pacotes IP use um socket .BR packet (7) com o protocolo .B ETH_P_IP . Observe que sockets packet não remontam fragmentos IP, ao contrário dos sockets raw. Se você quiser receber todos os pacotes ICMP de um socket de datagrama, é muitas vezes melhor usar .B IP_RECVERR neste socket. Ver .BR ip (7). Os sockets raw podem ler todos os protocolos IP no linux, mesmo protocolos como ICMP ou TCP, que têm um módulo de protocolo no kernel. Neste caso, os pacotes são passados tanto para o módulo do kernel e para o(s) socket(s) raw. Não se deve contar com isso em programas portáveis, porque muitas implementações de sockets em BSD têm limitações aqui. O linux nunca modifica cabeçalhos enviados pelo usuário, exceto para preencher alguns campos zerados conforme descrito em .BR IP_HDRINCL. Muitas implementações de sockets raw não se comportam assim. Os sockets RAW geralmente são pouco portáveis, devendo ser evitados em programas que se deseje portar. Os sockets raw enviados lêem o protocolo de .B sin_port; Esta capacidade foi perdida no linux 2.2. A solução é usar .B IP_HDRINCL. .SH MANUSEIO DE ERROS Erros originários da rede só são passados para o usuário quando o socket está conectado ou o flag .B IP_RECVERR está habilitado. Sockets conectados recebem apenas .B EMSGSIZE e .B EPROTO para manter a compatibilidade. Com .B IP_RECVERR todos os erros de rede são enviados para a fila de erros. .SH ERROS .TP .B EMSGSIZE O pacote é grande demais. Ou a pesquisa de MTU do caminho está habilitada (com o sinalizador .B IP_PMTU_DISCOVER ) ou o tamanho do pacote excede o máximo de 64KB permitido pelo IPv4. .TP .B EACCES O usuário tentou transmitir para um endereço de broadcast sem que o socket tivesse um flag de broadcast. .TP .B EPROTO Um mensagem ICMP chegou reportando um erro de parâmetros. .TP .B EFAULT Foi fornecido um endereço de memória inválido. .TP .B EOPNOTSUPP Um flag inválido foi passado para uma chamada de socket (como .BR MSG_OOB ). .TP .B EINVAL Argumetno inválido. .TP .B EPERM O usuário não tem permissão para abrir sockets raw. Apenas processos com user if efetivo de 0 ou o atributo .B CAP_NET_RAW podem fazer isto. .SH VERSÕES .B IP_RECVERR e .B ICMP_FILTER surgiram no linux 2.2. São extensões linux e não devem ser usadas em programas portáveis. O linux 2.0 criou alguma compatibilidade 'bug a bug' com o BSD no código dos sockets raw, que é habilitada com o flag SO_BSDCOMPAT. Isto foi retirado do 2.2. .SH PROBLEMAS Extensões transparentes de proxy não estão incluídas. Quando a opção .B IP_HDRINCL está habilitada os datagramas não serão fragmentados, e ficam limitados à interface MTU. Isto é uma limitação do linux 2.2. O ajuste do protocolo IP para envio no campo .B sin_port foi perdido no linux 2.2. O protocolo que foi atrelado a este socket ou que foi especificado na chamada inicial à .BR socket (2) é usado sempre. .SH AUTORES Esta página foi escrita por Andi Kleen. .SH "VEJA TAMBÉM" .BR ip (7), .BR socket (7), .BR recvmsg (2), .BR sendmsg (2). .PP .B RFC1191 para pesquisa do MTU do caminho. .B RFC791 e o arquivo .B para o protocolo IP. .SH TRADUZIDO POR LDP-BR em 21/08/2000. \&\fR\&\f(CWPaulo César Mendes (tradução)\fR \&\fR\&\f(CWAndré L. Fassone Canova (revisão)\fR