9  Práctica 03. Integración de las colas con prioridad en PDRouter

En la práctica 02 implemetamos colas con prioridad, usando las tramas de PDRouter, pero no llegamos a integrarlas en el router. Es lo que haremos ahora.

9.1 Práctica 301. Campos adicionales en Item

Tu profesor te habrá explicado la gestión del tiempo en Rust. Ahora ya podemos usar exactamente el struct que emplea PDRouter para la cola de paquetes, no solo incluye trama y prioridad, sino el interface por el que debe salir el datagrama y el instante en que fue encolado, lo que permitirá implementar una política contra la inanición.

pub struct QueueItem {
    pub frame: Frame,
    priority: u8,
    pub out_port: usize,
    instant: Instant,
}

Copia tu programa prac_202 en un fichero llamado prac_301.rs y modifícalo para que trabaje con esta estructura:

  • Al crear un item, habrá que añadir el campo out_port.

  • Al encolar un item, el programa le dará valor al campo instant.

  • Al mostrar la cola en pantalla, tendrá que verse estos nuevos dos campos. Ya sabes que instant es un valor que, aparentemente, no significa nada. Pero haz que se muestre igualmente.

9.2 Práctica 302. Creación y uso de un módulo

En este ejercicio partiremos de prac_301.rs y lo reescribiremos para dividirlo en dos ficheros:

  • ~/pst2/pdrouter/src/bin/priority_queue.rs

  • ~/pst2/pdrouter/src/bin/prac_302.rs

De forma que:

  • Todas las funciones excepto main y todas las estructuras de datos, (realmente solo una, el struct QueueItem) estén en un módulo, priority_queue.rs. Esto nos permitirá reutilizar este código en PDRouter.

  • La función main ahora esté en prac_302.rs, e invocará a las funciones que ahora están en priority_queue.rs.

Ten en cuenta que:

  • En Rust todo el código de un módulo es privado, a menos que lo hagas público.

  • Los módulos arp, eth, ipv4 y utils solo es necesario incluirlos en prac_302.rs.

  • El módulo frame es necesario tanto en priority_queue.rs como en prac_302.rs.

9.3 Práctica 303. Ejecución de una tarea durante cierto tiempo

Cuando la cola esté integrada en PDRouter:

  • El momento de insertar un elemento en la cola está claro: cada vez que una trama esté lista para enviarse, con su dirección MAC, se encolará.

  • ¿Cuando extraerlas y enviarlas? Para esto se pueden aplicar diversas políticas. Lo que hace PDRouter en su versión con cola con prioridad es, en el fichero stack.rs, añadir una función flush_send_queue que, al final de cada iteración del bucle principal, desencola unas cuantas tramas y las envía. ¿Cuántas exactamente? Las que le de tiempo. Tiempo fijado, en milisegundos, por la constante SEND_QUEUE_TIME_LIMIT.

Ahora escribirás un programa, independiente y muy sencillo, que haga precisamente eso: repetir una tarea y detenerse al cabo de cierto tiempo.

Escribe un programa según esta especifiación:

  • Estará en el fichero ~/pst2/pdrouter/src/bin/prac_303.rs

  • Tendrá en sus primeras líneas una constante TIMEOUT que contendrá un número entero, que interpretaremos como milisegundos. Por ejemplo 500.

  • El programa hará alguna tarea sencilla, por ejemplo escribir repetidamente un caracter cualquiera en pantalla, durante timeout milisegundos. Para ello, usa un bucle y haz el programa salga de él cuando el tiempo transcurrido sea mayor a timeout.

  • El programa mostrará el tiempo transcurrido realmente. Que debería ser ligeramente superior a este timeout.

9.4 Integración de tu código en PDRouter.

  1. En ~/pst2/pdrouter/src/stack_v_prior_queue.rs encontrarás la versión de stack.rs preparada para trabajar con la cola con prioridades. Borra el stack.rs anterior, y cambia el nombre a stack_v_prior_queue.rs para que ahora se llame stack.rs.

  2. Personaliza PDRouter para que su mensaje sea algo así:

    PDRouter v1.2 de Juan García. Escribe ‘help’ para ver los comandos disponibles.

  3. Añade en main.rs esta línea para que PDRouter trabaje con tu código:

    mod priority_queue;

  4. Compila todo y copia el ejecutable a la carpeta shared del lab Kathará. Para ello, puedes invocar al siguiente script:

    ~/pst2/pdrouter/compila_copia_pdr.sh

  5. Comprueba que el lab, usando esta nueva versión de PDRouter, sigue superando todos los tests