+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
解码SCTP层数据的目的是提取M3ua协议层。由于SCTP的data chunks 由多个chunk组成。所以在解码时需要循环解码。具体设计思路如下:
第一、做一个SCTP Common Header的结构体,该结构体要包含Common Header的所有字段和一个指向data chunks的结构指针。这个结构体用于保存Common Header的字段值以备后用。
第二、做一个Chunk的结构体,该结构体包含Chunk Field Descriptions的所有字段和一个chunk value的指针,这个指针就指向了要提取的chunk value数据。
第三、根据天元程序“protocolanalyser”中结构体RAW_PACKET的成员packetlength (包总长度)和reportLength(当前解析长度)进行解码控制。
第四、做一个Chunk Value的结构体,包含Chunk Type 为data 类型的所有字段和一个指向数据的指针,该指针指向M3ua数据。如果Chunk Value结构体的Payload Protocol Identifier字段不是M3ua则不进行解析。 第五、在解析函数
static int get_packet_pasered_ip(RAW_PACKET* packet)中调用static int get_packet_pasered_sctp(RAW_PACKET* packet)来解析SCTP协议。
Chunk Type
ID Value Chunk Type ----- ----------
0 - Payload Data (DATA) 1 - Initiation (INIT)
2 - Initiation Acknowledgement (INIT ACK) 3 - Selective Acknowledgement (SACK) 4 - Heartbeat Request (HEARTBEAT)
5 - Heartbeat Acknowledgement (HEARTBEAT ACK) 6 - Abort (ABORT) 7 - Shutdown (SHUTDOWN)
8 - Shutdown Acknowledgement (SHUTDOWN ACK) 9 - Operation Error (ERROR) 10 - State Cookie (COOKIE ECHO)
11 - Cookie Acknowledgement (COOKIE ACK)
12 - Reserved for Explicit Congestion Notification Echo (ECNE) 13 - Reserved for Congestion Window Reduced (CWR) 14 - Shutdown Complete (SHUTDOWN COMPLETE) 15 to 62 - available
63 - reserved for IETF-defined Chunk Extensions 64 to 126 - available
127 - reserved for IETF-defined Chunk Extensions 128 to 190 - available
191 - reserved for IETF-defined Chunk Extensions 192 to 254 - available
255 - reserved for IETF-defined Chunk Extensions
目前,只用到了DATA 和SACK。RANAP协议用到的是DATA。但这里需要过滤SACK包。 Chunk Length
This value represents the size of the chunk in bytes, including the Chunk Type, Chunk Flags, Chunk Length, and Chunk Value fields. Therefore, if the Chunk Value field is zero-length, the Length field will be set to 4. The Chunk Length field does not count any chunk padding.
Chunk Value
The Chunk Value field contains the actual information to be transferred in the chunk. The usage and format of this field is dependent on the Chunk Type. Chunk数据块内容包含了真实的传输信息,Chunk数据的用法和格式依赖于Chunk Type的取值。
Chunk Type为 Data时Chunk value的格式
Payload Data (DATA) (0) The following format MUST be used for the DATA chunk:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type = 0 | Reserved|U|B|E| Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TSN | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Stream Identifier S | Stream Sequence Number n | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Payload Protocol Identifier | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \\ \\ / User Data (seq n of Stream S) / \\ \\ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Chunk Type为SACK时Chunk value的格式
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type = 3 | Chunk Flags | Chunk Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Cumulative TSN Ack | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Advertised Receiver Window Credit (a_rwnd) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Number of Gap Ack Blocks = N | Number of Duplicate TSNs = X |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Gap Ack Block #1 Start | Gap Ack Block #1 End | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \\ ... \\ / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Gap Ack Block #N Start | Gap Ack Block #N End | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Duplicate TSN 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \\ ... \\ / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Duplicate TSN X | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4. MTP第三级用户的适配层协议(MTP 3 User Adaptation Layer)
M3ua协议消息格式包含一个消息头和多个由消息类型决定的可变长度的参数组成。下图是消息头字段定义。
M3UA messages consist of a Common Header followed by zero or more variable-length parameters, as defined by the message type. Common Message Header
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Version | Reserved |Message Class | Message Type | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \\ \\ / /
Version
1 Release 1.0 Reserved
The Reserved field SHOULD be set to all '0's and ignored by the receiver. Message Class and Message Type
The following list contains the valid Message Type Classes: 0 Management (MGMT) Messages 1 Transfer Messages
2 SS7 Signalling Network Management (SSNM) Messages 3 ASP State Maintenance (ASPSM) Messages 4 ASP Traffic Maintenance (ASPTM) Messages
5 Reserved for Other SIGTRAN Adaptation Layers 6 Reserved for Other SIGTRAN Adaptation Layers 7 Reserved for Other SIGTRAN Adaptation Layers 8 Reserved for Other SIGTRAN Adaptation Layers 9 Routing Key Management (RKM) Messages 10 to 127 Reserved by the IETF
128 to 255 Reserved for IETF-Defined Message Class extensions
由于RANAP协议只涉及到Transfer Messages消息类型类,所有这里只列出Transfer消息的消息类型。
Transfer Messages 0 Reserved
1 Payload Data (DATA) 2 to 127 Reserved by the IETF
128 to 255 Reserved for IETF-Defined Transfer extensions
Message Length
The Message Length defines the length of the message in octets, including the Common Header.