참고자료: https://www.bluetooth.com/specifications/specs/core-specification-5-3/
* 전체 Data Physical Channel PDU는 "Bluetooth LE Packet Format" 참고
* LL Control PDU opcode 정리표는 "LL Control PDU opcode" 참고
LL Control PDU Payload
- Link Layer connection을 control 할 때 사용한다
- LLID는 0b11를 사용한다 (자세한 내용은, 위의 "1-1. LLID field" 참고)
- Opcode: Link Layer connection을 control 하기 위한 operation code
- CtrData: Opcode에 대한 control data로, opcode에 따라 길이가 고정이고, 명시적으로 선언되지 않은 interger는 unsigned로 해석된다
1. LL_CONNECTION_UPDATE_IND (0x00)
- WinSize: transmitWindowSize 값 (transmitWindowSize = WinSize * 1.25 ms)
- WinOffset: transmitWindowOffset 값 (transmitWindowOffset = WinOffset * 1.25 ms.)
- Interval: connInterval 값 (connInterval = Interval * 1.25 ms)
- Latency: connPeripheralLatency 값 (connPeripheralLatency = Latency)
- Timeout: connSupervisionTimeout 값 (connSupervisionTimeout = Timeout * 10 ms)
- Instant: connection 관련된 변화의 기준점
2. LL_CHANNEL_MAP_IND (0x01)
- ChM: data channel의 Used/Unused 상태를 알려준다 (자세한 내용은, "LE - RF channel map" 참고)
- Instant: connection 관련된 변화의 기준점 (자세한 내용은, 위의 "1. LL_CONNECTION_UPDATE_IND"를 참고)
3. LL_TERMINATE_IND (0x02)
- ErrorCode: connection이 끊어진 이유 (자세한 내용은, "Controller Error Code" 참고)
4. LL_ENC_REQ (0x03)
- Rand: EDIV와 같이 사용되는, Host가 제공하는 random 숫자
- EDIV: encrypted diversifier
- SKD_C: Central의 Session key diversifier의 일부분
- IV_C: Central의 initialization vector의 일부분
5. LL_ENC_RSP (0x04)
- SKD_P: Peripheral의 Session key diversifier의 일부분
- IV_P: Peripheral의 initialization vector의 일부분
6. LL_START_ENC_REQ (0x05)
- No CtrData field
7. LL_START_ENC_RSP (0x06)
- No CtrData field
8. LL_UNKNOWN_RSP (0x07)
- 지원하지 않는 LL Control PDU를 수신하면, UnknownType field에 해당 opcode를 할당한 후, LL_UNKNOWN_RSP PDU로 응답해야 한다
- RFU인 LL Control PDU를 수신하면, UnknownType field에 해당 opcode를 할당한 후, LL_UNKNOWN_RSP PDU로 응답해야 한다
- 길이가 잘못된 LL Control PDU를 수신하여, 해석을 시도하였으나 실패하면, UnknownType field에 해당 opcode를 할당한 후, LL_UNKNOWN_RSP PDU로 응답해야 한다
- CtrData가 잘못된 LL Control PDU를 수신하여, 해석을 시도하였으나 실패하면, UnknownType field에 해당 opcode를 할당한 후, LL_UNKNOWN_RSP PDU로 응답해야 한다
- UnknownType: 수신한 LL Control PDU의 Opcode
9. LL_FEATURE_REQ (0x08)
- FeatureSet: Central에서 지원하는 features set (자세한 내용은, "LE Controller features" 참고)
10. LL_FEATURE_RSP (0x09)
- FeatureSet[0]: Central과 Peripheral에서 지원하는 features set (자세한 내용은, "LE Controller features" 참고)
- FeatureSet[1] ~ [7]: 해당 PDU를 전송하는 디바이스의 Link Layer에서 지원하는 features set
11. LL_PAUSE_ENC_REQ (0x0A)
- No CtrData field
12. LL_PAUSE_ENC_RSP (0x0B)
- No CtrData field
13. LL_VERSION_IND (0x0C)
- Version: Controller에서 지원하는 Link Layer 버전 ("Core specification version UUID" 참고)
- Company_Identifier: Bluetooth Controller manufacturer의 company identifier ("Company Identifiers UUID" 참고)
- Subversion: Bluetooth Controller의 implementation에 대한 unique value 또는 implementation revision
14. LL_REJECT_IND (0x0D)
- Extended Reject Indication Link Layer feature을 지원하면 LL_REJECT_EXT_IND가 사용되고, 아니면 LL_REJECT_IND PDU가 사용된다
- 길이가 잘못된 LL Control PDU를 수신하여, 해석을 시도하여 성공하면, LL_REJECT_IND PDU로 응답해야 한다
- CtrData가 잘못된 LL Control PDU를 수신하여, 해석을 시도하여 성공하면, LL_REJECT_IND PDU로 응답해야 한다
- ErrorCode: request가 reject된 이유 (자세한 내용은, "Controller Error Code" 참고)
15. LL_PERIPHERAL_FEATURE_REQ (0x0E)
- FeatureSet: Peripheral에서 지원하는 features set (자세한 내용은, "LE Controller features" 참고)
16. LL_CONNECTION_PARAM_REQ (0x0F)
- Interval_Min: connInterval의 최소값 (connInterval = Interval_Min * 1.25 ms)
- Interval_Max: connInterval의 최대값 (connInterval = Interval_Max * 1.25 ms)
- Latency: connPeripheralLatency 값 (connPeripheralLatency = Latency)
- Timeout: connSupervisionTimeout 값 (connSupervisionTimeout = Timeout * 10 ms)
- PreferredPeriodicity: 선호되는 connInterval의 값으로, 0 이면 선호되는 값이 없다는 것이다 (PreferredPeriodicity * 1.25 ms = connInterval =< Interval_Max * 1.25 ms)
- ReferenceConnEventCount: valid인 Offset0 ~ Offset5 필드가 계산된, connEventCounter 값
- Offset0 ~ Offset5: updated connection parameter에 대한, LE connection의 예상 anchor point 값으로, 값이 0xFFFF이면 invalid이다. Offset0가 가장 선호되는 값이고, 그다음 선호되는 값은 Offset1 이며, Offset5는 가장 선호되지 않는 값이다 (Offset0 ~ Offset5 * 1.25 ms = connInterval =< Interval_Max * 1.25 ms)
17. LL_CONNECTION_PARAM_RSP (0x10)
- 각 필드에 대한 설명은, "16. LL_CONNECTION_PARAM_REQ (0x0F)"과 동일
18. LL_REJECT_EXT_IND (0x11)
- Extended Reject Indication Link Layer feature을 지원하면 LL_REJECT_EXT_IND가 사용되고, 아니면 LL_REJECT_IND PDU가 사용된다
- 길이가 잘못된 LL Control PDU를 수신하여, 해석을 시도하여 성공하면, RejectOpcode field에 해당 opcode를 할당한 후, LL_REJECT_EXT_IND PDU로 응답해야 한다
- CtrData가 잘못된 LL Control PDU를 수신하여, 해석을 시도하여 성공하면, RejectOpcode field에 해당 opcode를 할당한 후, LL_REJECT_EXT_IND PDU로 응답해야 한다
- RejectOpcode: reject 된, LL Control PDU의 Opcode
- ErrorCode: LL Control PDU가 reject된 이유 (자세한 내용은, "Controller Error Code" 참고)
19. LL_PING_REQ (0x12)
- No CtrData field
20. LL_PING_RSP (0x13)
- No CtrData field
21. LL_LENGTH_REQ (0x14)
- MaxRxOctets: 전송 디바이스의 connMaxRxOctets 값으로, 수신할 수 있는 payload의 최대 octet 갯수를 나타낸다 (MaxRxOctets >= 27 octet)
- MaxRxTime: 전송 디바이스의 connMaxRxTime 값으로, packet을 수신할 수 있는 최대 μs를 나타낸다 (MaxRxTime >= 328 μs)
- MaxTxOctets: 전송 디바이스의 connMaxTxOctets 값으로, 전송할 수 있는 payload의 최대 octet 갯수를 나타낸다 (MaxTxOctets >= 27 octet)
- MaxTxTime: 전송 디바이스의 connMaxTxTime 값으로, packet을 전송할 수 있는 최대 μs를 나타낸다 (MaxTxTime >= 328 μs)
22. LL_LENGTH_RSP (0x15)
- 각 필드에 대한 설명은, "21. LL_LENGTH_REQ (0x14)"과 동일
23. LL_PHY_REQ (0x16)
- TX_PHYS: 전송 디바이스에서 선호하는 송신 PHY
- RX_PHYS: 전송 디바이스에서 선호하는 수신 PHY
bit 값이 1인 위치 | 선호하는 PHY |
0 bit | LE 1M PHY |
1 bit | LE 2M PHY |
2 bit | LE Coded PHY |
3 ~ 7 bit | RFU |
24. LL_PHY_RSP (0x17)
- 각 필드에 대한 설명은, "23. LL_PHY_REQ (0x16)"과 동일
25. LL_PHY_UPDATE_IND (0x18)
- PHY_C_TO_P: Central에서 Peripheral으로 packet 전송에 사용되는 PHY
- PHY_P_TO_C: Peripheral에서 Central으로 packet 전송에 사용되는 PHY
bit 값이 1인 위치 | 선호하는 PHY |
0 bit | LE 1M PHY |
1 bit | LE 2M PHY |
2 bit | LE Coded PHY |
3 ~ 7 bit | RFU |
- Instant: connection 관련된 변화의 기준점
26. LL_MIN_USED_CHANNELS_IND (0x19)
- PHYS: 최소 channel을 사용하는 Peripheral의 PHY 값으로 설정
bit 값이 1인 위치 | 선호하는 PHY |
0 bit | LE 1M PHY |
1 bit | LE 2M PHY |
2 bit | LE Coded PHY |
3 ~ 7 bit | RFU |
- MinUsedChannels: 지정된 PHY에서 사용되는 최소 channel 수
27. LL_CTE_REQ (0x1A)
- MinCTELenReq: 리모트 디바이스에서 요청한 Constant Tone Extension의 최소 길이를 나타내고, 8 μs 단위이다 (2 ~ 20)
- CTETypeReq: 리모트 디바이스에서 요청한 Constant Tone Extension 종류를 나타낸다
값 | Constant Tone Extension 종류 |
0 | AoA Constant Tone Extension |
1 | AoD Constant Tone Extension with 1 μs slots |
2 | AoD Constant Tone Extension with 2 μs slots |
3 | Reserved for future use |
- Constant Tone Extension에 대한 자세한 내용은 "Constant Tone Extension" 참고
28. LL_CTE_RSP (0x1B)
- No CtrData field
29. LL_PERIODIC_SYNC_IND (0x1C)
- 해당 PDU를 전송하기 위해서는, 먼저 connection이 되어있어야 한다
- 해당 PDU를 전송하기 위해서는, AUX_SYNC_IND PDU를 전송하거나 수신해야 한다
- ID: Upper layer에서 사용하기 위해, Host에서 제공한 값
- SyncInfo: syncPacketWindowOffset의 reference point가, connEventCount field에서 지정된 counter 값을 가진 connection event의 anchor point라는 점과, zero offset은 의미가 없다는 점을 제외하고는, "Common Extended Advertising Payload - SyncInfo field"과 동일하다
- connEventCount: currEvent는 LL_PERIODIC_SYNC_IND PDU가 전송(또는 재전송)될 때 connection event의 counter 값이다 (currEvent - 2^14 < connEventCount < currEvent + 2^14)
- lastPaEventCounter: AUX_SYNC_IND PDU에 적용되는 paEventCounter 값으로 설정되어야 하고, SyncInfo의 PeriodicEventCounter 값과 동일하거나, 1 차이가 있거나(modulo 0x 1 0000), 5초 이상 차이가 나면 안된다
- SID: periodic advertising을 pointing하는, advertising set의 Advertising SID subfield 값으로 설정되어야 한다
- AType: public address이면 0, random address이면 1이다
- SCA: 디바이스의 sleep clock accuracy를 나타내고, CONNECT_IND PDU와 동일한 방식으로 표시해야 한다
- PHY: periodic advertising이 사용하는 PHY를 나타낸다
bit 값이 1인 위치 | 선호하는 PHY |
0 bit | LE 1M PHY |
1 bit | LE 2M PHY |
2 bit | LE Coded PHY |
3 ~ 7 bit | RFU |
- AdvA: periodic advertising을 pointing하는 advertising set에 있는 advertiser의 address가, resolvable private address이면 동일한 IRK를 사용하여 생성 되어야 되고, 그렇지 않으면 advertising set에 있는 advertiser의 address로 설정되어야 한다
- syncConnEventCount: 전송 디바이스에서 해당 PDU의 내용을 결정하는데 사용된 connection event에 대한 connection event counter 값으로 설정되어야 하고, anchor point를 동기화 하는데 사용된다
30. LL_CLOCK_ACCURACY_REQ (0x1D)
- SCA: PDU를 전송한 디바이스의 sleep clock accuracy를 나타내고, CONNECT_IND PDU와 동일한 방식으로 표시해야 한다
31. LL_CLOCK_ACCURACY_RSP (0x1E)
- SCA: PDU를 전송한 디바이스의 sleep clock accuracy를 나타내고, CONNECT_IND PDU와 동일한 방식으로 표시해야 한다
32. LL_CIS_REQ (0x1F)
- CIG_ID: CIG(Connected Isochronous Group) identifier
- CIS_ID: CIS(Connected Isochronous Stream) identifier
- PHY_C_To_P: Central에서 Peripheral으로 packet 전송에 사용되는 PHY
- PHY_P_To_C: Peripheral에서 Central으로 packet 전송에 사용되는 PHY
bit 값이 1인 위치 | 선호하는 PHY |
0 bit | LE 1M PHY |
1 bit | LE 2M PHY |
2 bit | LE Coded PHY |
3 ~ 7 bit | RFU |
- Max_SDU_C_To_P: Central Host의 SDU 최대 크기 (octet)
- Framed: 0이면 unframed Data PDU이고, 1이면 framed Data PDU이다
- Max_SDU_P_To_C: Peripheral Host의 SDU 최대 크기 (octet)
- SDU_Interval_C_To_P: Central Host에서 연속된 두 SDU 사이의 시간 (μs)
- SDU_Interval_P_To_C: Peripheral Host에서 연속된 두 SDU 사이의 시간 (μs)
- Max_PDU_C_To_P: Central에서 Peripheral으로의 최대 payload 크기로, 만약 BN_C_To_P가 0이면 Max_PDU_C_To_P도 0이다 (0 ~ 251 octet)
- Max_PDU_P_To_C: Peripheral에서 Central으로의 최대 payload 크기로, 만약 BN_P_To_C가 0이면 Max_PDU_P_To_C도 0이다 (0 ~ 251 octet)
- NSE(Number of SubEvent): 각 CIS(Connected Isochronous Stream) event에 있는 subevents의 최대 갯수 (1 ~ 31)
- Sub_Interval: 동일한 CIS event에서, 시작 subevent와 다음 subevent 사이의 시간으로, 만약 NSE 값이 1이면 Sub_Interval 값은 0이다 (400 μs < Sub_Interval < ISO_Interval )
- BN_C_To_P: Central에서 Peripheral으로 사용되는 BN parameter 값 (0 ~ 15)
- BN_P_To_C: Peripheral에서 Central으로 사용되는 BN parameter 값 (0 ~ 15)
- FT_C_To_P: Central에서 Peripheral으로 사용되는 FT parameter 값 (1 ~ 255)
- FT_P_To_C: Peripheral에서 Central으로 사용되는 FT parameter 값 (1 ~ 255)
- ISO_Interval: 두개의 연속된 CIS(Connected Isochronous Stream) anchor point의 1.25 ms 단위 시간 (4 ~ 3200 = 5 ms ~ 4 s)
- CIS_Offset_Min: connection event counter가 connEventCount와 같은 connection event의 ACL anchor point와, 최초 CIS anchor point 사이의 μs 단위 최소 시간 (CIS_Offset_Min >= 500 μs)
- CIS_Offset_Max: connection event counter가 connEventCount와 같은 connection event의 ACL anchor point와, 최초 CIS anchor point 사이의 μs 단위 최대 시간 ( CIS_Offset_Min =< CIS_Offset_Max =< connInterval – ((NSE – 1) × Sub_Interval + MPT_C + T_IFS + MPT_P + T_MSS))
- connEventCount: currEvent는 LL_CIS_REQ PDU가 전송(또는 재전송)될 때 connection event의 counter 값이다 (currEvent - 2^14 < connEventCount < currEvent + 2^14)
33. LL_CIS_RSP (0x20)
- CIS_Offset_Min: connection event counter가 connEventCount와 같은 connection event의 ACL anchor point와, 최초 CIS anchor point 사이의 μs 단위 최소 시간 (CIS_Offset_Min >= 500 μs)
- CIS_Offset_Max: connection event counter가 connEventCount와 같은 connection event의 ACL anchor point와, 최초 CIS anchor point 사이의 μs 단위 최대 시간 ( CIS_Offset_Min =< CIS_Offset_Max =< connInterval – ((NSE – 1) × Sub_Interval + MPT_C + T_IFS + MPT_P + T_MSS))
- connEventCount: currEvent는 LL_CIS_RSP PDU가 전송(또는 재전송)될 때 connection event의 counter 값이다 (currEvent - 2^14 < connEventCount < currEvent + 2^14)
34. LL_CIS_IND (0x21)
- CIS event의 가능한 최대 시간 = (NSE – 1) × Sub_Interval + MPT_C + T_IFS + MPT_P
- AA: CIS(Connected Isochronous Stream)의 Access Address
- CIS_Offset: connEventCount가 참조하는 connection event의 anchor point에서, 첫번째 CIS anchor point 까지의 시간 (μs)
- CIG_Sync_Delay: 아래 "3개 CIS로 구성된 CIG" 그림 참고 (μs)
- CIS_Sync_Delay: 아래 "3개 CIS로 구성된 CIG" 그림 참고 (μs)
- connEventCount: currEvent는 LL_CIS_IND PDU가 전송(또는 재전송)될 때 connection event의 counter 값이다 (currEvent - 2^14 < connEventCount < currEvent + 2^14)
35. LL_CIS_TERMINATE_IND (0x22)
- CIG_ID: 종료된 CIG(Connected Isochronous Group)의 identifier
- CIS_ID: 종료된 CIS(Connected Isochronous Stream)의 identifier
- ErrorCode: CIS가 종료된 이유 (자세한 내용은, "Controller Error Code" 참고)
36. LL_POWER_CONTROL_REQ (0x23)
- PHY: Power control이 요청된 PHY
bit 값이 1인 위치 | 선호하는 PHY |
0 bit | LE 1M PHY |
1 bit | LE 2M PHY |
2 bit | LE Coded PHY with S=8 data coding |
3 bit | LE Coded PHY with S=2 data coding |
All other bits | RFU |
- Delta: 수신 디바이스의 transmit power level 변경 요청 값 (dB)
Delta 값 | 설명 |
음수 | transmit power level 감소 요청 |
0 | transmit power level 변경 요청 없음 |
양수 | transmit power level 증가 요청 |
0x7F | transmit power level 최대로 증가 요청 |
- TxPower: 전송 디바이스의 transmit power level (dBm)
값 | 설명 |
126 | 126은 사용하면 안됨 |
127 | 사용 불가능을 나타냄 |
37. LL_POWER_CONTROL_RSP (0x24)
- 만약 Min, Max가 둘 다 set 되었으면, 전송 디바이스가 fixed transmit power level을 가진 것이다.
- Min: 전송 디바이스의 power level이 현재 최소 level이면 set
- Max: 전송 디바이스의 power level이 현재 최대 level이면 set
- Delta: 전송 디바이스의 transmit power level이 변경된 값 (dB)
Delta 값 | 설명 |
음수 | transmit power level 감소됨 |
0 | transmit power level 변경 없음 |
양수 | transmit power level 증가됨 |
- TxPower: 전송 디바이스의 transmit power level (dBm)
값 | 설명 |
126 | 126은 사용하면 안됨 |
127 | 사용 불가능을 나타냄 |
- APR (Acceptable Power Reduction): 전송 디바이스가 수용 가능한, 상대 디바이스의 output power level의 최대 감소치로, 만약 APR 값이 0xFF이면, 전송 디바이스가 APR 값을 결정할 수 없다는 것이다 (dB)
38. LL_POWER_CHANGE_IND (0x25)
- 만약 Min, Max가 둘 다 set 되었으면, 전송 디바이스가 fixed transmit power level을 가진 것이다.
- PHY: Power level이 change되는 PHY
bit 값이 1인 위치 | 선호하는 PHY |
0 bit | LE 1M PHY |
1 bit | LE 2M PHY |
2 bit | LE Coded PHY with S=8 data coding |
3 bit | LE Coded PHY with S=2 data coding |
All other bits | RFU |
- Min: 전송 디바이스의 power level이 현재 최소 level이면 set
- Max: 전송 디바이스의 power level이 현재 최대 level이면 set
- Delta: 전송 디바이스의 transmit power level이 변경된 값 (dB)
Delta 값 | 설명 |
음수 | transmit power level 감소됨 |
0 | transmit power level 변경 없음 |
양수 | transmit power level 증가됨 |
- TxPower: 전송 디바이스의 transmit power level (dBm)
값 | 설명 |
126 | 전송 디바이스가 power managment를 중지한다는 것을 나타냄 모든 다른 field 값이 무시된다 |
127 | 사용 불가능을 나타냄 |
39. LL_SUBRATE_REQ (0x26)
- SubrateFactorMin: connSubrateFactor 최소값 (자세한 내용은, "LE Connection event" 참고)
- SubrateFactorMax: connSubrateFactor 최대값 (자세한 내용은, "LE Connection event" 참고)
- Max_Latency: connPeripheralLatency 최대값 (자세한 내용은, "LE Connection event" 참고)
- ContinuationNumber: connContinuationNumber 최소값 (자세한 내용은, "LE Connection event" 참고)
- Timeout: connSupervisionTimeout 값 (자세한 내용은, "LE Connection event" 참고)
40. LL_SUBRATE_IND (0x27)
- SubrateFactor: 새로운 connSubrateFactor 값 (자세한 내용은, "LE Connection event" 참고)
- SubrateBaseEvent: 새로운 connSubrateBaseEvent 값 (자세한 내용은, "LE Connection event" 참고)
- Latency: subrated events에서 새로운 connPeripheralLatency 값 (자세한 내용은, "LE Connection event" 참고)
- ContinuationNumber: 새로운 connContinuationNumber 값 (자세한 내용은, "LE Connection event" 참고)
- Timeout: 새로운 connSupervisionTimeout 값 (자세한 내용은, "LE Connection event" 참고)
41. LL_CHANNEL_REPORTING_IND (0x28)
- Enable: channel classification reporting을 enable/disable할 지 나타낸다
값 | 설명 |
0x00 | Disable channel classification reporting |
0x01 | Enable channel classification reporting |
All other values | RFU |
- Min_Spacing: 마지막으로 전송된 LL_CHANNEL_STATUS_IND PDU로부터, 다음 LL_CHANNEL_STATUS_IND PDU를 전송할 수 있는 최소 시간 (5 ~ 150 = 1s ~ 30s)
- Max_Delay: Peripheral에서 channel classification의 변화를 detect한 시점과, LL_CHANNEL_STATUS_IND PDU가 생성되는 사이의 최대 시간 (5 ~ 150 = 1s ~ 30s), (Max_Delay >= Min_Spacing)
42. LL_CHANNEL_STATUS_IND (0x29)
- Channel_Classification: data channel의 상태를 알려주며, uint2[37] 자료형을 가진다
값 | data channel의 상태 |
0 | unknown |
1 | good |
2 | RFU |
3 | bad |
43. RFU (0xF0 ~ 0xFB)
- Used for specification development purposes
44. RFU (All other values)
'블루투스 > LE Link Layer' 카테고리의 다른 글
LE Connection event (0) | 2023.02.13 |
---|---|
LL Control PDU opcode (0) | 2023.02.09 |
LE MD(More Data) field (0) | 2023.02.07 |
LE - Acknowledgment / Flow control (0) | 2023.02.05 |
Data Physical Channel PDU (0) | 2023.02.04 |