blob: b9bf787f10e2c35e95234b55e1ecd7bf0eb289ec [file] [log] [blame]
// Copyright 2026 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// Private implementation helpers for address parsing and formatting.
//
// These functions operate on raw bytes without any platform socket headers.
// They are implemented in address.c and called by the platform-specific
// address_posix.c / address_win32.c / address_generic.c files.
#ifndef IREE_ASYNC_ADDRESS_IMPL_H_
#define IREE_ASYNC_ADDRESS_IMPL_H_
#include "iree/base/api.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
//===----------------------------------------------------------------------===//
// Byte-order helpers
//===----------------------------------------------------------------------===//
// Converts a 16-bit value from host byte order to network byte order
// (big-endian).
static inline uint16_t iree_async_htons(uint16_t value) {
#if defined(IREE_ENDIANNESS_LITTLE)
return (uint16_t)((value >> 8) | (value << 8));
#else
return value;
#endif
}
// Converts a 16-bit value from network byte order (big-endian) to host byte
// order.
static inline uint16_t iree_async_ntohs(uint16_t value) {
#if defined(IREE_ENDIANNESS_LITTLE)
return (uint16_t)((value >> 8) | (value << 8));
#else
return value;
#endif
}
//===----------------------------------------------------------------------===//
// IPv4 parsing and formatting
//===----------------------------------------------------------------------===//
// Parses a dotted-quad IPv4 address string into 4 bytes in network order.
// Validates:
// - Exactly 4 decimal octets separated by 3 dots
// - Each octet in range [0, 255]
// - No leading zeros (rejects "01.02.03.04")
// - No trailing characters after the fourth octet
// - No hex digits, whitespace, or empty octets
// Returns IREE_STATUS_INVALID_ARGUMENT on any validation failure.
iree_status_t iree_async_address_parse_ipv4(iree_string_view_t host,
uint8_t out_octets[4]);
// Formats an IPv4 address and port as "o.o.o.o:p" into |buffer|.
// |buffer| must have at least IREE_ASYNC_ADDRESS_MAX_FORMAT_LENGTH bytes.
// |octets| is the 4-byte address in network order.
// |port| is in host byte order.
// Returns the number of characters written (no NUL is appended).
iree_host_size_t iree_async_address_format_ipv4(const uint8_t octets[4],
uint16_t port, char* buffer);
//===----------------------------------------------------------------------===//
// IPv6 parsing and formatting
//===----------------------------------------------------------------------===//
// Parses a colon-hex IPv6 address string into 16 bytes in network order.
// Supports:
// - Full 8-group form (2001:0db8:0000:0000:0000:0000:0000:0001)
// - Zero compression with :: (at most one occurrence)
// - IPv4-mapped form (::ffff:192.168.1.1)
// Validates:
// - 1-8 groups of 1-4 hex digits
// - At most one :: for zero compression
// - No invalid hex characters
// Returns IREE_STATUS_INVALID_ARGUMENT on any validation failure.
iree_status_t iree_async_address_parse_ipv6(iree_string_view_t host,
uint8_t out_bytes[16]);
// Formats an IPv6 address and port as "[addr]:p" using RFC 5952 shortest form.
// |buffer| must have at least IREE_ASYNC_ADDRESS_MAX_FORMAT_LENGTH bytes.
// Rules applied:
// - Longest run of consecutive all-zero 16-bit groups replaced with ::
// - Ties broken by leftmost run
// - Single zero group is NOT compressed (remains "0")
// - Hex digits in lowercase, no leading zeros in groups
// - IPv4-mapped addresses (::ffff:0:0/96 prefix) shown as [::ffff:a.b.c.d]
// - Non-zero scope_id appended as %<id> inside brackets
// |bytes| is the 16-byte address in network order.
// |port| is in host byte order.
// |scope_id| is the interface scope (0 means none, omitted from output).
// Returns the number of characters written (no NUL is appended).
iree_host_size_t iree_async_address_format_ipv6(const uint8_t bytes[16],
uint16_t port,
uint32_t scope_id,
char* buffer);
//===----------------------------------------------------------------------===//
// Unix path formatting
//===----------------------------------------------------------------------===//
// Formats a Unix socket path as "unix:/path" or "unix:@name" (abstract).
// |buffer| must have at least IREE_ASYNC_ADDRESS_MAX_FORMAT_LENGTH bytes.
// |path| is the socket path (for abstract, this is the name without the
// leading NUL byte). |is_abstract| indicates abstract namespace.
// Returns the number of characters written (no NUL is appended).
iree_host_size_t iree_async_address_format_unix(iree_string_view_t path,
bool is_abstract, char* buffer);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // IREE_ASYNC_ADDRESS_IMPL_H_