2 * Copyright (c) 2004-2007 Voltaire Inc. All rights reserved.
\r
4 * This software is available to you under the OpenFabrics.org BSD license
\r
7 * Redistribution and use in source and binary forms, with or
\r
8 * without modification, are permitted provided that the following
\r
9 * conditions are met:
\r
11 * - Redistributions of source code must retain the above
\r
12 * copyright notice, this list of conditions and the following
\r
15 * - Redistributions in binary form must reproduce the above
\r
16 * copyright notice, this list of conditions and the following
\r
17 * disclaimer in the documentation and/or other materials
\r
18 * provided with the distribution.
\r
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
21 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
\r
23 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
\r
24 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
\r
25 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
\r
26 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
\r
31 # include <config.h>
\r
32 #endif /* HAVE_CONFIG_H */
\r
37 #if defined(_WIN32) || defined(_WIN64)
\r
38 #include <windows.h>
\r
39 #include <winsock2.h>
\r
48 * BITSOFFS and BE_OFFS are required due the fact that the bit offsets are inconsistently
\r
49 * encoded in the IB spec - IB headers are encoded such that the bit offsets
\r
50 * are in big endian convention (BE_OFFS), while the SMI/GSI queries data fields bit
\r
51 * offsets are specified using real bit offset (?!)
\r
52 * The following macros normalize everything to big endian offsets.
\r
54 #define BITSOFFS(o, w) (((o) & ~31) | ((32 - ((o) & 31) - (w)))), (w)
\r
55 #define BE_OFFS(o, w) (o), (w)
\r
56 #define BE_TO_BITSOFFS(o, w) (((o) & ~31) | ((32 - ((o) & 31) - (w))))
\r
58 ib_field_t ib_mad_f [] = {
\r
59 {0, 0}, /* IB_NO_FIELD - reserved as invalid */
\r
61 {0, 64, "GidPrefix", mad_dump_rhex},
\r
62 {64, 64, "GidGuid", mad_dump_rhex},
\r
65 * MAD: common MAD fields (IB spec 13.4.2)
\r
66 * SMP: Subnet Management packets - lid routed (IB spec 14.2.1.1)
\r
67 * DSMP: Subnet Management packets - direct route (IB spec 14.2.1.2)
\r
68 * SA: Subnet Administration packets (IB spec 15.2.1.1)
\r
71 /* first MAD word (0-3 bytes) */
\r
72 {BE_OFFS(0, 7), "MadMethod", mad_dump_hex}, /* TODO: add dumper */
\r
73 {BE_OFFS(7, 1), "MadIsResponse", mad_dump_uint}, /* TODO: add dumper */
\r
74 {BE_OFFS(8, 8), "MadClassVersion", mad_dump_uint},
\r
75 {BE_OFFS(16, 8), "MadMgmtClass", mad_dump_uint}, /* TODO: add dumper */
\r
76 {BE_OFFS(24, 8), "MadBaseVersion", mad_dump_uint},
\r
78 /* second MAD word (4-7 bytes) */
\r
79 {BE_OFFS(48, 16), "MadStatus", mad_dump_hex}, /* TODO: add dumper */
\r
82 {BE_OFFS(32, 8), "DrSmpHopCnt", mad_dump_uint},
\r
83 {BE_OFFS(40, 8), "DrSmpHopPtr", mad_dump_uint},
\r
84 {BE_OFFS(48, 15), "DrSmpStatus", mad_dump_hex}, /* TODO: add dumper */
\r
85 {BE_OFFS(63, 1), "DrSmpDirection", mad_dump_uint}, /* TODO: add dumper */
\r
87 /* words 3,4,5,6 (8-23 bytes) */
\r
88 {64, 64, "MadTRID", mad_dump_hex},
\r
89 {BE_OFFS(144, 16), "MadAttr", mad_dump_hex}, /* TODO: add dumper */
\r
90 {160, 32, "MadModifier", mad_dump_hex}, /* TODO: add dumper */
\r
92 /* word 7,8 (24-31 bytes) */
\r
93 {196, 64, "MadMkey", mad_dump_hex},
\r
95 /* word 9 (32-37 bytes) */
\r
96 {BE_OFFS(256, 16), "DrSmpDLID", mad_dump_hex},
\r
97 {BE_OFFS(272, 16), "DrSmpSLID", mad_dump_hex},
\r
99 /* word 10,11 (36-43 bytes) */
\r
100 {0, 0}, /* IB_SA_MKEY_F - reserved as invalid */
\r
102 /* word 12 (44-47 bytes) */
\r
103 {BE_OFFS(46*8, 16), "SaAttrOffs", mad_dump_uint},
\r
105 /* word 13,14 (48-55 bytes) */
\r
106 {48*8, 64, "SaCompMask", mad_dump_hex},
\r
108 /* word 13,14 (56-255 bytes) */
\r
109 {56*8, (256-56)*8, "SaData", mad_dump_hex},
\r
111 /* bytes 64 - 127 */
\r
112 {0, 0}, /* IB_SM_DATA_F - reserved as invalid */
\r
114 /* bytes 64 - 256 */
\r
115 {64*8, (256-64) * 8, "GsData", mad_dump_hex},
\r
117 /* bytes 128 - 191 */
\r
118 {1024, 512, "DrSmpPath", mad_dump_hex},
\r
120 /* bytes 192 - 255 */
\r
121 {1536, 512, "DrSmpRetPath", mad_dump_hex},
\r
126 {0, 64, "Mkey", mad_dump_hex},
\r
127 {64, 64, "GidPrefix", mad_dump_hex},
\r
128 {BITSOFFS(128, 16), "Lid", mad_dump_hex},
\r
129 {BITSOFFS(144, 16), "SMLid", mad_dump_hex},
\r
130 {160, 32, "CapMask", mad_dump_portcapmask},
\r
131 {BITSOFFS(192, 16), "DiagCode", mad_dump_hex},
\r
132 {BITSOFFS(208, 16), "MkeyLeasePeriod", mad_dump_uint},
\r
133 {BITSOFFS(224, 8), "LocalPort", mad_dump_uint},
\r
134 {BITSOFFS(232, 8), "LinkWidthEnabled", mad_dump_linkwidthen},
\r
135 {BITSOFFS(240, 8), "LinkWidthSupported", mad_dump_linkwidthsup},
\r
136 {BITSOFFS(248, 8), "LinkWidthActive", mad_dump_linkwidth},
\r
137 {BITSOFFS(256, 4), "LinkSpeedSupported", mad_dump_linkspeedsup},
\r
138 {BITSOFFS(260, 4), "LinkState", mad_dump_portstate},
\r
139 {BITSOFFS(264, 4), "PhysLinkState", mad_dump_physportstate},
\r
140 {BITSOFFS(268, 4), "LinkDownDefState", mad_dump_linkdowndefstate},
\r
141 {BITSOFFS(272, 2), "ProtectBits", mad_dump_uint},
\r
142 {BITSOFFS(277, 3), "LMC", mad_dump_uint},
\r
143 {BITSOFFS(280, 4), "LinkSpeedActive", mad_dump_linkspeed},
\r
144 {BITSOFFS(284, 4), "LinkSpeedEnabled", mad_dump_linkspeeden},
\r
145 {BITSOFFS(288, 4), "NeighborMTU", mad_dump_mtu},
\r
146 {BITSOFFS(292, 4), "SMSL", mad_dump_uint},
\r
147 {BITSOFFS(296, 4), "VLCap", mad_dump_vlcap},
\r
148 {BITSOFFS(300, 4), "InitType", mad_dump_hex},
\r
149 {BITSOFFS(304, 8), "VLHighLimit", mad_dump_uint},
\r
150 {BITSOFFS(312, 8), "VLArbHighCap", mad_dump_uint},
\r
151 {BITSOFFS(320, 8), "VLArbLowCap", mad_dump_uint},
\r
152 {BITSOFFS(328, 4), "InitReply", mad_dump_hex},
\r
153 {BITSOFFS(332, 4), "MtuCap", mad_dump_mtu},
\r
154 {BITSOFFS(336, 3), "VLStallCount", mad_dump_uint},
\r
155 {BITSOFFS(339, 5), "HoqLife", mad_dump_uint},
\r
156 {BITSOFFS(344, 4), "OperVLs", mad_dump_opervls},
\r
157 {BITSOFFS(348, 1), "PartEnforceInb", mad_dump_uint},
\r
158 {BITSOFFS(349, 1), "PartEnforceOutb", mad_dump_uint},
\r
159 {BITSOFFS(350, 1), "FilterRawInb", mad_dump_uint},
\r
160 {BITSOFFS(351, 1), "FilterRawOutb", mad_dump_uint},
\r
161 {BITSOFFS(352, 16), "MkeyViolations", mad_dump_uint},
\r
162 {BITSOFFS(368, 16), "PkeyViolations", mad_dump_uint},
\r
163 {BITSOFFS(384, 16), "QkeyViolations", mad_dump_uint},
\r
164 {BITSOFFS(400, 8), "GuidCap", mad_dump_uint},
\r
165 {BITSOFFS(408, 1), "ClientReregister", mad_dump_uint},
\r
166 {BITSOFFS(411, 5), "SubnetTimeout", mad_dump_uint},
\r
167 {BITSOFFS(419, 5), "RespTimeVal", mad_dump_uint},
\r
168 {BITSOFFS(424, 4), "LocalPhysErr", mad_dump_uint},
\r
169 {BITSOFFS(428, 4), "OverrunErr", mad_dump_uint},
\r
170 {BITSOFFS(432, 16), "MaxCreditHint", mad_dump_uint},
\r
171 {BITSOFFS(456, 24), "RoundTrip", mad_dump_uint},
\r
172 {0, 0}, /* IB_PORT_LAST_F */
\r
177 {BITSOFFS(0,8), "BaseVers", mad_dump_uint},
\r
178 {BITSOFFS(8,8), "ClassVers", mad_dump_uint},
\r
179 {BITSOFFS(16,8), "NodeType", mad_dump_node_type},
\r
180 {BITSOFFS(24,8), "NumPorts", mad_dump_uint},
\r
181 {32, 64, "SystemGuid", mad_dump_hex},
\r
182 {96, 64, "Guid", mad_dump_hex},
\r
183 {160, 64, "PortGuid", mad_dump_hex},
\r
184 {BITSOFFS(224,16), "PartCap", mad_dump_uint},
\r
185 {BITSOFFS(240,16), "DevId", mad_dump_hex},
\r
186 {256, 32, "Revision", mad_dump_hex},
\r
187 {BITSOFFS(288,8), "LocalPort", mad_dump_uint},
\r
188 {BITSOFFS(296,24), "VendorId", mad_dump_hex},
\r
189 {0, 0}, /* IB_NODE_LAST_F */
\r
193 * SwitchInfo fields:
\r
195 {BITSOFFS(0, 16), "LinearFdbCap", mad_dump_uint},
\r
196 {BITSOFFS(16, 16), "RandomFdbCap", mad_dump_uint},
\r
197 {BITSOFFS(32, 16), "McastFdbCap", mad_dump_uint},
\r
198 {BITSOFFS(48, 16), "LinearFdbTop", mad_dump_uint},
\r
199 {BITSOFFS(64, 8), "DefPort", mad_dump_uint},
\r
200 {BITSOFFS(72, 8), "DefMcastPrimPort", mad_dump_uint},
\r
201 {BITSOFFS(80, 8), "DefMcastNotPrimPort", mad_dump_uint},
\r
202 {BITSOFFS(88, 5), "LifeTime", mad_dump_uint},
\r
203 {BITSOFFS(93, 1), "StateChange", mad_dump_uint},
\r
204 {BITSOFFS(96,16), "LidsPerPort", mad_dump_uint},
\r
205 {BITSOFFS(112, 16), "PartEnforceCap", mad_dump_uint},
\r
206 {BITSOFFS(128, 1), "InboundPartEnf", mad_dump_uint},
\r
207 {BITSOFFS(129, 1), "OutboundPartEnf", mad_dump_uint},
\r
208 {BITSOFFS(130, 1), "FilterRawInbound", mad_dump_uint},
\r
209 {BITSOFFS(131, 1), "FilterRawOutbound", mad_dump_uint},
\r
210 {BITSOFFS(132, 1), "EnhancedPort0", mad_dump_uint},
\r
211 {0, 0}, /* IB_SW_LAST_F */
\r
214 * SwitchLinearForwardingTable fields:
\r
216 {0, 512, "LinearForwTbl", mad_dump_array},
\r
219 * SwitchMulticastForwardingTable fields:
\r
221 {0, 512, "MulticastForwTbl", mad_dump_array},
\r
224 * NodeDescription fields:
\r
226 {0, 64*8, "NodeDesc", mad_dump_string},
\r
229 * Notice/Trap fields
\r
231 {BITSOFFS(0, 1), "NoticeIsGeneric", mad_dump_uint},
\r
232 {BITSOFFS(1, 7), "NoticeType", mad_dump_uint},
\r
233 {BITSOFFS(8, 24), "NoticeProducerType", mad_dump_node_type},
\r
234 {BITSOFFS(32, 16), "NoticeTrapNumber", mad_dump_uint},
\r
235 {BITSOFFS(48, 16), "NoticeIssuerLID", mad_dump_uint},
\r
236 {BITSOFFS(64, 1), "NoticeToggle", mad_dump_uint},
\r
237 {BITSOFFS(65, 15), "NoticeCount", mad_dump_uint},
\r
238 {80, 432, "NoticeDataDetails", mad_dump_array},
\r
239 {BITSOFFS(80, 16), "NoticeDataLID", mad_dump_uint},
\r
240 {BITSOFFS(96, 16), "NoticeDataTrap144LID", mad_dump_uint},
\r
241 {BITSOFFS(128, 32), "NoticeDataTrap144CapMask", mad_dump_uint},
\r
246 {BITSOFFS(8, 8), "PortSelect", mad_dump_uint},
\r
247 {BITSOFFS(16, 16), "CounterSelect", mad_dump_hex},
\r
248 {BITSOFFS(32, 16), "SymbolErrors", mad_dump_uint},
\r
249 {BITSOFFS(48, 8), "LinkRecovers", mad_dump_uint},
\r
250 {BITSOFFS(56, 8), "LinkDowned", mad_dump_uint},
\r
251 {BITSOFFS(64, 16), "RcvErrors", mad_dump_uint},
\r
252 {BITSOFFS(80, 16), "RcvRemotePhysErrors", mad_dump_uint},
\r
253 {BITSOFFS(96, 16), "RcvSwRelayErrors", mad_dump_uint},
\r
254 {BITSOFFS(112, 16), "XmtDiscards", mad_dump_uint},
\r
255 {BITSOFFS(128, 8), "XmtConstraintErrors", mad_dump_uint},
\r
256 {BITSOFFS(136, 8), "RcvConstraintErrors", mad_dump_uint},
\r
257 {BITSOFFS(152, 4), "LinkIntegrityErrors", mad_dump_uint},
\r
258 {BITSOFFS(156, 4), "ExcBufOverrunErrors", mad_dump_uint},
\r
259 {BITSOFFS(176, 16), "VL15Dropped", mad_dump_uint},
\r
260 {192, 32, "XmtData", mad_dump_uint},
\r
261 {224, 32, "RcvData", mad_dump_uint},
\r
262 {256, 32, "XmtPkts", mad_dump_uint},
\r
263 {288, 32, "RcvPkts", mad_dump_uint},
\r
264 {0, 0}, /* IB_PC_LAST_F */
\r
269 {0, 64, "SmInfoGuid", mad_dump_hex},
\r
270 {64, 64, "SmInfoKey", mad_dump_hex},
\r
271 {128, 32, "SmActivity", mad_dump_uint},
\r
272 {BITSOFFS(160, 4), "SmPriority", mad_dump_uint},
\r
273 {BITSOFFS(164, 4), "SmState", mad_dump_uint},
\r
278 {BE_OFFS(24*8+24, 8), "RmppVers", mad_dump_uint},
\r
279 {BE_OFFS(24*8+16, 8), "RmppType", mad_dump_uint},
\r
280 {BE_OFFS(24*8+11, 5), "RmppResp", mad_dump_uint},
\r
281 {BE_OFFS(24*8+8, 3), "RmppFlags", mad_dump_hex},
\r
282 {BE_OFFS(24*8+0, 8), "RmppStatus", mad_dump_hex},
\r
285 {28*8, 32, "RmppData1", mad_dump_hex},
\r
286 {28*8, 32, "RmppSegNum", mad_dump_uint},
\r
288 {32*8, 32, "RmppData2", mad_dump_hex},
\r
289 {32*8, 32, "RmppPayload", mad_dump_uint},
\r
290 {32*8, 32, "RmppNewWin", mad_dump_uint},
\r
293 * SA Get Multi Path
\r
295 {BITSOFFS(41,7), "MultiPathNumPath", mad_dump_uint},
\r
296 {BITSOFFS(120,8), "MultiPathNumSrc", mad_dump_uint},
\r
297 {BITSOFFS(128,8), "MultiPathNumDest", mad_dump_uint},
\r
298 {192, 128, "MultiPathGid", mad_dump_array},
\r
303 {64, 128, "PathRecDGid", mad_dump_array},
\r
304 {192, 128, "PathRecSGid", mad_dump_array},
\r
305 {BITSOFFS(320,16), "PathRecDLid", mad_dump_hex},
\r
306 {BITSOFFS(336,16), "PathRecSLid", mad_dump_hex},
\r
307 {BITSOFFS(393,7), "PathRecNumPath", mad_dump_uint},
\r
312 {0, 128, "McastMemMGid", mad_dump_array},
\r
313 {128, 128, "McastMemPortGid", mad_dump_array},
\r
314 {256, 32, "McastMemQkey", mad_dump_hex},
\r
315 {BITSOFFS(288, 16), "McastMemMLid", mad_dump_hex},
\r
316 {BITSOFFS(352, 4), "McastMemSL", mad_dump_uint},
\r
317 {BITSOFFS(306, 6), "McastMemMTU", mad_dump_uint},
\r
318 {BITSOFFS(338, 6), "McastMemRate", mad_dump_uint},
\r
319 {BITSOFFS(312, 8), "McastMemTClass", mad_dump_uint},
\r
320 {BITSOFFS(320, 16), "McastMemPkey", mad_dump_uint},
\r
321 {BITSOFFS(356, 20), "McastMemFlowLbl", mad_dump_uint},
\r
322 {BITSOFFS(388, 4), "McastMemJoinState", mad_dump_uint},
\r
323 {BITSOFFS(392, 1), "McastMemProxyJoin", mad_dump_uint},
\r
328 {0, 64, "ServRecID", mad_dump_hex},
\r
329 {64, 128, "ServRecGid", mad_dump_array},
\r
330 {BITSOFFS(192, 16), "ServRecPkey", mad_dump_hex},
\r
331 {224, 32, "ServRecLease", mad_dump_hex},
\r
332 {256, 128, "ServRecKey", mad_dump_hex},
\r
333 {384, 512, "ServRecName", mad_dump_string},
\r
334 {896, 512, "ServRecData", mad_dump_array}, /* ATS for example */
\r
337 * ATS SM record - within SA_SR_DATA
\r
339 {12*8, 32, "ATSNodeAddr", mad_dump_hex},
\r
340 {BITSOFFS(16*8, 16), "ATSMagicKey", mad_dump_hex},
\r
341 {BITSOFFS(18*8, 16), "ATSNodeType", mad_dump_hex},
\r
342 {32*8, 32*8, "ATSNodeName", mad_dump_string},
\r
345 * SLTOVL MAPPING TABLE
\r
347 {0, 64, "SLToVLMap", mad_dump_hex},
\r
350 * VL ARBITRATION TABLE
\r
352 {0, 512, "VLArbTbl", mad_dump_array},
\r
355 * IB vendor classes range 2
\r
357 {BE_OFFS(36*8, 24), "OUI", mad_dump_array},
\r
358 {40*8, (256-40)*8, "Vendor2Data", mad_dump_array},
\r
361 * Extended port counters
\r
363 {BITSOFFS(8, 8), "PortSelect", mad_dump_uint},
\r
364 {BITSOFFS(16, 16), "CounterSelect", mad_dump_hex},
\r
365 {64, 64, "PortXmitData", mad_dump_uint},
\r
366 {128, 64, "PortRcvData", mad_dump_uint},
\r
367 {192, 64, "PortXmitPkts", mad_dump_uint},
\r
368 {256, 64, "PortRcvPkts", mad_dump_uint},
\r
369 {320, 64, "PortUnicastXmitPkts", mad_dump_uint},
\r
370 {384, 64, "PortUnicastRcvPkts", mad_dump_uint},
\r
371 {448, 64, "PortMulticastXmitPkts", mad_dump_uint},
\r
372 {512, 64, "PortMulticastRcvPkts", mad_dump_uint},
\r
373 {0, 0}, /* IB_PC_EXT_LAST_F */
\r
378 {0, 64, "GUID0", mad_dump_hex},
\r
379 {0, 0} /* IB_FIELD_LAST_ */
\r
384 _set_field64(void *buf, int base_offs, ib_field_t *f, uint64_t val)
\r
388 nval = cl_hton64(val);
\r
389 memcpy((char *)buf + base_offs + f->bitoffs / 8, &nval, sizeof(uint64_t));
\r
393 _get_field64(void *buf, int base_offs, ib_field_t *f)
\r
396 memcpy(&val, ((char *)buf + base_offs + f->bitoffs / 8), sizeof(uint64_t));
\r
397 return cl_ntoh64(val);
\r
401 _set_field(void *buf, int base_offs, ib_field_t *f, uint32_t val)
\r
403 int prebits = (8 - (f->bitoffs & 7)) & 7;
\r
404 int postbits = (f->bitoffs + f->bitlen) & 7;
\r
405 int bytelen = f->bitlen / 8;
\r
406 unsigned idx = base_offs + f->bitoffs / 8;
\r
407 char *p = (char *)buf;
\r
409 if (!bytelen && (f->bitoffs & 7) + f->bitlen < 8) {
\r
410 p[3^idx] &= ~((((1 << f->bitlen) - 1)) << (f->bitoffs & 7));
\r
411 p[3^idx] |= (val & ((1 << f->bitlen) - 1)) << (f->bitoffs & 7);
\r
415 if (prebits) { /* val lsb in byte msb */
\r
416 p[3^idx] &= (1 << (8 - prebits)) - 1;
\r
417 p[3^idx++] |= (val & ((1 << prebits) - 1)) << (8 - prebits);
\r
421 /* BIG endian byte order */
\r
422 for (; bytelen--; val >>= 8)
\r
423 p[3^idx++] = val & 0xff;
\r
425 if (postbits) { /* val msb in byte lsb */
\r
426 p[3^idx] &= ~((1 << postbits) - 1);
\r
432 _get_field(void *buf, int base_offs, ib_field_t *f)
\r
434 int prebits = (8 - (f->bitoffs & 7)) & 7;
\r
435 int postbits = (f->bitoffs + f->bitlen) & 7;
\r
436 int bytelen = f->bitlen / 8;
\r
437 unsigned idx = base_offs + f->bitoffs / 8;
\r
438 uint8_t *p = (uint8_t *)buf;
\r
439 uint32_t val = 0, v = 0, i;
\r
441 if (!bytelen && (f->bitoffs & 7) + f->bitlen < 8)
\r
442 return (p[3^idx] >> (f->bitoffs & 7)) & ((1 << f->bitlen) - 1);
\r
444 if (prebits) /* val lsb from byte msb */
\r
445 v = p[3^idx++] >> (8 - prebits);
\r
447 if (postbits) { /* val msb from byte lsb */
\r
448 i = base_offs + (f->bitoffs + f->bitlen) / 8;
\r
449 val = (p[3^i] & ((1 << postbits) - 1));
\r
452 /* BIG endian byte order */
\r
453 for (idx += bytelen - 1; bytelen--; idx--)
\r
454 val = (val << 8) | p[3^idx];
\r
456 return (val << prebits) | v;
\r
459 /* field must be byte aligned */
\r
461 _set_array(void *buf, int base_offs, ib_field_t *f, void *val)
\r
463 int bitoffs = f->bitoffs;
\r
465 if (f->bitlen < 32)
\r
466 bitoffs = BE_TO_BITSOFFS(bitoffs, f->bitlen);
\r
468 memcpy((uint8_t *)buf + base_offs + bitoffs / 8, val, f->bitlen / 8);
\r
472 _get_array(void *buf, int base_offs, ib_field_t *f, void *val)
\r
474 int bitoffs = f->bitoffs;
\r
476 if (f->bitlen < 32)
\r
477 bitoffs = BE_TO_BITSOFFS(bitoffs, f->bitlen);
\r
479 memcpy(val, (uint8_t *)buf + base_offs + bitoffs / 8, f->bitlen / 8);
\r