5 min read

NGAP와 함께 보는 ASN.1 - 5th

NGAP와 함께 보는 ASN.1 - 5th
Photo by Bernard Hermant / Unsplash

이제 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-PROCEDURENGAP-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-1CLASS-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-InitialUEMessageNGAP-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에 대해 파악한 내용을 계속 올리도록 하겠다.

— END OF POST.