Я использую код c, сгенерированный asn1c из спецификации протокола TCAP (т. Е. Соответствующий ASN1 файлы). Я могу успешно кодировать пакеты TCAP сгенерированным кодом. Однако попытка «декодировать» связанные потоки байтов не удалась.

Пример кода выглядит следующим образом.

// A real byte stream of a TCAP message:
unsigned char packet_bytes[] = {
  0x62, 0x43, 0x48, 0x04, 0x00, 0x18, 0x02, 0x78,
  0x6b, 0x1a, 0x28, 0x18, 0x06, 0x07, 0x00, 0x11,
  0x86, 0x05, 0x01, 0x01, 0x01, 0xa0, 0x0d, 0x60,
  0x0b, 0xa1, 0x09, 0x06, 0x07, 0x04, 0x00, 0x00,
  0x01, 0x00, 0x14, 0x03, 0x6c, 0x1f, 0xa1, 0x1d,
  0x02, 0x01, 0x00, 0x02, 0x01, 0x2d, 0x30, 0x15,
  0x80, 0x07, 0x91, 0x64, 0x21, 0x92, 0x05, 0x31,
  0x74, 0x81, 0x01, 0x01, 0x82, 0x07, 0x91, 0x64,
  0x21, 0x00, 0x00, 0x90, 0x02
};
// Initializing ...
TCAP_TCMessage_t _pdu, *pdu = &_pdu;
memset(pdu, 0, sizeof(*pdu));    

// Decoding:
asn_dec_rval_t dec_ret = ber_decode(NULL, &asn_DEF_TCAP_TCMessage, (void **) &pdu, packet_bytes, sizeof(packet_bytes));

Хотя тип сообщения (в данном случае «Начало») правильно определен, другие параметры не анализируются.

Использование других правил кодирования, т. Е. aper_decode() и uper_decode(), также дает сбой. Я был бы благодарен, если кто-нибудь может описать, как использовать автоматически сгенерированный код c для декодирования (разбора) байтовой строки сообщений TCAP.

1
Abolfazl Diyanat 15 Авг 2019 в 10:14

2 ответа

Лучший ответ

@Vasil, большое спасибо за ответ.

Какой asn1c вы используете (git commit id) и откуда вы его взяли, так как там довольно много логов?

Я использую ветку mouse07410.

Откуда вы знаете, что Begin правильно обнаружен?

Из поля present переменной pdu, которая оценивается с помощью ber_decode (вы можете увидеть тип pdu в примере кода). Из вывода «Wireshark» для этого потока байтов я знаю, что правильный тип сообщения - Begin.

Вы можете попробовать скомпилировать с -DASN_EMIT_DEBUG = 1 в CFLAGS (или -DEMIT_ASN_DEBUG = 1 в зависимости от используемой версии asn1c), чтобы получить еще несколько сообщений отладки.

Спасибо за подсказку; это было полезно.


Проблема была связана с файлами asn1, которые я использовал. Я использовал файлы osmocom asn1 и скомпилировал их

ASN=../asn
asn1c $ASN/DialoguePDUs.asn $ASN/tcap.asn $ASN/UnidialoguePDUs.asn

В котором DialoguePortion определяется следующим образом (обратите внимание, что первое определение прокомментировано):

--DialoguePortion ::= [APPLICATION 11] EXPLICIT EXTERNAL

-- WS adaptation
DialoguePortion ::= [APPLICATION  11] IMPLICIT DialogueOC
DialogueOC ::= OCTET STRING    

Чтобы иметь возможность декодировать сообщения TCAP, необходимо использовать первое определение (как в стандартном) то есть DialoguePortion должен быть определен как

DialoguePortion ::= [APPLICATION 11] EXPLICIT EXTERNAL

При использовании этого последнего определения в файле asn1 и перекомпиляции файлов asn1 проблема решается.

P.S .: Этот вопрос также связан с моей проблемой.

1
Abolfazl Diyanat 26 Авг 2019 в 12:16

Я использую код c, сгенерированный asn1c из спецификации протокола TCAP

Какой asn1c вы используете (git commit id) и откуда вы его взяли, так как там довольно много логов?

Хотя тип сообщения (в данном случае «Начало») правильно определен, другие параметры не анализируются.

Откуда вы знаете, что Begin правильно обнаружен?

Использование других правил кодирования, то есть aper_decode () и uper_decode (), также завершается ошибкой.

Нет смысла пробовать другие кодировки, так как они не являются двоично-совместимыми.

Я был бы благодарен, если кто-нибудь может описать, как использовать автоматически сгенерированный код c для декодирования (разбора) байтовой строки сообщений TCAP.

Вы используете его правильно и, возможно, где-то в декодере BER есть ошибка.

Вы можете попробовать скомпилировать с -DASN_EMIT_DEBUG=1 в CFLAGS (или -DEMIT_ASN_DEBUG=1 в зависимости от используемой версии asn1c), чтобы получить еще несколько сообщений отладки.

0
Vasil Velichkov 19 Авг 2019 в 15:20