[ipoib] Add support for another mlnx series of GUIDs.
[mirror/winof/.git] / ulp / ipoib / kernel / ipoib_xfr_mgr.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  *\r
4  * This software is available to you under the OpenIB.org BSD license\r
5  * below:\r
6  *\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
10  *\r
11  *      - Redistributions of source code must retain the above\r
12  *        copyright notice, this list of conditions and the following\r
13  *        disclaimer.\r
14  *\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
19  *\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 AND\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
27  * SOFTWARE.\r
28  *\r
29  * $Id$\r
30  */\r
31 \r
32 \r
33 #ifndef _IPOIB_XFR_MGR_H_\r
34 #define _IPOIB_XFR_MGR_H_\r
35 \r
36 \r
37 #include <iba/ib_al.h>\r
38 #include <complib/cl_types.h>\r
39 #include <complib/cl_qpool.h>\r
40 #include <complib/cl_spinlock.h>\r
41 #include <complib/cl_qlist.h>\r
42 #include <complib/cl_qpool.h>\r
43 #include <complib/cl_list.h>\r
44 \r
45 \r
46 #include "ipoib_driver.h"\r
47 #include "ip_stats.h"\r
48 #include <ip_packet.h>\r
49 \r
50 \r
51 #include <complib/cl_packon.h>\r
52 /****s* IPoIB Driver/ipoib_hw_addr_t\r
53 * NAME\r
54 *   ipoib_hw_addr_t\r
55 *\r
56 * DESCRIPTION\r
57 *   The ipoib_hw_addr_t structure defines an IPoIB compatible hardware\r
58 *   address.  Values in this structure are stored in network order.\r
59 *\r
60 * SYNOPSIS\r
61 */\r
62 typedef struct _ipoib_hw_addr\r
63 {\r
64         uint32_t        flags_qpn;\r
65         ib_gid_t        gid;\r
66 \r
67 }       PACK_SUFFIX ipoib_hw_addr_t;\r
68 /*\r
69 * FIELDS\r
70 *       flags_qpn\r
71 *               Flags and queue pair number.  Use ipoib_addr_get_flags,\r
72 *               ipoib_addr_set_flags, ipoib_addr_set_qpn, and ipoib_addr_get_qpn\r
73 *               to manipulate the contents.\r
74 *\r
75 *       gid\r
76 *               IB GID value.\r
77 *\r
78 * SEE ALSO\r
79 *       IPoIB, ipoib_addr_get_flags, ipoib_addr_set_flags, ipoib_addr_set_qpn,\r
80 *       ipoib_addr_get_qpn\r
81 *********/\r
82 #include <complib/cl_packoff.h>\r
83 \r
84 \r
85 \r
86 #ifdef __cplusplus\r
87 extern "C"\r
88 {\r
89 #endif\r
90 \r
91 \r
92 /*\r
93  * Address accessors\r
94  */\r
95 \r
96 static inline uint8_t\r
97 ipoib_addr_get_flags(\r
98         IN              const   ipoib_hw_addr_t* const          p_addr )\r
99 {\r
100         return (uint8_t)(cl_ntoh32( p_addr->flags_qpn ) >> 24);\r
101 }\r
102 \r
103 static inline void\r
104 ipoib_addr_set_flags(\r
105         IN                              ipoib_hw_addr_t* const          p_addr,\r
106         IN              const   uint8_t                                         flags )\r
107 {\r
108         p_addr->flags_qpn &= cl_ntoh32( 0xFFFFFF00 );\r
109         p_addr->flags_qpn |= cl_ntoh32( flags );\r
110 }\r
111 \r
112 static inline net32_t\r
113 ipoib_addr_get_qpn(\r
114         IN              const   ipoib_hw_addr_t* const          p_addr )\r
115 {\r
116         return cl_ntoh32( cl_ntoh32( p_addr->flags_qpn ) >> 8 );\r
117 }\r
118 \r
119 static inline void\r
120 ipoib_addr_set_qpn(\r
121         IN                              ipoib_hw_addr_t* const          p_addr,\r
122         IN              const   net32_t                                         qpn )\r
123 {\r
124         p_addr->flags_qpn = cl_ntoh32( (cl_ntoh32(\r
125                 p_addr->flags_qpn ) & 0x000000FF ) | (cl_ntoh32( qpn ) << 8) );\r
126 }\r
127 \r
128 \r
129 /****f* IPOIB/ipoib_mac_from_sst_guid\r
130 * NAME\r
131 *       ipoib_mac_from_sst_guid\r
132 *\r
133 * DESCRIPTION\r
134 *       Generates an ethernet MAC address given a SilverStorm port GUID.\r
135 *\r
136 * SYNOPSIS\r
137 */\r
138 static inline ib_api_status_t\r
139 ipoib_mac_from_sst_guid(\r
140         IN              const   net64_t                                         port_guid,\r
141                 OUT                     mac_addr_t* const                       p_mac_addr )\r
142 {\r
143         const uint8_t   *p_guid = (const uint8_t*)&port_guid;\r
144         uint32_t                low24;\r
145 \r
146         /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
147         ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x06 && p_guid[2] == 0x6a );\r
148 \r
149         /*\r
150          * We end up using only the lower 23-bits of the GUID.  Trap that\r
151          * the 24th (bit 23) through 27th (bit 26) bit aren't set.\r
152          */\r
153         if( port_guid & CL_HTON64( 0x0000000007800000 ) )\r
154                 return IB_INVALID_GUID;\r
155 \r
156         low24 = 0x00FFF000 -\r
157                 ((((uint32_t)cl_ntoh64( port_guid ) & 0x00FFFFFF) - 0x101) * 2);\r
158         low24 -= p_guid[3]; /* minus port number */\r
159 \r
160         p_mac_addr->addr[0] = p_guid[0];\r
161         p_mac_addr->addr[1] = p_guid[1];\r
162         p_mac_addr->addr[2] = p_guid[2];\r
163         p_mac_addr->addr[3] = (uint8_t)(low24 >> 16);\r
164         p_mac_addr->addr[4] = (uint8_t)(low24 >> 8);\r
165         p_mac_addr->addr[5] = (uint8_t)low24;\r
166         \r
167         return IB_SUCCESS;\r
168 }\r
169 /*\r
170 * PARAMETERS\r
171 *       port_guid\r
172 *               The port GUID, in network byte order, for which to generate a\r
173 *               MAC address.\r
174 *\r
175 *       p_mac_addr\r
176 *               Pointer to a mac address in which to store the results.\r
177 *\r
178 * RETURN VALUES\r
179 *       IB_SUCCESS\r
180 *               The MAC address was successfully converted.\r
181 *\r
182 *       IB_INVALID_GUID\r
183 *               The port GUID provided was not a known GUID format.\r
184 *\r
185 * NOTES\r
186 *       The algorithm to convert portGuid to MAC address is as per DN0074, and\r
187 *       assumes a 2 port HCA.\r
188 *\r
189 * SEE ALSO\r
190 *       IPOIB\r
191 *********/\r
192 \r
193 \r
194 /****f* IPOIB/ipoib_mac_from_mlx_guid\r
195 * NAME\r
196 *       ipoib_mac_from_mlx_guid\r
197 *\r
198 * DESCRIPTION\r
199 *       Generates an ethernet MAC address given a Mellanox port GUID.\r
200 *\r
201 * SYNOPSIS\r
202 */\r
203 static inline ib_api_status_t\r
204 ipoib_mac_from_mlx_guid(\r
205         IN              const   net64_t                                         port_guid,\r
206                 OUT                     mac_addr_t* const                       p_mac_addr )\r
207 {\r
208         const uint8_t   *p_guid = (const uint8_t*)&port_guid;\r
209         uint32_t                low24;\r
210         net16_t                 guid_middle;\r
211 \r
212         /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
213         ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x02 && p_guid[2] == 0xc9 );\r
214 \r
215         guid_middle = (net16_t)((port_guid & CL_HTON64( 0x000000ffff000000 )) >>24);\r
216 \r
217         if (guid_middle == 2) {\r
218                         p_mac_addr->addr[0] = 0;\r
219         } else if (guid_middle == 3) {\r
220                         p_mac_addr->addr[0] = 2;\r
221         } else {\r
222                 return IB_INVALID_GUID;\r
223         }\r
224         low24 = ((uint32_t)cl_ntoh64( port_guid ) & 0x00FFFFFF);\r
225 \r
226         p_mac_addr->addr[1] = p_guid[1];\r
227         p_mac_addr->addr[2] = p_guid[2];\r
228         p_mac_addr->addr[3] = (uint8_t)(low24 >> 16);\r
229         p_mac_addr->addr[4] = (uint8_t)(low24 >> 8);\r
230         p_mac_addr->addr[5] = (uint8_t)low24;\r
231         \r
232         return IB_SUCCESS;\r
233 }\r
234 /*\r
235 * PARAMETERS\r
236 *       port_guid\r
237 *               The port GUID, in network byte order, for which to generate a\r
238 *               MAC address.\r
239 *\r
240 *       p_mac_addr\r
241 *               Pointer to a mac address in which to store the results.\r
242 *\r
243 * RETURN VALUES\r
244 *       IB_SUCCESS\r
245 *               The MAC address was successfully converted.\r
246 *\r
247 *       IB_INVALID_GUID\r
248 *               The port GUID provided was not a known GUID format.\r
249 *\r
250 * SEE ALSO\r
251 *       IPOIB\r
252 *********/\r
253 \r
254 \r
255 /****f* IPOIB/ipoib_mac_from_voltaire_guid\r
256 * NAME\r
257 *       ipoib_mac_from_voltaire_guid\r
258 *\r
259 * DESCRIPTION\r
260 *       Generates an ethernet MAC address given a Voltaire port GUID.\r
261 *\r
262 * SYNOPSIS\r
263 */\r
264 static inline ib_api_status_t\r
265 ipoib_mac_from_voltaire_guid(\r
266         IN              const   net64_t                                         port_guid,\r
267                 OUT                     mac_addr_t* const                       p_mac_addr )\r
268 {\r
269         const uint8_t   *p_guid = (const uint8_t*)&port_guid;\r
270 \r
271         /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
272         ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x08 && p_guid[2] == 0xf1 );\r
273 \r
274         p_mac_addr->addr[0] = p_guid[0];\r
275         p_mac_addr->addr[1] = p_guid[1];\r
276         p_mac_addr->addr[2] = p_guid[2];\r
277         p_mac_addr->addr[3] = p_guid[4] ^ p_guid[6];\r
278         p_mac_addr->addr[4] = p_guid[5] ^ p_guid[7];\r
279         p_mac_addr->addr[5] = p_guid[5] + p_guid[6] + p_guid[7];\r
280 \r
281         return IB_SUCCESS;\r
282 }\r
283 \r
284 /****f* IPOIB/ipoib_mac_from_supermicro_guid\r
285 * NAME\r
286 *       ipoib_mac_from_supermicro_guid\r
287 *\r
288 * DESCRIPTION\r
289 *       Generates an ethernet MAC address given a supermicro port GUID.\r
290 *\r
291 * SYNOPSIS\r
292 */\r
293 static inline ib_api_status_t\r
294 ipoib_mac_from_supermicro_guid(\r
295         IN              const   net64_t                                         port_guid,\r
296                 OUT                     mac_addr_t* const                       p_mac_addr )\r
297 {\r
298         const uint8_t   *p_guid = (const uint8_t*)&port_guid;\r
299 \r
300         /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
301         ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x30 && p_guid[2] == 0x48 \r
302         && p_guid[3] == 0xff && p_guid[4] == 0xff);\r
303 \r
304         p_mac_addr->addr[0] = 0;\r
305         p_mac_addr->addr[1] = 0x30;\r
306         p_mac_addr->addr[2] = 0x48; \r
307         p_mac_addr->addr[3] = p_guid[5];\r
308         p_mac_addr->addr[4] = p_guid[6];\r
309         p_mac_addr->addr[5] = p_guid[7];\r
310 \r
311         return IB_SUCCESS;\r
312 }\r
313 \r
314 /****f* IPOIB/ipoib_mac_from_cisco_guid\r
315 * NAME\r
316 *       ipoib_mac_from_cisco_guid\r
317 *\r
318 * DESCRIPTION\r
319 *       Generates an ethernet MAC address given a Cisco port GUID.\r
320 *\r
321 * SYNOPSIS\r
322 */\r
323 static inline ib_api_status_t\r
324 ipoib_mac_from_cisco_guid(\r
325         IN              const   net64_t                                         port_guid,\r
326                 OUT                     mac_addr_t* const                       p_mac_addr )\r
327 {\r
328         const uint8_t   *p_guid = (const uint8_t*)&port_guid;\r
329 \r
330         /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
331         ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x5 && p_guid[2] == 0xad);\r
332 \r
333         p_mac_addr->addr[0] = 0;\r
334         p_mac_addr->addr[1] = 0x5;\r
335         p_mac_addr->addr[2] = 0xad; \r
336         p_mac_addr->addr[3] = p_guid[5];\r
337         p_mac_addr->addr[4] = p_guid[6];\r
338         p_mac_addr->addr[5] = p_guid[7];\r
339 \r
340         return IB_SUCCESS;\r
341 }\r
342 \r
343 /****f* IPOIB/ipoib_mac_from_hp_guid\r
344 * NAME\r
345 *       ipoib_mac_from_hp_guid\r
346 *\r
347 * DESCRIPTION\r
348 *       Generates an ethernet MAC address given a HP port GUID.\r
349 *\r
350 * SYNOPSIS\r
351 */\r
352 static inline ib_api_status_t\r
353 ipoib_mac_from_hp_guid(\r
354         IN              const   net64_t                                         port_guid,\r
355                 OUT                     mac_addr_t* const                       p_mac_addr )\r
356 {\r
357         const uint8_t   *p_guid = (const uint8_t*)&port_guid;\r
358 \r
359         /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
360         ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x1a && p_guid[2] == 0x4b);\r
361 \r
362         p_mac_addr->addr[0] = 0;\r
363         p_mac_addr->addr[1] = 0x1a;\r
364         p_mac_addr->addr[2] = 0x4b; \r
365         p_mac_addr->addr[3] = p_guid[5];\r
366         p_mac_addr->addr[4] = p_guid[6];\r
367         p_mac_addr->addr[5] = p_guid[7];\r
368 \r
369         return IB_SUCCESS;\r
370 }\r
371 \r
372 /*\r
373 * PARAMETERS\r
374 *       port_guid\r
375 *               The port GUID, in network byte order, for which to generate a\r
376 *               MAC address.\r
377 *\r
378 *       p_mac_addr\r
379 *               Pointer to a mac address in which to store the results.\r
380 *\r
381 * RETURN VALUES\r
382 *       IB_SUCCESS\r
383 *               The MAC address was successfully converted.\r
384 *\r
385 * SEE ALSO\r
386 *       IPOIB\r
387 *********/\r
388 \r
389 \r
390 /****f* IPOIB/ipoib_mac_from_guid\r
391 * NAME\r
392 *       ipoib_mac_from_guid\r
393 *\r
394 * DESCRIPTION\r
395 *       Generates an ethernet MAC address given a port GUID.\r
396 *\r
397 * SYNOPSIS\r
398 */\r
399 static inline ib_api_status_t\r
400 ipoib_mac_from_guid(\r
401         IN              const   net64_t                                         port_guid,\r
402                 OUT                     mac_addr_t* const                       p_mac_addr )\r
403 {\r
404         ib_api_status_t status;\r
405         const uint8_t   *p_guid = (const uint8_t*)&port_guid;\r
406         uint32_t                laa;\r
407 \r
408         if( p_guid[0] == 0 ) \r
409         {\r
410                 if( p_guid[1] == 0x02 && p_guid[2] == 0xc9 )\r
411                 {\r
412                         status = ipoib_mac_from_mlx_guid( port_guid, p_mac_addr );\r
413                         if( status == IB_SUCCESS )\r
414                                 return IB_SUCCESS;\r
415                 }\r
416                 else if( p_guid[1] == 0x08 && p_guid[2] == 0xf1 )\r
417                 {\r
418                         status = ipoib_mac_from_voltaire_guid( port_guid, p_mac_addr );\r
419                         if( status == IB_SUCCESS )\r
420                                 return IB_SUCCESS;\r
421                 }\r
422                 else if( p_guid[1] == 0x30 && p_guid[2] == 0x48 )\r
423                 {\r
424                         status = ipoib_mac_from_supermicro_guid( port_guid, p_mac_addr );\r
425                         if( status == IB_SUCCESS )\r
426                                 return IB_SUCCESS;\r
427                 }\r
428                 else if( p_guid[1] == 0x05 && p_guid[2] == 0xad )\r
429                 {\r
430                         status = ipoib_mac_from_cisco_guid( port_guid, p_mac_addr );\r
431                         if( status == IB_SUCCESS )\r
432                                 return IB_SUCCESS;\r
433                 }        \r
434                 /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
435                 else if( p_guid[1] == 0x06 && p_guid[2] == 0x6a )\r
436                 {\r
437                         status = ipoib_mac_from_sst_guid( port_guid, p_mac_addr );\r
438                         if( status == IB_SUCCESS )\r
439                                 return IB_SUCCESS;\r
440                 }\r
441                 else if( p_guid[1] == 0x1a && p_guid[2] == 0x4b )\r
442                 {\r
443                         status = ipoib_mac_from_hp_guid( port_guid, p_mac_addr );\r
444                         if( status == IB_SUCCESS )\r
445                                 return IB_SUCCESS;\r
446                 }\r
447         }\r
448 \r
449         /* Value of zero is reserved. */\r
450         laa = cl_atomic_inc( &g_ipoib.laa_idx );\r
451 \r
452         if( !laa )\r
453                 return IB_INVALID_GUID;\r
454 \r
455         p_mac_addr->addr[0] = 2; /* LAA bit */\r
456         p_mac_addr->addr[1] = 0;\r
457         p_mac_addr->addr[2] = (uint8_t)(laa >> 24);\r
458         p_mac_addr->addr[3] = (uint8_t)(laa >> 16);\r
459         p_mac_addr->addr[4] = (uint8_t)(laa >> 8);\r
460         p_mac_addr->addr[5] = (uint8_t)laa;\r
461         \r
462         return IB_SUCCESS;\r
463 }\r
464 /*\r
465 * PARAMETERS\r
466 *       port_guid\r
467 *               The port GUID, in network byte order, for which to generate a\r
468 *               MAC address.\r
469 *\r
470 *       p_mac_addr\r
471 *               Pointer to a mac address in which to store the results.\r
472 *\r
473 * RETURN VALUES\r
474 *       IB_SUCCESS\r
475 *               The MAC address was successfully converted.\r
476 *\r
477 *       IB_INVALID_GUID\r
478 *               The port GUID provided was not a known GUID format.\r
479 *\r
480 * NOTES\r
481 *       Creates a locally administered address using a global incrementing counter.\r
482 *\r
483 * SEE ALSO\r
484 *       IPOIB\r
485 *********/\r
486 \r
487 \r
488 /****f* IPOIB/ipoib_sst_guid_from_mac\r
489 * NAME\r
490 *       ipoib_sst_guid_from_mac\r
491 *\r
492 * DESCRIPTION\r
493 *       Generates a port GUID given an ethernet MAC address.\r
494 *\r
495 * SYNOPSIS\r
496 */\r
497 static inline ib_api_status_t\r
498 ipoib_sst_guid_from_mac(\r
499         IN              const   mac_addr_t                                      mac,\r
500                 OUT                     net64_t* const                          p_port_guid )\r
501 {\r
502         uint8_t         *p_guid = (uint8_t*)p_port_guid;\r
503         uint32_t        low24;\r
504 \r
505         /* MAC address is in network byte order.  OUI is in lower 3 bytes. */\r
506         if( mac.addr[0] != 0x00 || \r
507                 mac.addr[1] != 0x06 || \r
508                 mac.addr[2] != 0x6a )\r
509         {\r
510                 return IB_INVALID_GUID;\r
511         }\r
512 \r
513         low24 = mac.addr[3] << 16 || mac.addr[4] << 8 || mac.addr[5];\r
514 \r
515         low24 = 0x00FFF000 - low24;\r
516         /* Divide by two */\r
517         low24 >>= 1;\r
518         /* Add the serial number base offset. */\r
519         low24 += 0x101;\r
520 \r
521         /* OUI */\r
522         p_guid[0] = mac.addr[0];\r
523         p_guid[1] = mac.addr[1];\r
524         p_guid[2] = mac.addr[2];\r
525         /* Port number */\r
526         p_guid[3] = mac.addr[5] & 0x01;\r
527         /* Type */\r
528         p_guid[4] = 0x98;\r
529         /* Serial Number */\r
530         p_guid[5] = (uint8_t)(low24 >> 16);\r
531         p_guid[6] = (uint8_t)(low24 >> 8);\r
532         p_guid[7] = (uint8_t)low24;\r
533         \r
534         return IB_SUCCESS;\r
535 }\r
536 /*\r
537 * PARAMETERS\r
538 *       port_guid\r
539 *               The port GUID, in network byte order, for which to generate a\r
540 *               MAC address.\r
541 *\r
542 *       p_mac_addr\r
543 *               Pointer to a mac address in which to store the results.\r
544 *\r
545 * RETURN VALUES\r
546 *       IB_SUCCESS\r
547 *               The MAC address was successfully converted.\r
548 *\r
549 *       IB_INVALID_GUID\r
550 *               The port GUID provided was not a known GUID format.\r
551 *\r
552 * NOTES\r
553 *       The algorithm to convert portGuid to MAC address is as per DN0074, and\r
554 *       assumes a 2 port HCA.\r
555 *\r
556 * SEE ALSO\r
557 *       IPOIB\r
558 *********/\r
559 \r
560 \r
561 /****f* IPOIB/ipoib_mlx_guid_from_mac\r
562 * NAME\r
563 *       ipoib_mlx_guid_from_mac\r
564 *\r
565 * DESCRIPTION\r
566 *       Generates a port GUID given an ethernet MAC address.\r
567 *\r
568 * SYNOPSIS\r
569 */\r
570 static inline ib_api_status_t\r
571 ipoib_mlx_guid_from_mac(\r
572         IN              const   mac_addr_t                                      mac,\r
573                 OUT                     net64_t* const                          p_port_guid )\r
574 {\r
575         uint8_t         *p_guid = (uint8_t*)p_port_guid;\r
576         uint32_t        low24;\r
577 \r
578         /* MAC address is in network byte order.  OUI is in lower 3 bytes. */\r
579         if( mac.addr[0] != 0x00 || \r
580                 mac.addr[1] != 0x02 || \r
581                 mac.addr[2] != 0xc9 )\r
582         {\r
583                 return IB_INVALID_GUID;\r
584         }\r
585 \r
586         low24 = mac.addr[3] << 16 || mac.addr[4] << 8 || mac.addr[5];\r
587 \r
588         /* OUI */\r
589         p_guid[0] = mac.addr[0];\r
590         p_guid[1] = mac.addr[1];\r
591         p_guid[2] = mac.addr[2];\r
592         p_guid[3] = 0x02;\r
593         p_guid[4] = 0x00;\r
594         /* Serial Number */\r
595         p_guid[5] = (uint8_t)(low24 >> 16);\r
596         p_guid[6] = (uint8_t)(low24 >> 8);\r
597         p_guid[7] = (uint8_t)low24;\r
598         \r
599         return IB_SUCCESS;\r
600 }\r
601 /*\r
602 * PARAMETERS\r
603 *       port_guid\r
604 *               The port GUID, in network byte order, for which to generate a\r
605 *               MAC address.\r
606 *\r
607 *       p_mac_addr\r
608 *               Pointer to a mac address in which to store the results.\r
609 *\r
610 * RETURN VALUES\r
611 *       IB_SUCCESS\r
612 *               The MAC address was successfully converted.\r
613 *\r
614 *       IB_INVALID_GUID\r
615 *               The port GUID provided was not a known GUID format.\r
616 *\r
617 * NOTES\r
618 *       The algorithm to convert portGuid to MAC address is as \r
619 *\r
620 * SEE ALSO\r
621 *       IPOIB\r
622 *********/\r
623 \r
624 \r
625 /****f* IPOIB/ipoib_is_voltaire_router_gid\r
626 * NAME\r
627 *       ipoib_is_voltaire_router_gid\r
628 *\r
629 * DESCRIPTION\r
630 *       Checks whether the GID belongs to Voltaire IP router\r
631 *\r
632 * SYNOPSIS\r
633 */\r
634 boolean_t\r
635 static inline\r
636 ipoib_is_voltaire_router_gid(\r
637         IN              const   ib_gid_t                                        *p_gid )\r
638 {\r
639         static const uint8_t VOLTAIRE_GUID_PREFIX[] = {0, 0x08, 0xf1, 0, 0x1};\r
640 \r
641         return !cl_memcmp( &p_gid->unicast.interface_id, VOLTAIRE_GUID_PREFIX,\r
642                 sizeof(VOLTAIRE_GUID_PREFIX) );\r
643 }\r
644 \r
645 \r
646 #ifdef __cplusplus\r
647 }\r
648 #endif\r
649 \r
650 #endif  /* _IPOIB_XFR_MGR_H_ */\r