3 * exported_pdu helper functions
4 * Copyright 2013, Anders Broman <anders-broman@ericsson.com>
8 * Wireshark - Network traffic analyzer
9 * By Gerald Combs <gerald@wireshark.org>
10 * Copyright 1998 Gerald Combs
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License along
23 * with this program; if not, write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
30 #include <epan/packet.h>
31 #include <epan/exported_pdu.h>
32 #include <epan/dissectors/packet-mtp3.h>
33 #include <epan/dissectors/packet-dvbci.h>
36 * Allocates and fills the exp_pdu_data_t struct according to the wanted_exp_tags
37 * bit_fileld, if proto_name is != NULL, wtap_encap must be -1 or vice-versa
40 load_export_pdu_tags(packet_info
*pinfo
, const char* proto_name
, int wtap_encap _U_
, guint32 tags_bit_field
)
42 exp_pdu_data_t
*exp_pdu_data
;
47 gboolean port_type_defined
= FALSE
;
49 exp_pdu_data
= (exp_pdu_data_t
*)g_malloc(sizeof(exp_pdu_data_t
));
51 /* If we have a protocol name, calculate the buffer size needed including padding and tag + length */
53 str_len
= (int)strlen(proto_name
);
55 /* Ensure that tag length is a multiple of 4 bytes */
56 tag_str_len
= (str_len
+ 3) & 0xfffffffc;
57 /* Add Tag + length */
58 tag_buf_size
= tag_str_len
+ 4;
61 if((tags_bit_field
& EXP_PDU_TAG_IP_SRC_BIT
) == EXP_PDU_TAG_IP_SRC_BIT
){
62 if(pinfo
->net_src
.type
== AT_IPv4
){
63 tag_buf_size
+= 4 + EXP_PDU_TAG_IPV4_SRC_LEN
;
64 }else if(pinfo
->net_src
.type
== AT_IPv6
){
65 tag_buf_size
+= 4 + EXP_PDU_TAG_IPV6_SRC_LEN
;
69 if((tags_bit_field
& EXP_PDU_TAG_IP_DST_BIT
) == EXP_PDU_TAG_IP_DST_BIT
){
70 if(pinfo
->net_dst
.type
== AT_IPv4
){
71 tag_buf_size
+= 4 + EXP_PDU_TAG_IPV4_DST_LEN
;
72 }else if(pinfo
->net_dst
.type
== AT_IPv6
){
73 tag_buf_size
+= 4 + EXP_PDU_TAG_IPV6_DST_LEN
;
77 if((tags_bit_field
& EXP_PDU_TAG_SRC_PORT_BIT
) == EXP_PDU_TAG_SRC_PORT_BIT
){
78 if (!port_type_defined
) {
79 tag_buf_size
= tag_buf_size
+ EXP_PDU_TAG_PORT_TYPE_LEN
+ 4;
80 port_type_defined
= TRUE
;
82 tag_buf_size
= tag_buf_size
+ EXP_PDU_TAG_SRC_PORT_LEN
+ 4;
85 if((tags_bit_field
& EXP_PDU_TAG_DST_PORT_BIT
) == EXP_PDU_TAG_DST_PORT_BIT
){
86 if (!port_type_defined
) {
87 tag_buf_size
= tag_buf_size
+ EXP_PDU_TAG_PORT_TYPE_LEN
+ 4;
89 tag_buf_size
= tag_buf_size
+ EXP_PDU_TAG_DST_PORT_LEN
+ 4;
92 if((tags_bit_field
& EXP_PDU_TAG_SCTP_PPID_BIT
) == EXP_PDU_TAG_SCTP_PPID_BIT
){
93 for(j
= 0; j
< MAX_NUMBER_OF_PPIDS
; j
++) {
94 if (pinfo
->ppids
[j
] != LAST_PPID
) {
95 tag_buf_size
= tag_buf_size
+ EXP_PDU_TAG_SCTP_PPID_LEN
+ 4;
102 if((tags_bit_field
& EXP_PDU_TAG_SS7_OPC_BIT
) == EXP_PDU_TAG_SS7_OPC_BIT
){
103 if(pinfo
->src
.type
== AT_SS7PC
){
104 tag_buf_size
+= 4 + EXP_PDU_TAG_SS7_OPC_LEN
;
108 if((tags_bit_field
& EXP_PDU_TAG_SS7_DPC_BIT
) == EXP_PDU_TAG_SS7_DPC_BIT
){
109 if(pinfo
->dst
.type
== AT_SS7PC
){
110 tag_buf_size
+= 4 + EXP_PDU_TAG_SS7_DPC_LEN
;
114 if((tags_bit_field
& EXP_PDU_TAG_ORIG_FNO_BIT
) == EXP_PDU_TAG_ORIG_FNO_BIT
){
115 tag_buf_size
= tag_buf_size
+ EXP_PDU_TAG_ORIG_FNO_LEN
+ 4;
118 if((tags_bit_field
& EXP_PDU_TAG_DVBCI_EVT_BIT
) == EXP_PDU_TAG_DVBCI_EVT_BIT
){
119 tag_buf_size
= tag_buf_size
+ EXP_PDU_TAG_DVBCI_EVT_LEN
+ 4;
122 /* Add end of options length */
125 exp_pdu_data
->tlv_buffer
= (guint8
*)g_malloc0(tag_buf_size
);
126 exp_pdu_data
->tlv_buffer_len
= tag_buf_size
;
127 port_type_defined
= FALSE
;
130 exp_pdu_data
->tlv_buffer
[i
] = 0;
132 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_PROTO_NAME
;
134 exp_pdu_data
->tlv_buffer
[i
] = 0;
136 exp_pdu_data
->tlv_buffer
[i
] = tag_str_len
; /* tag length */
138 memcpy(exp_pdu_data
->tlv_buffer
+i
, proto_name
, str_len
);
143 if((tags_bit_field
& EXP_PDU_TAG_IP_SRC_BIT
) == EXP_PDU_TAG_IP_SRC_BIT
){
144 if(pinfo
->net_src
.type
== AT_IPv4
){
145 exp_pdu_data
->tlv_buffer
[i
] = 0;
147 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_IPV4_SRC
;
149 exp_pdu_data
->tlv_buffer
[i
] = 0;
151 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_IPV4_SRC_LEN
; /* tag length */
153 memcpy(exp_pdu_data
->tlv_buffer
+i
, pinfo
->net_src
.data
, EXP_PDU_TAG_IPV4_SRC_LEN
);
154 i
+= EXP_PDU_TAG_IPV4_SRC_LEN
;
155 }else if(pinfo
->net_src
.type
== AT_IPv6
){
156 exp_pdu_data
->tlv_buffer
[i
] = 0;
158 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_IPV6_SRC
;
160 exp_pdu_data
->tlv_buffer
[i
] = 0;
162 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_IPV6_SRC_LEN
; /* tag length */
164 memcpy(exp_pdu_data
->tlv_buffer
+i
, pinfo
->net_src
.data
, EXP_PDU_TAG_IPV6_SRC_LEN
);
165 i
+= EXP_PDU_TAG_IPV6_SRC_LEN
;
169 if((tags_bit_field
& EXP_PDU_TAG_IP_DST_BIT
) == EXP_PDU_TAG_IP_DST_BIT
){
170 if(pinfo
->net_dst
.type
== AT_IPv4
){
171 exp_pdu_data
->tlv_buffer
[i
] = 0;
173 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_IPV4_DST
;
175 exp_pdu_data
->tlv_buffer
[i
] = 0;
177 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_IPV4_DST_LEN
; /* tag length */
179 memcpy(exp_pdu_data
->tlv_buffer
+i
, pinfo
->net_dst
.data
, EXP_PDU_TAG_IPV4_DST_LEN
);
180 i
+= EXP_PDU_TAG_IPV4_DST_LEN
;
181 }else if(pinfo
->net_dst
.type
== AT_IPv6
){
182 exp_pdu_data
->tlv_buffer
[i
] = 0;
184 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_IPV6_DST
;
186 exp_pdu_data
->tlv_buffer
[i
] = 0;
188 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_IPV6_DST_LEN
; /* tag length */
190 memcpy(exp_pdu_data
->tlv_buffer
+i
, pinfo
->net_dst
.data
, EXP_PDU_TAG_IPV6_DST_LEN
);
191 i
+= EXP_PDU_TAG_IPV6_DST_LEN
;
195 if((tags_bit_field
& EXP_PDU_TAG_SRC_PORT_BIT
) == EXP_PDU_TAG_SRC_PORT_BIT
){
196 if (!port_type_defined
) {
197 exp_pdu_data
->tlv_buffer
[i
] = 0;
199 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_PORT_TYPE
;
201 exp_pdu_data
->tlv_buffer
[i
] = 0;
203 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_PORT_TYPE_LEN
; /* tag length */
205 exp_pdu_data
->tlv_buffer
[i
] = (pinfo
->ptype
& 0xff000000) >> 24;
206 exp_pdu_data
->tlv_buffer
[i
+1] = (pinfo
->ptype
& 0x00ff0000) >> 16;
207 exp_pdu_data
->tlv_buffer
[i
+2] = (pinfo
->ptype
& 0x0000ff00) >> 8;
208 exp_pdu_data
->tlv_buffer
[i
+3] = (pinfo
->ptype
& 0x000000ff);
209 i
= i
+EXP_PDU_TAG_PORT_TYPE_LEN
;
210 port_type_defined
= TRUE
;
212 exp_pdu_data
->tlv_buffer
[i
] = 0;
214 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_SRC_PORT
;
216 exp_pdu_data
->tlv_buffer
[i
] = 0;
218 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_SRC_PORT_LEN
; /* tag length */
220 exp_pdu_data
->tlv_buffer
[i
] = (pinfo
->srcport
& 0xff000000) >> 24;
221 exp_pdu_data
->tlv_buffer
[i
+1] = (pinfo
->srcport
& 0x00ff0000) >> 16;
222 exp_pdu_data
->tlv_buffer
[i
+2] = (pinfo
->srcport
& 0x0000ff00) >> 8;
223 exp_pdu_data
->tlv_buffer
[i
+3] = (pinfo
->srcport
& 0x000000ff);
224 i
= i
+EXP_PDU_TAG_SRC_PORT_LEN
;
227 if((tags_bit_field
& EXP_PDU_TAG_DST_PORT_BIT
) == EXP_PDU_TAG_DST_PORT_BIT
){
228 if (!port_type_defined
) {
229 exp_pdu_data
->tlv_buffer
[i
] = 0;
231 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_PORT_TYPE
;
233 exp_pdu_data
->tlv_buffer
[i
] = 0;
235 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_PORT_TYPE_LEN
; /* tag length */
237 exp_pdu_data
->tlv_buffer
[i
] = (pinfo
->ptype
& 0xff000000) >> 24;
238 exp_pdu_data
->tlv_buffer
[i
+1] = (pinfo
->ptype
& 0x00ff0000) >> 16;
239 exp_pdu_data
->tlv_buffer
[i
+2] = (pinfo
->ptype
& 0x0000ff00) >> 8;
240 exp_pdu_data
->tlv_buffer
[i
+3] = (pinfo
->ptype
& 0x000000ff);
241 i
= i
+EXP_PDU_TAG_PORT_TYPE_LEN
;
243 exp_pdu_data
->tlv_buffer
[i
] = 0;
245 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_DST_PORT
;
247 exp_pdu_data
->tlv_buffer
[i
] = 0;
249 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_DST_PORT_LEN
; /* tag length */
251 exp_pdu_data
->tlv_buffer
[i
] = (pinfo
->destport
& 0xff000000) >> 24;
252 exp_pdu_data
->tlv_buffer
[i
+1] = (pinfo
->destport
& 0x00ff0000) >> 16;
253 exp_pdu_data
->tlv_buffer
[i
+2] = (pinfo
->destport
& 0x0000ff00) >> 8;
254 exp_pdu_data
->tlv_buffer
[i
+3] = (pinfo
->destport
& 0x000000ff);
255 i
= i
+EXP_PDU_TAG_DST_PORT_LEN
;
258 if((tags_bit_field
& EXP_PDU_TAG_SCTP_PPID_BIT
) == EXP_PDU_TAG_SCTP_PPID_BIT
){
259 for(j
= 0; j
< MAX_NUMBER_OF_PPIDS
; j
++) {
260 if (pinfo
->ppids
[j
] != LAST_PPID
) {
261 exp_pdu_data
->tlv_buffer
[i
] = 0;
263 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_SCTP_PPID
;
265 exp_pdu_data
->tlv_buffer
[i
] = 0;
267 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_SCTP_PPID_LEN
; /* tag length */
269 exp_pdu_data
->tlv_buffer
[i
] = (pinfo
->ppids
[j
] & 0xff000000) >> 24;
270 exp_pdu_data
->tlv_buffer
[i
+1] = (pinfo
->ppids
[j
] & 0x00ff0000) >> 16;
271 exp_pdu_data
->tlv_buffer
[i
+2] = (pinfo
->ppids
[j
] & 0x0000ff00) >> 8;
272 exp_pdu_data
->tlv_buffer
[i
+3] = (pinfo
->ppids
[j
] & 0x000000ff);
273 i
= i
+EXP_PDU_TAG_SCTP_PPID_LEN
;
280 if((tags_bit_field
& EXP_PDU_TAG_SS7_OPC_BIT
) == EXP_PDU_TAG_SS7_OPC_BIT
){
281 if(pinfo
->src
.type
== AT_SS7PC
){
282 mtp3_addr_pc_t
*mtp3_addr
= (mtp3_addr_pc_t
*)(pinfo
->src
.data
);
283 exp_pdu_data
->tlv_buffer
[i
] = 0;
285 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_SS7_OPC
;
287 exp_pdu_data
->tlv_buffer
[i
] = 0;
289 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_SS7_OPC_LEN
; /* tag length */
291 exp_pdu_data
->tlv_buffer
[i
] = (mtp3_addr
->pc
& 0xff000000) >> 24;
292 exp_pdu_data
->tlv_buffer
[i
+1] = (mtp3_addr
->pc
& 0x00ff0000) >> 16;
293 exp_pdu_data
->tlv_buffer
[i
+2] = (mtp3_addr
->pc
& 0x0000ff00) >> 8;
294 exp_pdu_data
->tlv_buffer
[i
+3] = (mtp3_addr
->pc
& 0x000000ff);
295 exp_pdu_data
->tlv_buffer
[i
+4] = (mtp3_addr
->type
& 0xff00) >> 8;
296 exp_pdu_data
->tlv_buffer
[i
+5] = (mtp3_addr
->type
& 0x00ff);
297 exp_pdu_data
->tlv_buffer
[i
+6] = mtp3_addr
->ni
;
298 i
+= EXP_PDU_TAG_SS7_OPC_LEN
;
302 if((tags_bit_field
& EXP_PDU_TAG_SS7_DPC_BIT
) == EXP_PDU_TAG_SS7_DPC_BIT
){
303 if(pinfo
->dst
.type
== AT_SS7PC
){
304 mtp3_addr_pc_t
*mtp3_addr
= (mtp3_addr_pc_t
*)(pinfo
->dst
.data
);
305 exp_pdu_data
->tlv_buffer
[i
] = 0;
307 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_SS7_DPC
;
309 exp_pdu_data
->tlv_buffer
[i
] = 0;
311 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_SS7_DPC_LEN
; /* tag length */
313 exp_pdu_data
->tlv_buffer
[i
] = (mtp3_addr
->pc
& 0xff000000) >> 24;
314 exp_pdu_data
->tlv_buffer
[i
+1] = (mtp3_addr
->pc
& 0x00ff0000) >> 16;
315 exp_pdu_data
->tlv_buffer
[i
+2] = (mtp3_addr
->pc
& 0x0000ff00) >> 8;
316 exp_pdu_data
->tlv_buffer
[i
+3] = (mtp3_addr
->pc
& 0x000000ff);
317 exp_pdu_data
->tlv_buffer
[i
+4] = (mtp3_addr
->type
& 0xff00) >> 8;
318 exp_pdu_data
->tlv_buffer
[i
+5] = (mtp3_addr
->type
& 0x00ff);
319 exp_pdu_data
->tlv_buffer
[i
+6] = mtp3_addr
->ni
;
320 i
+= EXP_PDU_TAG_SS7_DPC_LEN
;
324 if((tags_bit_field
& EXP_PDU_TAG_ORIG_FNO_BIT
) == EXP_PDU_TAG_ORIG_FNO_BIT
){
325 exp_pdu_data
->tlv_buffer
[i
] = 0;
327 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_ORIG_FNO
;
329 exp_pdu_data
->tlv_buffer
[i
] = 0;
331 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_ORIG_FNO_LEN
; /* tag length */
333 exp_pdu_data
->tlv_buffer
[i
] = (pinfo
->fd
->num
& 0xff000000) >> 24;
334 exp_pdu_data
->tlv_buffer
[i
+1] = (pinfo
->fd
->num
& 0x00ff0000) >> 16;
335 exp_pdu_data
->tlv_buffer
[i
+2] = (pinfo
->fd
->num
& 0x0000ff00) >> 8;
336 exp_pdu_data
->tlv_buffer
[i
+3] = (pinfo
->fd
->num
& 0x000000ff);
337 /*i = i +EXP_PDU_TAG_ORIG_FNO_LEN;*/
340 if((tags_bit_field
& EXP_PDU_TAG_DVBCI_EVT_BIT
) == EXP_PDU_TAG_DVBCI_EVT_BIT
){
341 exp_pdu_data
->tlv_buffer
[i
] = 0;
343 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_DVBCI_EVT
;
345 exp_pdu_data
->tlv_buffer
[i
] = 0;
347 exp_pdu_data
->tlv_buffer
[i
] = EXP_PDU_TAG_DVBCI_EVT_LEN
;
349 exp_pdu_data
->tlv_buffer
[i
] = dvbci_get_evt_from_addrs(pinfo
);