Errores en Mario Kart WFC (94030) - Cagada de Nintendo (detalles y solución)

Muchos hemos oido de gente con problemas al conectar a WFC con Mario Kart. En concreto, es típico que a la tercera carrera de un error 94030 y se desconecte. Pasa solo con ciertos (muchos) routers, y las soluciones generalmente son cambiar de router o actualizar el firmware, etc. Supongo que la mayoría pensamos que es la conexión a internet o el router que tiene fallos.

NO

El problema radica en un bug, o mas bien una omisión muy importante en el código de red del Mario Kart y de aparentemente otros (puede que todos) los juegos WFC. No se puede solucionar desde los servidores (a no ser que tengan un metodo de parchear el juego via online o algo similar), y no se me ocurre como a los programadores se les ha olvidado / la han cagado de esta forma.

Yo llevaba una semana con el Mario Kart, con los problemas de marras. Ni una sola vez habia conseguido acabar las 4 carreras al jugar online. Ni una. Entonces saqué el packet sniffer y me puse a investigar.

Descripción sencilla:
En una red Ethernet o WiFi, las maquinas tiene una dirección MAC fija y (por lo general) inalterable. Para comunicarse con la maquina que tenga cierta IP, preguntan quien la tiene, y ese host debe contestar con su MAC.

La DS no lo hace. Repetid conmigo: la DS se salta a la torera un requerimiento muy importante de los estandares de TCP/IP y Ethernet. No es una chorrada ni un bug pequeño, es que directamente no implementa una parte importantísima.

Esto lo podeis comprobar haciendo ping a la DS. En lugar del típico error de tiempo de espera agotado, os dará error de ruta al host - como si hicierais ping a un host en la red local que no existiera - porque el PC no sabe a quien enviar el ping si no obtiene respuesta a las peticiones.

La perdida de conexión se produce a la tercera carrera porque los routers al parecer "olvidan" estas direcciones cada cierto tiempo, supongo que por motivos de optimización, para mantener las tablas limpias. El router obtiene la asignacion IP->MAC cuando la DS se conecta porque la DS en sí le pide la MAC al router (y este de paso guarda la de la DS), pero mas adelante cuando las borra, pregunta de nuevo y no obtiene respuesta. Se pierde la comunicación, la DS envia pero no recibe nada porque el router no sabe quien es la DS.

Esto no tiene nada que ver con DHCP por cierto. Con el 3CRADSL72 DHCP no funciona (es el que tengo yo), pero esto sí que es por un bug en el router (no envía las respuestas DHCP correctamente, y las envia en broadcast y a velocidad de 11Mbps aunque la DS le haya dicho lo contrario, y como la DS tiene un maximo de 2Mbps, pues no rula.) Pero esto se puede evitar simplemente poniendole IP fija.

Descripción tecnica:
La DS no responde a las peticiones ARP. Los routers hacen una limpieza de la caché de mapeos IP->MAC (tabla ARP) de vez en cuando, y cuando esto ocurre la DS no contesta a las nuevas peticiones, y el router no sabe a quien enviarle los paquetes.

Workaround / medio solucion:
He hecho un programita para Linux que responde a las peticiones de ARP del router simulando ser la DS, para que el router pueda comunicarse con ella correctamente. Lo podeis bajar aqui (:
http://marcansoft.com/subidos/dsarp.c
Tendreis que compilarlo y ejecutarlo como root (usa raw sockets para simular ser la DS, y eso no va como usuario normal). Los parametros son la interfaz de red, la MAC de la DS, y la IP de la DS. Si alguien puede/quiere portarlo a Windows que lo haga, y así podra mas gente evitar los problemas. Usa las librerias PCAP, que tienen versión windows, pero la sección de generar el paquete ARP habrá que reescribirla para Win. Y creo que el XP no soportaba RAW sockets por "seguridad", asi que puede que haya que instalar algun driver que lo desbloquee.

para compilar, asi:
gcc -o dsarp dsarp.c -lpcap

Por supuesto hay que usarlo en la misma red en la que esta la DS. He comprobado que funciona: hoy es el primer dia que he acabado las 4 carreras.
Impresionante!

Muchas gracias por la solución temporal. Ojalá Nintendo lo solucione con una actualización o algo.

Por cierto, yo uso Mac. Tengo que probar si puedo compilar y hacer funcionar el parche.

Cinco estrellas para tí ;)

Edito: Probado en Mac. Resulta que no va, no lo puedo compilar. La librería if_packet.h no la encuentra.

El código del compilador es:

powerbook-g4-15-de-cees:~/Desktop cees$ gcc -o dasrp dsarp.c -lpcap
dsarp.c:12:31: error: netinet/if_packet.h: No such file or directory
dsarp.c: In function 'main_loop':
dsarp.c:127: error: dereferencing pointer to incomplete type
dsarp.c:127: error: 'ETH_P_ARP' undeclared (first use in this function)
dsarp.c:127: error: (Each undeclared identifier is reported only once
dsarp.c:127: error: for each function it appears in.)
dsarp.c:128: error: invalid use of undefined type 'struct ethhdr'
dsarp.c:130: error: dereferencing pointer to incomplete type
dsarp.c:131: error: dereferencing pointer to incomplete type
dsarp.c:132: error: 'ETH_P_IP' undeclared (first use in this function)
dsarp.c:148: error: invalid application of 'sizeof' to incomplete type 'struct ethhdr'
dsarp.c:151: error: invalid use of undefined type 'struct ethhdr'
dsarp.c:153: error: storage size of 'socket_address' isn't known
dsarp.c:154: error: storage size of 'ifr' isn't known
dsarp.c:157: warning: incompatible implicit declaration of built-in function 'memset'
dsarp.c:159: warning: incompatible implicit declaration of built-in function 'memcpy'
dsarp.c:159: error: dereferencing pointer to incomplete type
dsarp.c:160: error: dereferencing pointer to incomplete type
dsarp.c:161: error: dereferencing pointer to incomplete type
dsarp.c:172: error: 'PF_PACKET' undeclared (first use in this function)
dsarp.c:175: error: 'PACKET_HOST' undeclared (first use in this function)
dsarp.c:176: error: 'ETH_ALEN' undeclared (first use in this function)
dsarp.c:183: error: 'ETH_P_ALL' undeclared (first use in this function)
dsarp.c:189: warning: incompatible implicit declaration of built-in function 'strcpy'
dsarp.c:190: error: 'SIOCGIFINDEX' undeclared (first use in this function)


Como ves, la librería if_packet.h no existe (no tengo esa carpeta en gcc).

¿Qué hacemos?
a mi mas que con el mario kart me pasa con el Mertroid me pone todos los rivales se han ido o yo me caido pero muchas veces y es algo que no puede ser xq que se vayan los 4 rivales a la vez y que yo me caiga siempre antes de empezar las partidas y en el MK y AC no me pase.... es muy extraño
asi que muy pocas veces puedo jugar en mundial con el Metroid
Bueno, he añadido la librería que faltaba, pero parece que no va.

El error que da el compilador es este:

In file included from dsarp.c:12:
/usr/include/netinet/if_packet.h:33: error: parse error before '__SOCKADDR_COMMON'
/usr/include/netinet/if_packet.h:36: error: parse error before '}' token
dsarp.c: In function 'main_loop':
dsarp.c:127: error: dereferencing pointer to incomplete type
dsarp.c:127: error: 'ETH_P_ARP' undeclared (first use in this function)
dsarp.c:127: error: (Each undeclared identifier is reported only once
dsarp.c:127: error: for each function it appears in.)
dsarp.c:128: error: invalid use of undefined type 'struct ethhdr'
dsarp.c:130: error: dereferencing pointer to incomplete type
dsarp.c:131: error: dereferencing pointer to incomplete type
dsarp.c:132: error: 'ETH_P_IP' undeclared (first use in this function)
dsarp.c:148: error: invalid application of 'sizeof' to incomplete type 'struct ethhdr'
dsarp.c:151: error: invalid use of undefined type 'struct ethhdr'
dsarp.c:153: error: storage size of 'socket_address' isn't known
dsarp.c:154: error: storage size of 'ifr' isn't known
dsarp.c:157: warning: incompatible implicit declaration of built-in function 'memset'
dsarp.c:159: warning: incompatible implicit declaration of built-in function 'memcpy'
dsarp.c:159: error: dereferencing pointer to incomplete type
dsarp.c:160: error: dereferencing pointer to incomplete type
dsarp.c:161: error: dereferencing pointer to incomplete type
dsarp.c:172: error: 'PF_PACKET' undeclared (first use in this function)
dsarp.c:175: error: 'PACKET_HOST' undeclared (first use in this function)
dsarp.c:176: error: 'ETH_ALEN' undeclared (first use in this function)
dsarp.c:183: error: 'ETH_P_ALL' undeclared (first use in this function)
dsarp.c:189: warning: incompatible implicit declaration of built-in function 'strcpy'
dsarp.c:190: error: 'SIOCGIFINDEX' undeclared (first use in this function)


¿Alguna idea?
Normal, if_packet es el sistema de los raw sockets de linux, que creo que no es estandar posix asi que nanai en OSX. Tendré que mirar como se hace en OSX.

Las pcap si las tienes no?

edit: mirate esto. Al menos comprueba si tienes una versión compatible del kernel, o si necesitas parchearlo. http://slagheap.net/etherspoof/. Desde luego spoofear las MAC es necesario (al menos para que parezca que sea la DS... igual el router se lo traga de todas formas, pero ya dependera del modelo)
Voy a probar.

Por cierto, las pcap sí las tengo :)

Edito:

Según la web que me has dado,

OS X 10.4.x (Darwin 8.x) kernel sources appear to require no modification in order to spoof MAC addresses.


Por lo que en teoría, me debería funcionar sin modificar (uso Mac OS X Tiger - 10.4.6 -). Así que me voy a curar en salud y no voy a parchear el kernel :D

Parece que la cosa está chunga en BSD por una serie de protecciones que lleva. Claro, te confías con tener un sistema muy seguro y luego pasan estas cosas :Ð
Que conste que el programita este lo he escrito esta nocha estando un poquito hasta las narices de problema, y sin dormir, asi que no he investigado cual es la manera mas portable de hacerlo X-D

Esta tarde miro como van las aplicaciones conocidas (nmap etc), y lo hago de la misma forma.
eso que tu dices nunca deberia pasar, puesto que cada vez que el router reciba un paquete de la DS refresca su tabla de arp y se reinicia el contador de timeout.
Por tanto, en medio de una carrera, estas transmitiendo datos continuamente y nunca podria expirar esa entrada de la tabla de arp...

Edito y añado: los tiempos estandar de timeout de arp son de 5 y 3 minutos, por si alguien tenia curiosidad.

Vuelvo a editar: la DS responde perfectamente a pings, asi que yo que tu revisaria la configuracion de tu router. Lo mismo tienes activado el AP isolation, que separa tu red Ethernet de tu red Wi-Fi.

Me parecia muy extraño lo que contabas asi que estado cacharreando y aqui tienes el proceso por si tenias dudas:

0) Conecto al Wi-Fi con la DS con el juego Mario Kart

1) Miro en la config de mi router a ver que ip le habia asignado a mi DS y veo que es la 192.168.1.110 asi que hago en mi pc:

melildorn:Mis Documentos$ arp -a

Interfaz: 192.168.1.100 --- 0x10003
Dirección IP Dirección física Tipo
192.168.1.1 00-14-bf-XX-XX-XX dinámico


por tanto mi pc no conoce la MAC de la nintendo DS. La unica entrada de la tabla ARP es la del router con la IP 192.168.1.1

2) Hago ping a la direccion de la DS que he visto en el router:

melildorn:Mis Documentos$ ping 192.168.1.110

Haciendo ping a 192.168.1.110 con 32 bytes de datos:

Respuesta desde 192.168.1.110: bytes=32 tiempo=82ms TTL=128
Respuesta desde 192.168.1.110: bytes=32 tiempo=7ms TTL=128
Respuesta desde 192.168.1.110: bytes=32 tiempo=5ms TTL=128
Respuesta desde 192.168.1.110: bytes=32 tiempo=7ms TTL=128

Estadísticas de ping para 192.168.1.110:
Paquetes: enviados = 4, recibidos = 4, perdidos = 0
(0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
Mínimo = 5ms, Máximo = 82ms, Media = 25ms


Vemos que el ping responde perfectamente (resolucion de ARP correcta) y que ademas el tiempo del primer ping es mayor puesto que se ha tenido que hacer una resolucion ARP, y en las siguientes esa direccion ya esta en cache.

3) Justo despues del ping compruebo que se ha resuelto correctamente la peticion de ARP y que ha quedado guardada en cache

melildorn:Mis Documentos$ arp -a

Interfaz: 192.168.1.100 --- 0x10003
Dirección IP Dirección física Tipo
192.168.1.1 00-14-bf-XX-XX-XX dinámico
192.168.1.110 00-16-56-XX-XX-XX dinámico
melildorn:Mis Documentos$



Nota: he sustituido los numeros reales por XX porque no quiero dejar aqui la mac de mi pc y de mi consola ;)

Siento quitarte la ilusion de descubrir un bug gordo de Nintendo, pero te aseguro que las (buenas) compañias realizan muchas pruebas a su software antes de sacarlo. Un bug tan gordo hubiera hecho que muchisimas conexiones wifi fallaran y se hubiera notado a la legua antes de distribuir el cartucho. Entonces ¿como es que falla en tu caso? pues necesitaria muchos mas datos:
- como tienes configurado el router
- si estas cargandolo mucho mientras intentas jugar online: cerrar la mula es vital porque gasta mucha ram de los routers y casi todos los routers que venden para el mercado domestico son una autentica basura en cuanto hardware
- si tu lite esta flasheada
- si usas un mk original o un backup
...

cualquier pista podria ayudarnos a solucionarlo, aunque a priori yo me inclino por un problema de configuracion del router como causa mas probable.

Un saludo y que consigas jugar online pronto.
Si esto soluciona realmente el problema para algunos, tal vez podríais enviárselo a Nintendo y tal vez haga algo al respecto.
fr0d0b0ls0n escribió:Si esto soluciona realmente el problema para algunos, tal vez podríais enviárselo a Nintendo y tal vez haga algo al respecto.


veo que no te has leido mi contestacion que aclara que NO EXISTE TAL BUG de Nintendo...

a ver si siendo mas conciso se lo lee alguien y os enterais :-p
chesko escribió:eso que tu dices nunca deberia pasar, puesto que cada vez que el router reciba un paquete de la DS refresca su tabla de arp y se reinicia el contador de timeout.
Por tanto, en medio de una carrera, estas transmitiendo datos continuamente y nunca podria expirar esa entrada de la tabla de arp...

Edito y añado: los tiempos estandar de timeout de arp son de 5 y 3 minutos, por si alguien tenia curiosidad.

Es cierto que el router hace una tontería al borrar las entradas ARP, pero la DS tiene que contestar de todas formas.

chesko escribió:Vuelvo a editar: la DS responde perfectamente a pings, asi que yo que tu revisaria la configuracion de tu router. Lo mismo tienes activado el AP isolation, que separa tu red Ethernet de tu red Wi-Fi.

A mi no me contesta, y te aseguro de que con todo lo demás hay comunicación correcta entre WiFi y Ethernet.

marcansoft:~$ ping 192.168.3.185
PING 192.168.3.185 (192.168.3.185) 56(84) bytes of data.
From 192.168.3.170 icmp_seq=2 Destination Host Unreachable
From 192.168.3.170 icmp_seq=3 Destination Host Unreachable
From 192.168.3.170 icmp_seq=4 Destination Host Unreachable


Si miro con el Ethereal, tanto en la red Ethernet como en la red WiFi (usando una tarjeta WiFi en modo monitor) aparecen peticiones ARP de mi PC, sin respuesta. Han sido enviadas a 2Mbps, asi que la DS no tiene excusa para no contestar (tiene que recibirlos correctamente).

chesko escribió:Me parecia muy extraño lo que contabas asi que estado cacharreando y aqui tienes el proceso por si tenias dudas:

[.......]


Ese mismo procedimiento he seguido yo innumerables veces, con los resultados que te he comentado: Destination Host Unreachable, sin respuestas ARP, y con la tabla arp solo con la dirección del router logicamente. Yo uso IP fija (192.168.3.185).

chesko escribió:Siento quitarte la ilusion de descubrir un bug gordo de Nintendo, pero te aseguro que las (buenas) compañias realizan muchas pruebas a su software antes de sacarlo. Un bug tan gordo hubiera hecho que muchisimas conexiones wifi fallaran y se hubiera notado a la legua antes de distribuir el cartucho.

Eso no explica mis problemas, que desde luego me parecen apuntar directamente a la DS como culpable. Además la prueba de que el problema es que el router no recibe los ARP de la DS, o la DS no los envía (mas probable, porque mi tarjeta wifi en monitor tampoco los recibe), es que mi programa soluciona el problema perfectamente. Te recuerdo que esto nos ha pasado a mucha gente, hay unos threads grandes en los foros de nintendo, y les pasa a todos los usuarios de los routers Ya.com en muchas o todas las versiones de su firmware, o al menos eso tengo entendido.

Y antes de que menciones la recepción WiFi, te aseguro que todos los paquetes ARP se transmiten a 2Mbps (mi router tiene la manía de no hacerlo con las respuestas DHCP y petan por eso, pero todo lo demás se envía correctamente a 2Mbps, comprobado por la tarjeta wifi que los recibe a esa velocidad. Si necesitas packet logs demostrándolo, los tengo)

Por cierto, con el PC puedo hacer ping a la DS perfectamente si abro el test de las librerias WiFi homebrew de sgstair. Responde a los ARPs perfectamente. Sin embargo el Mario Kart no lo hace, con la misma configuración.

chesko escribió:Entonces ¿como es que falla en tu caso? pues necesitaria muchos mas datos:
- como tienes configurado el router

Router 3com Wireless 11g 3CRADSL72 de Ya.com, con el firmware del SMC Barricade (comprobado por muchos que va mucho mejor que el orignal. Ambos routers tienen el mismo hardware, y el software esta basado en el mismo sistema, pero el de SMC va mejor).
He probado muchas configuraciones distintas:
Modo WiFi: 11b solo, 11g+b long range, 11g+b, etc.
Velocidad he probado 11Mbps, 2Mbps, y 1Mbps.
G Nitro: en general Off, pero probé On porque alguien dijo que podía ayudar (nada)
Mi red interna es 192.168.3.x/255.255.255.0. La IP del router es 192.168.3.1, y la de la DS es 192.168.3.185. El PC tiene 192.168.3.170.
No tengo puertos abiertos hacia la DS, porque evidentemente no es necesario, ya que funciona sin ellos. Uso WEP, pero hay mucha gente que ha probado quitandolo y es inutil (y no me hace mucha gracia quitar WEP).
chesko escribió:- si estas cargandolo mucho mientras intentas jugar online: cerrar la mula es vital porque gasta mucha ram de los routers y casi todos los routers que venden para el mercado domestico son una autentica basura en cuanto hardware

En realidad, casi todos los routers que venden son una autentica basura en cuanto a software. El 3CRADSL72 tiene un hardware muy bueno y RAM de sobra, pero el software es una mierda. Pero eso no importa, porque lo unico que tengo usando internet en el PC mientras juego es el IRC. Nada de emule ni torrent, etc. La linea de uso de red en el minigrafico en mi PC se mantiene al cero de lo poco que recibe/envia.
chesko escribió:- si tu lite esta flasheada

Si, lo está. Pero estos problemas ya los daba sin flashearla. Cuando la compré probé el mario kart (original claro), y daba los mismos problemas. Voy a pedirle una DS original, sin flashear, a un amigo, y hago las pruebas de nuevo para asegurarme.
chesko escribió:- si usas un mk original o un backup

Ahora mismo backup, pero como te digo el original da los mismos problemas. Lo voy a confirmar mañana, pero que conste que jugué varios dias con el de mi amigo antes de comprarme la mia, y daba los mismos problemas (tampoco conseguí acabar las 4 carreras, nunca).

chesko escribió:cualquier pista podria ayudarnos a solucionarlo, aunque a priori yo me inclino por un problema de configuracion del router como causa mas probable.

Cuando le pasa a muchísima gente, con varios routers totalmente distintos, y nadie ha encontrado solución excepto cambiar firmwares y similar? (que lo unico que hace sera eliminar el borrado de la tabla ARP en algunas versiones, y por eso funciona, supongo)

chesko escribió:Un saludo y que consigas jugar online pronto.

Ya juego online perfectamente, gracias a mi programa ;) (no te parece eso prueba suficiente de que el problema está con los ARPs?)

chesko escribió:
veo que no te has leido mi contestacion que aclara que NO EXISTE TAL BUG de Nintendo...

a ver si siendo mas conciso se lo lee alguien y os enterais :-p

Que rapido sacas conclusiones no? No se como explicas entonces que los WiFi de los routers vayan bien con todos los dispositivos menos la DS, y que claramente en las capturas se vea que no envia los ARPs. Claro que a ti te funciona perfectamente - eso solo demuestra que no esta totalmente cagada, y que en algunos casos funciona bien. Pero todavía no hay pruebas de que sea asi en todos los casos, o de que el problema sea el router.

Que conste que no descarto todavía que puedan ser los routers y la DS sea inocente, pero hasta ahora todas mis pruebas indican lo contrario. Las tuyas no indican nada, solo que en algunos casos ambos la DS y el router/pc van bien.

Voy a montar un router wifi que tengo de otra marca, y voy a hacer mas pruebas con otras DS (sin flashear y con el juego orignal).

Acabo de probar con DHCP, por cierto (usando un servidor en el PC para evitar el problema del DHCP del router, que como te digo es una cosa totalmente aparte). Puedo hacer ping a la DS porque mi PC ha cacheado el ARP de la petición DHCP, pero si limpio la tabla ARP, ya no puedo hacer ping.
Jul 14 03:11:41 marcansoft dhcpd: DHCPDISCOVER from 00:16:56:42:42:ba via eth0
Jul 14 03:11:41 marcansoft dhcpd: DHCPOFFER on 192.168.3.250 to 00:16:56:42:42:ba (NintendoDS) via eth0
Jul 14 03:11:41 marcansoft dhcpd: DHCPREQUEST for 192.168.3.250 (192.168.3.170) from 00:16:56:42:42:ba (NintendoDS) via eth0
Jul 14 03:11:41 marcansoft dhcpd: DHCPACK on 192.168.3.250 to 00:16:56:42:42:ba (NintendoDS) via eth0

# ping 192.168.3.250
PING 192.168.3.250 (192.168.3.250) 56(84) bytes of data.
64 bytes from 192.168.3.250: icmp_seq=1 ttl=128 time=3.95 ms
64 bytes from 192.168.3.250: icmp_seq=2 ttl=128 time=3.51 ms
64 bytes from 192.168.3.250: icmp_seq=3 ttl=128 time=3.29 ms
64 bytes from 192.168.3.250: icmp_seq=4 ttl=128 time=3.51 ms
64 bytes from 192.168.3.250: icmp_seq=5 ttl=128 time=4.15 ms

--- 192.168.3.250 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4001ms
rtt min/avg/max/mdev = 3.298/3.686/4.158/0.323 ms
# arp
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.3.1              ether   00:0E:6A:C7:FA:08   C                     eth0
192.168.3.250            ether   00:16:56:42:42:BA   C                     eth0
# arp -d 192.168.3.250
# arp
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.3.1              ether   00:0E:6A:C7:FA:08   C                     eth0
192.168.3.250                    (incomplete)                              eth0
# ping 192.168.3.250
PING 192.168.3.250 (192.168.3.250) 56(84) bytes of data.
From 192.168.3.170 icmp_seq=1 Destination Host Unreachable
From 192.168.3.170 icmp_seq=2 Destination Host Unreachable
From 192.168.3.170 icmp_seq=3 Destination Host Unreachable

Nota: hacer arp -d no significa "matar para siempre" esa entrada ARP, sino borrarla y dejar que se vueva a buscar. Si lo hago con el router (192.168.3.1) segundos despues vuelve a aparecer por las conexiones que hay existentes que fuerzan que se vuelva a resolver. Con la DS no va.
pues entonces solo se me ocurren dos causas posibles:

1) que sea problema con algunos modelos de router por algun motivo aun por descubrir
2) que haya diferentes versiones del mario kart en el mercado, unas con bug y otras con el bug corregido.

Lo que no puede ser es que el mismo programa unas veces responda a las peticiones arp y otras no. Yo he probado con un mk original prestado por un amigo en mi lite sin flashear. Si alguien colabora (pues yo todavia no tengo ningun aparato de carga/grabacion de backups) podriamos hacer un dump del cartucho original que estoy usando y probarlo con tu router. Con esto averiguariamos si hay diferentes versiones de mk circulando y aparte podriamos inclinarnos mas por echar la culpa al router o al mario kart.

Otra solucion posible es que ya que usas un firmware hackeado para tu router, pedirle al que lo ha desarrollado que te pase una version con un timeout de arp modificado para que sea mas largo de lo habitual, por ejemplo, 10 minutos.

De todas formas vuelvo a repetir lo primero que dije: mientras a tu router le lleguen paquetes de la DS nunca deberia borrarla de la tabla de arp. Borrar la entrada cuando deberias renovarla al recibir ratos tambien es un comportamiento no estandar de la pila de protocolos.

Otra cosa que podria influir es que si es un backup y la consola esta flasehada, todos los que usen el mismo flash y el mismo dump que tu de la rom del mario kart, tienen el mismo numero de serie de consola y el mismo numero de serie de mk. Puede que nintendo detecte este hecho, y tire periodicamente a todos los usuarios online que coincidan. Con "tire" me refiero a que puede que tengan medios para enviar comandos a tu DS y que esta deje de tener el comportamiento normal de la pila de protocolos, provocando tu caida (por ejemplo).
Muy interesante, sí señor.

Ahora me doy cuenta de que no era una desconexión casual lo del MK.
¡ Qué curioso ! También me ocurría siempre en la tercera carrera y yo pensando que era algo casual... Pues igual que yo seguro que hay mucha más gente.

Luego encima, veo que el router mío también es el 3Com de Ya.com... vaya, vaya....

Es un tema muy interesante para investigar, espero que sigáis con las pruebas.

Creo que los dos tenéis algo de razón,es cuestión de ir haciendo pruebas....

marcansoft ha conseguido algo importante, que es resolver el problema, lo cual dice mucho de la causa, aunque no del origem (NDS o router).

chesko tiene mucha razón cuando dice que "mientras a tu router le lleguen paquetes de la DS nunca deberia borrarla de la tabla de arp. Borrar la entrada cuando deberias renovarla al recibir ratos tambien es un comportamiento no estandar de la pila de protocolos".

Sería interesante saber si alguien tiene estos problemas con otros routers.

Un saludo.
seria bueno ir haciendo estadisticas de a quien le falla y a quien no, si os parece bien podiamos ir poniendolo en este hilo con los siguientes datos:

- Funciona: si o no
- Marca y modelo de router
- Mario Kart utilizado: original o backup
- Consola utilizada: normal, lite y flasheada o no.

Asi seria mas facil encontrar al culpable.

Empiezo yo:

- Funciona: bien
- Router: Linksys WRT54GL flasheado con HyperWRT G Thibor15c (Linux)
- MK: original
- Consola: lite sin flashear
- Net Config: 192.168.1.0/24. El router es la .1 y las ips asignadas por DHCP a mis equipos van de la .100 a la .149
- AP Config: Velocidad auto, modo mixto (11g y 11b), Burst Rate activado, cifrado WEP 128 BITS con filtrado de MAC.
No se si mi ejemplo será valido o no, porque me conecto a traves de un AP y IP forwarding...

- Funciona: bien
- Router: ¿iptables?
- MK: original
- Consola: lite sin flashear

Marcan, si quieres en la Euskal (creo que eres el mismo del foro de la euskal) probamos con mi Mario Kart y mi DS, asi podemos descartar que sea un problema de diferentes versiones... Eso si, llevate el router si puedes.
Hola,

- Funciona: mal (siempre se bloquea con el error en la 3a. carrera)
- Router : 3com Wireless 11g de Ya.com (Soft-1.07Y) (ADSL modem version = 04.01.02.00A)
- MK: Backup
- Consola: DS Tocha flasheada y DS Lite flasheada.

Un saludo.
Pongo mis datos:

- Funciona: bien (usando Firmware Version: v1.02.00)
- Router: Linksys WAG54G-EU V2
- MK: original
- Consola: nintendo DS original

P.d. Si no actualizas el firmware, la nintendo DS no encuentra el punto de acceso.
- Funciona: cuelgues alrededor de la 3ra o principio de la 4a carrera.
- Router: 3com 3CRADSL72 de Ya.com. No funciona desde el PC tampoco (usandolo de bridge). Firm SMC 0.85, ADSL 13.9.38
- MK: Backup, aunque juraría que también pasaba en el original. Probaré un original en cuanto lo consiga (lo tiene prestado un amigo)
- Consola: Lite Flasheada. De nuevo juraría que también pasaba con la Lite sin flashear y el MK original. Sin probar en una tocha, aunque lo haré. FlashMe v7 con soporte Lite.

Propongo también que pongamos la configuración del sistema resumida:
- Net Config: net 192.168.3.0/24, Router .1, DS .185
- AP Config: 2Mbps 11b WEP

nota: lo de 192.168.3.0/24 es una abreviación de decir /255.255.255.0 (la mascara de red expresada en numero de bits se puede abreviar. 255.0.0.0 seria /8, 255.255.0.0 /16, etc). La dirección de la red siempre es la .0 (o .0.0, etc), en el 99% de los casos.

Si tenemos mas configs probadas ponedlas tambien.
- Config: net 192.168.3.0/24, Router .1, DS DHCP(.250 asignada), 2Mbps, 11b, WEP
- AP Config: 11Mbps 11b+g WEP
- Notas config: el DHCP del 3CRADSL72 no funciona por un fallo del router - el DHCP que he usado lo servía el PC.

El firmware del SMC no es hackeado, simplemente es el firmware de otro modelo que tiene el mismo hardware. Lo unico que tiene de "hackeado" es que se le cambia el ID para que lo acepte. Eso si, tengo un proyectito algo muerto pero que pienso revivir, de meterle linux a este router. Puede que ayude a clarificar algo.

Para los que usen routers con firmware GPL (Linksys WRT54G me viene a la cabeza), en teoría tiene que ser facil editarlo para ampliar el timeout arp, o meter una entrada ARP forzada en la tabla.

OnekO, si, soy el de la Euskal. Lo probaremos. Evidentemente no podemos probar con el router como router (no tenemos ADSL en la euskal), pero si como punto de acceso WiFi, que para el caso da igual porque he comprobado que con el PC haciendo peticiones ARP tampoco va.

Ahora mismo voy a sacar un router/AP 3com OfficeConnect (router Ethernet+AP, sin ADSL), y voy a probar a ver si pasa lo mismo.

En cuanto al 3com de Ya.com, alguien comentaba que con el ultimo firmware oficial de 3com se arreglaba, con las opciones correctas. Yo paso de cambiarlo que para todo lo demás me va muy bien el SMC, y con mi programa ya no tengo el problema. Supongo que la unica diferencia será que el otro firmware no tiene el timeout del ARP tan corto, aunque igual un dia lo pongo para probar a ver que pasa realmente.

Bien, acabo de probar el 3com 3CRWE50194, que es un router-AP sin ADSL, en modo bridge (ignorando la funcion router). El hardware de este router es totalmente distinto al del 3CRADSL72, que yo sepa. (vamos, la CPU es del mismo fabricante, pero ahi acaban las similtudes).

De entrada, deciros que da el mismo fallo. Asi que directamente:

- Funciona: cuelgues alrededor de la 3ra o principio de la 4a carrera.
- Router: 3com 3CRADSL72 de Ya.com. No funciona desde el PC tampoco (usandolo de bridge). Firm SMC 0.85, ADSL 13.9.38
- AP Wifi: 3com 3CRWE50194, bridge con el 3CRADSL72
- MK: Backup
- Consola: Lite Flasheada.
- Net Config: net 192.168.3.0/24, Router .1, DS .185
- AP Config: 11Mbps 11b OPEN

He hecho capturas de paquetes desde el PC, con la DS conectandose a ambos routers, y el resultado es el mismo. Las capturas estan filtradas para que solo se vea lo interesante, no todo el trafico que va al PC. Las podeis ver con Ethereal/Wireshark, o otro programa que soporte capturas en formato pcap. Son capturas del Ethernet del PC, no del WiFi (eso sera lo siguiente).

Captura 1: El PC tiene la tabla de ARP limpia. El PC esta intentando hacer ping a la DS, y por tanto hace peticiones ARP constantes. En ese momento la DS se conecta a WFC via el 3CRADSL72.
Captura
Vemos como primero el PC pregunta por la DS. La DS al conectarse primero envia un ARP gratuito (una petición de la dirección de si misma, con lo que realmente es un regalo a los demás diciendo eh, yo soy esta y me da igual quien me pida). En ese momento el PC comienza a hacer pings a la dirección que acaba de obtener, pero la DS no contesta (por ahora). La DS hace unos ARPs al router como parte de su proceso de conexión, y hace los test de conexión y autenticación (no se ve en esta captura desde el PC). Entonces la DS hace un ARP al PC (el cual contesta), obtiene su dirección, y empieza a responder a los pings del PC. (estamos en la pantalla de selección de modo, ya dentro del WFC). Notese que en ningun momento ha contestado la DS al ARP del PC, sino que simplemente ha regalado su dirección al principio (cosa que hace sea pedida o no), pero no ha hecho ninguna contestación directa. Entonces, yo limpio la tabla ARP del PC. Se puede ver como los pings se pierden y comienzan los ARPs de nuevo por parte del PC. La DS se queda callada, y el PC no puede hacer ping. Fin de la captura.

Captura 2: El PC tiene la tabla de ARP limpia. El PC esta intentando hacer ping a la DS, y por tanto hace peticiones ARP constantes. En ese momento la DS se conecta a WFC via el 3CRWE50194.
Captura
Resultados: exactamente los mismos que en el anterior. Sin embargo, en este caso, intento reanimar la conexion. Despues de borrar la tabla de ARP al final, la DS magicamente envia una respuesta ARP! ¿como ha ocurrido esto? Muy facil. He entrado en la pantalla de busqueda de jugadores, y he desenchufado el ethernet del router. La ruedecita se queda parada en la DS, y cuando lo vuelvo a enchufar ¡envia el ARP que necesitamos! (y sigue funcionando). El PC reanuda los pings, y luego el proceso lo repito un par de veces para asegurarme (borrar ARP, desenchufar, enchufar). Esto demuestra que la DS es capaz de enviar respuestas ARPs, pero en algunos casos (casi siempre en mi caso), no los envia. Causar una pérdida forzada de paquetes hace que se envien los ARPs temporalmente, en mi caso.

Captura 3: Continuación de captura 2, ya en juego. No se ven los datos de juego, solo los broadcasts a la red puesto que la captura es desde el PC y esto es una red switched.
Captura
Este es un ejemplo de como falla la DS al comunicarse con el router en medio de la tercera carrera, visto desde el punto de vista del PC (que no ve los datos DS<->router, sino solo los datos genericos como los ARPs que van broadcast). Proximamente saco la captura WiFi que si incluye todo.
La captura empieza desde el principio de la primera carrera, pero el primer paquete (marcado como el paquete en tiempo 0 en este caso), es una petición ARP que hace el router a la DS ya empezada la tercera carrera. La DS no contesta, aunque por ahora la comunicación continua (el router quizas todavia no ha borrado la entrada correspondiente de la tabla ARP). Despues vienen mas, y despues uno al PC (el cual contesta. Tambien es signo de que el router ha limpiado TODOS los ARP). Poco despues, el router vuelve a preguntar a la DS, sin que ella conteste. Al final, se desata un torrente de peticiones ARP, ya que el router ha perdido la entrada y hace una por cada paquete entrante de los servidores dirigido a la DS. La DS los ignora, y se cuelga la partida. Desenchufar y enchufar el Ethernet no ayuda.

Luego saco las capturas WiFi para tener mas datos.

Sobre lo de que Nintendo nos tire, yo voy a probar con un original pronto. En teoría flashearla no debería cambiar el numero de serie ni nada, aunque el juego por supuesto si está preparado puede detectar el firmware cambiado. Pero aun asi, creo que MKDS salió antes que FlashMe, asi que la unica opción de Nintendo sería hacerlo via codigo de parcheo online (no se si será posible), no creo que hayan previsto esto antes de que se hiciera.

Aun asi, tengo un dump del firmware original al completo (soy previsor), asi que puedo restaurarlo si lo necesito.
Interesante hilo.

En mi caso, cuando empezé a jugar al MK, sufría las famosas desconexiones, con juego original y consola sin flashear.

Puse la IP fija a la DS y a partir de ahí, no he tenido ningún problema...
para los de ya.com mirad lo que comentan por este hilo:
http://elotrolado.net/showthread.php?s=&threadid=581133

(no, si al final va a ser del router... me pareceria lamentable que un router no funcione correctamente con ciertos equipos)
Con ese router (3CRADSL72), como ya comento tiene un fallo que hace que envie las respuestas DHCP a la DS a 11mbps (debido a la unión de DOS fallos del router, que conjuntamente causan esto). Forzarle a menos de 2mbps evidentemente es posible que arregle esto, pero el problema de las ARP continua, y lo del DHCP tiene una solución mucho mas sencilla que es usar IP fija. Y como digo, lo de los ARP falla tambien con el OTRO router de AP, asi que o yo tengo muy mala suerte y ambos routers distintos van mal, o es un problema mas bien de la DS. Lo de los 2mbps es un problema comun en muchos routers que solo son testeados con dispositivos que soportan hasta 11mbps, como la mayoría, pero esto es totalmente separado al problema de los cuelgues en la tercera partida del MKDS. Los ARP, al menos tal y como los recibe mi tarjeta sniffer, llegan a 2mbps, asi que ese no es el problema.

Fase 3: voy a wardrivear un poquito, a ver si me enchufo al vecino, y pruebo que tal va el MKDS.
[qmparto][qmparto][qmparto][qmparto][qmparto]

La fase 3 es un buen metodo para probar que tal va con otros modelos de routers xDDDDDD
Me pregunto por qué sólo funciona mal con el mk.
Con el tetris ds y el metroid va perfecto.
Voy a probar lo de la IP fija a ver qué tal.

Por cierto, lo de Ya.com, como el resto, no olvidéis que es "hasta 20 megas" o "hasta "4 megas"..... Los que van por la red propia YA.com ( albura) lo tienen chungo, porque tiene mucha saturación. Los que utilizan la red de telefónica (Rima) irán mejor, pero no tienen el servicio de "hasta 20 megas" ni el de "hasta 4 megas", sólo "hasta 1 o 2 megas"


Un saludo.
22 respuestas