<div dir="ltr">2008/8/21 Fernando Gont <span dir="ltr"><<a href="mailto:fernando@gont.com.ar" target="_blank">fernando@gont.com.ar</a>></span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">


<div>
<font size="3">Hola, Jorge,<br><br>
<br>
</font><div><blockquote type="cite">Concuerdo con Roque, lo
propuesto en la seccion 3.1 solo es valido para 2 de los ethertypes 
0x0800 (IPv4) e 0x86DD (IPv6).<br><br>
En el caso de otros ethertypes como 802.3, SPRITE, X.25  Segun el
documento ¿ se deberia descartar el paquete , aun cuando se esta
encapsulando adecuadamente sobre otro tipo de link layer
?</blockquote><br></div>
mmmm.... no entiendo.<br><br>
El planteo es el siguiente:<br>
Si un frame ethernet llega a un host, y su payload se le pasa al modulo
de IPv4, es porque el Ehertype del paquete Ethernet era 0x0800.<br>
Este valor de  Ethertype indica que el payload del paquete Ethernet
contiene un paquete IP.<br><br>
Si el Ethertype es 0x0800, pero lo que se encapsula es en realidad un
paquete IPv6, esto es una error, ya que en tal caso el Ethertype deberia
haber sido 0X86DD, y *no* 0x0800.<br><br>
Del mismo modo, si un modulo IPv6 llegara a "procesar" un
paquete IPv4 que llego en un frame Ethernet, es porque el Ethertype fue
0x86DD, en vez de 0x0800, que es el que verdaderamente correspondia. Por
tal motivo, esta es una condicion de error.<br><br>
Se entiende el argumento?<br><br>
Saludos cordiales, y gracias por el feedback!<div><br>
<p>
<font size="3">--<br>
Fernando Gont<br>
e-mail: <a href="mailto:fernando@gont.com.ar" target="_blank">fernando@gont.com.ar</a> || <a href="mailto:fgont@acm.org" target="_blank">fgont@acm.org</a><br>
PGP Fingerprint: 7809 84F5 322E 45C7 F1C9 3945 96EE A9EF D076
FFF1<br><br>
<br><br>
</font></p></div></div>

<br>_______________________________________________<br>
Seguridad mailing list<br>
<a href="mailto:Seguridad@lacnic.net" target="_blank">Seguridad@lacnic.net</a><br>
<a href="https://mail.lacnic.net/mailman/listinfo/seguridad" target="_blank">https://mail.lacnic.net/mailman/listinfo/seguridad</a><br>
<br></blockquote></div><br>Hola Fernando,<br><br>Respondiendome a mi mismo y aclarando mi apreciacion,<br><br>Supongamos el caso comun de un frame ethernet obviando algunos detalles , el flujo seria (solo consideraremos el procesamiento de entrada del frame) :<br>
<br>rutina ether_input()<br>    se valida    ETHER_HDR_LEN<br>    se valida    M_PKTHDR<br>    <br>Luego se extrae de la cabecera el ether_type <br><br>etype = ntohs(eh->ether_type);<br><br>Luego se setean algunos bits flags en caso de ser multicast,etc<br>
<br>Al finalizar la rutina se llama a  ether_demux() quien setea el isr con los NETISR apropiados para dicha mbuff.<br>   <br>case ETHERTYPE_IP    isr = NETISR_IP<br>case ETHERTYPE_ARP    isr = NETISR_ARP<br>case ETHERTYPE_IPX      isr = NETISR_IPX<br>
case ETHERTYPE_IPV6    isr = NETISR_IPV6<br>case ETHERTYPE_ATALK    isr = NETISR_ATALK1<br><br><br>Luego con el ISR seteado se despacha al network interruption software routine netisr_dispatch(isr, mbuff) , que distingue 2 casos, cuando es un NETISR_MPSAFE (casos como ipsec) se setea directamente<br>
la funcion handler apropiada segun el isr , en caso contrario se envia al  schednetisr(num).<br><br>Para los casos de NETISR_IP y NETISR_IPV6 previamente se registran las rutinas de manejo de entrada.<br><br>netisr_register(NETISR_IP, ip_input, &ipintrq, NETISR_MPSAFE);<br>
netisr_register(NETISR_IPV6, ip6_input, &ip6intrq, 0);<br><br>En ambos casos la comprobacion es simple tanto en la rutina ip_input como ip6_input :<br><br>if (ip->ip_v != IPVERSION) {<br>                ipstat.ips_badvers++;<br>
                goto bad;<br>}<br><br><br>Lo mismo ocurre para el caso de una if_ppp , en tal caso <br><br> switch (proto) {<br>#ifdef INET<br>    case PPP_IP:<br>        /*<br>         * IP packet - take off the ppp header and pass it up to IP.<br>
         */<br>        if ((ifp->if_flags & IFF_UP) == 0<br>            || sc->sc_npmode[NP_IP] != NPMODE_PASS) {<br>            /* interface is down - drop the packet. */<br>            m_freem(m);<br>            return;<br>
        }<br>        m->m_pkthdr.len -= PPP_HDRLEN;<br>        m->m_data += PPP_HDRLEN;<br>        m->m_len -= PPP_HDRLEN;<br>        if ((m = ip_fastforward(m)) == NULL)<br>            return;<br>        isr = NETISR_IP;<br>
        break;<br><br>Es decir que la rutina de interrupcion seguira siendo la registrada para NETISR_IP<br><br>En definitiva centrandonos en el caso ethernet , considerando un ethertype 0x0800 esta es manejada por la rutina registrada para NETISR_IP (en stack 4.4BSD es ip_input) valida que el campo ip_v sea correcto, por lo tanto, esa comprobacion extra no es necesaria.<br>
<br clear="all"><br>-- <br>Jorge Niedbalski R.<br>-----------------------------------------<br><br>
</div>