Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / packet-infiniband_sdp.c
blob87d332e869c62b84297d0c785f79caa466c95314
1 /* packet-infiniband_sdp.c
2 * Routines for Infiniband Sockets Direct Protocol dissection
3 * Copyright 2010, Mellanox Technologies Ltd.
4 * Code by Amir Vadai and Slava Koyfman.
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * SPDX-License-Identifier: GPL-2.0-or-later
13 #include "config.h"
15 #include <stdlib.h>
17 #include <epan/packet.h>
18 #include <epan/prefs.h>
19 #include <epan/conversation.h>
21 #include "packet-infiniband.h"
23 void proto_register_ib_sdp(void);
24 void proto_reg_handoff_ib_sdp(void);
26 static dissector_handle_t ib_sdp_handle;
28 /* If the service-id is non-zero after being ANDed with the following mask then
29 this is SDP traffic */
30 #define SERVICE_ID_MASK 0x0000000000010000
32 static int proto_infiniband; /* we'll need the Infiniband protocol index for conversation data */
34 /* Initialize the protocol and registered fields... */
35 static int proto_ib_sdp;
37 /* IB SDP BSDH Header */
38 static int hf_ib_sdp_bsdh;
39 static int hf_ib_sdp_mid;
40 static int hf_ib_sdp_flags;
41 static int hf_ib_sdp_flags_oobpres;
42 static int hf_ib_sdp_flags_oob_pend;
43 static int hf_ib_sdp_flags_reqpipe;
45 static int hf_ib_sdp_len;
46 static int hf_ib_sdp_bufs;
47 static int hf_ib_sdp_mseq;
48 static int hf_ib_sdp_mseqack;
50 /* IB SDP Hello Header */
51 static int hf_ib_sdp_hh;
52 static int hf_ib_sdp_majv;
53 static int hf_ib_sdp_minv;
54 static int hf_ib_sdp_ipv;
55 static int hf_ib_sdp_cap;
56 static int hf_ib_sdp_cap_invalidate;
57 static int hf_ib_sdp_cap_extmaxadverts;
58 static int hf_ib_sdp_maxadverts;
59 static int hf_ib_sdp_desremrcvsz;
60 static int hf_ib_sdp_localrcvsz;
61 static int hf_ib_sdp_localport;
62 static int hf_ib_sdp_src_ip;
63 static int hf_ib_sdp_dst_ip;
64 static int hf_ib_sdp_extmaxadverts;
65 static int hf_ib_sdp_hah;
66 static int hf_ib_sdp_rwch;
67 static int hf_ib_sdp_rrch;
68 static int hf_ib_sdp_mch;
69 static int hf_ib_sdp_crbh;
70 static int hf_ib_sdp_crbah;
71 static int hf_ib_sdp_suspch;
72 static int hf_ib_sdp_sinkah;
73 static int hf_ib_sdp_srcah;
74 static int hf_ib_sdp_data;
76 /* Initialize the subtree pointers */
77 static int ett_ib_sdp;
78 static int ett_ib_sdp_bsdh;
79 static int ett_ib_sdp_hh;
81 typedef enum {
82 Hello = 0x0,
83 HelloAck,
84 DisConn,
85 AbortConn,
86 SendSm,
87 RdmaWrCompl,
88 RdmaRdCompl,
89 ModeChange,
90 SrcAvailCancel,
91 SinkAvailCancel,
92 SinkCancelAck,
93 ChRcvBuf,
94 ChRcvBufAck,
95 SuspComm,
96 SuspCommAck,
97 SinkAvail = 0xfd,
98 SrcAvail,
99 Data
100 } message_by_mid_t;
102 static const range_string mid_meanings[] = {
103 { Hello, Hello, "Hello" },
104 { HelloAck, HelloAck, "HelloAck" },
105 { DisConn, DisConn, "DisConn" },
106 { AbortConn, AbortConn, "AbortConn" },
107 { SendSm, SendSm, "SendSm" },
108 { RdmaWrCompl, RdmaWrCompl, "RdmaWrCompl" },
109 { RdmaRdCompl, RdmaRdCompl, "RdmaRdCompl" },
110 { ModeChange, ModeChange, "ModeChange" },
111 { SrcAvailCancel, SrcAvailCancel, "SrcAvailCancel" },
112 { SinkAvailCancel, SinkAvailCancel, "SinkAvailCancel" },
113 { SinkCancelAck, SinkCancelAck, "SinkCancelAck" },
114 { ChRcvBuf, ChRcvBuf, "ChRcvBuf" },
115 { ChRcvBufAck, ChRcvBufAck, "ChRcvBufAck" },
116 { SuspComm, SuspComm, "SuspComm" },
117 { SuspCommAck, SuspCommAck, "SuspCommAck" },
118 { SinkAvail, SinkAvail, "SinkAvail" },
119 { SrcAvail, SrcAvail, "SrcAvail" },
120 { Data, Data, "Data" },
121 { 0x00001111, 0x00111111, "Reserved" },
122 { 0x01000000, 0x01111111, "Experimental" },
123 { 0x10000000, 0x11111100, "Reserved" },
124 { 0, 0, NULL }
127 /* Code to actually dissect the packets */
128 static int
129 dissect_ib_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
131 int local_offset = 0;
132 proto_item *SDP_header_item;
133 proto_tree *SDP_header_tree;
134 proto_item *SDP_BSDH_header_item;
135 proto_tree *SDP_BSDH_header_tree;
136 proto_item *SDP_EH_header_item;
137 proto_tree *SDP_EH_header_tree;
138 uint8_t mid;
140 if (tvb_captured_length(tvb) < 16) /* check this has at least enough bytes for the BSDH */
141 return 0;
143 col_set_str(pinfo->cinfo, COL_PROTOCOL, "SDP");
145 SDP_header_item = proto_tree_add_item(tree, proto_ib_sdp, tvb, local_offset, -1, ENC_NA);
146 SDP_header_tree = proto_item_add_subtree(SDP_header_item, ett_ib_sdp);
148 SDP_BSDH_header_item = proto_tree_add_item(SDP_header_tree, hf_ib_sdp_bsdh, tvb, local_offset, 16, ENC_NA);
149 SDP_BSDH_header_tree = proto_item_add_subtree(SDP_BSDH_header_item, ett_ib_sdp_bsdh);
151 mid = tvb_get_uint8(tvb, local_offset);
152 proto_tree_add_item(SDP_BSDH_header_tree, hf_ib_sdp_mid, tvb, local_offset, 1, ENC_BIG_ENDIAN); local_offset += 1;
154 col_append_fstr(pinfo->cinfo, COL_INFO, "(SDP %s)",
155 rval_to_str_const(mid, mid_meanings, "Unknown"));
157 proto_tree_add_item(SDP_BSDH_header_tree, hf_ib_sdp_flags, tvb, local_offset, 1, ENC_BIG_ENDIAN);
158 proto_tree_add_item(SDP_BSDH_header_tree, hf_ib_sdp_flags_oobpres, tvb, local_offset, 1, ENC_BIG_ENDIAN);
159 proto_tree_add_item(SDP_BSDH_header_tree, hf_ib_sdp_flags_oob_pend, tvb, local_offset, 1, ENC_BIG_ENDIAN);
160 proto_tree_add_item(SDP_BSDH_header_tree, hf_ib_sdp_flags_reqpipe, tvb, local_offset, 1, ENC_BIG_ENDIAN); local_offset += 1;
162 proto_tree_add_item(SDP_BSDH_header_tree, hf_ib_sdp_bufs, tvb, local_offset, 2, ENC_BIG_ENDIAN); local_offset += 2;
163 proto_tree_add_item(SDP_BSDH_header_tree, hf_ib_sdp_len, tvb, local_offset, 4, ENC_BIG_ENDIAN); local_offset += 4;
164 proto_tree_add_item(SDP_BSDH_header_tree, hf_ib_sdp_mseq, tvb, local_offset, 4, ENC_BIG_ENDIAN); local_offset += 4;
165 proto_tree_add_item(SDP_BSDH_header_tree, hf_ib_sdp_mseqack, tvb, local_offset, 4, ENC_BIG_ENDIAN); local_offset += 4;
167 switch (mid) {
168 case Hello:
169 SDP_EH_header_item = proto_tree_add_item(SDP_header_tree, hf_ib_sdp_hh, tvb, local_offset, 48, ENC_NA);
170 SDP_EH_header_tree = proto_item_add_subtree(SDP_EH_header_item, ett_ib_sdp_hh);
171 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_majv, tvb, local_offset, 1, ENC_BIG_ENDIAN);
172 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_minv, tvb, local_offset, 1, ENC_BIG_ENDIAN); local_offset += 1;
173 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_ipv, tvb, local_offset, 1, ENC_BIG_ENDIAN);
174 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_cap, tvb, local_offset, 1, ENC_BIG_ENDIAN);
175 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_cap_invalidate, tvb, local_offset, 1, ENC_BIG_ENDIAN);
176 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_cap_extmaxadverts, tvb, local_offset, 1, ENC_BIG_ENDIAN); local_offset += 1;
177 local_offset += 1; /* skip reserved */
178 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_maxadverts, tvb, local_offset, 1, ENC_BIG_ENDIAN); local_offset += 1;
179 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_desremrcvsz, tvb, local_offset, 4, ENC_BIG_ENDIAN); local_offset += 4;
180 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_localrcvsz, tvb, local_offset, 4, ENC_BIG_ENDIAN); local_offset += 4;
181 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_localport, tvb, local_offset, 2, ENC_BIG_ENDIAN); local_offset += 2;
182 local_offset += 2; /* skip reserved */
183 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_src_ip, tvb, local_offset, 16, ENC_NA); local_offset += 16;
184 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_dst_ip, tvb, local_offset, 16, ENC_NA); local_offset += 16;
185 local_offset += 2; /* skip reserved */
186 proto_tree_add_item(SDP_EH_header_tree, hf_ib_sdp_extmaxadverts, tvb, local_offset, 2, ENC_BIG_ENDIAN); /*local_offset += 2;*/
187 break;
188 case HelloAck:
189 proto_tree_add_item(SDP_header_tree, hf_ib_sdp_hah, tvb, local_offset, 48, ENC_NA);
190 break;
191 case DisConn:
192 break;
193 case AbortConn:
194 break;
195 case SendSm:
196 break;
197 case RdmaWrCompl:
198 proto_tree_add_item(SDP_header_tree, hf_ib_sdp_rwch, tvb, local_offset, 48, ENC_NA);
199 break;
200 case RdmaRdCompl:
201 proto_tree_add_item(SDP_header_tree, hf_ib_sdp_rrch, tvb, local_offset, 48, ENC_NA);
202 break;
203 case ModeChange:
204 proto_tree_add_item(SDP_BSDH_header_tree, hf_ib_sdp_mch, tvb, local_offset, 48, ENC_NA);
205 break;
206 case SrcAvailCancel:
207 break;
208 case SinkAvailCancel:
209 break;
210 case SinkCancelAck:
211 break;
212 case ChRcvBuf:
213 proto_tree_add_item(SDP_header_tree, hf_ib_sdp_crbh, tvb, local_offset, 48, ENC_NA);
214 break;
215 case ChRcvBufAck:
216 proto_tree_add_item(SDP_header_tree, hf_ib_sdp_crbah, tvb, local_offset, 48, ENC_NA);
217 break;
218 case SuspComm:
219 proto_tree_add_item(SDP_header_tree, hf_ib_sdp_suspch, tvb, local_offset, 48, ENC_NA);
220 break;
221 case SuspCommAck:
222 break;
223 case SinkAvail:
224 proto_tree_add_item(SDP_header_tree, hf_ib_sdp_sinkah, tvb, local_offset, 48, ENC_NA);
225 break;
226 case SrcAvail:
227 proto_tree_add_item(SDP_header_tree, hf_ib_sdp_srcah, tvb, local_offset, 48, ENC_NA);
228 break;
229 case Data:
230 proto_tree_add_item(SDP_header_tree, hf_ib_sdp_data, tvb, local_offset, -1, ENC_NA);
231 break;
232 default:
233 break;
236 return tvb_captured_length(tvb);
239 static bool
240 dissect_ib_sdp_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
242 conversation_t *conv;
243 conversation_infiniband_data *convo_data = NULL;
245 if (tvb_captured_length(tvb) < 16) /* check this has at least enough bytes for the BSDH */
246 return false;
248 /* first try to find a conversation between the two current hosts. in most cases this
249 will not work since we do not have the source QP. this WILL succeed when we're still
250 in the process of CM negotiations */
251 conv = find_conversation(pinfo->num, &pinfo->src, &pinfo->dst,
252 CONVERSATION_IBQP, pinfo->srcport, pinfo->destport, 0);
254 if (!conv) {
255 /* if not, try to find an established RC channel. recall Infiniband conversations are
256 registered with one side of the channel. since the packet is only guaranteed to
257 contain the qpn of the destination, we'll use this */
258 conv = find_conversation(pinfo->num, &pinfo->dst, &pinfo->dst,
259 CONVERSATION_IBQP, pinfo->destport, pinfo->destport, NO_ADDR_B|NO_PORT_B);
261 if (!conv)
262 return false; /* nothing to do with no conversation context */
265 convo_data = (conversation_infiniband_data *)conversation_get_proto_data(conv, proto_infiniband);
267 if (!convo_data)
268 return false;
270 if (!(convo_data->service_id & SERVICE_ID_MASK))
271 return false; /* the service id doesn't match that of SDP - nothing for us to do here */
273 dissect_ib_sdp(tvb, pinfo, tree, data);
274 return true;
277 void
278 proto_register_ib_sdp(void)
280 module_t *ib_sdp_module;
281 static hf_register_info hf[] = {
282 /* SDP BSDH Header */
283 { &hf_ib_sdp_bsdh, {
284 "BSDH", "infiniband_sdp.bsdh",
285 FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
287 { &hf_ib_sdp_mid, {
288 "MID", "infiniband_sdp.bsdh.mid",
289 FT_UINT8, BASE_HEX|BASE_RANGE_STRING, RVALS(mid_meanings), 0x0, NULL, HFILL}
291 {&hf_ib_sdp_flags, {
292 "Flags", "infiniband_sdp.bsdh.flags",
293 FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
295 {&hf_ib_sdp_flags_oobpres, {
296 "OOB_PRES", "infiniband_sdp.bsdh.oobpres",
297 FT_UINT8, BASE_HEX, NULL, 0x01, "Out-Of-Band Data is present", HFILL}
299 {&hf_ib_sdp_flags_oob_pend, {
300 "OOB_PEND", "infiniband_sdp.bsdh.oobpend",
301 FT_UINT8, BASE_HEX, NULL, 0x02, "Out-Of-Band Data is pending", HFILL}
303 {&hf_ib_sdp_flags_reqpipe, {
304 "REQ_PIPE", "infiniband_sdp.bsdh.reqpipe",
305 FT_UINT8, BASE_HEX, NULL, 0x04, "Request change to Pipelined Mode", HFILL}
307 {&hf_ib_sdp_bufs, {
308 "Buffers", "infiniband_sdp.bsdh.bufs",
309 FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
311 {&hf_ib_sdp_len, {
312 "Length", "infiniband_sdp.bsdh.len",
313 FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
315 {&hf_ib_sdp_mseq, {
316 "MSeq", "infiniband_sdp.bsdh.mseq",
317 FT_UINT32, BASE_HEX, NULL, 0x0, "Message Sequence Number", HFILL}
319 {&hf_ib_sdp_mseqack, {
320 "MSeqAck", "infiniband_sdp.bsdh.mseqack",
321 FT_UINT32, BASE_HEX, NULL, 0x0, "Message Sequence Number Acknowledgement", HFILL}
323 /* SDP Hello Header */
324 {&hf_ib_sdp_hh, {
325 "Hello Header", "infiniband_sdp.hh",
326 FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
328 {&hf_ib_sdp_majv, {
329 "Major Protocol Version Number", "infiniband_sdp.hh.majv",
330 FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
332 {&hf_ib_sdp_minv, {
333 "Minor Protocol Version Number", "infiniband_sdp.hh.minv",
334 FT_UINT8, BASE_HEX, NULL, 0x0f, NULL, HFILL}
336 {&hf_ib_sdp_ipv,
337 {"IP version", "infiniband_sdp.hh.ipv",
338 FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
340 {&hf_ib_sdp_cap, {
341 "Capabilities", "infiniband_sdp.hh.cap",
342 FT_UINT8, BASE_HEX, NULL, 0x0f, NULL, HFILL}
344 {&hf_ib_sdp_cap_invalidate, {
345 "INVALIDATE_CAP", "infiniband_sdp.hh.cap_invalidate",
346 FT_UINT8, BASE_HEX, NULL, 0x1, "Supports incoming Send w/Invalidate opcode", HFILL}
348 {&hf_ib_sdp_cap_extmaxadverts, {
349 "EXTENDED_MAXADVERTS", "infiniband_sdp.hh.cap_extmaxadverts",
350 FT_UINT8, BASE_HEX, NULL, 0x2, "Extended MaxAdverts is used", HFILL}
352 {&hf_ib_sdp_maxadverts, {
353 "Maximum Advertisements", "infiniband_sdp.hh.maxadverts",
354 FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
356 {&hf_ib_sdp_desremrcvsz, {
357 "DesRemRcvSz", "infiniband_sdp.hh.desremrcvsz",
358 FT_UINT32, BASE_DEC, NULL, 0x0, "Desired Remote Receive Size", HFILL}
360 {&hf_ib_sdp_localrcvsz,
361 {"LocalRcvSz", "infiniband_sdp.hh.localrcvsz",
362 FT_UINT32, BASE_DEC, NULL, 0x0, "Local Receive Size", HFILL}
364 {&hf_ib_sdp_localport, {
365 "Local Port", "infiniband_sdp.hh.localport",
366 FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
368 {&hf_ib_sdp_src_ip, {
369 "Source IP", "infiniband_sdp.hh.src_ip",
370 FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL}
372 {&hf_ib_sdp_dst_ip, {
373 "Destination IP", "infiniband_sdp.hh.dst_ip",
374 FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL}
376 {&hf_ib_sdp_extmaxadverts, {
377 "Extended MaxAdverts", "infiniband_sdp.hh.extmaxadverts",
378 FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
380 /* Rest of Headers */
381 {&hf_ib_sdp_hah, {
382 "HelloAck Header", "infiniband_sdp.hah",
383 FT_NONE, BASE_NONE, NULL, 0x00, NULL, HFILL}
385 {&hf_ib_sdp_rwch, {
386 "RdmaWrCompl Header", "infiniband_sdp.rwch",
387 FT_NONE, BASE_NONE, NULL, 0x00, "RDMA Write Complete", HFILL}
389 {&hf_ib_sdp_rrch, {
390 "RdmaRdCompl Header", "infiniband_sdp.rrch",
391 FT_NONE, BASE_NONE, NULL, 0x00, "RDMA Read Complete", HFILL}
393 {&hf_ib_sdp_mch, {
394 "ModeChange Header", "infiniband_sdp.mch",
395 FT_NONE, BASE_NONE, NULL, 0x00, NULL, HFILL}
397 {&hf_ib_sdp_crbh, {
398 "ChRcvBuf Header", "infiniband_sdp.crbh",
399 FT_NONE, BASE_NONE, NULL, 0x00, "Change Receive private Buffer size", HFILL}
401 {&hf_ib_sdp_crbah, {
402 "ChRcvBufAck Header", "infiniband_sdp.crbah",
403 FT_NONE, BASE_NONE, NULL, 0x00, "Change Receive private Buffer size Acknowledgement", HFILL}
405 {&hf_ib_sdp_suspch, {
406 "SuspComm Header", "infiniband_sdp.suspch",
407 FT_NONE, BASE_NONE, NULL, 0x00, "Suspend Communication", HFILL}
409 {&hf_ib_sdp_sinkah, {
410 "SinkAvail Header", "infiniband_sdp.sinkah",
411 FT_NONE, BASE_NONE, NULL, 0x00, "Data Sink Available", HFILL}
413 {&hf_ib_sdp_srcah, {
414 "SrcAvail Header", "infiniband_sdp.srcah",
415 FT_NONE, BASE_NONE, NULL, 0x00, "Data Source Available", HFILL}
417 {&hf_ib_sdp_data, {
418 "Data", "infiniband_sdp.Data",
419 FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
423 /* Setup protocol subtree array */
424 static int *ett[] = {
425 &ett_ib_sdp,
426 &ett_ib_sdp_bsdh,
427 &ett_ib_sdp_hh,
430 proto_ib_sdp = proto_register_protocol("Infiniband Sockets Direct Protocol", "Infiniband SDP", "infiniband_sdp");
432 ib_sdp_handle = register_dissector("infiniband_sdp", dissect_ib_sdp, proto_ib_sdp);
434 /* Required function calls to register the header fields and subtrees used */
435 proto_register_field_array(proto_ib_sdp, hf, array_length(hf));
436 proto_register_subtree_array(ett, array_length(ett));
438 /* Register preferences */
439 ib_sdp_module = prefs_register_protocol(proto_ib_sdp, NULL);
441 prefs_register_static_text_preference(ib_sdp_module, "use_decode_as",
442 "Heuristic matching preferences removed. Use Infiniband protocol preferences or Decode As.",
443 "Simple heuristics can still be enable (may generate false positives) through Infiniband protocol preferences."
444 "To force Infiniband SDP dissection use Decode As");
446 prefs_register_obsolete_preference(ib_sdp_module, "manual_en");
448 prefs_register_obsolete_preference(ib_sdp_module, "addr_a");
449 prefs_register_obsolete_preference(ib_sdp_module, "addr_a_type");
450 prefs_register_obsolete_preference(ib_sdp_module, "addr_a_id");
451 prefs_register_obsolete_preference(ib_sdp_module, "addr_a_qp");
453 prefs_register_obsolete_preference(ib_sdp_module, "addr_b");
454 prefs_register_obsolete_preference(ib_sdp_module, "addr_b_type");
455 prefs_register_obsolete_preference(ib_sdp_module, "addr_b_id");
456 prefs_register_obsolete_preference(ib_sdp_module, "addr_b_qp");
459 void
460 proto_reg_handoff_ib_sdp(void)
462 heur_dissector_add("infiniband.payload", dissect_ib_sdp_heur, "Infiniband SDP", "sdp_infiniband", proto_ib_sdp, HEURISTIC_ENABLE);
463 heur_dissector_add("infiniband.mad.cm.private", dissect_ib_sdp_heur, "Infiniband SDP in PrivateData of CM packets", "sdp_ib_private", proto_ib_sdp, HEURISTIC_ENABLE);
465 dissector_add_for_decode_as("infiniband", ib_sdp_handle);
467 proto_infiniband = proto_get_id_by_filter_name( "infiniband" );
471 * Editor modelines - https://www.wireshark.org/tools/modelines.html
473 * Local variables:
474 * c-basic-offset: 4
475 * tab-width: 8
476 * indent-tabs-mode: nil
477 * End:
479 * vi: set shiftwidth=4 tabstop=8 expandtab:
480 * :indentSize=4:tabSize=8:noTabs=true: