참고자료: https://www.bluetooth.com/specifications/specs/core-specification-5-3/
* Bluetooth 전체 packet 내용은 "Bluetooth Packet Format" 참고
L2CAP PDU
- L2CAP에서 관리("블루투스 아키텍처 계층" 참고)
- Information payload를 제외한 L2CAP PDU는 little endian을 사용한다
- Information payload는 프로토콜의 specific에 따라 endian이 결정된다
- CID 값이 없거나 RFU 값이면, 수신측에서 해당 PDU를 무시한다
- PDU Length: Basic L2CAP header를 제외한 L2CAP PDU의 octet 길이이다
- L2CAP PDU 최대 길이는 65,539 octet = 2 (Basic L2CAP header 길이) + 0xFFFF (최대 PDU Length) 이다
- Information Payload 길이는, 상대 디바이스의 MPS 보다 작아야 한다
1. Connection-oriented channel에서 Basic L2CAP mode PDU
- PDU Length: Inforation payload 길이로, 최대값은 62235 (0xFFFF) octet 이고, 수신측에서 recombination 할 때 integrity check 용도로 사용한다
- Channel ID: Destination의 endpoint
- Information payload: Upper layer의 protocol이고, 상대 디바이스의 MTU 보다 작아야 한다
2. Connectionless channel에서 L2CAP PDU
- PDU Length: Information payload 길이 + PSM octet 길이
- Channel ID: 0x0002 (connectionless channel)
- PSM (Protocol/Service Multiplexer): most significant octet의 least significant bit은 0 이어야 하고 (짝수값), 다른 octet의 least significant bit은 1 이어야 한다 (홀수값)
PSM range | |||
Range | Type | Server에서 사용 | Client에서 사용 |
0x0001 ~ 0x0EFF | Fixed SIG에서 할당 |
모든 implementation에 대해 PSM은 fix이다 | SDP에서 PSM을 얻거나, fix된 service를 사용한다고 가정할 수 있다 PSM에 의해 사용하는 protocol을 알 수 있다 |
0x1000 초과 | Dynamic | PSM은 주어진 implementation에 대해 fix 되거나, SDP가 등록될 때 할당할 수 있다 | Reconnection 할 때마다 SDP에서 PSM을 얻는다 각 방향에 따라 PSM은 다르다 |
- Information payload: Peripheral에게 전송하는 data로, 상대 디바이스의 MTU 보다 작아야 하고, connectionless MTU (48 octet)의 길이가 변경되는 것을 지원해야 한다
3. Flow Control and Retransmission mode에서 L2CAP PDU
- Supervisory frames (S-frames): I-frame의 acknowledge와 I-frames의 retransmission에 사용된다
- PDU Length: 2 or 4 octet (control) + 0 or 2 octet (L2CAP SDU Length) + Information payload 길이 + FCS 길이
- Channel ID: Destination의 endpoint
- Control: 아래 "3-1. Control" 참고
- L2CAP SDU Length: 모든 Segment 길이이며, SDU의 시작 frame에서만 존재하고, 나머지 frame에서는 존재하지 않는다
- Information payload: 길이는 상대 디바이스와 설정한 MTU 이하 이어야 한다
- FCS (Frame Check Sequence): Retransmission Control mode와 Flow Control mode에서는 있어야 하고, Enhanced Retransmission mode와 Streaming mode에서는 있어도 되고 없어도 된다
3-1. Control
- Retransmission mode와 Flow Control mode에서는 Standard Control Field (2 octet) 사용
- Enhanced Retransmission mode에서는 Enhanced Control Field (2 octet) 사용
- Streaming mode에서는 Extended Control Field (4 octet) 사용
3-1-1. Information frame format (I-frame)
- 정보를 전송할 때 사용
Standard Control Field | |
Enhanced Control Field | |
Extended Control Field |
- Type: 0 (I-frame)
- TxSeq (Send Sequence Number): retransmission을 위한 I-frame의 순서
- R (Retransmission Disable Bit): 0 (Flow Control GO: 송신측 I-frame RetransmissionTimer가 enable) / 1 (Flow Control STOP: 송신측 I-frame RetransmissionTimer가 disable)
- SAR (Segmentation and Reassembly): L2CAP SDU가 Segmentation 되었는지 알려준다
SAR | |
SAR bit | 설명 |
0b00 | Unsegmented L2CAP SDU |
0b01 | Start of L2CAP SDU |
0b10 | End of L2CAP SDU |
0b11 | Continuation of L2CAP SDU |
- S (Supervisory function)
S (Supervisory function) | |
S bit (Supervisory function) |
설명 |
0b00 | RR(Receiver Ready) |
0b01 | REJ(Reject) |
0b10 | RNR(Receiver Not Ready) |
0b11 | SREJ(Select Reject) |
- F (Final): 1 (P bit이 1인 frame에 대한 response)
3-1-2. Supervisory frame format (S-frame)
- I-frame에 대한 ACK 또는 retransmission을 요청할 때 사용
Standard Control Field | |
Enhanced Control Field | |
Extended Control Field |
- Type: 1 (S-frame)
- ReqSeq (Receive Sequence Number): 해당 Sequence Number에 해당하는 I-frame에 대한 ACK, 또는 retransmission 요청 (REJ frame이나 SREJ frame에서)
- R (Retransmission Disable Bit): 0 (Flow Control GO: 송신측 I-frame RetransmissionTimer가 enable) / 1 (Flow Control STOP: 송신측 I-frame RetransmissionTimer가 disable)
- S (Supervisory function)
S (Supervisory function) | |
S bit (Supervisory function) |
설명 |
0b00 | RR(Receiver Ready) |
0b01 | REJ(Reject) |
0b10 | RNR(Receiver Not Ready) |
0b11 | SREJ(Select Reject) |
- P (Poll): 1 (수신측에게 즉각적인 response를 요청할 때 사용하고, 수신측에서는 F bit을 1로 해서 response를 바로 전송해야 한다)
- F (Final): 1 (P bit이 1인 frame에 대한 response)
4. LE에서 L2CAP PDU
- PDU Length: 2 octet (L2CAP SDU Length) + Information payload 길이
- Channel ID: Destination의 endpoint
- L2CAP SDU Length: SDU의 시작 frame에서만 존재하고, 나머지 frame에서는 존재하지 않는다 (SDU Length 보다 길면, 수신측에서 disconnect)
- Information Payload 길이는, 상대 디바이스의 MPS 보다 작아야 한다 (MPS 보다 길면, 수신측에서 disconnect)
5. Signaling channel에서 L2CAP PDU
- Signaling command를 전송할 때 사용
- PDU Length: Information payload 길이
- Channel ID: 0x0001 (ACL-U), 0x0005 (LE-U)
- Information payload: Signaling command
Signaling command code | ||
Code | Description | CID |
0x01 | L2CAP_COMMAND_REJECT_RSP | 0x0001 ~ 0x0005 |
0x02 | L2CAP_CONNECTION_REQ | 0x0001 |
0x03 | L2CAP_CONNECTION_RSP | 0x0001 |
0x04 | L2CAP_CONFIGURATION_REQ | 0x0001 |
0x05 | L2CAP_CONFIGURATION_RSP | 0x0001 |
0x06 | L2CAP_DISCONNECTION_REQ | 0x0001 ~ 0x0005 |
0x07 | L2CAP_DISCONNECTION_RSP | 0x0001 ~ 0x0005 |
0x08 | L2CAP_ECHO_REQ | 0x0001 |
0x09 | L2CAP_ECHO_RSP | 0x0001 |
0x0A | L2CAP_INFORMATION_REQ | 0x0001 |
0x0B | L2CAP_INFORMATION_RSP | 0x0001 |
0x0C ~ 0x11 |
Previously used | None |
0x12 | L2CAP_CONNECTION_PARAMETER_UPDATE_REQ | 0x0005 |
0x13 | L2CAP_CONNECTION_PARAMETER_UPDATE_RSP | 0x0005 |
0x14 | L2CAP_LE_CREDIT_BASED_CONNECTION_REQ | 0x0005 |
0x15 | L2CAP_LE_CREDIT_BASED_CONNECTION_RSP | 0x0005 |
0x16 | L2CAP_FLOW_CONTROL_CREDIT_IND | 0x0001 ~ 0x0005 |
0x17 | L2CAP_CREDIT_BASED_CONNECTION_REQ | 0x0001 ~ 0x0005 |
0x18 | L2CAP_CREDIT_BASED_CONNECTION_RSP | 0x0001 ~ 0x0005 |
0x19 | L2CAP_CREDIT_BASED_RECONFIGURE_REQ | 0x0001 ~ 0x0005 |
0x1A | L2CAP_CREDIT_BASED_RECONFIGURE_RSP | 0x0001 ~ 0x0005 |
Other | RFU | Any |
'블루투스 > L2CAP' 카테고리의 다른 글
L2CAP segmentation (0) | 2023.03.12 |
---|---|
L2CAP(Logical Link Control and Adaptation Layer Protocol) (0) | 2022.12.18 |