Logiciels Libres et Systèmes Embarqués

Interface LoopBack

Le pilote Xilinx de l'interface Ethernet n'est pas capable d'émettre vers lui-même.

Par défaut, l'interface LoopBack (le fameux 127.0.0.1) n'est pas activé dans LwIP fourni par Xilinx, nous allons donc voir comment y remédier.

Dans un premier temps, copiez le répertoire $XILINX_EDK/sw/lib/sw_services/Lwip_v2_00_a/ vers le répertoire $XILINX_EDK/sw/lib/sw_services/Lwip_v2_00_b/ , pour différentier la bibliothèque LwIP modifiée de celle d'origine.

Modifiez le fichier $XILINX_EDK/sw/lib/sw_services/Lwip_v2_00_a/src/Makefile_ppc de la manière suivante :

# NETIFFILES: Files implementing various generic network interface functions.
NETIFFILES=$(LWIPDIR)/netif/etharp.c \
	$(LWIPDIR)/netif/loopif.c

Ainsi que le fichier $XILINX_EDK/sw/lib/sw_services/Lwip_v0_00_a/src/contrib/ports/v2pro/lwipopts.h :

/* Support loop interface (127.0.0.1) */
#define LWIP_HAVE_LOOPIF		1

Pour que l'interface LoopBack fonctionne correctement, nous avons besoin de la fonction sys_timeout qui n'est malheureusement pas définie en mode RAW. Pour remédier à ce problème, il suffit de modifier le fichier $XILINX_EDK/sw/lib/sw_services/Lwip_v2_00_b/src/Lwip/src/netif/loopif.c de la manière suivante :

/**
 * workaround (patch #1779) to try to prevent bug #2595:
 * When connecting to "localhost" with the loopif interface,
 * tcp_output doesn't get the opportunity to finnish sending the
 * segment before tcp_process gets it, resulting in tcp_process
 * referencing pcb->unacked-> which still is NULL.
 * 
 * TODO: Is there still a race condition here? Leon
 */
//sys_timeout( 1, loopif_input, arg );
loopif_input(arg);

En ce qui concerne ce problème de "race-condition", nous le contournons simplement en utilisant un PCB différent entre le serveur et le client.

Enfin, il ne reste plus qu'à adapter le code pour utiliser l'interface LoopBack à la place de l'interface Xemac. Il faut alors enlever les appels de fonctions relatifs à l'ancienne interface :

//xemacif_setmac(0, (u8_t *)mac);
//xemacif_input(netif);
//etharp_tmr();

Puis configurer correctement l'interface LoobBack :

//netif = netif_add(netif, &ipaddr, &netmask, &gw, &XEmacIf_ConfigTable[0], xemacif_init,
netif = netif_add(netif, &ipaddr, &netmask, &gw, NULL, loopif_init, ip_input);

Dans l'exemple fourni, l'interface Xemac n'est pas utilisable en même temps que l'interface LoopBack, mais ce n'est uniquement pour simplifier la compréhension du code ! En effet, il est tout à fait envisageable de les utiliser en même temps à partir du moment où elles sont configurer avec des adresses IP/Mask différentes !

Il est à noter que si l'on teste cette exemple du LoopBack, il va s'arrêter automatiquement au bout d'un certain temps. En effet la file d'envoie est limiter en taille...

LoopBack sans interface Ethernet

Si l'on souhaite utiliser LwIP uniquement en LoopBack (donc sans interface Ethernet), les modifications précédentes ne suffisent pas. Il suffit alors de modifier le fichier $XILINX_EDK/sw/lib/sw_services/Lwip_v2_00_a/src/Makefile_ppc de la manière suivante :
# NETIFFILES: Files implementing various generic network interface functions.
NETIFFILES=$(LWIPDIR)/netif/loopif.c

# ARCHFILES: Archiecture specific files.
ARCHFILES=$(ARCHDIR)/lib_arch.c \
          $(ARCHDIR)/perf.c 

aller à la section suivante