ae973e118186424b2f7f0edd97e48b3c70603e68
[mirror/winof/.git] / ulp / libibmad / src / sa.c
1 /*\r
2  * Copyright (c) 2004-2007 Voltaire Inc.  All rights reserved.\r
3  *\r
4  * This software is available to you under the OpenFabrics.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 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
27  * SOFTWARE.\r
28  */\r
29 \r
30 #if HAVE_CONFIG_H\r
31 #  include <config.h>\r
32 #endif /* HAVE_CONFIG_H */\r
33 \r
34 #include <stdio.h>\r
35 #include <stdlib.h>\r
36 \r
37 #if defined(_WIN32) || defined(_WIN64)\r
38 #include <windows.h>\r
39 #else\r
40 #include <unistd.h>\r
41 #include <pthread.h>\r
42 #include <string.h>\r
43 #include <sys/time.h>\r
44 #endif\r
45 \r
46 #include <mad.h>\r
47 \r
48 #undef DEBUG\r
49 #define DEBUG   if (ibdebug)    IBWARN\r
50 \r
51 uint8_t *\r
52 sa_rpc_call(const void *ibmad_port, void *rcvbuf, ib_portid_t *portid,\r
53             ib_sa_call_t *sa, unsigned timeout)\r
54 {\r
55         ib_rpc_t rpc = {0};\r
56         uint8_t *p;\r
57 \r
58         DEBUG("attr 0x%x mod 0x%x route %s", sa->attrid, sa->mod,\r
59               portid2str(portid));\r
60 \r
61         if (portid->lid <= 0) {\r
62                 IBWARN("only lid routes are supported");\r
63                 return 0;\r
64         }\r
65 \r
66         rpc.mgtclass = IB_SA_CLASS;\r
67         rpc.method = sa->method;\r
68         rpc.attr.id = sa->attrid;\r
69         rpc.attr.mod = sa->mod;\r
70         rpc.mask = sa->mask;\r
71         rpc.timeout = timeout;\r
72         rpc.datasz = IB_SA_DATA_SIZE;\r
73         rpc.dataoffs = IB_SA_DATA_OFFS;\r
74         rpc.trid = sa->trid;\r
75 \r
76         portid->qp = 1;\r
77         if (!portid->qkey)\r
78                 portid->qkey = IB_DEFAULT_QP1_QKEY;\r
79 \r
80         p = mad_rpc_rmpp(ibmad_port, &rpc, portid, 0/*&sa->rmpp*/, rcvbuf);     /* TODO: RMPP */\r
81 \r
82         sa->recsz = rpc.recsz;\r
83 \r
84         return p;\r
85 }\r
86 \r
87 /* PathRecord */\r
88 #define IB_PR_COMPMASK_DGID                             (1ull<<2)\r
89 #define IB_PR_COMPMASK_SGID                             (1ull<<3)\r
90 #define IB_PR_COMPMASK_DLID                             (1ull<<4)\r
91 #define IB_PR_COMPMASK_SLID                             (1ull<<5)\r
92 #define IB_PR_COMPMASK_RAWTRAFIC                        (1ull<<6)\r
93 #define IB_PR_COMPMASK_RESV0                            (1ull<<7)\r
94 #define IB_PR_COMPMASK_FLOWLABEL                        (1ull<<8)\r
95 #define IB_PR_COMPMASK_HOPLIMIT                         (1ull<<9)\r
96 #define IB_PR_COMPMASK_TCLASS                           (1ull<<10)\r
97 #define IB_PR_COMPMASK_REVERSIBLE                       (1ull<<11)\r
98 #define IB_PR_COMPMASK_NUMBPATH                         (1ull<<12)\r
99 #define IB_PR_COMPMASK_PKEY                             (1ull<<13)\r
100 #define IB_PR_COMPMASK_RESV1                            (1ull<<14)\r
101 #define IB_PR_COMPMASK_SL                               (1ull<<15)\r
102 #define IB_PR_COMPMASK_MTUSELEC                         (1ull<<16)\r
103 #define IB_PR_COMPMASK_MTU                              (1ull<<17)\r
104 #define IB_PR_COMPMASK_RATESELEC                        (1ull<<18)\r
105 #define IB_PR_COMPMASK_RATE                             (1ull<<19)\r
106 #define IB_PR_COMPMASK_PKTLIFETIMESELEC                 (1ull<<20)\r
107 #define IB_PR_COMPMASK_PKTLIFETIME                      (1ull<<21)\r
108 #define IB_PR_COMPMASK_PREFERENCE                       (1ull<<22)\r
109 \r
110 #define IB_PR_DEF_MASK (IB_PR_COMPMASK_DGID |\\r
111                         IB_PR_COMPMASK_SGID |\\r
112                         IB_PR_COMPMASK_NUMBPATH)\r
113 \r
114 int\r
115 ib_path_query_via(const void *srcport, ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t *sm_id, void *buf)\r
116 {\r
117         int npath;\r
118         ib_sa_call_t sa = {0};\r
119         uint8_t *p;\r
120         int dlid;\r
121 \r
122         npath = 1;                      /* only MAD_METHOD_GET is supported */\r
123         memset(&sa, 0, sizeof sa);\r
124         sa.method = IB_MAD_METHOD_GET;\r
125         sa.attrid = IB_SA_ATTR_PATHRECORD;\r
126         sa.mask = IB_PR_DEF_MASK;\r
127         sa.trid = mad_trid();\r
128 \r
129         memset(buf, 0, IB_SA_PR_RECSZ);\r
130 \r
131         mad_encode_field(buf, IB_SA_PR_NPATH_F, &npath);\r
132         mad_encode_field(buf, IB_SA_PR_DGID_F, destgid);\r
133         mad_encode_field(buf, IB_SA_PR_SGID_F, srcgid);\r
134 \r
135         if (srcport) {\r
136                 p = sa_rpc_call (srcport, buf, sm_id, &sa, 0);\r
137         } else {\r
138                 p = safe_sa_call(buf, sm_id, &sa, 0);\r
139         }\r
140         if (!p) {\r
141                 IBWARN("sa call path_query failed");\r
142                 return -1;\r
143         }\r
144 \r
145         mad_decode_field(p, IB_SA_PR_DLID_F, &dlid);\r
146         return dlid;\r
147 }\r
148 \r
149 MAD_EXPORT int\r
150 ib_path_query(ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t *sm_id, void *buf)\r
151 {\r
152         return ib_path_query_via (NULL, srcgid, destgid, sm_id, buf);\r
153 }\r