             Laurent Constantin's network library (lcrzo)


            ----------------------------------------------
            |               LCRZO 's CHANGELOG           |
            ----------------------------------------------

---------------------------------------------------------------------
Version 3.08 - 08-april-2001
 ++ bugs ++
  - In virtual servers, the device was not set for socket
    information (lcrzo_sock_get_infos).

 ++ major evolutions of liblcrzo ++
    none in this version

 ++ minor evolutions of liblcrzo ++
  - In functions lcrzo_ips_init and lcrzo_eths_init, we now
    check for correct IP/Ethernet address before copying it.
  - In lcrzo_conf_route_to_host, we set the known values even
    if there is an error.
  - Creation of two functions to decide if we want virtual
    clients/servers to answer arp/rarp/ping requests :
     lcrzo_global_set_cliser_virt_answeralive
     lcrzo_global_get_cliser_virt_answeralive

 ++ major evolutions of lcrzoex ++
  - In examples 2, 3, 4 and 5, conversion functions are now used,
    to show their usage.
  - Creation of examples 173, 174 and 175 displaying informations
    about the local computer (devices, arp cache, and routing table).
  - Creation of example 176 showing header's values to use
    to reach a host.
  - Every example now shows parameters to use. This helps new users.

 ++ minor evolutions of lcrzoex ++
  - An useless space was displayed in the function lcrzoex_title_print.
  - Example 161 (IP range computing) prints "..." and the end.


---------------------------------------------------------------------
Version 3.07 - 25-march-2001
 ++ bugs ++
  - In examples 84, 108 and 168, we should _exit after sending
    an interruption request. Instead, we were continuing.

 ++ major evolutions of liblcrzo ++
  - Creation of lcrzo_file module dealing with files, file descriptors
    streams and directories. Writting and reading large data chuncks
    is now done by lcrzo (thanks Kerline Doucet).
  - Creation of functions reading a fixed size or a line from 
    an ipc or a socket :
      lcrzo_ipc_read_flow_fixed
      lcrzo_ipc_readm_flow_fixed
      lcrzo_ipc_read_flow_line
      lcrzo_ipc_readm_flow_line
      lcrzo_sock_read_fixed
      lcrzo_sock_readm_fixed
      lcrzo_sock_read_line
      lcrzo_sock_readm_line

 ++ minor evolutions of liblcrzo ++
  - The manual page is splitted in several small manpages.

 ++ major evolutions of lcrzoex ++
  - Creation of categorie A containing simple examples.

 ++ minor evolutions of lcrzoex ++
  - Creation of example 172, a simple tcp traceroute.
  - Use of lcrzo_file functions in examples 162 and 163.
 

---------------------------------------------------------------------
Version 3.06 - 11-march-2001
 ++ bugs ++
    none in this version

 ++ major evolutions of liblcrzo ++
  - Creation of functions to allocate and reallocate memory data.

 ++ minor evolutions of liblcrzo ++
    none in this version

 ++ major evolutions of lcrzoex ++
    none in this version

 ++ minor evolutions of lcrzoex ++
  - Example 162(send email) can now deal with server answers on 
    several lines.
  - Creation of example 166 sending a spoofed mail.
  - Creation of example 167 : tcp client with loose source routing.
  - In examples 44 and 72 (fragmented spoof) data size is
    now greater than 100 bytes.
  - Creation of examples 168, 169, 170 and 171, which are other
    clients using stdin.
 

---------------------------------------------------------------------
Version 3.05 - 04-march-2001
 ++ bugs ++
  - In example 162, a SMTP helo was done with '@domain.fr' instead
    of 'domain.fr'.
  - Help for examples 74 (icmp with lsrr option) and 75 (icmp with 
    ssrr option) was switched.

 ++ major evolutions of liblcrzo ++
    none in this version

 ++ minor evolutions of liblcrzo ++
  - Sometimes, hostnames resolution takes longer than 30 seconds
    to return "unknown host". Functions lcrzo_global_set_resolver_timeout
    and lcrzo_global_get_resolver_timeout help users to select
    a shorter timeout value (by default, it is 4 seconds).

 ++ major evolutions of lcrzoex ++
  - Creation of example 165 recursively putting files on a ftp 
    server.
  - The example 161 (IP/ranges computing) prints all surrounding
    ranges.

 ++ minor evolutions of lcrzoex ++
  - In example 133 (tcp prediction), the difference was printed
    as unsigned (%lu) instead of signed (%ld).
  - Various improvements of examples 162(send email) and 163(send
    news).


---------------------------------------------------------------------
Version 3.04 - 25-february-2001
 ++ bugs ++
  - In lcrzo_uint32_stdin, memory was freed too soon. As a 
    consequence, correct user's values were rejected.
  - The functions lcrzo_int32_stdin, lcrzo_int16_stdin and
    lcrzo_int8_stdin were not conceived for negative integers.
  - The function lcrzo_uint32_rand didn't verify if the
    minimum value was inferior to the maximum value.

 ++ major evolutions of liblcrzo ++
  - Creation of lcrzo_conf_route_to_host, which determines the
    router and the Ethernet addresses to use to send an IP
    packet. This function looks at the routing table to obtain
    these informations.
  - If the user wants to spoof an IP packet at Ethernet level, 
    but doesn't want to bother with Ethernet addresses and 
    device, the new function lcrzo_spoof_set_useethforip can
    help him. This is very useful on systems like Solaris
    which modify IP header values.

 ++ minor evolutions of liblcrzo ++
  - Functions lcrzo_uint32_rand, lcrzo_int32_rand, lcrzo_uint16_rand,
    lcrzo_int16_rand, lcrzo_uint8_rand and lcrzo_int8_rand
    initialize the random generator only once.

 ++ major evolutions of lcrzoex ++
  - In examples 37, 40, 48, and 51, allow user to specify a port
    number equal to zero(0). The minimal value was 1.
  - In examples 65 and 68, allow user to specify icmp types and
    icmp codes of zero(0). The minimal value was 1.
  - Creation of example 162 sending an email using SMTP.
  - Creation of example 163 sending a news message using NNTP.
  - Creation of example 164 sending an IP packet and showing
    how to use lcrzo_spoof_set_useethforip.

 ++ minor evolutions of lcrzoex ++
    none in this version


---------------------------------------------------------------------
Version 3.03 - 18-february-2001
 ++ bugs ++
  - In example 144, the help printed "octal_number" instead of
    "IP_address".

 ++ major evolutions of liblcrzo ++
  - Creation of the module lcrzo_sysdep containing all the system
    dependant functions. 
  - Creation of the module lcrzo_conf to obtain and change network
    configuration : device configuration, arp cache and ip routes.
    The changes are not made on the computer, but on a virtual layer
    allowing users to dynamicaly configure network functionnalities.
    All network functions of lcrzo now use this configuration module.

 ++ minor evolutions of liblcrzo ++
    none in this version

 ++ major evolutions of lcrzoex ++
  - Creation of examples 157, ... 160 printing the configuration 
    of the local computer. These examples uses new functionnalities
    provided by lcrzo_conf.
  - Creation of example 161 converting IP ranges. This is useful
    to compute network masks.

 ++ minor evolutions of lcrzoex ++
  - In example 133 (tcp prediction), there is a now a pause 
    to ensure the destination host is not synflooded.
    Furthermore, the difference is printed.
  - The example number 158 supersedes example 6.


---------------------------------------------------------------------
Version 3.02 - 04-february-2001
 ++ bugs ++
    none in this version

 ++ major evolutions of liblcrzo ++
    none in this version

 ++ minor evolutions of liblcrzo ++
  - Update of the document presenting lcrzo.
  - Addition of configuration functions allowing to specify Ethernet
    and IP addresses for internal spoofing. These addresses can
    also be computed to match the local network. These functions
    are now used for internal arp and rarp spoofing, in addresses
    conversion functions.

 ++ major evolutions of lcrzoex ++
    none in this version

 ++ minor evolutions of lcrzoex ++
  - Creation of a manual page for lcrzoex.
  - Creation of exemple 156, obtaining informations about a hostname
    with random ARP spoofing.


---------------------------------------------------------------------
Version 3.01 - 28-january-2001
 ++ bugs ++
  - In lcrzo_etha_stdin, lcrzo_etha_init_hs was used instead of
    lcrzo_etha_init_eths, so it was not possible to enter
    a valid Ethernet address.
  - In lcrzo_uint32_stdin, the default value was printed in
    signed integer ("%ld"), instead of unsigned integer ("%lu").

 ++ major evolutions of liblcrzo ++
    none in this version

 ++ minor evolutions of liblcrzo ++
  - In order to be able to use the libpcap package of RedHat, I had
    to circumvent its usage in lcrzo_sniff.c. So, it's now possible
    to use the libpcap package modified by RedHat.
  - Several low level functions of lcrzo 3.x are not implemented in
    libnet. So, using libnet doesn't help a lot on unsupported
    systems. In the configuration file, I removed the choice to
    compile with libnet. The use of libnet is still possible,
    but from now on it's not proposed as a solution for unsupported
    systems.

 ++ major evolutions of lcrzoex ++
    none in this version

 ++ minor evolutions of lcrzoex ++
  - The example 22 (Ethernet packet printing) is added in the
    sniff category.
  - In examples 48 to 53 (TCP spoof), the seqnum and acknum 
    parameters are added.


---------------------------------------------------------------------
Version 3.00 - 21-january-2001
 - Translation of most of the library from French to English.
 - Most of the functions were remade, so the changelog for this version
   is far from being complete : I put only the major changes.
 - Standardization of error codes. An error string is now also available
   to explain error to users.
 - Creation of a private module containing all the private function
   which may be used by several functions in the library, but which
   are not sufficiently interesting to be proposed as public functions.
 - Add a boolean type (lcrzo_bool), and use it in all the functions
 - Creation of private functions allowing to open files securely
   (no symlink race, no privilege escalation, etc.).
   Use of theses functions in lcrzo_record module.
 - In lcrzo_sniff module, the number of function has been decreased
   because they were redondant.
 - The function doing the checksum returns now the checksum as an
   argument.
 - Optimization of all functions in lcrzo_list module. Creation of
   new functions in this module. For example it's now possible to
   directly insert a packet in a list, without using an intermediary
   structure.
 - Creation of new functions to deal with device, and to access them
   specifying which device type we want.
 - Homogenization of functions dealing with lcrzo_printtype and
   lcrzo_printprofile.
 - All the functions dealing with access of data within a range
   of possible values have now the folowing names :
    xx_count : count the number of elements
    xx_value_pos : get value at a position
    xx_value_first : get value at first position
    xx_value_last : get value at last position
    xx_loop_range : call a function for each value in the range
    xx_loop_all : call a function for every value
 - In the function decoding ARP packets, the arp header was set
   even if it was a NULL pointer.
 - In all the functions, in all the modules, a NULL pointer can now 
   be used for all the optional parameters.
 - In few functions, input pointers were not const pointers.
 - Creation of global parameters allowing users to specify some
   internal functionnalities for the library : for "real" hackers only.
 - All the function parameters are verified before been used.
 - Creation of the type lcrzo_spoof allowing an easy configuration
   of spoof functions : printprofile, fragment size, etc.
 - Creation of new print types and reorganization of lcrzo_print.c.
 - New module : lcrzo_data to perform all the data manipulation.
   The module lcrzo_string is now based on lcrzo_data.
   A lot of functions, working on data, was remade.
 - All the return values of close() or fclose() are tested.
 - All the examples were remade.

---------------------------------------------------------------------
Below, lcrzo was in French, so the changelog is in French.
Version 2.08 - 01/10/2000
 - Ajout d'un exemple de synflood spoofant au niveau ethernet.
 - Ajout d'exemples permettant de compter les paquets.
 - Lorsque l'on spoofe au niveau IP, sur une machine puissante, le
   systeme se met a saturer (cf. bug_connus.txt). Ajout d'une parade
   temporaire dans lcrzo_sendraw_ip.
 - Creation du module lcrzo_temps comportant toutes les fonctions
   de gestion de temps.
 - Ajout du message d'erreur fourni par libpcap lorsqu'une erreur
   de pcap est affichee.
 - Creation du module lcrzo_string comportant les fonctions de
   traitement de chaines de caracteres : creation, recherche,
   expressions regulieres, etc.
 - Ajout d'un module lcrzo_global. Pour le moment, ce module 
   n'a pas a etre employe par les utilisateurs. Ce module permettra
   de gerer la configuration de certaines fonctionnalites.
 - Ajout de fonctions permettant de creer des serveurs tcp multiclients :
     lcrzo_initsertcp_reelmulti
     lcrzo_initsertcp_reeloipmulti
     lcrzo_initsertcp_reelmultiinfos 
     lcrzo_initsertcp_reeloipmultiinfos
 - Ajout d'un exemple analysant succinctement, a l'aide d'expressions
   regulieres, les bannieres des serveurs. 

---------------------------------------------------------------------
Version 2.07 - 17/09/2000
 - Ajout d'un fichier vide dans le repertoire d'exemple afin de 
   faciliter la creation du premier exemple par l'utilisateur
   (ex1.c). Complement du Makefile du repertoire d'exemple afin de 
   pouvoir compiler rapidement n'importe quel fichier c : par 
   exemple, pour compiler toto.c, il faut taper "make toto".
 - Ajout de trois types de plages :
     lcrzo_plageeth  : plage d'adresses ethernet
     lcrzo_plageip   : plage d'adresses ip
     lcrzo_plageport : plage d'adresses de ports
   Ces plages ont la syntaxe :
     lcrzo_plageeth  :
       a:b:c:d:e:f
       1:2:3:4:5:6-a:b:c:d:e:f
       1:2:3:4:5:0/FF:FF:FF:FF:FF:0
       1:2:3:4:5:0/40
       1:2:3:4:5/FF:FF:FF:FF:FF:0
       1:2:3:4:5/40
       1:2:3:4:5:0%FF:FF:FF:FF:FF:0
       1:2:3:4:5:0%40
       1:2:3:4:5%FF:FF:FF:FF:FF:0
       1:2:3:4:5%40
     lcrzo_plageip   :
       1.2.3.4
       1.2.3.4-5.6.7.8
       1.2.3.0/255.255.255.0
       1.2.3.0/24
       1.2.3/255.255.255.0
       1.2.3/24
       1.2.3.0%255.255.255.O
       1.2.3.0%24
       1.2.3%255.255.255.O
       1.2.3%24
     lcrzo_plageport :
       23
       23-25
       23-
       0-21
       1-21
       -21
       -
   Ajout des fonctions de conversions correspondantes.
 - Complement de genemake afin que le test du bug de ether_hostton
   soit automatiquement mene. Un warning s'affiche alors a l'utilisateur
   pour qu'il puisse, si il le desire, faire la modification de son
   fichier /etc/ethers.
 - Ajout des fonctions :
    - lcrzo_initcliudp_reelloc
    - lcrzo_initcliudp_reellocoip
    - lcrzo_initclitcp_reelloc
    - lcrzo_initclitcp_reellocoip
   Ces fonctions permettent de specifier un numero de port source pour
   les clients udp/tcp (il n'y a plus besoin d'utiliser les clients
   virtuels pour cela).
 - Reorganisation des noms des fonctions d'initialisation des 
   clients et serveurs udp/tcp. 

---------------------------------------------------------------------
Version 2.06 - 10/09/2000
 - Dans les fonctions de conversion d'adresse lcrzo_ipt2etht et 
   lcrzo_etht2ipt, on interroge aussi :
    - le cache arp/rarp par le biais des procfs /proc/net/arp et
      /proc/net/rarp sous Linux.
    - "netstat -pn" sous Solaris.
 - Ajout des fonctions lcrzo_time_xxx gerant des mesures de temps,
   des pauses, etc.
 - Creation de lcrzo_optip et lcrzo_opttcp pour gerer les options.
   Mise a jour de toutes les fonctions et de tous les exemples 
   utilisant des options.
 - Dans les fonctions lcrzo_get_etht et lcrzo_get_ipl, Solaris ne
   reconnaissait pas le device loopback "lo0", et l'adresse 
   127.0.0.1 ne lui etait pas associee.
 - Ajout d'un exemple de traceroute TCP.
 - Resolution d'un bug de libpcap. Ci-dessous, dans la modification
   de la "Version 1.12 - 01/05/2000", j'avais ecrit :
   "L'exemple 6 affichait "linux socket: Too many open files" apres
    avoir resolu plus de 240 adresses. Le probleme semble lie
    au processus fils de sniff des reponses arp. En utilisant _exit()
    au lieu de exit(), j'ai resolu le probleme, mais je sais pas
    pourquoi...".
   Apres avoir pris le temps d'analyser ce bug, il s'avere que la 
   fonction "linux_restore_ifr" de "pcap-linux.c" (libpcap-0-5rel2)
   ne ferme pas le fd qu'elle ouvre :
    void linux_restore_ifr(void)
    { register int fd;
      fd = socket(PF_INET, SOCK_PACKET, htons(0x0003));
      if (fd < 0)
        fprintf(stderr, "linux socket: %s", pcap_strerror(errno));
      else if (ioctl(fd, SIOCSIFFLAGS, &saved_ifr) < 0)
        fprintf(stderr, "linux SIOCSIFFLAGS: %s", pcap_strerror(errno));
      /*et ici, il n'y avait pas de close*/
      close(fd); /*rajoute par Laurent dans libpcap.*/
    }
   J'ai rajoute la section correspondante dans bugs_connus.txt,
   car ce bug ne peut etre corrige qu'en patchant libpcap.
 - L'affichage des bits reserves de l'entete TCP etait fait dans
   le sens inverse dans la fonction lcrzo_ecrit_hdrltcp.
 - Modification du module de liste afin de pouvoir passer des 
   informations complementaires aux fonctions travaillant sur
   les elements.
 - Ajout des fonctions lcrzo_record_lit_boucleinfos,
   lcrzo_sniff_bouclefiltreinfos et lcrzo_sniff_boucleinfos permettant
   de passer des informations complementaires aux fonctions travaillant
   sur les elements.
 - Ajout de lcrzo_randinit permettant d'initialiser le generateur
   aleatoire avec /dev/random, /dev/urandom ou time^pids. Utilisation
   de lcrzo_randinit dans lcrzo_rand.
 - Dans lcrzo_sniff_init et lcrzo_sniff_initfiltre, la taille a passer
   a pcap_open_live devait aussi inclure la taille de l'entete ethernet.
 - Modification du module de sniff :
    - les fonctions peuvent etre bloquantes ou non
    - il y a trois type de sniff :
        LCRZO_TYPESNIFFNORMAL  fournit tous les paquets sniffes,
			       sans les modifier
	LCRZO_TYPESNIFFREASIP  reassemble les fragments IP,
		               et supprime les doublons IP
        LCRZO_TYPESNIFFREORTCP reassemble les fragments IP,
                               supprime les doublons IP, et 
                               reordonne les paquets TCP
 - Utilisation des nouvelles fontionnalites de sniff dans la gestion
   des clients/serveurs virtuels. 

---------------------------------------------------------------------
Version 2.05 - 20/08/2000
 - Dans lcrzo_sendraw_ip, il y avait :
     retour=sendto(sock, paquet, nboctpaquet, 0,
		   (struct sockaddr*)&soin, sizeof(soin));
   au lieu de :
		   (struct sockaddr*)&soin, sizeof(struct sockaddr));
   Ca n'a jamais pose de souci, mais c'est plus logique.
 - Delocalisation de la parade contre le bug de Solaris 2.4, 2.5 et
   2.5.1 de la fonction lcrzo_initpaquet_ipopttcpoptdata vers 
   lcrzo_sendraw_ip. De plus, je me suis rendu compte que le probleme
   existe aussi pour le checksum des paquets udp. En resume, 
   j'utilise maintenant :
     hdrltcp.check=hdrltcp.doff<<2;
     hdrludp.check=hdrludp.len;
   Si on met une valeur differente de celles calculees ci-dessus, le
   noyau Solaris envoie un checksum incorrect sur le reseau.
   Par contre, en lui envoyant la valeur ci-dessus, il calcule 
   correctement le checksum.
   C'est un bug assez ennuyeux car il nous empeche d'envoyer un
   checksum falsifie : il faut utiliser pour cela lcrzo_sendraw_eth.
 - Ajout des fonctions lcrzo_sockoptip_xxx permettant de specifier des
   options IP pour des connexions udp ou tcp (client ou serveur).
 - Ajout d'exemples de clients tcp utilisant les fonctions 
   lcrzo_sockoptip_xxx.
 - Renommage des fonctions :
    lcrzo_initoptip_time_time en lcrzo_initoptip_time
    lcrzo_initoptip_time_iptime en lcrzo_initoptip_timeip
    lcrzo_initoptip_time_ipptime en lcrzo_initoptip_timeipp
    lcrzo_decodeoptip_time_time en lcrzo_decodeoptip_time
    lcrzo_decodeoptip_time_iptime en lcrzo_decodeoptip_timeip
    lcrzo_decodeoptip_time_ipptime en lcrzo_decodeoptip_timeipp
   Cela permet de raccourcir et simplifier le nom des fonctions.
 - On peut maintenant utiliser lcrzo_initserveur_tcp pour ouvrir des
   ports identiques, sans avoir a attendre le "TIME_WAIT".
 - Dans l'exemple verifiant les checksum, on verifie aussi maintenant
   le checksum des fragments IP.
 - Ajout d'autres exemples permettant de construire des paquets
   en direct.
 - Lorsque des paquets tcp ou udp sont routes par la source (source
   routing), le calcul du checksum tcp/udp doit aussi se faire selon
   le contenu de l'option IP (et pas seulement selon l'adresse IP
   destination). C'est maintenant fait.
 - Dans les fonctions lcrzo_initpaquet_ipoptdata et 
   lcrzo_initpaquet_ipopttcpoptdata, on verifie maintenant que la 
   taille des options (ip et tcp) soit un multiple de 4.
 - Dans lcrzo_sendraw_ip, sous Solaris, les options ip
   ne passaient pas : il faut utiliser setsockopt.
 - Creation de structures contenant les entetes logiques.
   Toutes les fonctions de lcrzo utilisent ces entetes logiques.
   Il y a donc :
    - les entetes "logiques" : ce sont les entetes au format machine
    - les entetes "physiques" : ce sont les entetes au format reseau
   Par exemple, pour affecter le port source :
    - d'un entete UDP "logique", il faut faire
         hdrludp.sport=80;
    - d'un entete UDP "physique", il faut faire
         hdrpudp.sport=lcrzo_htons(80);
   Par exemple, pour lire le port source :
    - d'un entete UDP "logique", il faut faire
          valeur = hdrludp.sport;
    - d'un entete UDP "physique", il faut faire
         valeur = lcrzo_ntohs(hdrpudp.sport);
   Comme on peut le voir, les entetes logiques sont beaucoup plus
   simples a utiliser. D'un autre cote, les entetes physiques
   correspondent exactement a ce qui transite sur le reseau.
   Toutes les fonctions de lczrzo ont pour interface des entetes
   logiques, ce qui les rend simples d'emploi.
   Des entetes physiques sont aussi proposees, si vous desirez pouvoir
   acceder directement a des paquets reseau, sans utiliser des 
   fonctions de lcrzo.
 - Suppression du parametre "data" dans toutes les fonctions traitant
   d'ARP. En effet, ce champ avait une utilisation "theorique", mais
   il ne sert a rien en pratique.
   Les fonctions :
      lcrzo_initpaquet_etharpdata
      lcrzo_decodepaquet_arpdata
      lcrzo_decodepaquet_etharpdata
      lcrzo_sendpaquet_etharpdata
   on donc ete renommees en :
      lcrzo_initpaquet_etharp
      lcrzo_decodepaquet_arp
      lcrzo_decodepaquet_etharp
      lcrzo_sendpaquet_etharp
 - Dans le programme contenant les exemples, le device par defaut 
   correspond au systeme : eth0, le0, elx0, etc.
 - Ajout du module lcrzo_ipc. Les fonctions presentes dans ce module
   permettent de communiquer des donnees entre deux processus.
   Par exemple, on peut concevoir un programme ou un processus
   serait charge de sniffer le reseau, puis de passer les donnees
   interessantes a un autre processus, charge de spoofer des reponses.
 - Fusion des modules lcrzo_cliser et lcrzo_virtuel. Ces fonctions
   ont maintenant le meme interface. Ecriture/reecriture de nombreuses
   fonctions de ces modules. Reorganisation/reecriture des exemples
   correspondants.
 - Ajout de la fonction lcrzo_stdin_ipl permettant d'obtenir un ipl
   a partir de l'entree d'un utilisateur.
 - Ajout des informations demandees lors de l'affichage synthetique
   de requete/reponse arp/rarp.

---------------------------------------------------------------------
Version 2.04 - 29/07/2000
 - Creation des fonctions lcrzo_decodeoptip_xxx permettant de decoder
   des options IP.
 - Utilisation des fonctions lcrzo_decodeoptip_xxx dans la fonction
   d'affichage d'un entete IP.
 - Lorsque l'on fragmente des paquets IP contenant des options IP,
   ces options peuvent etre envoyees dans tous les paquets, ou 
   seulement dans le premier paquet. Avant, dans les fonctions 
   lcrzo_sendpaqfrag_xxx, j'utilisais une liste predeterminee pour
   savoir comment traiter les options.
   Maintenant, afin d'avoir un code generique, j'utilise la valeur
   du bit de poids fort du type d'option (rfc 791).
 - Ajout de fonctions traitant l'encodage base64 :
    Initialisation :
     lcrzo_initpaquet_base64("Ym9uam91cg==", donnees, &nboct);
    Affichage :
     lcrzo_affpaquet_data(donnees, nboct, LCRZO_TYPEAFF_BASE64);
 - Simplification de l'affichage des fonctions lcrzo_ecritinfos_xxx
   (ces fonctions avaient ete crees dans le but de deboguer lcrzo,
   mais maintenant elles ne servent plus a ca).
 - Ajout dans la fonction lcrzo_initclientvirtuel_tcp, du reset des
   connexions IDENT initiees par le serveur : on n'a plus a attendre
   le timeout de certains serveurs.
 - Ajout des fonctions lcrzo_sendpaqsimple_xxx. Ces fonctions envoient
   des paquets simples. En effet, dans la majorite des cas, on ne veut
   pas specifier l'id, la window, le type eth, etc.
   Ces fonctions permettent donc d'envoyer des paquets "classiques".
 - Utilisation des fonctions lcrzo_sendpaqsimple_xxx dans les exemples
   classiques.
 - Dans la fonction lcrzo_hs2ipt, on essaie d'abord d'utiliser
   lcrzo_ips2ipt avant de convertir de hs en ipt (car il y avait un
   timeout ennuyant sur certaines machines).
 - Modification de lcrzo_initpaquet_ipopttcpoptdata afin de contourner
   un bug du noyau Solaris 2.4, 2.5 et 2.5.1 qui apparait lorsque l'on
   envoie un paquet tcp avec un checksum different de 20 (c'est une
   erreur qui a ete corrigee a partir de la version 2.6 de Solaris).

---------------------------------------------------------------------
Version 2.03 - 17/07/2000
 - En utilisant des valeurs NULL pour les pointeurs de 
   lcrzo_decodepaquet_xxx, les parametres correspondant ne sont pas
   affectes. Par exemple :
     lcrzo_decodepaquet_ipoptdata(paquet, nboctpaquet,
                             	  &hdrip,
				  NULL, NULL,
				  data, &nboctdata);
   n'affecte pas les options IP (ainsi, si on ne s'en sert pas, on n'a
   plus besoin de les declarer).
 - Simplification de toutes les fonctions utilisant lcrzo_decodepaquet_xxx
   en passant "NULL" pour les parametres inutilises.
 - Erreur dans lcrzo_initpaquet_ipopttcpoptdata pour le calcul du
   checksum TCP : lorsqu'il y avait des options TCP, le calcul n'en 
   tenait pas compte.

---------------------------------------------------------------------
Version 2.02 - 14/07/2000
 - Ajout de l'inclusion de <ctype.h> dans lcrzo_spoof.c lorsque l'on
   compile sous Solaris Intel. Un warning s'affichait.
 - Suppression de la definition du "lcrzo_hdrpseudo" dans lcrzo.h,
   car on ne s'en sert que pour les fonctions privees.
 - Creation de lcrzo_coderr.h contenant les codes d'erreur des 
   fonctions de la bibliotheque (avant, ils etaient dans lcrzo.h).
 - Ajout du module lcrzo_ipopt permettant de creer des options IP :
     - lcrzo_initipopt_noop "no operation"
     - lcrzo_initipopt_lsrr "strict source routing and record route"
     - lcrzo_initipopt_ssrr "strict source routing and record route"
     - lcrzo_initipopt_rr "record route"
     - lcrzo_initipopt_time_time "timestamp type 0"
     - lcrzo_initipopt_time_iptime "timestamp type 1"
     - lcrzo_initipopt_time_ipptime "timestamp type 3"
 - Le ttl cree par lcrzo_initdefaut_hdrip est maintenant de 128 au
   lieu de 64.
 - Afin de faciliter la creation de paquets d'attaque, on ne 
   recalcule, dans les fonctions lcrzo_initpaquet_xxx, les champs
   suivants que si leur valeur est differente de la valeur par 
   defaut. Ainsi, 
     - si l'utilisateur ne touche pas a la valeur, la valeur sera
       calculee pour lui
     - si l'utilisateur utilise une valeur autre que la valeur par
       defaut, on laisse cette valeur dans le paquet : cela permet
       de creer des paquets frauduleux.
   Les variables concernees sont (suivies de leur valeur par 
   defaut) :
       hdreth.type    0
       hdrip.totlen   lcrzo_htons(20)
       hdrip.ihl      5
       hdrip.check    0
       hdrip.protocol 0
       hdrudp.len     lcrzo_htons(8)
       hdrudp.check   0
       hdrtcp.doff    5
       hdrtcp.check   0
       hdricmp.check  0
   Les autres variables des entetes ne sont pas du tout modifiees
   par la bibliotheque : la valeur entree par l'utilisateur est
   mise dans le paquet.
 - Ajout de fonctions permettant de creer des paquets fragmentes :
     lcrzo_sendpaqfrag_ipoptdata
     lcrzo_sendpaqfrag_ipoptudpdata
     lcrzo_sendpaqfrag_ipopttcpoptdata
     lcrzo_sendpaqfrag_ipopticmpdata
     lcrzo_sendpaqfrag_ethipoptdata
     lcrzo_sendpaqfrag_ethipoptudpdata
     lcrzo_sendpaqfrag_ethipopttcpoptdata
     lcrzo_sendpaqfrag_ethipopticmpdata
 - Initialisation de hs a "" si lcrzo_get_hs retourne une erreur.
   (ce n'etait pas fait dans le cas ou lcrzo_get_ipl retourne
   != LCRZO_ERR_OK).
 - Modification de lcrzo_stdin_paquet afin qu'elle en demande pas
   "Voulez-vous la chaine Vide ou la chaine par Defaut ?" si la
   chaine par defaut est vide.
 - Au lieu de laisser le noyau calculer le checksum IP dans 
   lcrzo_initpaquet_ipoptdata, on le calcule. Cela permet de voir 
   les valeurs contenues dans les paquets que l'on envoie (au lieu
   de voir "0000").
 - Remise a plat de tous les exemples de lcrzoex.c.
 - Modification des fonctions lcrzo_strxxx afin qu'elles retournent
   un "int" et non un "void".
 - Restriction du format autorise pour lcrzo_strinit_ent et
   lcrzo_strappend_ent. Avant, une simple verification de contenu
   etait faite. Maintenant, le format doit correspondre a 
   l'expression reguliere : 
     "%[0+-.]{0,1}[1-9]{0,2}[l]{0,1}[douxX]"
 - La fonction lcrzo_checksum() retourne maintenant un checksum
   au format host (et non network). Il faut donc utiliser
   lcrzo_htons(resu) afin de mettre resu dans un paquet. C'est 
   ainsi coherent avec le reste de la bibliotheque.

---------------------------------------------------------------------
Version 2.01 - 14/06/2000
 - Le programme de generation des "Makefile" a ete renomme en
   "genemake". L'ancien nom "configure" pouvait faire croire que
   tout se configurait selon le systeme : et non, il faut editer
   config.dat. J'en ai profite pour completer les tests effectues
   dans genemake. L'execution de genemake s'arrete des qu'un souci
   potentiel a ete rencontre. Un message explicatif indique ce qui
   ne va pas.
 - Prise en compte des systemes sur lesquels libnet est installe.
   Dans ce cas l'utilisateur peut choisir d'utiliser libnet : c'est
   cette bibliotheque qui sera utilisee pour les fonctions bas
   niveau.
   Cela peut aussi servir pour installer liblcrzo sur un systeme
   sur lequel elle n'a pas ete portee: HP-UX, etc.
 - Modification de lcrzo_spoof.c. Remplacement de :
      sock=socket(AF_INET, SOCK_PACKET, IPPROTO_RAW);
   Par :
      sock=socket(AF_INET, SOCK_PACKET, lcrzo_htons(ETH_P_ALL));
   Dans la fonction lcrzo_sendraw_eth.
 - Modification des variables de preprocesseur concernant
   l'endianness
     Avant :
       #define LCRZODEF_ENDIAN "Big"
       mais, comme LCRZODEF_ENDIAN_Little n'etait pas defini ce
       n'etait pas pratique de l'employer directement dans du C.
     Maintenant :
       #define LCRZODEF_ENDIANLITTLE 0
       #define LCRZODEF_ENDIANBIG 1
       On peut donc utiliser LCRZODEF_ENDIANxxx pour des tests
       au niveau du preprocesseur, mais aussi dans du C :
        if (LCRZODEF_ENDIANLITTLE) ...
 - Reorganisation des fonctions lcrzo_snprintf, lcrzo_strnapp,
   lcrzo_strncat, lcrzo_strncpy. J'avais, entre-autres, des soucis
   de portabilite avec vsnprintf.
   Les fonctions de remplacement sont :
     lcrzo_strappend_str  : ajout d'une chaine
     lcrzo_strinit_str    : initialisation par une chaine
     lcrzo_strappend_car  : ajout d'un caractere
     lcrzo_strinit_car    : initialisation par un caractere
     lcrzo_strappend_ent  : ajout d'un entier
     lcrzo_strinit_ent    : initialisation par un entier
 - Modification de lcrzo_checksum afin que la fonction travaille
   sur un pointeur de caracteres et non un pointeur de word.
 - Remplacement de LCRZODEF_VERMAJ.LCRZODEF_VERMIN par 
   LCRZODEF_VERSION.
 - Realignement de divers pointeurs.

---------------------------------------------------------------------
Version 2.00 - 27/05/2000
 - Comme la version 1.12 semble stable, je passe en version 2.00, et
   je commence a porter la bibliotheque.
   J'en profite aussi pour renommer la bibliotheque de rlc en lcrzo
   (qui signifie Laurent Constantin Reseau (RZO)). En effet, une 
   recherche de RLC sur internet fournit beaucoup trop de resultats.
 - Portage sous FreeBSD effectue.
 - Portage sous Debian effectue.
 - Portage sous Solaris Intel effectue.
 - Modification de la procedure de generation des Makefile: creation
   de config.dat.
 - Deplacement de lcrzotest.c et modification de ce programme afin
   de pouvoir tester un intervalle.
 - Divers remaniement de repertoires et programmes.


---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
Version 1.12 - 01/05/2000
 - Ajout du module rlc_liste.c permettant de creer des listes chainees.
 - L'exemple 6 affichait "linux socket: Too many open files" apres
   avoir resolu plus de 240 adresses. Le probleme semble lie
   au processus fils de sniff des reponses arp. En utilisant _exit()
   au lieu de exit(), j'ai resolu le probleme, mais je sais pas
   pourquoi... D'apres la page d'aide, la seule difference est
   que exit() flushe les filedescriptors avant de les fermer. Si vous
   avez l'explication du pourquoi de ce bug, merci de me l'indiquer. 
 - Ajout de l'exemple numero 7 qui ecoute ce qui passe sur le reseau
   et en deduit ou se trouvent les serveurs, les clients, etc. Lors de
   l'appui sur control-C, un resume de tous les paquets sniffes 
   s'affiche. Cet exemple utilise les listes chainees pour stocker les
   informations.
 - Ajout des fonctions rlc_cmp_... permettant de comparer des adresses.

---------------------------------------------------------------------
Version 1.11 - 24/04/2000
 - Ajout des fonctions :
    void rlc_strncpy(char *dest, const char *src, rlc_uint32 taille);
    void rlc_strncat(char *dest, const char *src, rlc_uint32 taille);
    void rlc_strnapp(char *dest, rlc_uint32 taille, const char *src);
    void rlc_snprintf(char *dest, rlc_uint32 taille,
	   	      const char *format, ...);
   Ces fonctions servent de substitut aux fonctions systeme qui ne sont
   pas homogenes et/ou adaptees a la securite (strncpy ne copie pas
   forcement le '\0' en fin, snprintf compte le '\0' contrairement
   aux strxxx, etc.).
 - Utilisation des fonctions ci-dessus dans toute la bibliotheque.
 - Amelioration des fonctions de conversion d'adresse eth<->ip
   Maintenant, on envoie aussi des requetes arp/rarp sur le reseau 
   et on sniffe la reponse. De plus, on regarde si les adresses a 
   resoudre sont celles de la machine locale.
 - Ajout d'un exemple permettant d'obtenir toutes les adresses ethernet
   d'un reseau.
 - Ajout d'un appel manquant a la fonction close dans rlc_ipt2etht
   et rlc_etht2ipt.
 - Ajout d'un exemple permettant de voir les numeros de sequence
   d'un serveur.

---------------------------------------------------------------------
Version 1.10 - 17/04/2000
 - Suppression d'un message de warning apparaissant en compilant
   avec gcc2.91 : j'avais "static faitsrand" au lieu de "static int 
   faitsrand".
 - Creation du fichier src/INSTALL afin de separer la procedure
   d'install du blabla contenu dans le README.
 - Ajout d'une section "Problemes rencontres" dans le fichier 
   INSTALL.

---------------------------------------------------------------------
Version 1.9 - 08/04/2000
 - Simplification de l'arborescence du serveur. Maintenant, je
   propose n versions tar_gzippees :
    rlcsrc-1.9.tgz : sources de la bibliotheque
    rlcdist.Linuxi386-1.9.tgz : version precompilee pour Linuxi386
    rlcdist.FreeBSDi386-1.9.tgz : version precompilee pour FreeBSD
 - Creation d'une fonction privee pour remplacer les appels a fgets 
   dans rlc_stdin.c. En effet, la fonction fgets n'a pas le meme
   fonctionnement sur les differentes versions de RedHat (un '\0'
   n'est pas ajoute en fin de chaine comme ecrit dans la page d'aide
   de la RedHat 5.0...).
 - Ajout des fonctions :
     rlc_initsniff
     rlc_initsnifffiltre
     rlc_sniff_suivant
     rlc_sniff_ferme
   Ces fonctions servent a initialiser un contexte de sniff, a 
   obtenir les paquets du reseau et a fermer le contexte.
   Un exemple typique d'utilisation est :
    rlc_er(rlc_initsniff("eth0", 1500, &cs));
    while(rlc_sniff_suivant(&cs, paquet, &nboct)==RLC_ERR_OK)
    { afficher_ce_paquet(paquet, nboct);
    }
    rlc_er(rlc_sniff_ferme(&cs));
 - Ajout du type ethernet IP dans les fonctions rlc_initpaquet_eth...
   Cet ajout ne se fait que si le type n'etait pas deja defini :
    if (hdreth.type==0)
      hdreth.type=rlc_htons(RLC_ETHPROTO_IP);
 - Ajout de la prise en compte des options tcp. Ce parametre a ete
   ajoute aux fonctions :
	rlc_initpaquet_ipopttcpoptdata
	rlc_initpaquet_ethipopttcpoptdata
	rlc_decodepaquet_tcpoptdata
 	rlc_decodepaquet_ipopttcpoptdata
 	rlc_decodepaquet_ethipopttcpoptdata
 	rlc_sendpaquet_ipopttcpoptdata
 	rlc_sendpaquet_ethipopttcpoptdata
 - Creation du module rlc_virtuel.c. Ce module permet de creer des 
   machines virtuelles :
    - simule une machine presente en repondant aux arp/rarp/ping
    - client udp virtuel
    - serveur udp virtuel
    - client tcp virtuel
    - serveur tcp virtuel
   Ces fonctions n'implementent pas des piles IP parfaites. Par 
   exemple, le nombre de paquets ip recus dans le desordre ne doit
   pas exceder 10. De plus, la gestion des paquets fragmentes n'est
   pas encore assuree. Cependant, ces fonctions permettent de creer
   des machines virtuelles fonctionnant dans la majorite des cas.
   Par exemple, si un wrapper tcp est installe sur un serveur et que
   seules les machines de 192.168.10/24 sont autorisees a se 
   connecter, il est possible de spoofer une connexion tcp en se
   faisant passer pour 192.168.10.56
 - Ajout d'un autre exemple de machine repondant aux requetes
 - Lors du decodage de paquets IP ou ARP/RARP, on supprime les
   octets de bourrage en fin de paquet sniffes. Ces octets pouvaient
   tromper un utilisateur non averti. On etait oblige de regarder
   hdrip.totlen pour distinguer les octets du paquet des octets
   de bourrage. Maintenant, on ne voit plus les octets de bourrage.

---------------------------------------------------------------------
Version 1.8 - 25/03/2000
 - Uniformisation de l'affichage des donnees sous forme de tableaux :
              "0_1_2_3_.0_1_2_3_:0_1_2_3_.0_1_2_3_|..."
    1 bit :   "b " en binaire
    4 bits :  "   dd   " en decimal
              "   Hh   " en hexa
              " dd=Hh  " en decimal et hexa
    8 bits :  "       ddd       " en decimal
              "       HHh       " en hexa
              "        c        " en caractere affichable ('.' sinon)
              "     ddd=HHh     " en decimal et hexa
              "    ddd=HHh=c    " en decimal, hexa et carac affichable
    16 bits : ...
   Ainsi, une entete TCP est maintenant affichee comme suit :
    TCP___________________________________________________________...
    |            port source            |         port destination...
    |____________0455h= 1109____________|____________0017h=   23__...
    |                                seq num                      ...
    |_________________________42193EA3h=1108950691________________...
    |                                ack num                      ...
    |_________________________9738B667h=2537076327________________...
    |dataoff |         . . UrAk PuRsSyFi|               window    ...
    |___ 5___|___ 0____0_0_0_1__0_0_0_0_|____________7D78h=32120__...
    |             checksum              |          pointeur urgent...
    |____________CA3Eh=51774____________|____________0000h=    0__...
   Cette modification permettra d'ecrire ulterieurement un algorithme
   pouvant relire ce format.
 - Ajout de la conversion de nombres binaires dans l'exemple 101.

---------------------------------------------------------------------
Version 1.7 - 18/03/2000
 - Ajout de la fonction rlc_get_mtu permettant de connaitre le mtu
   associe a une interface reseau.
 - Ajout de rlc_purgeblanc dans les fonctions du module rlc_config.c
   afin d'accepter des parametres pouvant contenir des espaces.
 - Utilisation de rlc_get_mtu dans les fonctions de sniff de 
   l'exemple afin de ne plus avoir besoin de specifier la taille
   des donnees a sniffer.
 - Ajout d'un appel a la fonction close dans rlc_sendraw_eth et 
   rlc_sendraw_ip. Cela empechait d'envoyer plus de 
   nbmaxfiledescriptors paquets par programme.
 - Ajout d'un exemple de synflood.

---------------------------------------------------------------------
Version 1.6 - 12/03/2000
 - Homogeneisation du nom des fonctions.
 - Ajout de diverses fonctions au module config.c.
 - Ajout de rlc_ecritinfos_device.
 - Homogeneisation de l'ordre des parametres :
    filedesc_io, entree, parametres, valeurs_par_defaut, sortie
 - Homogeneisation des noms de parametre :
    pxx            pointeur
    paquet         tableau de donnees
    nboctpaquet    nombre d'octets
    sock           socket
    xxdefaut       valeur par defaut
    ...

---------------------------------------------------------------------
Version 1.5 - 06/03/2000
 - Au lieu de definir le device en dur dans le programme d'exemple,
   on le demande maintenant sur la ligne de commande. Cela permet 
   donc de sniffer sur eth1 a l'aide de l'exemple.
 - Utilisation d'un fichier temporaire pour l'option 104 de 
   l'exemple (conversion unix_dos). Cela permet d'ecraser le fichier
   en entree avec par exemple :
    ./rlcex 104 1 nomfichier nomfichier

---------------------------------------------------------------------
Version 1.4 - 01/03/2000
 - Modification de rlc_stdin_presse et rlc_stdin_carac pour utiliser
   tcgetattr et ne plus avoir besoin d'appuyer sur entree pour saisir
   une touche.
 - Compilation de la bibliotheque avec -Wtraditional -Wshadow 
    -Wid-clash-32 -Wpointer-arith -Wcast-qual -Wcast-align
    -Wwrite-strings -Wstrict-prototypes -Wnested-externs
    -Wmissing-prototypes -Wmissing-declarations -Werror
   Cette option de compilation n'est accessible que pour le 
   developpeur de la bibliotheque. Les utilisateurs normaux 
   compilent simplement avec -Wall (defini automatiquement par 
   le ./configure).
   Diverses modifications ont donc ete apportees aux fonctions pour
   pouvoir compiler avec ces options strictes. Principalement, cela
   a consiste a ajouter des "const" pour tous les parametres non
   modifies. 
 - Correction d'un bug dans l'exemple rlcex. Il y avait :
      nomprog=malloc(strlen(argv[0]+10));
   au lieu de malloc(strlen(argv[0])+10);
   J'ai remplace ca par :
    nomprog=malloc(strlen(argv[0])+1+strlen(argv[1])+1);
 - Correction d'un bug dans l'exemple rlcex. Il y avait 
   "if (argc==1)" au lieu de "if (argc==2)" pour l'option 61.
 - Ajout d'une notice en tete du fichier d'exemple :
    "Les programmes ci-dessous sont donnes en guise d'exemple et
     n'ont donc pas fait l'objet d'une conception ou d'un
     developpement approfondis. Des bugs sont peut etre presents."
 - Suppression des messages d'erreur des fonctions rlc_ecritadinfos
   Au lieu d'afficher l'erreur, on affiche maintenant l'adresse
   vide (ex : "0.0.0.0"). C'est plus joli.
 - Ajout du module rlc_device permettant de gerer des devices.
 - Ajout du module rlc_config permettant d'obtenir des informations
   sur la configuration de la machine: cartes reseau, hostname, etc.
 - Ajout de divers exemples : affichage de la configuration, 
   conversion de ficher dos<->unix, etc.
 - Ajout de fonctions de comparaison d'adresse.
 - Ajout de la fonction rlc_purgeblanc qui permet de supprimer les 
   espaces, tabulation, 0x0D et 0X0A et debut et en fin de chaine.
 - Utilisation de la fonction rlc_purgeblanc dans diverses autres
   fonctions.

---------------------------------------------------------------------
Version 1.3 - 23/02/2000
 - Correction d'un bug dans rlc_snifffiltre car la fonction pcap_next
   retourne NULL pour chaque paquet non matche. Cela empechait
   la fonction rlc_snifffiltre de fonctionner. Ce bug etait apparu
   dans la version 1.2.
 - Suppression de l'inclusion de libpcap.a dans librlc.a.
   Cela oblige maintenant a specifier "-lpcap -lrlc" sur la ligne de
   commande de gcc. Cependant, on obtient une structure plus standard.
 - Menage dans les differents fichiers makefile et configure : 
   suppression des cas d'erreur, creation automatique pour une 
   livraison, etc.
 - Modification interne des fonctions rlc_ecritpaquet_xxx afin 
   d'uniformiser la procedure de fin d'affichage des paquets.

---------------------------------------------------------------------
Version 1.2 - 20/02/2000
 - Ajout du module rlc_paquet. Ce module permet de :
    - creer des paquets a l'aide d'entetes et de donnees
      (exemple : convertit entete_eth+entete_ip+entete_tcp+donnees
      en un tableau representant tout cela)
    - decomposer des paquets afin d'extraire les entetes et les 
      donnees (exemple : convertit un tableau representant un paquet
      en entete_eth+donnees_eth)
 - Renommage des modules et relocalisation des fonctions :
    rlc_adconv -> rlc_adresse et rlc_ecrit
    rlc_paquet
    rlc_spoof
    rlc_sniff
    rlc_affpaq -> rlc_ecrit
    rlc_cliser
    rlc_stdin
    rlc_fich   -> rlc_record
 - Creation des fonctions rlc_initpaquet_xxx permettant d'initialiser
   des paquets a l'aide de donnees aleatoires, hexa, texte ou mixtes
 - Modification de la syntaxe des chaines mixtes. Avant on avait :
     "bonjour" 04d F5a "cou""cou"
   Maintenant, il faut taper:
     'bonjour' 04d F5a 'cou''cou'
   En effet, utiliser le ' au lieu du " presente deux avantages :
    - en C, c'est plus simple d'ecrire
       "'bonjour' 04d F5a 'cou''cou'"
      que
       "\"bonjour\" 04d F5a \"cou\"\"cou\""
    - en ecrivant 'z', on comprend que l'on ecrit le caractere z
      Mais, en ecrivant "z", on pouvait mal comprendre, et croire
      que l'on voulait 'z' suivi de '\0' pour terminer le string
 - La fonction rlc_initheader_tcp met le bit "syn" a 0 et non
   plus a 1.
 - Les fonctions rlc_initpaquet_ipoptudpdata, ipopttcpdata, 
   ipopticmpdata ont ete modifiees. Le checksum n'est calcule que si
   le checksum vaut zero, c'est a dire si il n'a jamais ete calcule. 
   Cela peut servir pour envoyer sur le reseau des paquets dont le 
   checksum serait incorrect.
 - Utilisation des fonctions de decodage du module rlc_paquet
   dans les fonctions rlc_ecritpaquet_xxx 
 - Creation des types d'affichage et des profils d'affichage.
   Utilisation de ceux-ci en tant que parametre des fonctions
   affichant des donnees.
 - Creation des fonctions rlc_fich_litnumero et rlc_fich_litboucle
   qui permettent d'acceder a un paquet particulier du fichier de
   donnees ou de tous les parcourir.
 - Les fragments IP d'offset>0 sont affiches en tant que donnees
   (et non plus comme entete udp/tcp/icmp+donnees_udp/tcp/icmp)
 - Ajout du calcul automatique du checksumIP pour les fonctions
   rlc_initpaquet_ethip... car le noyau ne peut pas le faire.
   Le checksum n'est calcule que si il vaut zero.
 - Ajout de divers exemples.

---------------------------------------------------------------------
Version 1.1 - 06/02/2000
 - Ajout des messages d'erreur (errno et h_errno) dans la fonction
   rlc_ecriterr() afin d'indiquer la cause de l'erreur.
 - Ajout du commentaire suivant pour les fonctions rlc_sendraw_eth()
   et rlc_sendraw_ip() :
    Si le noyau est compile avec l'IP firewalling, la machine refuse
    d'emettre des paquets malformes (par exemple, tentative 
    d'ecrasement de l'entete tcp a l'aide de fragments). On obtient 
    alors une erreur lors de l'appel a la fonction sendto(). Il faut
    recompiler le noyau sans l'IP firewalling pour pouvoir emettre
    des paquets malformes.
 - Modification de la fonction d'affichage en dump afin de supprimer
   les '.' et '-' qui servaient de separateur. Ils ont ete remplaces 
   par deux espaces. Avant, on avait :
    72 6C 63 74.68 2C 20 32-2C 2C 30 78.00 2B 2B     rlcth, 2,,0x.++ 
   Maintenant, on a :
    72 6C 63 74  68 2C 20 32  2C 2C 30 78  00 2B 2B   rlcth, 2,,0x.++ 
   Cela va permettre de faciliter les copier-coller, car il n'y a 
   plus besoin de supprimer les '.' ou '-' pour passer les donnees
   a rlc_initpaquet_hexa() par exemple.
 - Ajout du module rlc_stdin. Ce module comporte des fonctions
   permettant de gerer les saisies clavier des utilisateurs :
   pression sur une touche, entier, caractere, chaine, chaine hexa,
   adresse ipt, adresse etht
 - Modification de rlc_sock_read() et rlc_sock_write() pour que les
   tailles soient du rlc_uint32 et non du rlc_uint16.
 - Creation des fonctions :
    rlc_verifbof_hs()
    rlc_verifbof_ips()
    rlc_verifbof_eths()
    rlc_verifbof_device()
    rlc_verifbof_paquet()
   Ces fonctions permettent de verifier les buffer overflow dans 
   les variables de type rlc_hs, rlc_ips, rlc_eths, rlc_device et
   rlc_paquet.
 - Utilisation des fonctions rlc_verifbof_xxx dans la librairie.
   Toutes les fonctions de la bibliotheque devraient etre protegees
   contre les buffer overflow. Les programmes corrects, crees avec la 
   bibliotheque rlc, peuvent donc etre suid root.
   Note : ce n'est pas encore le cas pour les programmes rlcex
          et rlctest, car ceux-ci n'ont pas ete ecrits afin que tous
          leurs parametres soient verifies : ce ne sont que des 
          exemple d'utilisation de la bib. Il ne faut pas les 
          mettre suid root. 
 - Modification du programme de test et des exemples afin de
   prendre en compte les modifications ci-dessus.

---------------------------------------------------------------------
Version 1.0 - 30/01/2000
 Premiere version publique.
