Logiciels Libres et Systèmes Embarqués

Référence du fichier global.h

#include "lwip/tcp.h"
#include "config.h"
#include "netif/xemacliteif.h"

Aller au code source de ce fichier.


Fonctions

void print (char *ptr)
 Fonction d'affichage d'une chaine de caractères sur stdin (généralement le port série).
void xil_printf (const char *ctrl1,...)
 Fonction d'affichage avancée sur stdin (généralement le port série).
void putnum (unsigned int num)
 Fonction d'affichage d'un nombre hexadécimal sur stdin (généralement le port série).
int main (void)
 Exemple d'utilisation de lwIP avec l'API raw.
int lwip_init (void)
 Initialise la pile TCP/IP de lwIP.
netif * lwip_config (const unsigned char mac[6], const unsigned char ip[4], const unsigned char subnet[4], const unsigned char gateway[4])
 Configure l'interface réseau de lwIP.
int server_init (short int port)
 Initialise notre serveur.
err_t server_accept (void *arg, struct tcp_pcb *pcb, err_t err)
 Fonction d'acceptation de connexion.
err_t server_recv (void *arg, struct tcp_pcb *pcb, struct pbuf *pbuf, err_t err)
 Fonction appelée lors de la réception de données.
err_t server_sent (void *arg, struct tcp_pcb *pcb, u16_t len)
 Fonction appelée lors de l'acquittement des données émises.
void server_err (void *arg, err_t err)
 Fonction appelée lors d'une erreur.
int client_init (const unsigned char remote_ip[4], short int remote_port)
 Initialise notre client.
err_t client_connected (void *arg, struct tcp_pcb *pcb, err_t err)
 Fonction appelée lorsqu'une connexion à été établie.
err_t client_sent (void *arg, struct tcp_pcb *pcb, u16_t len)
 Fonction appelée lors de l'acquittement des données émises.
err_t client_poll (void *arg, struct tcp_pcb *pcb)
 Fonction appelée régulièrement pour envoyé des données.
void client_err (void *arg, err_t err)
 Fonction appelée lors d'une erreur.
err_t client_recv (void *arg, struct tcp_pcb *pcb, struct pbuf *pbuf, err_t err)
 Fonction appelée lors de la réception de données.
void run (struct netif *netif)
 Fonction principale de l'application.
void print_err (err_t err)
 Affiche sur stdin, de manière lisible, une erreur.

Variables

XEmacLiteIf_Config XEmacLiteIf_ConfigTable []
 Configuration des interfaces réseaux du FPGA (généré par EDK dans le fichier xemac_g.h).

Documentation des fonctions

err_t client_connected ( void *  arg,
struct tcp_pcb *  pcb,
err_t  err 
)

Fonction appelée lorsqu'une connexion à été établie.

Cette fonction effectue les opérations suivantes :

  • enregistre auprès de lwIP le callback client_recv() qui sera appelé à chaque fois que le client recevra des données.
  • amorce le timer qui appelera le callback client_poll() qui sera appelé toutes les POLL_INTERVAL secondes.
Renvoie:
ERR_OK en cas de succès, sinon le code d'erreur.

Définition à la ligne 5 du fichier client_connected.c.

Références client_poll(), client_recv(), POLL_INTERVAL, et print().

Référencé par client_init().

void client_err ( void *  arg,
err_t  err 
)

Fonction appelée lors d'une erreur.

Cette fonction fait simplement appel à print_err().

Paramètres:
arg pointeur sur nos données personnelles.
err erreur qui s'est produite.

Définition à la ligne 3 du fichier client_err.c.

Références print(), et print_err().

Référencé par client_init().

int client_init ( const unsigned char  remote_ip[4],
short int  remote_port 
)

Initialise notre client.

Cette fonction effectue les opérations suivantes :

  • alloue un bloc de contrôle TCP pour lwIP.
  • enregistre auprès de lwIP le pointeur de client_close qui sera passée en tant que paramètre arg à toutes nos fonctions callback du serveur.
  • enregistre auprès de lwIP le callback client_err() qui sera appelé à chaque fois qu'une erreur se produit.
  • initialise la connexion et enregistre le callback client_connected() qui sera appelé lorsque la connexion sera établie.
Paramètres:
remote_ip adresse du serveur sur lequel se connecter.
remote_port numéro de port du serveur sur lequel se connecter.
Renvoie:
-1 en cas d'erreur, 0 sinon.

Définition à la ligne 9 du fichier client_init.c.

Références client_close, client_connected(), client_err(), et print().

Référencé par main().

err_t client_poll ( void *  arg,
struct tcp_pcb *  pcb 
)

Fonction appelée régulièrement pour envoyé des données.

Cette fonction effectue les opérations suivantes :

  • initialise un paquet.
  • enregistre le nom de l'entreprise "SMP" dans la charge du paquet.
  • envoie le paquet.
  • enregistre auprès de lwIP le callback client_sent() qui sera appelé lorsque les données émise seront acquittées.
  • libère la mémoire de ce paquet (le contenu est copier dans l'appel à tcp_write, cf le troisème paramètre).
  • en fontion de la configuration, ferme la connexion.
Renvoie:
ERR_OK en cas de succès, sinon le code d'erreur.

Définition à la ligne 6 du fichier client_poll.c.

Références client_close, et client_sent().

Référencé par client_connected().

err_t client_recv ( void *  arg,
struct tcp_pcb *  pcb,
struct pbuf *  pbuf,
err_t  err 
)

Fonction appelée lors de la réception de données.

Cette fonction effectue les opérations suivantes :

  • affiche le nombre de données reçues.
  • enregistre auprès de LwIP le nombre de données reçues.
  • libère le paquet reçu.
Renvoie:
ERR_OK en cas de succès, sinon le code d'erreur.

Définition à la ligne 5 du fichier client_recv.c.

Références print(), et putnum().

Référencé par client_connected().

err_t client_sent ( void *  arg,
struct tcp_pcb *  pcb,
u16_t  len 
)

Fonction appelée lors de l'acquittement des données émises.

Cette fonction ne fait qu'afficher sur stdin le nombre d'octets envoyé avec succès.

Paramètres:
arg pointeur sur nos données personnelles.
pcb pointeur sur le PCB de la connexion.
len taille des données émises correctement.
Renvoie:
ERR_OK en cas de succès, sinon le code d'erreur.

Définition à la ligne 5 du fichier client_sent.c.

Références print(), et putnum().

Référencé par client_poll().

struct netif* lwip_config ( const unsigned char  mac[6],
const unsigned char  ip[4],
const unsigned char  subnet[4],
const unsigned char  gateway[4] 
)

Configure l'interface réseau de lwIP.

Cette fonction effectue les opérations suivantes :

  • enregistre l'adresse MAC auprès du pilote, cette fonction fait partie du portage de la pile lwIP par Xilinx.
  • configure l'interface réseau et initialise le périphérique grâce au callback xemacif_init(), ce dernier faisant partie du portage Xilinx de lwIP. Le callback ip_input() est une fonction fournie par lwIP, permettant de traiter les paquets IP entrants.
  • configure notre interface réseau comme étant celle par défaut.
Paramètres:
mac adresse MAC de l'interface réseau.
ip adresse IP du FPGA.
subnet adresse de sous réseau.
gateway adresse de la passerelle.
Renvoie:
NULL en cas d'erreur, sinon un pointeur sur la structure représentant notre interface réseau.

Définition à la ligne 7 du fichier lwip_config.c.

Références EMAC, loopif_init(), print(), et XEmacLiteIf_ConfigTable.

Référencé par main().

int lwip_init ( void   ) 

Initialise la pile TCP/IP de lwIP.

Cette fonction effectue les opérations suivantes :

  • initialise la couche "system architecture", cette dernière fourni les systèmes de sémaphores et de messages à la pile lwIP. Dans notre cas (Virtex2Pro) cette fonction ne fait rien puisque c'est la couche Xilinx (XMK) qui s'en occupe. Nous gardons cet appel par soucis de portabilité.
  • initialise le gestionnaire de mémoire dynamique, ce dernier fourni les fonctions mem_malloc(), mem_free(), mem_realloc() pour le fonctionnement de lwIP
  • initialise le gestionnaire de mémoire dynamique, ce dernier est spécifique aux protocoles réseaux gérés par lwIP.
  • initialise le gestionnaire de paquets. ce dernier s'occupe des paquets IP entrants et sortants.
  • initialise la couche d'abstraction des interfaces réseaux, cette dernière permet d'associe une adresses IP, un masque de sous-réseau, une adresse de passerelle, ... , à une interface réseaux.
  • initialise la couche TCP. cette dernière est une implémentation de la fameuse pile TCP/IP.
Renvoie:
toujours 0, étant donné qu'aucune fonction d'initialisation de lwIP ne renvoie de code d'erreur.

Définition à la ligne 8 du fichier lwip_init.c.

Référencé par main().

int main ( void   ) 

Exemple d'utilisation de lwIP avec l'API raw.

Cette fonction effectue les opérations suivantes :

  • active les caches d'instructions et de données pour la plage d'adresse [0, 0x7FFFFFF].
  • initialise la pile TCP/IP de lwIP.
  • configure l'interface réseau de lwIP.
  • initialise notre serveur et/ou notre client.
  • lance la fonction principale : run().
Renvoie:
-1 en cas d'erreur, 0 sinon.

Définition à la ligne 5 du fichier main.c.

Références client_init(), LOCAL_GATEWAY, LOCAL_IP, LOCAL_MAC, LOCAL_PORT, LOCAL_SUBNET, lwip_config(), lwip_init(), print(), REMOTE_IP, REMOTE_PORT, run(), server_init(), et xil_printf().

void print ( char *  ptr  ) 

Fonction d'affichage d'une chaine de caractères sur stdin (généralement le port série).

On retrouve cette fonction dans le fichier standalone_v1_00_a/src/print.c

Référencé par client_connected(), client_err(), client_init(), client_recv(), client_sent(), lwip_config(), main(), print_err(), run(), server_err(), server_init(), server_recv(), et server_sent().

void print_err ( err_t  err  ) 

Affiche sur stdin, de manière lisible, une erreur.

Paramètres:
err erreur à afficher.

Définition à la ligne 4 du fichier print_err.c.

Références print().

Référencé par client_err(), et server_err().

void putnum ( unsigned int  num  ) 

Fonction d'affichage d'un nombre hexadécimal sur stdin (généralement le port série).

On retrouve cette fonction dans le fichier standalone_v1_00_a/src/putnum.c

Référencé par client_recv(), client_sent(), server_recv(), et server_sent().

void run ( struct netif *  netif  ) 

Fonction principale de l'application.

Il s'agit de la fonction la plus compliquée de l'application, alors des explications semblent les bienvenues...

Pour que la pile TCP/IP de lwIP fonctionne, il faut appeler certaines fonctions périodiquement. Nous avons utilisé le timer interne au PPC pour effectuer ces appels périodiques, grâce aux fonctions XTime_SetTime() et XTime_GetTime() qui, respectivment, met à jour et lit la valeur du Time Base Register. Ce dernier est sur 64 bits et est incrémenté de 1 à chaque coup d'horloge.

Ainsi, nous pouvons (devons) appeler la fonction tcp_tmr() toutes les 100 milli-secondes et la fonction etharp_tmr() toutes les 10 secondes. Dans les autres "périodes", nous faisons appel à la fonction xemacif_input() afin que lwIP puisse lire les trames Ethernet entrant sur l'interface réseau.

Paramètres:
netif interface réseau où lire les trames Eternet.
Note:
TCP_TMR_INTERVAL est la période (en milli-seconde) à laquelle tcp_tmr() doit être appelée.

ARP_TMR_INTERVAL est la période (en milli-seconde) à laquelle etharp_tmr() doit être appelée. Nous avons fait l'hypothèse qu'elle est plus grande que TCP_TMR_INTERVAL.

Définition à la ligne 11 du fichier run.c.

Références print().

Référencé par main().

err_t server_accept ( void *  arg,
struct tcp_pcb *  pcb,
err_t  err 
)

Fonction d'acceptation de connexion.

Cette fonction enregistre simplement auprès de lwIP le callback server_recv() qui sera appelé lors de la reception de données.

Paramètres:
arg pointeur sur nos données personnelles.
pcb pointeur sur le PCB de la connexion.
err ERR_OK s'il n'y à pas eu de problème avant l'acceptation de la connexion.
Renvoie:
ERR_OK en cas de succès, sinon le code d'erreur.

Définition à la ligne 6 du fichier server_accept.c.

Références server_recv().

Référencé par server_init().

void server_err ( void *  arg,
err_t  err 
)

Fonction appelée lors d'une erreur.

Cette fonction fait simplement appel à print_err().

Paramètres:
arg pointeur sur nos données personnelles.
err erreur qui s'est produite.

Définition à la ligne 3 du fichier server_err.c.

Références print(), et print_err().

Référencé par server_init().

int server_init ( short int  port  ) 

Initialise notre serveur.

Cette fonction effectue les opérations suivantes :

  • alloue un bloc de contrôle TCP pour lwIP.
  • enregistre auprès de lwIP le pointeur de server_close qui sera passée en tant que paramètre arg à toutes nos fonctions callback du serveur.
  • enregistre auprès de lwIP le callback server_err() qui sera appelé à chaque fois qu'une erreur se produit.
  • initialise le port de connexion.
  • place le port dans l'état d'écoute.
  • enregistre auprès de lwIP le callback server_accept() qui sera appelé à chaque acceptation de connexion, à partir de ce moment nous sommes capable d'accepter les connexions entrantes.
Paramètres:
port port TCP d'écoute du serveur.
Renvoie:
-1 en cas d'erreur, 0 sinon.
Note:
PCB signifie Protocol Control Block, il s'agit d'une structure opaque utilisée par lwIP.

Définition à la ligne 9 du fichier server_init.c.

Références print(), server_accept(), server_close, et server_err().

Référencé par main().

err_t server_recv ( void *  arg,
struct tcp_pcb *  pcb,
struct pbuf *  pbuf,
err_t  err 
)

Fonction appelée lors de la réception de données.

Cette fonction effectue les opérations suivantes :

  • si la liste des paquets n'est pas vide (i.e. pbuf != NULL), nous renvoyons simplement les données reçues (uniquement celles du premier paquet).
  • enregistre auprès de LwIP le nombre de données reçues.
  • enregiste le callback server_sent() qui sera appelé lorsque les données émise seront acquittées.
  • en fonction de la configuration, nous fermons la connexion, mais le serveur sera alors à nouveau en état d'écoute sur le port, près à accepter un nouvelle connexion.
Paramètres:
arg pointeur sur nos données personnelles.
pcb pointeur sur le PCB de la connexion.
pbuf pointeur sue la liste chainée des paquets reçus.
err ERR_OK s'il n'y à pas eu de problème avant l'acceptation de la connexion.
Renvoie:
ERR_OK en cas de succès, sinon le code d'erreur.

Définition à la ligne 5 du fichier server_recv.c.

Références print(), putnum(), server_close, et server_sent().

Référencé par server_accept().

err_t server_sent ( void *  arg,
struct tcp_pcb *  pcb,
u16_t  len 
)

Fonction appelée lors de l'acquittement des données émises.

Cette fonction ne fait qu'afficher sur stdin le nombre d'octets envoyé avec succès.

Paramètres:
arg pointeur sur nos données personnelles.
pcb pointeur sur le PCB de la connexion.
len taille des données émises correctement.
Renvoie:
ERR_OK en cas de succès, sinon le code d'erreur.

Définition à la ligne 5 du fichier server_sent.c.

Références print(), et putnum().

Référencé par server_recv().

void xil_printf ( const char *  ctrl1,
  ... 
)

Fonction d'affichage avancée sur stdin (généralement le port série).

On retrouve cette fonction dans le fichier standalone_v1_00_a/src/xil_printf.c

Référencé par main().


Documentation des variables

XEmacLiteIf_Config XEmacLiteIf_ConfigTable[]

Configuration des interfaces réseaux du FPGA (généré par EDK dans le fichier xemac_g.h).

On retrouve cette variable dans le fichier lwip_v1_00_a/src/contrib/ports/v2pro/netif/xemacif.c

Référencé par lwip_config().