Как добавить сообщение необязательных частей в сгенерированные ASN.1 C-коды - PullRequest
0 голосов
/ 10 декабря 2018

Я использовал код C из libosmo-asn1-map , чтобы получить реализацию протокола GSM_MAP.Затем я пытаюсь закодировать сообщение « Отправить информацию аутентификации ».Как упомянуто в 3GPP TS 29.002 , это сообщение содержит некоторые обязательные части (например, 'imsi') и некоторые дополнительные части (например, 'requesttingNodeType').

/* SendAuthenticationInfoArg */
typedef struct SendAuthenticationInfoArg {
    IMSI_t   imsi;
    NumberOfRequestedVectors_t   numberOfRequestedVectors;
    NULL_t  *segmentationProhibited /* OPTIONAL */;
    NULL_t  *immediateResponsePreferred /* OPTIONAL */;
    struct Re_synchronisationInfo   *re_synchronisationInfo /* OPTIONAL */;
    struct ExtensionContainer   *extensionContainer /* OPTIONAL */;
    /*
     * This type is extensible,
     * possible extensions are below.
     */
    RequestingNodeType_t    *requestingNodeType /* OPTIONAL */;
    PLMN_Id_t   *requestingPLMN_Id  /* OPTIONAL */;
    NumberOfRequestedVectors_t  *numberOfRequestedAdditional_Vectors    /* OPTIONAL */;
    NULL_t  *additionalVectorsAreForEPS /* OPTIONAL */;

    /* Context for parsing across buffer boundaries */
    asn_struct_ctx_t _asn_ctx;
} SendAuthenticationInfoArg_t;

Я использовал следующееC-код, который был вдохновлен проектом osmo-tcap-map .

SendAuthenticationInfoArg_t ula;
memset(&ula, 0, sizeof(ula));

ASN1Common::OCTET_STRING_fromRevVal(&ula.imsi, 202015604083166);
ula.requestingNodeType = 0;
ula.numberOfRequestedVectors = 5;    
xer_fprint(stdout, &asn_DEF_SendAuthenticationInfoArg, &ula);

Но в выводе XER нет опциональной части, в то время как ' requesttingNodeType ' инициализирован:

<SendAuthenticationInfoArg>
    <imsi>02 02 51 06 04 38 61 F6</imsi>
    <numberOfRequestedVectors>5</numberOfRequestedVectors>
</SendAuthenticationInfoArg>

Как включить дополнительные детали(т.е. добавить 'requesttingNodeType' к сообщению)?

1 Ответ

0 голосов
/ 11 декабря 2018

Оба requestingNodeType и numberOfRequestedVectors являются указателями

RequestingNodeType_t    *requestingNodeType /* OPTIONAL */;
PLMN_Id_t   *requestingPLMN_Id  /* OPTIONAL */;
NumberOfRequestedVectors_t  *numberOfRequestedAdditional_Vectors    /* OPTIONAL */;
NULL_t  *additionalVectorsAreForEPS /* OPTIONAL */;

, поэтому сначала вам нужно выделить их, это должно быть что-то вроде

ula.requestingNodeType = malloc(sizeof(RequestingNodeType_t));
asn_long2INTEGER(ula.requestingNodeType, RequestingNodeType_vlr);

RequestingNodeType_t - это typedefd ENUMERATED_t, что typedef'd как INTEGER_t, и поэтому мы не можем присвоить значение напрямую, но используя asn_long2INTEGER

ula.numberOfRequestedVectors = malloc(sizeof(NumberOfRequestedVectors_t));
*ula.numberOfRequestedVectors = 5;

NumberOfRequestedVectors_t typedef'd какlong поэтому здесь мы могли бы присвоить значение напрямую

...