Как добавить сообщение необязательных частей в сгенерированные ASN.1 C-коды
Я использовал код 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 ответ
И то и другое 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
typedef'd как ENUMERATED_t
это typedef'd как INTEGER_t
и поэтому мы не можем присвоить значение напрямую, но используя asn_long2INTEGER
ula.numberOfRequestedVectors = malloc(sizeof(NumberOfRequestedVectors_t));
*ula.numberOfRequestedVectors = 5;
NumberOfRequestedVectors_t
typedef'd как long
так что здесь мы могли бы присвоить значение напрямую