8751cfe4999e0ecc785bba65ce6937d1d9297a86
[mirror/winof/.git] / ulp / libibmad / src / portid.c
1 /*\r
2  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.\r
3  * Copyright (c) 2008 Intel Corporation.  All rights reserved.\r
4  *\r
5  * This software is available to you under the OpenFabrics.org BSD license\r
6  * below:\r
7  *\r
8  *     Redistribution and use in source and binary forms, with or\r
9  *     without modification, are permitted provided that the following\r
10  *     conditions are met:\r
11  *\r
12  *      - Redistributions of source code must retain the above\r
13  *        copyright notice, this list of conditions and the following\r
14  *        disclaimer.\r
15  *\r
16  *      - Redistributions in binary form must reproduce the above\r
17  *        copyright notice, this list of conditions and the following\r
18  *        disclaimer in the documentation and/or other materials\r
19  *        provided with the distribution.\r
20  *\r
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
22  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
23  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV\r
24  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
25  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
26  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
27  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
28  * SOFTWARE.\r
29  */\r
30 \r
31 #if HAVE_CONFIG_H\r
32 #  include <config.h>\r
33 #endif /* HAVE_CONFIG_H */\r
34 \r
35 #include <stdio.h>\r
36 #include <stdlib.h>\r
37 \r
38 #if defined(_WIN32) || defined(_WIN64)\r
39 #include <windows.h>\r
40 #include <winsock2.h>\r
41 #include <ws2tcpip.h>\r
42 #define snprintf _snprintf\r
43 #else\r
44 #include <unistd.h>\r
45 #include <pthread.h>\r
46 #include <sys/time.h>\r
47 #include <string.h>\r
48 #include <inttypes.h>\r
49 #include <arpa/inet.h>\r
50 #endif\r
51 \r
52 #include <mad.h>\r
53 \r
54 #undef DEBUG\r
55 #define DEBUG   if (ibdebug)    IBWARN\r
56 \r
57 #if defined(_WIN32) || defined(_WIN64)  \r
58 const char * _inet_ntop(int family, const void *addr, char *dst, size_t len)\r
59 {\r
60         if (family == AF_INET)\r
61         {\r
62                 struct sockaddr_in in;\r
63                 in.sin_family = AF_INET;\r
64                 memcpy(&in.sin_addr, addr, 4);\r
65                 if (getnameinfo((struct sockaddr *)&in,\r
66                                 (socklen_t) (sizeof(struct sockaddr_in)),\r
67                                 dst, len, NULL, 0, NI_NUMERICHOST))\r
68                         return NULL;\r
69         }\r
70         else if (family == AF_INET6)\r
71         {\r
72                 struct sockaddr_in6 in6;\r
73                 memset(&in6, 0, sizeof in6);\r
74                 in6.sin6_family = AF_INET;\r
75                 memcpy(&in6.sin6_addr, addr, sizeof(struct in_addr6));\r
76 \r
77                 /* if no ipv6 support return simple IPv6 format rule:\r
78                  * A series of "0's in a 16bit block can be represented by "0" \r
79                  */\r
80                 if (getnameinfo((struct sockaddr *)&in6, (socklen_t) (sizeof in6),\r
81                                  dst, len, NULL, 0, NI_NUMERICHOST)) \r
82                 {\r
83                         char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"];\r
84                         int i, n=0;\r
85                                         \r
86                         if (len < sizeof(tmp))\r
87                                 return NULL;\r
88 \r
89                         for (i = 0; i < 8; i++) \r
90                                 n += sprintf(tmp+n, "%s%x", \r
91                                              i?":":"",\r
92                                              ntohs(((unsigned short*)addr)[i]));\r
93                         tmp[n]='\0';\r
94                         strcpy(dst, tmp);\r
95                 }\r
96         }\r
97         return dst;\r
98 }\r
99 #define inet_ntop _inet_ntop\r
100 #endif\r
101 \r
102 MAD_EXPORT int\r
103 portid2portnum(ib_portid_t *portid)\r
104 {\r
105         if (portid->lid > 0)\r
106                 return -1;\r
107 \r
108         if (portid->drpath.cnt == 0)\r
109                 return 0;\r
110 \r
111         return portid->drpath.p[(portid->drpath.cnt-1)];\r
112 }\r
113 \r
114 MAD_EXPORT char *\r
115 portid2str(ib_portid_t *portid)\r
116 {\r
117         static char buf[1024] = "local";\r
118         int n = 0;\r
119 \r
120         if (portid->lid > 0) {\r
121                 n += sprintf(buf + n, "Lid %d", portid->lid);\r
122                 if (portid->grh_present) {\r
123                         char gid[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"];\r
124                         if (inet_ntop(AF_INET6, portid->gid, gid, sizeof(gid)))\r
125                                 n += sprintf(buf + n, " Gid %s", gid);\r
126                 }\r
127                 if (portid->drpath.cnt)\r
128                         n += sprintf(buf + n, " ");\r
129                 else\r
130                         return buf;\r
131         }\r
132         n += sprintf(buf + n, "DR path ");\r
133         drpath2str(&(portid->drpath), buf + n, sizeof(buf) - n);\r
134 \r
135         return buf;\r
136 }\r
137 \r
138 MAD_EXPORT int\r
139 str2drpath(ib_dr_path_t *path, char *routepath, int drslid, int drdlid)\r
140 {\r
141         char *s, *str = routepath;\r
142 \r
143         path->cnt = -1;\r
144 \r
145         DEBUG("DR str: %s", routepath);\r
146         while (str && *str) {\r
147                 if ((s = strchr(str, ',')))\r
148                         *s = 0;\r
149                 path->p[++path->cnt] = (uint8_t)atoi(str);\r
150                 if (!s)\r
151                         break;\r
152                 str = s+1;\r
153         }\r
154 \r
155         path->drdlid = drdlid ? drdlid : 0xffff;\r
156         path->drslid = drslid ? drslid : 0xffff;\r
157 \r
158         return path->cnt;\r
159 }\r
160 \r
161 MAD_EXPORT char *\r
162 drpath2str(ib_dr_path_t *path, char *dstr, size_t dstr_size)\r
163 {\r
164         int i = 0;\r
165         int rc = snprintf(dstr, dstr_size, "slid %d; dlid %d; %d",\r
166                 path->drslid, path->drdlid, path->p[0]);\r
167         if (rc >= (int) dstr_size)\r
168                 return dstr;\r
169         for (i = 1; i <= path->cnt; i++) {\r
170                 rc += snprintf(dstr+rc, dstr_size-rc, ",%d", path->p[i]);\r
171                 if (rc >= (int) dstr_size)\r
172                         break;\r
173         }\r
174         return (dstr);\r
175 }\r