Como he introducido varios fragmentos donde se mostraba el trafico IR, es absurdo no poner un apéndice un poco mas técnico para los interesados en analizar las diferentes comunicaciones....
Lo primero decir que las estaciones que intervienen en la comunicación se pueden poner en dos modos.
NRM - Normal Response Mode NDM - Normal Disconect Mode
Mas o menos sería en modo de conectado y en modo de desconectado.
La secuenciación de las tramas se realiza con dos registros: NS y NR. De esta manera es posible seguir un orden en el envío de las diferentes tramas. Estos dos registros están en el campo de control de la trama (Véase mas adelante).
La secuenciación es bastante sencilla.
NS lleva un contador de las tramas que va de 0 a 7. NR Envía qué trama se espera recibir.
Hay secuencias DIFERENTES para las tramas de tipo cmd (que mas adelante explicamos para que se usan) y las de tipo rsp (que tambien están explicadas mas adelante).
De esta forma por ejemplo vemos que, independientemente del resto de información de la trama, este ejemplo se explica de la siguiente manera:
19:17:56.783218 i:cmd > ca=1e pf=1 nr=2 ns=3 LM slsap=12 dlsap=00 CONN_CMD (6) 1f5680120100 . V . . . .
Esta es la trama 3 en modo CMD y espero la 2. Seguramente la 2 se perdería.
19:17:56.792779 i:rsp < ca=1e pf=1 nr=4 ns=2 LM slsap=00 dlsap=12 CONN_RSP (6) 1e9492008100 . . . . . .
Esta es la trama 2 (la que queríamos) y espero la 4.
19:17:56.792794 i:cmd > ca=1e pf=1 nr=3 ns=4 LM slsap=12 dlsap=00 GET_VALUE_BY_CLASS: "IrDA:IrCOMM" "IrDA:TinyTP:LsapSel" (37) 1f780012840b497244413a4972434f4d4d13497244413a54696e7954503a4c73 . x . . . . I r D A : I r C O M M . I r D A : T i n y T P : L s
Esta es la trama 4 y vuelvo a esperar la 3, pero esta vez es de tipo RSP.
19:17:56.807427 i:rsp < ca=1e pf=1 nr=5 ns=3 LM slsap=00 dlsap=12 GET_VALUE_BY_CLASS: Success Integer: 04 (15) 1eb612008400000100040100000004 . . . . . . . . . . . . . . .
Aquí tienes la 3 y espero la 5
19:17:56.807438 i:cmd > ca=1e pf=1 nr=4 ns=5 LM slsap=12 dlsap=00 DISC (6) 1f9a80120201 . . . . . .
Esta es la 5 y espero la 4 pero RSP. Y así todo el rato.
Cuando llega a 7, se confirma y se empieza. Ejemplo:
19:17:56.834072 i:cmd > ca=1e pf=1 nr=5 ns=7 LM slsap=10 dlsap=04 TTP credits=0 (24) 1fbe0410001200010410040000258011011312010420010c . . . . . . . . . . . . . % . . . . . . . . . 19:17:56.843203 rr:rsp < ca=1e pf=1 nr=0 (2) 1e11 . . 19:17:56.843211 rr:cmd > ca=1e pf=1 nr=5 (2) 1fb1 . . 19:17:56.855087 i:rsp < ca=1e pf=1 nr=0 ns=5 LM slsap=04 dlsap=10 TTP credits=1 (32) 1e1a1004011a010101100400004b0011010312013f1302111314021311210130 . . . . . . . . . . . . . K . . . . . . ? . . . . . . . . ! . 0
Vamos pues a adentrarnos mas en lo que es el contenido de cada trama.
La trama de IrLAP esta formada por un campo address, un campo control y un campo para información.
Los dos primeros tienen una tamaño de 8 bits mientras el ultimo debe ser multiplo de 8.
|------------|--------------|------------............|
Address Control Informacion
8 bits 8 bits N*8 bits
En lo que es el campo address, el bit de menor peso es el conocido como C/R. Sirve para diferenciar si la trama es un cmd (command) o una rsp (response) Dicho vulgarmente, es para saber si es una trama de petición/comando o si es una trama de contestación/respuesta precisamente a esa petición/comando.
C/R=1 cmd C/R=0 rsp
00000000= NULL conection 11111111= Broadcast
El resto son direcciones normales
En el campo control de 8 bits encontramos funciones muy importantes. Por ejemplo el 4º bit es el de P/F.
Bit P/F (Poll/Final): En una comunicación tenemos siempre el que pregunta y el que responde. En lenguaje mas técnico hablamos de la estación primaria (primary) y de la secundaria (secondary). Cuando el bit P/F=1 en la estación primaria entonces es POLL (P). Mientras que si P/F=1 en la secundaria entonces es FINAL (F). POLL exige a la estación secundaria una respuesta o serie de respuestas. Cuando es FINAL entonces es porque es la respuesta o fin de respuestas a una solicitud (POLL). Todo esto nos sirve para saber cuando un paquete es respuesta de otro y no hacernos la picha un lio.
Despues de detenernos en la particularidad del bit P/F, hay que decir que encontramos tres tipos de tramas según su campo de control:
U - Unnumered Format S - Supervisor I - Information Format
Vamos uno por uno:
Es usado para la conexión y desconexión de la comunicación, reportar errores y es posible transferir información en una trama de tipo 'U' cuando la localización de los datos de una secuencia no está comprobada. Vamos, que no se tiene ni puta idea ni se reconoce de qué viene o a donde va lo que estamos enviado. Estas tramas son las se utilizan cuando se reconoce por primera vez un dispositivo.
El famoso:
19:17:56.046160 xid:cmd 1a6a9e08 > ffffffff S=6 s=0 (14) ff3f01089e6a1affffffff010000 . ? . . . j . . . . . . . . 19:17:56.136126 xid:cmd 1a6a9e08 > ffffffff S=6 s=1 (14) ff3f01089e6a1affffffff010100 . ? . . . j . . . . . . . . 19:17:56.226120 xid:cmd 1a6a9e08 > ffffffff S=6 s=2 (14) ff3f01089e6a1affffffff010200 . ? . . . j . . . . . . . . 19:17:56.316120 xid:cmd 1a6a9e08 > ffffffff S=6 s=3 (14) ff3f01089e6a1affffffff010300 . ? . . . j . . . . . . . . 19:17:56.400635 xid:rsp 1a6a9e08 < ab580000 S=6 s=3 Nokia 7110 hint=b125 [ PnP Modem Fax Telephony IrCOMM IrOBEX ] (27) febf01000058ab089e6a1a010300b125004e6f6b69612037313130 . . . . . X . . . j . . . . . % . N o k i a 7 1 1 0
son tramas de tipo U. Dicho de otra manera, los XID son tramas de tipo U según su campo de control.
Si os dais cuenta, se cumplen dos cosas. La primera es que está buscando un dispositivo y la segunda es que no tenemos ni puta idea de quien recibe la solicitud.
Ya que estamos os explico los tipos de tramas U (Unnumered Format).
XID (Exchange station IDentification):
Es usado para descubrir dispositivos y para cuando hay conflictos con direcciones. Sirven tanto como solicitud como para respuesta. Lógicamente, la diferencia está en que en su campo address las de solicitud (cmd) tendrán el bit de C/R=1 y las de respuesta C/R=0. Véase el ejemplo anterior.
La estructura de la trama sería:
struct xid_frame { guint8 caddr; /* Connection address */ guint8 control; guint8 ident; /* Should always be XID_FORMAT */ guint32 saddr; /* Source device address */ guint32 daddr; /* Destination device address */ guint8 flags; /* Discovery flags */ guint8 slotnr; guint8 version; guint8 discovery_info[0]; } __attribute__((packed));
SNRM (Set Normal Response Mode):
Este control es usado para establecer o reiniciar una conexión.
Cuando estamos en medio de una conexión entre dispositivos, la estacion que lo
envía (la trama SNRM) se convierte en primaria, mientras que la que lo contesta
es la secundaria. Así distinguimos quién llama a quién.
El CAMPO ADDRESS de la trama del SNRM cuando se está realizando la conexión
esta colocado todo a 1. Dicho de otra forma, es una petición de difisión con
el C/R=1, o sea, como solicitud.
El CAMPO ADDRESS de la la trama del SNRM en una solicitud de desconexión que
lleva la direccion del dispositivo a desconectar.
El CAMPO INFORMACIÓN de la trama SNRM cuando se está estableciendo la conexión
lleva la dirección de origen y destino y los parámetros para la negociación.
En la desconexión el CAMPO INFORMACIÓN no contiene nada.
La estructura sería:
struct snrm_frame { guint8 caddr; guint8 control; guint32 saddr; guint32 daddr; guint8 ncaddr; guint8 params[0]; } __attribute__((packed));
UA (Unnumered Acknowledgmen):
Es la respuesta a tramas SNRM y DISC. Sirven para confirmar ambas tramas.
Ejemplo:
19:17:56.601954 snrm:cmd ca=fe pf=1 1a6a9e08 > ab580000 new-ca=1e (33) ff93089e6a1a000058ab1e0102fe0182010183013f84017f8501ff8601070801 . . . . j . . . X . . . . . . . . . . . ? . . . . . . . . . . . 19:17:56.741781 ua:rsp ca=1e pf=1 1a6a9e08 < ab580000 (31) 1e73000058ab089e6a1a01013e8201018301028401018501fc860107080107 . s . . X . . . j . . . > . . . . . . . . . . . . . . . . . .
Estructura:
struct ua_frame { guint8 caddr; guint8 control; guint32 saddr; /* Source device address */ guint32 daddr; /* Dest device address */ guint8 params[0]; } __attribute__((packed));
TEST:
Pues eso, sirve para, sin ir mas lejos, hacer comprobaciones. Sería el supuesto PING en el stack TCP/IP. La distinción entre cmd y rsp lo de siempre, el bit C/R.
Ejemplo:
21:01:33.414173 test:cmd ca=0xfe pf=1 00b9fab2 > ffffffff (32) fff3b2fab900ffffffff0600ad95ed3bcf510600000102030405060708090a0b . . . . . . . . . . . . . . . ; . Q . . . . . . . . . . . . . . 21:01:33.517694 test:rsp ca=0xfe pf=1 a2309075 < 00b9fab2 (32) fef3759030a2b2fab9000600ad95ed3bcf510600000102030405060708090a0b . . u . 0 . . . . . . . . . . ; . Q . . . . . . . . . . . . . .
Estructura:
struct test_frame { guint8 caddr; /* Connection address */ guint8 control; guint32 saddr; /* Source device address */ guint32 daddr; /* Destination device address */ guint8 info[0]; /* Information */ } __attribute__((packed));
DISC:
Sirve para poner fin a la comunicación. Una vez recibido la secundaria confirma con un UA y se pone en modo NDM:
19:37:56.976127 disc:cmd > ca=0x1e pf=1 (2) 1f53 . S 19:37:57.006146 ua:rsp ca=1e pf=1 1a6a9e08 < ab580000 (10) 1e73000058ab089e6a1a . s . . X . . . j .
La clasificación entera de datagramas de tipo U sería, espero no dejarme ninguno:
SNRM, DISC, UI, XID, TEST, RNRM, UA, FRMR, DM, RD
Para mas detalles de cada una remitiros a la especificaciones en:
RR (Receive Ready):
Confirma la secuencia de tramas recibidas y dice que está listo para recibir nuevas. Puede ser enviado tanto por la estación primaria como con la secundaria. Ejemplo:
19:17:56.741839 rr:cmd > ca=1e pf=1 nr=0 (2) 1f11 . . 19:17:56.750896 rr:rsp < ca=1e pf=1 nr=0 (2) 1e11
RNR (receive Not Ready):
Enviado por una estación primaria o secundaria. Indica un estado de ocupado,
bien por que no quedan mas buffers libres o por lo que sea.
Se envía un RR para indicar el fin de este estado.
REJ (Reject):
Solicita la retransmisión a partir de una trama que se ha perdido o ha llegado con errores.
SREJ (Selective Reject):
Solicita únicamente una trama.
Son las únicas tramas en las que se da el caso de que pueden secuenciarse sin necesidad de ningún tipo de interactuación. Cuando se llega a las 7 tramas secuenciales se empieza de nuevo.
El fin de la secuencia se marca con el bit de P/F=1, ya sea por parte de la primaria o la secundaria.
Pues sencillamente es el campo que posee toda la información que se quiere tranmitir. Según el tipo de tramas, este campo trae algún dato en su interior o no lo lo trae. Su longitud no está definida pero tiene que ser un múltiplo de 8.