sockaddr_utils.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2016 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
20 
22 
23 #include <errno.h>
24 #include <inttypes.h>
25 #include <string.h>
26 
27 #include <string>
28 #include <utility>
29 
30 #include "absl/status/status.h"
31 #include "absl/strings/str_cat.h"
32 #include "absl/strings/str_format.h"
33 
34 #include <grpc/support/log.h>
35 
41 
42 #ifdef GRPC_HAVE_UNIX_SOCKET
43 #include <sys/un.h>
44 #endif
45 
46 #ifdef GRPC_HAVE_UNIX_SOCKET
48  const grpc_resolved_address* resolved_addr) {
49  const grpc_sockaddr* addr =
50  reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
51  if (addr->sa_family != AF_UNIX) {
53  absl::StrCat("Socket family is not AF_UNIX: ", addr->sa_family));
54  }
55  const auto* unix_addr = reinterpret_cast<const struct sockaddr_un*>(addr);
56  std::string scheme, path;
57  if (unix_addr->sun_path[0] == '\0' && unix_addr->sun_path[1] != '\0') {
58  scheme = "unix-abstract";
59  path = std::string(unix_addr->sun_path + 1,
60  resolved_addr->len - sizeof(unix_addr->sun_family) - 1);
61  } else {
62  scheme = "unix";
63  path = unix_addr->sun_path;
64  }
66  std::move(scheme), /*authority=*/"", std::move(path),
67  /*query_parameter_pairs=*/{}, /*fragment=*/"");
68  if (!uri.ok()) return uri.status();
69  return uri->ToString();
70 }
71 #else
73  const grpc_resolved_address* /* addr */) {
74  return absl::InvalidArgumentError("Unix socket is not supported.");
75 }
76 #endif
77 
78 static const uint8_t kV4MappedPrefix[] = {0, 0, 0, 0, 0, 0,
79  0, 0, 0, 0, 0xff, 0xff};
80 
82  grpc_resolved_address* resolved_addr4_out) {
83  GPR_ASSERT(resolved_addr != resolved_addr4_out);
84  const grpc_sockaddr* addr =
85  reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
86  grpc_sockaddr_in* addr4_out =
87  resolved_addr4_out == nullptr
88  ? nullptr
89  : reinterpret_cast<grpc_sockaddr_in*>(resolved_addr4_out->addr);
90  if (addr->sa_family == GRPC_AF_INET6) {
91  const grpc_sockaddr_in6* addr6 =
92  reinterpret_cast<const grpc_sockaddr_in6*>(addr);
93  if (memcmp(addr6->sin6_addr.s6_addr, kV4MappedPrefix,
94  sizeof(kV4MappedPrefix)) == 0) {
95  if (resolved_addr4_out != nullptr) {
96  /* Normalize ::ffff:0.0.0.0/96 to IPv4. */
97  memset(resolved_addr4_out, 0, sizeof(*resolved_addr4_out));
98  addr4_out->sin_family = GRPC_AF_INET;
99  /* s6_addr32 would be nice, but it's non-standard. */
100  memcpy(&addr4_out->sin_addr, &addr6->sin6_addr.s6_addr[12], 4);
101  addr4_out->sin_port = addr6->sin6_port;
102  resolved_addr4_out->len =
103  static_cast<socklen_t>(sizeof(grpc_sockaddr_in));
104  }
105  return 1;
106  }
107  }
108  return 0;
109 }
110 
112  grpc_resolved_address* resolved_addr6_out) {
113  GPR_ASSERT(resolved_addr != resolved_addr6_out);
114  const grpc_sockaddr* addr =
115  reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
116  grpc_sockaddr_in6* addr6_out =
117  reinterpret_cast<grpc_sockaddr_in6*>(resolved_addr6_out->addr);
118  if (addr->sa_family == GRPC_AF_INET) {
119  const grpc_sockaddr_in* addr4 =
120  reinterpret_cast<const grpc_sockaddr_in*>(addr);
121  memset(resolved_addr6_out, 0, sizeof(*resolved_addr6_out));
122  addr6_out->sin6_family = GRPC_AF_INET6;
123  memcpy(&addr6_out->sin6_addr.s6_addr[0], kV4MappedPrefix, 12);
124  memcpy(&addr6_out->sin6_addr.s6_addr[12], &addr4->sin_addr, 4);
125  addr6_out->sin6_port = addr4->sin_port;
126  resolved_addr6_out->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in6));
127  return 1;
128  }
129  return 0;
130 }
131 
133  int* port_out) {
134  const grpc_sockaddr* addr;
135  grpc_resolved_address addr4_normalized;
136  if (grpc_sockaddr_is_v4mapped(resolved_addr, &addr4_normalized)) {
137  resolved_addr = &addr4_normalized;
138  }
139  addr = reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
140  if (addr->sa_family == GRPC_AF_INET) {
141  /* Check for 0.0.0.0 */
142  const grpc_sockaddr_in* addr4 =
143  reinterpret_cast<const grpc_sockaddr_in*>(addr);
144  if (addr4->sin_addr.s_addr != 0) {
145  return 0;
146  }
147  *port_out = grpc_ntohs(addr4->sin_port);
148  return 1;
149  } else if (addr->sa_family == GRPC_AF_INET6) {
150  /* Check for :: */
151  const grpc_sockaddr_in6* addr6 =
152  reinterpret_cast<const grpc_sockaddr_in6*>(addr);
153  int i;
154  for (i = 0; i < 16; i++) {
155  if (addr6->sin6_addr.s6_addr[i] != 0) {
156  return 0;
157  }
158  }
159  *port_out = grpc_ntohs(addr6->sin6_port);
160  return 1;
161  } else {
162  return 0;
163  }
164 }
165 
167  grpc_resolved_address* wild6_out) {
170 }
171 
173  grpc_resolved_address* resolved_wild_out) {
174  grpc_sockaddr_in* wild_out =
175  reinterpret_cast<grpc_sockaddr_in*>(resolved_wild_out->addr);
176  GPR_ASSERT(port >= 0 && port < 65536);
177  memset(resolved_wild_out, 0, sizeof(*resolved_wild_out));
178  wild_out->sin_family = GRPC_AF_INET;
179  wild_out->sin_port = grpc_htons(static_cast<uint16_t>(port));
180  resolved_wild_out->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in));
181 }
182 
184  grpc_resolved_address* resolved_wild_out) {
185  grpc_sockaddr_in6* wild_out =
186  reinterpret_cast<grpc_sockaddr_in6*>(resolved_wild_out->addr);
187  GPR_ASSERT(port >= 0 && port < 65536);
188  memset(resolved_wild_out, 0, sizeof(*resolved_wild_out));
189  wild_out->sin6_family = GRPC_AF_INET6;
190  wild_out->sin6_port = grpc_htons(static_cast<uint16_t>(port));
191  resolved_wild_out->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in6));
192 }
193 
195  const grpc_resolved_address* resolved_addr, bool normalize) {
196  const int save_errno = errno;
197  grpc_resolved_address addr_normalized;
198  if (normalize && grpc_sockaddr_is_v4mapped(resolved_addr, &addr_normalized)) {
199  resolved_addr = &addr_normalized;
200  }
201  const grpc_sockaddr* addr =
202  reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
204 #ifdef GRPC_HAVE_UNIX_SOCKET
205  if (addr->sa_family == GRPC_AF_UNIX) {
206  const sockaddr_un* addr_un = reinterpret_cast<const sockaddr_un*>(addr);
207  bool abstract = addr_un->sun_path[0] == '\0';
208  if (abstract) {
209  int len = resolved_addr->len - sizeof(addr->sa_family);
210  if (len <= 0) {
211  return absl::InvalidArgumentError("empty UDS abstract path");
212  }
213  out = std::string(addr_un->sun_path, len);
214  } else {
215  size_t maxlen = sizeof(addr_un->sun_path);
216  if (strnlen(addr_un->sun_path, maxlen) == maxlen) {
217  return absl::InvalidArgumentError("UDS path is not null-terminated");
218  }
219  out = std::string(addr_un->sun_path);
220  }
221  return out;
222  }
223 #endif
224 
225  const void* ip = nullptr;
226  int port = 0;
227  uint32_t sin6_scope_id = 0;
228  if (addr->sa_family == GRPC_AF_INET) {
229  const grpc_sockaddr_in* addr4 =
230  reinterpret_cast<const grpc_sockaddr_in*>(addr);
231  ip = &addr4->sin_addr;
232  port = grpc_ntohs(addr4->sin_port);
233  } else if (addr->sa_family == GRPC_AF_INET6) {
234  const grpc_sockaddr_in6* addr6 =
235  reinterpret_cast<const grpc_sockaddr_in6*>(addr);
236  ip = &addr6->sin6_addr;
238  sin6_scope_id = addr6->sin6_scope_id;
239  }
240  char ntop_buf[GRPC_INET6_ADDRSTRLEN];
241  if (ip != nullptr && grpc_inet_ntop(addr->sa_family, ip, ntop_buf,
242  sizeof(ntop_buf)) != nullptr) {
243  if (sin6_scope_id != 0) {
244  // Enclose sin6_scope_id with the format defined in RFC 6874 section 2.
245  std::string host_with_scope =
246  absl::StrFormat("%s%%%" PRIu32, ntop_buf, sin6_scope_id);
247  out = grpc_core::JoinHostPort(host_with_scope, port);
248  } else {
249  out = grpc_core::JoinHostPort(ntop_buf, port);
250  }
251  } else {
253  absl::StrCat("Unknown sockaddr family: ", addr->sa_family));
254  }
255  /* This is probably redundant, but we wouldn't want to log the wrong error. */
256  errno = save_errno;
257  return out;
258 }
259 
261  const grpc_resolved_address* resolved_addr) {
262  if (resolved_addr->len == 0) {
263  return absl::InvalidArgumentError("Empty address");
264  }
265  grpc_resolved_address addr_normalized;
266  if (grpc_sockaddr_is_v4mapped(resolved_addr, &addr_normalized)) {
267  resolved_addr = &addr_normalized;
268  }
269  const char* scheme = grpc_sockaddr_get_uri_scheme(resolved_addr);
270  if (scheme == nullptr || strcmp("unix", scheme) == 0) {
271  return grpc_sockaddr_to_uri_unix_if_possible(resolved_addr);
272  }
273  auto path = grpc_sockaddr_to_string(resolved_addr, false /* normalize */);
274  if (!path.ok()) return path;
276  grpc_core::URI::Create(scheme, /*authority=*/"", std::move(path.value()),
277  /*query_parameter_pairs=*/{}, /*fragment=*/"");
278  if (!uri.ok()) return uri.status();
279  return uri->ToString();
280 }
281 
283  const grpc_resolved_address* resolved_addr) {
284  const grpc_sockaddr* addr =
285  reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
286  switch (addr->sa_family) {
287  case GRPC_AF_INET:
288  return "ipv4";
289  case GRPC_AF_INET6:
290  return "ipv6";
291  case GRPC_AF_UNIX:
292  return "unix";
293  }
294  return nullptr;
295 }
296 
298  const grpc_sockaddr* addr =
299  reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
300  return addr->sa_family;
301 }
302 
304  const grpc_sockaddr* addr =
305  reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
306  switch (addr->sa_family) {
307  case GRPC_AF_INET:
308  return grpc_ntohs(
309  (reinterpret_cast<const grpc_sockaddr_in*>(addr))->sin_port);
310  case GRPC_AF_INET6:
311  return grpc_ntohs(
312  (reinterpret_cast<const grpc_sockaddr_in6*>(addr))->sin6_port);
313 #ifdef GRPC_HAVE_UNIX_SOCKET
314  case AF_UNIX:
315  return 1;
316 #endif
317  default:
318  gpr_log(GPR_ERROR, "Unknown socket family %d in grpc_sockaddr_get_port",
319  addr->sa_family);
320  return 0;
321  }
322 }
323 
325  grpc_sockaddr* addr = reinterpret_cast<grpc_sockaddr*>(resolved_addr->addr);
326  switch (addr->sa_family) {
327  case GRPC_AF_INET:
328  GPR_ASSERT(port >= 0 && port < 65536);
329  (reinterpret_cast<grpc_sockaddr_in*>(addr))->sin_port =
330  grpc_htons(static_cast<uint16_t>(port));
331  return 1;
332  case GRPC_AF_INET6:
333  GPR_ASSERT(port >= 0 && port < 65536);
334  (reinterpret_cast<grpc_sockaddr_in6*>(addr))->sin6_port =
335  grpc_htons(static_cast<uint16_t>(port));
336  return 1;
337  default:
338  gpr_log(GPR_ERROR, "Unknown socket family %d in grpc_sockaddr_set_port",
339  addr->sa_family);
340  return 0;
341  }
342 }
343 
345  const grpc_resolved_address* resolved_addr) {
346  const grpc_sockaddr* addr =
347  reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
348  if (addr->sa_family == GRPC_AF_INET) {
349  const grpc_sockaddr_in* addr4 =
350  reinterpret_cast<const grpc_sockaddr_in*>(addr);
351  const char* addr_bytes = reinterpret_cast<const char*>(&addr4->sin_addr);
352  return std::string(addr_bytes, 4);
353  } else if (addr->sa_family == GRPC_AF_INET6) {
354  const grpc_sockaddr_in6* addr6 =
355  reinterpret_cast<const grpc_sockaddr_in6*>(addr);
356  const char* addr_bytes = reinterpret_cast<const char*>(&addr6->sin6_addr);
357  return std::string(addr_bytes, 16);
358  } else {
359  GPR_ASSERT(false);
360  }
361 }
362 
364  uint32_t mask_bits) {
365  grpc_sockaddr* addr = reinterpret_cast<grpc_sockaddr*>(address->addr);
366  if (addr->sa_family == GRPC_AF_INET) {
367  grpc_sockaddr_in* addr4 = reinterpret_cast<grpc_sockaddr_in*>(addr);
368  if (mask_bits == 0) {
369  memset(&addr4->sin_addr, 0, sizeof(addr4->sin_addr));
370  return;
371  } else if (mask_bits >= 32) {
372  return;
373  }
374  uint32_t mask_ip_addr = (~(uint32_t(0))) << (32 - mask_bits);
375  addr4->sin_addr.s_addr &= grpc_htonl(mask_ip_addr);
376  } else if (addr->sa_family == GRPC_AF_INET6) {
377  grpc_sockaddr_in6* addr6 = reinterpret_cast<grpc_sockaddr_in6*>(addr);
378  if (mask_bits == 0) {
379  memset(&addr6->sin6_addr, 0, sizeof(addr6->sin6_addr));
380  return;
381  } else if (mask_bits >= 128) {
382  return;
383  }
384  // We cannot use s6_addr32 since it is not defined on all platforms that we
385  // need it on.
386  uint32_t address_parts[4];
387  GPR_ASSERT(sizeof(addr6->sin6_addr) == sizeof(address_parts));
388  memcpy(address_parts, &addr6->sin6_addr, sizeof(grpc_in6_addr));
389  if (mask_bits <= 32) {
390  uint32_t mask_ip_addr = (~(uint32_t(0))) << (32 - mask_bits);
391  address_parts[0] &= grpc_htonl(mask_ip_addr);
392  memset(&address_parts[1], 0, sizeof(uint32_t));
393  memset(&address_parts[2], 0, sizeof(uint32_t));
394  memset(&address_parts[3], 0, sizeof(uint32_t));
395  } else if (mask_bits <= 64) {
396  mask_bits -= 32;
397  uint32_t mask_ip_addr = (~(uint32_t(0))) << (32 - mask_bits);
398  address_parts[1] &= grpc_htonl(mask_ip_addr);
399  memset(&address_parts[2], 0, sizeof(uint32_t));
400  memset(&address_parts[3], 0, sizeof(uint32_t));
401  } else if (mask_bits <= 96) {
402  mask_bits -= 64;
403  uint32_t mask_ip_addr = (~(uint32_t(0))) << (32 - mask_bits);
404  address_parts[2] &= grpc_htonl(mask_ip_addr);
405  memset(&address_parts[3], 0, sizeof(uint32_t));
406  } else {
407  mask_bits -= 96;
408  uint32_t mask_ip_addr = (~(uint32_t(0))) << (32 - mask_bits);
409  address_parts[3] &= grpc_htonl(mask_ip_addr);
410  }
411  memcpy(&addr6->sin6_addr, address_parts, sizeof(grpc_in6_addr));
412  }
413 }
414 
416  const grpc_resolved_address* subnet_address,
417  uint32_t mask_bits) {
418  auto* addr = reinterpret_cast<const grpc_sockaddr*>(address->addr);
419  auto* subnet_addr =
420  reinterpret_cast<const grpc_sockaddr*>(subnet_address->addr);
421  if (addr->sa_family != subnet_addr->sa_family) return false;
422  grpc_resolved_address masked_address;
423  memcpy(&masked_address, address, sizeof(grpc_resolved_address));
424  addr = reinterpret_cast<grpc_sockaddr*>((&masked_address)->addr);
425  grpc_sockaddr_mask_bits(&masked_address, mask_bits);
426  if (addr->sa_family == GRPC_AF_INET) {
427  auto* addr4 = reinterpret_cast<const grpc_sockaddr_in*>(addr);
428  auto* subnet_addr4 = reinterpret_cast<const grpc_sockaddr_in*>(subnet_addr);
429  if (memcmp(&addr4->sin_addr, &subnet_addr4->sin_addr,
430  sizeof(addr4->sin_addr)) == 0) {
431  return true;
432  }
433  } else if (addr->sa_family == GRPC_AF_INET6) {
434  auto* addr6 = reinterpret_cast<const grpc_sockaddr_in6*>(addr);
435  auto* subnet_addr6 =
436  reinterpret_cast<const grpc_sockaddr_in6*>(subnet_addr);
437  if (memcmp(&addr6->sin6_addr, &subnet_addr6->sin6_addr,
438  sizeof(addr6->sin6_addr)) == 0) {
439  return true;
440  }
441  }
442  return false;
443 }
absl::InvalidArgumentError
Status InvalidArgumentError(absl::string_view message)
Definition: third_party/abseil-cpp/absl/status/status.cc:351
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
grpc_sockaddr_get_family
int grpc_sockaddr_get_family(const grpc_resolved_address *resolved_addr)
Definition: sockaddr_utils.cc:297
log.h
sockaddr_utils.h
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
memset
return memset(p, 0, total)
absl::StrFormat
ABSL_MUST_USE_RESULT std::string StrFormat(const FormatSpec< Args... > &format, const Args &... args)
Definition: abseil-cpp/absl/strings/str_format.h:338
uint16_t
unsigned short uint16_t
Definition: stdint-msvc2008.h:79
string.h
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc_sockaddr_make_wildcards
void grpc_sockaddr_make_wildcards(int port, grpc_resolved_address *wild4_out, grpc_resolved_address *wild6_out)
Definition: sockaddr_utils.cc:166
grpc_resolved_address
Definition: resolved_address.h:34
grpc_ntohs
uint16_t grpc_ntohs(uint16_t netshort)
grpc_inet_ntop
const char * grpc_inet_ntop(int af, const void *src, char *dst, size_t size)
check_documentation.path
path
Definition: check_documentation.py:57
grpc_sockaddr_to_string
absl::StatusOr< std::string > grpc_sockaddr_to_string(const grpc_resolved_address *resolved_addr, bool normalize)
Definition: sockaddr_utils.cc:194
sockaddr.h
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
grpc_sockaddr_to_uri_unix_if_possible
static absl::StatusOr< std::string > grpc_sockaddr_to_uri_unix_if_possible(const grpc_resolved_address *)
Definition: sockaddr_utils.cc:72
gen_build_yaml.struct
def struct(**kwargs)
Definition: test/core/end2end/gen_build_yaml.py:30
kV4MappedPrefix
static const uint8_t kV4MappedPrefix[]
Definition: sockaddr_utils.cc:78
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
socket_utils.h
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
grpc_sockaddr_match_subnet
bool grpc_sockaddr_match_subnet(const grpc_resolved_address *address, const grpc_resolved_address *subnet_address, uint32_t mask_bits)
Definition: sockaddr_utils.cc:415
grpc_sockaddr_get_packed_host
std::string grpc_sockaddr_get_packed_host(const grpc_resolved_address *resolved_addr)
Definition: sockaddr_utils.cc:344
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
sockaddr_in6::sin6_port
unsigned short sin6_port
Definition: ares_ipv6.h:28
grpc_sockaddr_set_port
int grpc_sockaddr_set_port(grpc_resolved_address *resolved_addr, int port)
Definition: sockaddr_utils.cc:324
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_core::JoinHostPort
std::string JoinHostPort(absl::string_view host, int port)
Definition: host_port.cc:32
addr6
static struct sockaddr_in6 addr6
Definition: test-getnameinfo.c:34
grpc_htonl
uint32_t grpc_htonl(uint32_t hostlong)
gtest_json_test_utils.normalize
def normalize(obj)
Definition: bloaty/third_party/googletest/googletest/test/gtest_json_test_utils.py:35
grpc_resolved_address::len
socklen_t len
Definition: resolved_address.h:36
host_port.h
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
grpc_sockaddr_to_v4mapped
int grpc_sockaddr_to_v4mapped(const grpc_resolved_address *resolved_addr, grpc_resolved_address *resolved_addr6_out)
Definition: sockaddr_utils.cc:111
grpc_htons
uint16_t grpc_htons(uint16_t hostshort)
tests.unit._exit_scenarios.port
port
Definition: _exit_scenarios.py:179
addr4
static struct sockaddr_in addr4
Definition: test-getnameinfo.c:33
grpc_sockaddr_get_port
int grpc_sockaddr_get_port(const grpc_resolved_address *resolved_addr)
Definition: sockaddr_utils.cc:303
absl::StatusOr::ok
ABSL_MUST_USE_RESULT bool ok() const
Definition: abseil-cpp/absl/status/statusor.h:491
grpc_sockaddr_make_wildcard4
void grpc_sockaddr_make_wildcard4(int port, grpc_resolved_address *resolved_wild_out)
Definition: sockaddr_utils.cc:172
port.h
grpc_core::URI::Create
static absl::StatusOr< URI > Create(std::string scheme, std::string authority, std::string path, std::vector< QueryParam > query_parameter_pairs, std::string fragment)
Definition: uri_parser.cc:289
grpc_sockaddr_make_wildcard6
void grpc_sockaddr_make_wildcard6(int port, grpc_resolved_address *resolved_wild_out)
Definition: sockaddr_utils.cc:183
sockaddr_in6::sin6_addr
struct ares_in6_addr sin6_addr
Definition: ares_ipv6.h:30
grpc_sockaddr_get_uri_scheme
const char * grpc_sockaddr_get_uri_scheme(const grpc_resolved_address *resolved_addr)
Definition: sockaddr_utils.cc:282
absl::StatusOr< std::string >
uri_parser.h
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
strnlen
size_t strnlen(const char *str, size_t maxlen)
Definition: os390-syscalls.c:554
grpc_sockaddr_is_wildcard
int grpc_sockaddr_is_wildcard(const grpc_resolved_address *resolved_addr, int *port_out)
Definition: sockaddr_utils.cc:132
grpc_sockaddr_is_v4mapped
int grpc_sockaddr_is_v4mapped(const grpc_resolved_address *resolved_addr, grpc_resolved_address *resolved_addr4_out)
Definition: sockaddr_utils.cc:81
grpc_sockaddr_to_uri
absl::StatusOr< std::string > grpc_sockaddr_to_uri(const grpc_resolved_address *resolved_addr)
Definition: sockaddr_utils.cc:260
grpc_resolved_address::addr
char addr[GRPC_MAX_SOCKADDR_SIZE]
Definition: resolved_address.h:35
grpc_core::URI::ToString
std::string ToString() const
Definition: uri_parser.cc:352
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
errno.h
sockaddr_in6::sin6_scope_id
unsigned int sin6_scope_id
Definition: ares_ipv6.h:31
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
absl::StatusOr::status
const Status & status() const &
Definition: abseil-cpp/absl/status/statusor.h:678
grpc_sockaddr_mask_bits
void grpc_sockaddr_mask_bits(grpc_resolved_address *address, uint32_t mask_bits)
Definition: sockaddr_utils.cc:363
port_platform.h


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:19