Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Desarrollo de una Herramienta Software para el Acceso a Redes TCP/IP a través de la Red Telefónica Conmutada

Última Actualización: 30 de Junio de 1.996 - Domingo

Apéndice B:
La Librería Común

La librería común está compuesta por diversas rutinas y tipos de datos utilizados en varios módulos. No se incluye dentro del módulo de portabilidad porque no necesita ser modificada para adaptarla a una nueva arquitectura. Se compone de tipos de datos y funciones.


Tipos de Datos


estado

Este tipo enumerado se utiliza como valor de retorno en multitud de funciones:

  • OK

    Indica que no ha habido ningún problema durante el procesado de la función.

  • ERR_EN_USO

    Indica que el puerto, la dirección IP, el canal, etc., que queremos crear ya existe.

  • ERR_INVALID

    Informa de que uno de los parámetros especificados no es válido. Por ejemplo, petición de información de control de flujo sobre una dirección IP que no es nuestra.

  • ERR_OVERFLOW

    Se retorna este valor cuando se intenta crear una nueva entrada en alguna de las tablas internas y no hay suficiente sitio libre para ella.

  • FLUJO_LLENO

    Si se solicita información sobre el flujo de algún canal, una de nuestras direcciones IP, conexiones TCP, etc., y éste está cerrado, se devuelve este valor.


Funciones y Macros


TO_32(a,b,c,d);
TO_IP(a,b,c,d);

Estas macros construyen un valor de 32 bits a partir de los cuatro bytes 'a', 'b', 'c' y 'd'. 'a' es el byte de mayor peso, mientras que 'd' es el byte de menor peso. Son equivalentes.


pmbuf concatena_memoria(pmbuf bloque);

Esta rutina fusiona en un sólo MBUF aislado el contenido de la cadena de MBUF's que se le pasa como parámetro. No toca el original. Si el tamaño total de los datos supera MAX_BLOQUE (1024 bytes, en la implementación actual), se produce un error fatal en tiempo de ejecución.


uint16 calcula_checksum(pmbuf bloque);

Esta rutina calcula la suma de control IP, UDP y TCP de los datos contenidos en una cadena de MBUF's. Todos los MBUF's, salvo el último, deben contener un número par de bytes.


void inic_tablas_locales(pmbuf POINTER tablas,puint16 tablas_ocupado,
  uint8 max);

Esta rutina inicializa la tabla de datos locales a un módulo. Dichas tablas pueden contener información muy variada, como los TCB's (Transmission Control Block) de la capa TCP, los búfferes de la capa física, la información de rutado del nivel IP, etc. Esta rutina no se utiliza NUNCA de forma directa, sino que se invoca a través del macro:


  inic_tablas_locales()

Para poder ejecutar la rutina hay que declarar el símbolo de preprocesador "MAX_TABLAS" con el número de tablas que necesitamos menos uno. También debemos definir, en algún momento, la matriz


  static uint8 tamanhos[MAX_TABLAS+1]={...};

donde los puntos suspensivos deben sustituirse por los tamaños en bytes de cada tipo de estructura que deseemos almacenar.


pvoid gestion_tablas(pmbuf tablas,puint16 tablas_ocupado,uint8 tamanhos[],
  uint8 max,uint8 indice,uint32 valor,uint8 tipo_gestion);

Esta es la rutina que nos permite gestionar las tablas creadas con "inic_tablas_locales". Tampoco se utiliza directamente, sino que se emplea el macro:


  gestion_tablas(a,b,c);

donde 'a' es el número de la tabla local a la que queremos acceder, 'b' es el valor a buscar o a insertar, según el caso, y 'c' es la operación a efectuar. Las operaciones permitidas son:

  • BUSCAR

    Se busca el valor de 32 bits 'b' en los primeros 32 bits de todas las entradas de la tabla local especificada por 'a'. Si se encuentra se devuelve un puntero "pvoid" al primer elemento de la estructura. En caso contrario se retorna un NULL.

  • BORRAR

    Se busca el valor de 32 bits 'b' en los primeros 32 bits de todas las entradas de la tabla local especificada por 'a'. Si se encuentra, se elimina toda la estructura asociada. Siempre devuelve el valor NULL.

  • INSERTAR

    Devuelve un puntero que puede utilizarse para almacenar una nueva estructura en la tabla local indicada por 'a'. El parámetro 'b' es ignorado. La inserción se efectúa al final de la tabla, y si no hay sitio suficiente se retorna NULL.

  • PRIMERO

    Retorna un puntero a la primera estructura almacenada en la tabla local 'a'. El parámetro 'b' se ignora. Si la tabla está vacía devuelve NULL.

  • SIGUIENTE

    Con esta opción se asume que el parámetro 'b' contiene un puntero a una estructura contenida en la tabla local 'a'. Se retorna la dirección de la siguiente estructura o NULL si hemos llegado al final.

    Insertar o eliminar elementos de cualquier tabla local modifica la estructura de todas ellas (todas las locales a ese módulo), por lo que es imprescindible volver a iniciar el ciclo con "PRIMERO".


pmbuf memoria_temporal(uint16 tamanho);

Gracias a esta rutina se alivia el hecho de que el módulo de gestión de memoria tiene una granularidad de MAX_BLOQUE bytes. "tamanho" indica el número de bytes que deseamos y la rutina nos entrega un puntero al MBUF correspondiente.

Como su nombre indica, la memoria solicitada por este medio no debe ser empleada con fines permanentes (por ejemplo, para almacenar información a mantener a lo largo de toda la vida de una conexión). Ello es debido a que tiende a fragmentar la memoria útil de una forma incompatible con el esquema de recogida de basuras implementado.


void debug(puint8 cadena,...);

Se trata de una rutina genérica de impresión, similar a "printf" pero mucho más pequeña y rápida. "cadena" contiene la cadena a imprimir, que puede contener las siguientes secuencias de escape:

  • %x

    Requiere un parámetro de 32 bits que será impreso como una secuencia ASCII de cuatro letras. Por ejemplo, el valor 1094861636 = 65*16777216 + 66*65536 + 67*256+68 se imprimirá como "ABCD" (sin las comillas). Suele emplearse para visualizar nombres de canales y dispositivos.

  • %s

    El parámetro es un puntero a una cadena (puint8), que será insertada en el lugar correspondiente.

  • %i

    El parámetro debe ser un entero sin signo de 16 bits (uint16), a imprimir en notación decimal.

  • %l

    El parámetro debe ser un entero sin signo de 32 bits (uint32), a imprimir en notación decimal.

  • %L

    El parámetro debe ser un entero sin signo de 32 bits (uint32), a imprimir en notación "punto". Se utiliza, normalmente, para visualizar direcciones IP.


Bibliografía


[RFC1071]   RFC1071: "Computing the Internet checksum"
            Robert Braden
            David Borman
            Craig Partridge
            Septiembre 1.988

[RFC1141]   RFC1141: "Incremental Updating of the Internet
            Checksum"
            T. Mallory
            A. Kullberg
            Enero 1.990

[RFC1146]   RFC1146: "TCP Alternate Checksum Options"
            Johnny Zweig
            Craig Partridge
            Marzo 1.990

[RFC1624]   RFC1624: "Computation of the Internet Checksum via
            Incremental Update"
            A. Rijsinghani
            Mayo 1.994

[RFC1936]   RFC1936: "Implementing the Internet Checksum in
            Hardware"
            J. Touch
            B.Parham
            Abril 1.996



Python Zope ©1996 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS