Parsing 如何使用asn1c生成的代码解码GSM-TCAP消息

Parsing 如何使用asn1c生成的代码解码GSM-TCAP消息,parsing,gsm,asn.1,ss7,Parsing,Gsm,Asn.1,Ss7,我使用的是asn1c根据TCAP协议规范生成的c代码(即相应的代码)。 我可以通过生成的代码成功地对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,

我使用的是asn1c根据TCAP协议规范生成的c代码(即相应的代码)。 我可以通过生成的代码成功地对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消息的字节字符串进行解码(解析),我将不胜感激

我使用的是asn1c根据TCAP协议规范生成的c代码

您使用的是哪个asn1c(git commit id)以及它是从哪里获得的,因为有相当多的forks日志

消息类型(在本例中为“开始”)被正确检测,但其他参数未被解析

您如何知道Begin被正确检测到

使用其他编码规则,即aper_decode()和uper_decode(),也会失败

尝试其他编码没有意义,因为它们不兼容二进制

如果有人能描述如何使用自动生成的c代码对TCAP消息的字节字符串进行解码(解析),我将不胜感激

您正在正确地使用它,并且可能在BER解码器中的某个地方存在错误


您可以尝试在
CFLAGS
中使用
-DASN\u EMIT\u DEBUG=1
进行编译(或
-DEMIT\u ASN\u DEBUG=1
根据您使用的
asn1c
版本而定),以获取更多的调试消息。

@Vasil,非常感谢您的回答

您正在使用哪个asn1c(git提交id)以及从哪里获得它 因为那里有很多叉子

我用这个

您如何知道Begin被正确检测到

从ber_decode评估的
pdu
变量的
present
字段(您可以在示例代码中看到
pdu
类型)。 从这个字节流的“Wireshark”输出中,我知道正确的消息类型是
Begin

您可以尝试使用CFLAGS中的-DASN_EMIT_DEBUG=1进行编译(或 -DEMIT_ASN_DEBUG=1(取决于您使用的asn1c版本),以获取更多调试消息

谢谢你的提示;这很有帮助


问题与我使用的asn1文件有关。 我使用并编译了它们

ASN=../asn
asn1c $ASN/DialoguePDUs.asn $ASN/tcap.asn $ASN/UnidialoguePDUs.asn
其中,
dialoguepartion
定义如下(注意,第一个定义被注释):

为了能够解码TCAP消息, 需要使用前面的定义(如中所示),即,
dialoguepartion
应定义为

DialoguePortion ::= [APPLICATION 11] EXPLICIT EXTERNAL
在asn1文件中使用后一种定义时, 重新编译asn1文件,问题解决了


附言:这也和我的问题有关

非常感谢你的回答。我终于解决了问题,并添加了我的解决方案。感谢您描述修复。请同时向osmocom报告。@Vasil,我们如何向osmocom报告?向openbsc邮件列表发送一条消息,或在他们的bug追踪器中打开一个新问题(不太确定在哪个项目中)。
DialoguePortion ::= [APPLICATION 11] EXPLICIT EXTERNAL