Digipeater#
El componente digirepeater (components/digirepeater/) implementa el
digipeating APRS con reescritura de ruta. Su único punto de entrada,
digiProcess(), se llama desde el despacho de RX cuando g_config.digi_en
está activo. Lee el indicativo/SSID del digipeater de g_config.digi_mycall /
digi_ssid, de modo que la página Digi de la administración web es la única
fuente de verdad.
El contrato de reescritura#
digiProcess(ax25_msg_t *packet) reescribe la ruta en el sitio y devuelve
uno de tres valores:
Retorno |
Significado |
|---|---|
|
No repetir (descartar / no es para nosotros / ya retransmitido / mal formado). |
|
Repetir tal cual — la ruta ya lleva nuestro indicativo usado (p. ej. un
|
|
Repetir con ruta modificada — el llamador recodifica la cabecera reescrita y la transmite por RF. |
Cuando digiProcess() devuelve 2, el despacho de aprs_service.c
re-renderiza la trama a TNC2, llama a aprs_service_send_tnc2() y, si tiene
éxito, incrementa el contador digi del panel y registra una entrada de
tráfico DIGI.
La tabla de alias#
El digipeater no reconoce alias propios. Cada alias que atiende es una fila de
g_config.digi_alias, editada en Alias de Ruta n-N de la página Digi, y
la fila dice cómo se repite ese alias. Eso es lo que convierte las convenciones
locales del Nuevo Paradigma n-N — un WIDE1-1 de relleno, un WIDE2-2 de
dos saltos, un SSn-N regional — en un ajuste del operador y no en una
constante del firmware.
Campo |
Rango |
Significado |
|---|---|---|
Alias |
6 caracteres |
El indicativo del repetidor sin su SSID; el SSID es el contador de
saltos N y se maneja aparte. |
N máximo |
1–7 |
El mayor contador de saltos que se atiende para este alias. Un N mayor recibido al aire queda atrapado. |
Modo |
Apagado / Traza / Inundación |
Traza inserta el indicativo de esta estación delante del alias restante y lo marca como usado, de modo que cada salto de la ruta puede atribuirse después. Inundación decrementa el contador de saltos y no deja constancia de quién lo hizo. Apagado ignora la fila por completo. |
Las filas se consultan en orden de tabla y gana la primera coincidencia, así
que un alias específico colocado encima de una fila comodín conserva su propio
límite de saltos. La tabla de fábrica es WIDE1 (1 salto), WIDE2
(2 saltos) y WIDE# (2 saltos), todas en modo traza, con la cuarta fila
libre para un alias regional.
WIDEn-N está obligado a trazar. El paradigma lo movió del mecanismo de
inundación no rastreable al de trazado precisamente para que cada salto de cada
ruta WIDEn-N sea identificable — por eso Inundación solo es apropiado
para un alias regional que el operador decida usar sin traza.
RELAY, GATE, ECHO y TRACEn-N no están incorporados: fueron
abandonados como rutas y ya no están en el firmware. Un operador que aún
necesite alguno para un vecino heredado lo agrega como una fila más.
Atrapado y el rol de relleno#
Un contador de saltos por encima del N máximo de la fila coincidente queda
atrapado, y Saltos por encima del N máximo elige cómo: Limitar al N máximo
(el valor por omisión) lo baja al límite y repite la trama, Descartar la
trama la rechaza de plano y cuenta DROP_DIGI_N_TRAPPED. Limitar mantiene
la trama en movimiento y a la vez impide que inunde más allá de lo que permiten
las condiciones locales, y por eso es el valor por omisión; cada salto adicional
multiplica por unas tres veces la carga que una trama impone a la red.
Digipetidor de relleno (un solo salto) restringe la estación a las filas cuyo límite de saltos es 1. Ese es todo el rol de relleno: levanta el tráfico de los vecinos que no alcanzan la red troncal directamente y deja todo lo ruteado para más saltos a los digipeaters amplios, que es lo que evita que una estación doméstica en un valle agregue una copia redundante de cada paquete de la región.
Dos tramas se rechazan antes de consultar la tabla: la que ya lleva el indicativo de esta estación marcado como usado, sin importar lo que aún tenga su ruta, y la que coincide con la ventana de supresión de duplicados de abajo.
Digipeteo preventivo#
Por omisión el digipeater solo mira la primera dirección sin usar de la ruta.
Rutas explícitas que nombran a esta estación en la página Digi
(digi_preempt) lo amplía a la conducta que describe
preemptive-digipeating.txt:
la ruta se recorre desde su primera dirección sin usar hasta el final buscando
alguna de las identidades propias de esta estación, y una coincidencia hallada
más adelante reclama la trama de inmediato en vez de esperar a que las
direcciones que están delante sean atendidas por los digipeaters que nombran.
Eso es lo que hace funcionar una ruta explícita como
WIDE1-1,CITYA,WIDE2-1,CITYB. Cada estación listada en ella repite la trama
cuando le llega el turno, las direcciones que quedan detrás de la coincidencia
siguen vivas, y el canal lleva una copia por salto nombrado en vez del
abanico exponencial de una inundación WIDEn-N. Un digipeater que nunca
escanea más allá de la primera dirección sin usar simplemente queda fuera de
esa ruta.
El ajuste está apagado por omisión, porque encenderlo cambia por qué estaciones responde este digipeater.
Valor |
Conducta |
|---|---|
Apagado (solo la primera dirección sin usar) |
Sin escaneo. La trama se rutea exactamente como deciden la tabla de alias y las comprobaciones anteriores. |
Atender ya, conservando las direcciones salteadas |
Cada dirección desde la primera sin usar hasta la coincidencia inclusive queda marcada como usada, y se enciende el bit reservado bajo de su octeto de SSID. La ruta sigue mostrando el camino que pidió la estación originante. |
Atender ya, descartando las direcciones salteadas |
Las direcciones que están delante de la coincidencia se eliminan y la coincidencia pasa a encabezar la ruta, así la trama sale llevando solo lo que queda por hacer. |
En ambos modos la dirección coincidente se reemplaza por el indicativo de esta
estación, marcado como usado, igual que en un salto n-N trazado, y todo lo
que queda detrás se deja intacto. Una coincidencia preventiva es una
repetición, no un descarte: cuenta en la cifra digi principal y no tiene
razón de descarte propia.
Qué puede reclamar el escaneo#
Solo una identidad fija: un nombre que representa a esta estación y a nada más:
el indicativo y SSID propios de esta estación, o
una fila de alias cuyo nombre no contenga el comodín
#ni termine en un dígito decimal, y solo cuando la dirección recibida lleve SSID 0.
Esa regla hace cumplir las dos exclusiones que enuncia la propuesta. Un alias
genérico XXXXn-N nunca se reclama preventivamente — saltar hasta un
WIDEn o un TRACEn más adelante repetiría una petición de inundación que
la red espera que viaje salto a salto — y tampoco se reclama un alias escrito
con contador de saltos, que es una petición de ruteo n-N por derecho
propio. Filas como WIDE#, WIDE1 y TRACE7 quedan excluidas por
construcción, mientras que una fila como CITYA es elegible.
Una coincidencia en la primera dirección sin usar no es preventiva —no se
saltea nada—, así que se deja a la lógica de ruta ordinaria. Eso es lo que
mantiene un primer salto explícito, y toda petición n-N genérica,
comportándose exactamente igual que con el escaneo apagado.
Nota
La trama que esta estación devuelve al aire se recodifica desde su representación TNC2, que expresa una dirección solo como indicativo, SSID y marca de usada. Por eso el bit reservado bajo que enciende el modo de marcado se mantiene en la trama decodificada pero no llega al canal.
Ruteo heredado por SSID de destino#
Antes del Nuevo Paradigma n-N, algunos TNC llevaban el contador de saltos en el
nibble SSID de la dirección de destino AX.25 y no en la ruta. Digipetir por
SSID de destino (heredado) en la página Digi (digi_dest_ssid_en) habilita
esa convención, y viene apagado por omisión.
Encendido, una trama cuyo SSID de destino sea de 1 a 7 se repite por ese solo
SSID: el contador se decrementa y el indicativo de esta estación se inserta en
la ruta marcado como usado, así el salto sigue siendo atribuible después. Esa
decisión se toma antes que la tabla de alias, que es justamente por lo que no
es el valor por omisión: una trama que lleve a la vez un SSID de destino y una
ruta WIDEn-N explícita se repetiría por el SSID y la ruta que pidió la
estación de origen nunca se leería.
Apagado, o cuando la convención no rutea una trama en particular (un SSID de destino de 0, o de 8 a 15, que pertenece a la dirección de destino misma; una ruta que ya lleva el indicativo de esta estación marcado como usado; una ruta ya llena), la trama llega a la tabla de alias tal como se recibió, SSID de destino incluido.
Supresión de duplicados#
Antes de cualquier trabajo sobre la ruta, el digipeater comprueba la trama con
isDuplicatePacketScoped(packet, DUP_SCOPE_DIGI). La clave se construye solo
con la dirección de origen y el campo de información — nunca con la ruta — así
que todas las copias de una misma transmisión producen el mismo hash sin
importar por dónde llegaron. Una trama que coincide con otra repetida dentro de
g_config.dup_cache_timeout_ms (30 s por defecto, editable en la página
IGate) se descarta, que es lo que evita que dos
digipeaters dentro de la cobertura mutua se reboten la misma trama, y lo que
absorbe un eco de RF de una trama que esta estación acaba de repetir.
La caché se comparte con el IGate pero las ventanas no: cada entrada lleva el ámbito que la insertó y solo coincide con búsquedas de ese mismo ámbito. Ambos consumidores ven las mismas tramas desde el mismo despacho de RX, y el digipeater corre primero, así que una única ventana compartida haría que consumiera todas las tramas y el IGate las tratara a todas como duplicadas.
El interruptor Habilitar supresión de duplicados de la página IGate
(g_config.dup_cache_en, activado por defecto) desactiva esta comprobación
para el digipeater y el IGate a la vez. Desactivado, ninguna trama se descarta
nunca como DROP_DIGI_DUPLICATE; la prueba del indicativo propio y la tabla
de alias pasan a ser la única protección contra dos digipeaters que se
repitan mutuamente las copias, así que conviene dejarlo activado siempre que
haya otro digipeater al alcance.
Contadores#
El digipeater no lleva contadores propios. Todo lo que el operador puede ver
sobre él viene de dos lugares que avanzan estén o no activos digi_en e
igate_en:
Cifra |
De dónde sale |
|---|---|
Contador |
|
Cada descarte y trama mal formada |
|
Nota
Los motivos DROP_DIGI_* se cuentan dentro de digiProcess(), así que
solo avanzan mientras el digipeater corre. Las tramas descartadas antes del
despacho, o de salida hacia RF, se cuentan a nivel de servicio en
aprs_service.c y aparecen esté o no habilitada cualquier función.