NGAP와 함께 보는 ASN.1 - 5th
이제 NGAP-PDU-Contents
모듈과 NGAP-PDU-Descriptions
모듈만 남았다. asn.1 관점에서는 새로운 문법이 나오지 않는다. NGAP 메시지의 구조를 따라가면서 필요한 것만 짚어가는 정도로 NGAP를 통해서 보는 asn.1 설명을 마무리하고자 한다.
NGAP-PDU ::= CHOICE {
initiatingMessage InitiatingMessage,
successfulOutcome SuccessfulOutcome,
unsuccessfulOutcome UnsuccessfulOutcome,
...
}
모든 NGAP 메시지는 NGAP-PDU
정의부터 시작한다. InitiatingMessage, SuccessfulOutcome, UnsuccessfulOutcome 중 하나임을 나타내는 선택 비트가 올 것이고, 마지막의 ...
때문에 확장 비트가 하나 추가될 것이다.
이 중 InitiatingMessage의 정의는 다음과 같다. 나머지 두 정의도 value
필드에 오는 메시지 타입만 차이가 있을 뿐 동일하다.
InitiatingMessage ::= SEQUENCE {
procedureCode NGAP-ELEMENTARY-PROCEDURE.&procedureCode ({NGAP-ELEMENTARY-PROCEDURES}),
criticality NGAP-ELEMENTARY-PROCEDURE.&criticality ({NGAP-ELEMENTARY-PROCEDURES}{@procedureCode}),
value NGAP-ELEMENTARY-PROCEDURE.&InitiatingMessage ({NGAP-ELEMENTARY-PROCEDURES}{@procedureCode})
}
여기서 NGAP-ELEMENTARY-PROCEDURE
와 NGAP-ELEMENTARY-PROCEDURES
두 가지 키워드가 보일 것이다. 단복수 표현 차이 뿐이라 구분하기 어려웠을 것인데 먼저 NGAP-ELEMENTARY-PROCEDURE
는 information object class이다.
NGAP-ELEMENTARY-PROCEDURE ::= CLASS {
&InitiatingMessage,
&SuccessfulOutcome OPTIONAL,
&UnsuccessfulOutcome OPTIONAL,
&procedureCode ProcedureCode UNIQUE,
&criticality Criticality DEFAULT ignore
}
WITH SYNTAX {
INITIATING MESSAGE &InitiatingMessage
[SUCCESSFUL OUTCOME &SuccessfulOutcome]
[UNSUCCESSFUL OUTCOME &UnsuccessfulOutcome]
PROCEDURE CODE &procedureCode
[CRITICALITY &criticality]
}
위 NGAP-ELEMENTARY-PROCEDURE
정의는 NGAP-PROTOCOL-IES
와 더불어 NGAP 메시지 내용을 정의하는 가장 중요한 두 개 클래스 정의이다. NGAP-PROTOCOL-IES
는 개별 IE에 대한 정의라면 NGAP-ELEMENTARY-PROCEDURE
는 NGAP 메시지에 대한 정의이다. InitiatingMessage와 달리 SuccessfulOutcome과 UnsuccessfulOutcome 메시지는 optional 필드임을 알 수 있다.
반면 NGAP-ELEMENTARY-PROCEDURES
는 information object set이다.
NGAP-ELEMENTARY-PROCEDURES NGAP-ELEMENTARY-PROCEDURE ::= {
NGAP-ELEMENTARY-PROCEDURES-CLASS-1 |
NGAP-ELEMENTARY-PROCEDURES-CLASS-2,
...
}
NGAP-ELEMENTARY-PROCEDURES-CLASS-1 NGAP-ELEMENTARY-PROCEDURE ::= {
aMFConfigurationUpdate |
handoverCancel |
(skip)
uERadioCapabilityIDMapping |
writeReplaceWarning,
...
}
NGAP-ELEMENTARY-PROCEDURES-CLASS-2 NGAP-ELEMENTARY-PROCEDURE ::= {
aMFCPRelocationIndication |
aMFStatusIndication |
(skip)
initialUEMessage |
(skip)
uplinkRIMInformationTransfer |
uplinkUEAssociatedNRPPaTransport,
...
}
우선 CLASS-1
과 CLASS-2
두 개의 information object set으로 나누고, 각각의 set에 각 information object 인스턴스를 나열하였다.
class 1 메시지는 InitiatingMessage가 request 메시지가 되고, 성공 또는 실패 여부에 따라 SuccessfulOutcome 또는 UnsuccessfulOutcome으로 응답하는 양방향 메시지 정의를 말한다. 반면 class 2에 속하는 메시지들은 InitiatingMessage만 정의되어 있으며, 이 메시지를 수신한 측에서는 아무 응답도 하지 않는 단방향 메시지 정의를 말한다. 위의 NGAP-ELEMENTARY-PROCEDURE
클래스 선언에서 SuccessfulOutcome과 UnsuccessfulOutcome 메시지가 optional 필드였던 이유가 여기 있다.
이 중 class 2에 속하는 initialUEMessage 인스턴의 정의를 보도록 하자.
initialUEMessage NGAP-ELEMENTARY-PROCEDURE ::= {
INITIATING MESSAGE InitialUEMessage
PROCEDURE CODE id-InitialUEMessage
CRITICALITY ignore
}
id-InitialUEMessage
는 NGAP-Constants
모듈에 정의된 상수 값이다. InitialUEMessage는 NGAP-PDU-Contents
모듈로 가서 찾아야 한다. 본체가 ProtocolIE-Container
로 정의된 SEQUENCE 자료혐임을 알 수 있다.
InitialUEMessage ::= SEQUENCE {
protocolIEs ProtocolIE-Container { {InitialUEMessage-IEs} },
...
}
InitialUEMessage-IEs
정의는 그 아래에 있는데, NGAP-PROTOCOL-IES
클래스에 대한 information object set이다. Initial UE Message는 처음의 procedure code나 criticality, length 필드 다음에는 아래의 메시지 구성 대로 형식화되어 있다.
InitialUEMessage-IEs NGAP-PROTOCOL-IES ::= {
{ ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
{ ID id-NAS-PDU CRITICALITY reject TYPE NAS-PDU PRESENCE mandatory }|
{ ID id-UserLocationInformation CRITICALITY reject TYPE UserLocationInformation PRESENCE mandatory }|
{ ID id-RRCEstablishmentCause CRITICALITY ignore TYPE RRCEstablishmentCause PRESENCE mandatory }|
{ ID id-FiveG-S-TMSI CRITICALITY reject TYPE FiveG-S-TMSI PRESENCE optional }|
{ ID id-AMFSetID CRITICALITY ignore TYPE AMFSetID PRESENCE optional }|
{ ID id-UEContextRequest CRITICALITY ignore TYPE UEContextRequest PRESENCE optional }|
{ ID id-AllowedNSSAI CRITICALITY reject TYPE AllowedNSSAI PRESENCE optional }|
{ ID id-SourceToTarget-AMFInformationReroute CRITICALITY ignore TYPE SourceToTarget-AMFInformationReroute PRESENCE optional }|
{ ID id-SelectedPLMNIdentity CRITICALITY ignore TYPE PLMNIdentity PRESENCE optional }|
{ ID id-IABNodeIndication CRITICALITY reject TYPE IABNodeIndication PRESENCE optional }|
{ ID id-CEmodeBSupport-Indicator CRITICALITY reject TYPE CEmodeBSupport-Indicator PRESENCE optional }|
{ ID id-LTEM-Indication CRITICALITY ignore TYPE LTEM-Indication PRESENCE optional }|
{ ID id-EDT-Session CRITICALITY ignore TYPE EDT-Session PRESENCE optional }|
{ ID id-AuthenticatedIndication CRITICALITY ignore TYPE AuthenticatedIndication PRESENCE optional }|
{ ID id-NPN-AccessInformation CRITICALITY reject TYPE NPN-AccessInformation PRESENCE optional },
...
}
set 내부의 각 인스턴스에 대해서는 반복해서 추적하면 된다. 참고로 RAN-UE-NGAP-ID
의 경우에는 NGAP-IEs
모듈에서 RAN-UE-NGAP-ID ::= INTEGER (0..4294967295)
로 찾을 수 있다.
마치며
지금까지 5편의 포스트로 NGAP asn.1 정의를 빌어서 asn.1 메시지 형식에 대한 분석을 하고자 하였다. 필자도 지금 공부하면서 이해한 내용을 블로그를 통해서 정리하는 것이라 설명이 충분하지 않은 부분도 있었고 asn.1 위주로 설명을 시도하다보니 NGAP 자체에 대한 설명이 상대적으로 부족했다. 그래도 블로그 포스트를 준비하면서 그간 이해되지 않던 information object class와 이 클래스를 바탕으로 정의되는 SEQUENCE 자료 구조와의 관계에 대해 좀 더 이해할 수 있게 된 것이 수확인 듯 하다.
앞으로도 NGAP와 asn.1에 대해 파악한 내용을 계속 올리도록 하겠다.