IrLMP - Link Management Protocol
The IrLMP layer uses the IrLAP layer to offer higher level connection and data transfer services using service identifiers, ie LSAP-SELs.
Contained within the IrLMP layer is the information access service (IAS): a repository to store LSAP-SELs and to allow querying to determine the higher level services offered.
The use of LSAP-SEL pairs enables multiple high-level connections over a single IrLAP link. For IrDA lite, there is only one high level session over the IrLAP link.
IrLMP supports these services:
IrLMP services add a 2-byte overhead to the IrLAP frame with the appending of the IrLMP header immediately after the IrLAP header.
The major aim of IrLMP is to provide the means by which the primary node can obtain the target LSAP-SEL value(s) from the secondary node for high-level service that is required, eg IrTTP/IrCOMM.
Typically, after the link has reached IrLAP NRM status, the primary connects at the IrLMP level, queries the IAS to obtain the required LSAP-SEL and then disconnects.
All IrLMP frames are I frames. The connect and disconnect services use IrLMP control frames, ie C/D = 1. All other services use IrLMP data frames, ie C/D = 0.
Within IrLMP control frames, immediately after the IrLMP header, there is a 1-byte field containing the 1-bit A flag and the 7-bit op-code. The A bit is used to indicate whether the frame is a request, ie A = 0, or a confirm, ie A = 1.
Service 1 of 4 - Connection
For IrCOMM 3-wire and 9-wire cooked, an IrLMP connect serves only to allow a primary node to temporarily communicate with a secondary node in order to query the IAS, ie immediately after an IrLMP IAS connect, payload data transfer is not possible.
Service 2 of 4 - Information Access Service (IAS)
For all IAS implementations, the class-names and service-names that are queried against are 'well-known' ASCII strings and are specified in the IrDA specifications. Class-names and services names are constants whereas the actual selector values vary from stack to stack.
A primary node may have an IAS implementation but this will be un-used if that node acts as a primary only.
A secondary node must have an IAS implementation. This will be queried by the primary to obtain the LSAP-SEL for the higher level service(s), eg IrTTP/IrCOMM.
For IrDA lite, the only IAS operation that must be implemented is 'get-value-by-class'.
For IrDA lite, there is only one high level session over the IrLAP link. A full IrDA implementation allows multiple high-level sessions to be established over the same low-level IrLAP connection. Each session is identified by the allocated LSAP-SEL values. A pair of these values form the IrLMP header together with the C/D bit.
Within IrLMP IAS frames, immediately after the IrLMP header, there is a 1-byte field containing the 1-bit Lst flag, the 1-bit Ack flag and the 6-bit op-code. The Lst bit is used to indicate whether the frame is the last frame, ie Lst = 1 or not, ie Lst = 0. The Ack bit is used to indicate whether the frame is an acknowledgment, ie Ack = 1, or a contains data, ie Ack = 0. For IrDA lite, in all frames, Lst = 1 and Ack = 0.
Service 3 of 4 - Data Transfer
Higher level data is transferred using IrLMP data I frames where C/D = 0 and the allocated LSAP-SEL values are used.
Service 4 of 4 - Disconnection
After an IrLMP disconnect, the link state reverts back to basic IrLAP NRM, ie there is still a logical connection at the IrLAP layer.
For the primary stack, for the class-name 'IrDA:IrCOMM', a query is requested to obtain the LSAP-SEL value for the service 'IrDA:TinyTP:LsapSel' using the IAS primitive 'get-value-by-class'.
For the secondary stack, for the class-name 'IrDA:IrCOMM', the LSAP-SEL value for the service 'IrDA:TinyTP:LsapSel' using the IAS primitive 'get-value-by-class' is the only supported query.