feat(renaser): Fase 19 — voz del userspace hacia la red (pregon)
Tres capacidades nuevas en wasm/env (12-14): - sys_net_mac(salida) -> i32: escribe los seis bytes del MAC del dispositivo. 0 OK, -1 si no hay red. - sys_net_enviar(ptr, len) -> i32: envia un frame Ethernet crudo. Valida rango contra la memoria lineal del modulo. - sys_net_recibir(salida, capacidad) -> i32: drena UN paquete por llamada hacia el buffer del modulo. Devuelve los bytes copiados, 0 si nada pendiente, codigos negativos diagnosticos. Añadida red::recibir_en(buf) -> usize como su contraparte del driver: gemelo cooperativo de drenar_rx que aterriza en un buffer del usuario. App nueva pregon (apps/pregon/, 4.2 KiB WASM): lienzo 480x160, tipografia 8x8 (font8x8) escalada x2. Al init pide su MAC y anuncia su presencia con un broadcast Ethernet — destino FF:FF:FF:FF:FF:FF, EtherType experimental 0x88B5, payload ASCII 'renaser :: hola desde mi red'. En cada tick drena un paquete con sys_net_recibir y muestra el titulo, el MAC propio, las cuentas TX/RX, y los datos del ultimo frame entrante. GENESIS 8 -> 9 apps (pregon en posicion 2 detras de bitacora); CELDA_TASKBAR_ANCHO 130 -> 116 px para que las nueve pestañas + lanzador + reloj caben holgadas en 1280 px. tarea_red del kernel ya no drena RX (la cola pertenece al userspace), conserva solo el envio del ARP de prueba al arrancar. Verificada en QEMU con -object filter-dump. El pcap captura tres frames en orden: (1) broadcast 88B5 de pregon con su payload, (2) ARP request del kernel, (3) ARP reply del gateway 52:55:0a:00:02:02. La consola anuncia 'manifiesto :: 9 apps nacidas del grafo'. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -1156,3 +1156,69 @@ el kernel abre ahora una boca y una oreja al exterior: una tarjeta de red.
|
||||
El src del paquete entrante codifica la IP del gateway dentro del MAC
|
||||
(`52:55:0a:00:02:02` = QEMU prefix + `10.0.2.2`): la respuesta ARP es
|
||||
legítima. Renaser ya habla con la red.
|
||||
|
||||
---
|
||||
|
||||
## Fase 19 — Voz del userspace hacia la red — 2026-05-23
|
||||
|
||||
La Fase 18 hizo que el kernel hablara con la red. La Fase 19 le da la
|
||||
misma capacidad a los apps: tres capacidades nuevas (`sys_net_mac`,
|
||||
`sys_net_enviar`, `sys_net_recibir`) y una primera app que las usa.
|
||||
|
||||
### Añadido
|
||||
- **`drivers::red::recibir_en(buf) -> usize`** — recibe UN paquete por
|
||||
llamada, lo copia al buffer del llamante, recicla el descriptor a la
|
||||
cola RX. Devuelve 0 si no hay paquete pendiente. El gemelo cooperativo
|
||||
de `drenar_rx`, pensado para la interfaz que el host expone a los apps.
|
||||
- **Tres capacidades nuevas en `wasm/env`** (índices 12, 13, 14):
|
||||
- `sys_net_mac(salida: u32) -> i32` — escribe seis bytes con la MAC del
|
||||
dispositivo en `(salida, 6)`. Devuelve `0` OK o `-1` si no hay red.
|
||||
- `sys_net_enviar(ptr: u32, len: u32) -> i32` — envía el frame Ethernet
|
||||
crudo. Devuelve `0` OK, `-1` red caída, `-2` longitud inválida,
|
||||
`-3` rango fuera de la memoria lineal.
|
||||
- `sys_net_recibir(salida: u32, capacidad: u32) -> i32` — drena UN
|
||||
paquete (si hay) hacia `(salida, capacidad)`. Devuelve los bytes
|
||||
copiados, `0` si nada pendiente, `-1` si no hay red, `-2` si la
|
||||
capacidad excede la memoria lineal.
|
||||
Todas validan `rango()` contra la memoria del módulo y registran
|
||||
diagnóstico por COM1 si falla la validación.
|
||||
- **App `pregon` (`apps/pregon/`, 4.2 KiB WASM)** — la primera voz del
|
||||
userspace hacia la red. Al arrancar:
|
||||
1. Pide su MAC al host vía `sys_net_mac`.
|
||||
2. Si la tiene, anuncia su presencia con un broadcast Ethernet
|
||||
(destino `FF:FF:FF:FF:FF:FF`, EtherType experimental `0x88B5`,
|
||||
payload ASCII `"renaser :: hola desde mi red"` — 42 bytes en el cable).
|
||||
En cada `tick` drena un paquete con `sys_net_recibir` y pinta:
|
||||
el título, el MAC propio, las cuentas TX/RX, y los datos del último
|
||||
frame entrante (tamaño, EtherType, src MAC) — todo en tipografía 8×8
|
||||
embebida (crate `font8x8`), escalada x2 sobre un lienzo 480×160 índigo.
|
||||
- **`pregon` en el manifiesto de genesis** (`boot/src/main.rs`): la novena
|
||||
app, posición 2 (detrás de `bitacora`). El disco se siembra ahora con
|
||||
9 entradas; el kernel reporta `manifiesto :: 9 apps nacidas del grafo`.
|
||||
|
||||
### Cambiado
|
||||
- **`tarea_red`** del kernel ya no drena la cola RX: la posesión de la
|
||||
cola pasa al userspace vía `sys_net_recibir`. La tarea conserva el
|
||||
envío del ARP de prueba al gateway en cuanto el dispositivo se
|
||||
estabiliza, y termina.
|
||||
- **`CELDA_TASKBAR_ANCHO`** baja de 130 a 116 px para que las nueve
|
||||
pestañas + lanzador + reloj caben holgadas en 1280 px.
|
||||
- **`ETHER_TYPE_RENASER`** del driver pasa a `#[allow(dead_code)]` —
|
||||
ahora vive en el userspace (en `pregon`); el kernel la conserva como
|
||||
referencia para futuras pilas nativas.
|
||||
|
||||
### Verificado
|
||||
- QEMU headless con `-object filter-dump,id=fd,netdev=net0,file=/tmp/renaser.pcap`.
|
||||
El pcap captura tres frames en orden:
|
||||
```
|
||||
#1 incl=42 dst=ff:ff:ff:ff:ff:ff src=52:54:00:12:34:56 etype=0x88b5
|
||||
payload: 'renaser :: hola desde mi red'
|
||||
#2 incl=42 dst=ff:ff:ff:ff:ff:ff src=52:54:00:12:34:56 etype=0x0806 (ARP REQ)
|
||||
#3 incl=64 dst=52:54:00:12:34:56 src=52:55:0a:00:02:02 etype=0x0806 (ARP REP)
|
||||
```
|
||||
El primero es `pregon`; el segundo el kernel; el tercero es el gateway
|
||||
respondiéndonos — el ciclo completo de salida y entrada en una sola
|
||||
fase.
|
||||
- Captura de pantalla: la ventana `pregon :: voz hacia la red` aparece
|
||||
teselada, su pestaña sale en la barra de tareas entre `bitacora` y
|
||||
`tonada`, y la consola anuncia `manifiesto :: 9 apps nacidas del grafo`.
|
||||
|
||||
Reference in New Issue
Block a user