10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 30Sigor@sysoev.ru * Copyright (C) Igor Sysoev 40Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 50Sigor@sysoev.ru */ 60Sigor@sysoev.ru 70Sigor@sysoev.ru #ifndef _NXT_SOCKADDR_H_INCLUDED_ 80Sigor@sysoev.ru #define _NXT_SOCKADDR_H_INCLUDED_ 90Sigor@sysoev.ru 100Sigor@sysoev.ru 110Sigor@sysoev.ru /* 120Sigor@sysoev.ru * The nxt_sockaddr_t should be allocated using nxt_sockaddr_alloc() 130Sigor@sysoev.ru * with actual "struct sockaddr_..." size: 140Sigor@sysoev.ru * nxt_sockaddr_alloc(pool, sizeof(struct sockaddr_in)) 150Sigor@sysoev.ru */ 160Sigor@sysoev.ru 1713Sigor@sysoev.ru /* 1813Sigor@sysoev.ru * A textual sockaddr representation is stored after struct sockaddr union 1913Sigor@sysoev.ru * and allocated as a whole. 2013Sigor@sysoev.ru */ 210Sigor@sysoev.ru 2213Sigor@sysoev.ru struct nxt_sockaddr_s { 2313Sigor@sysoev.ru /* Socket type: SOCKS_STREAM, SOCK_DGRAM, etc. */ 2413Sigor@sysoev.ru uint8_t type; 2513Sigor@sysoev.ru /* Size of struct sockaddr. */ 2613Sigor@sysoev.ru uint8_t socklen; 270Sigor@sysoev.ru /* 2813Sigor@sysoev.ru * Textual sockaddr representation, e.g.: "127.0.0.1:8000", 2913Sigor@sysoev.ru * "[::1]:8000", and "unix:/path/to/socket". 300Sigor@sysoev.ru */ 3113Sigor@sysoev.ru uint8_t start; 3213Sigor@sysoev.ru uint8_t length; 3313Sigor@sysoev.ru /* 3413Sigor@sysoev.ru * Textual address representation, e.g: "127.0.0.1", "::1", 3513Sigor@sysoev.ru * and "unix:/path/to/socket". 3613Sigor@sysoev.ru */ 3713Sigor@sysoev.ru uint8_t address_start; 3813Sigor@sysoev.ru uint8_t address_length; 3913Sigor@sysoev.ru /* 4013Sigor@sysoev.ru * Textual port representation, e.g. "8000". 41110Sigor@sysoev.ru * Port length is (start + length) - port_start. 4213Sigor@sysoev.ru */ 4313Sigor@sysoev.ru uint8_t port_start; 44*358Sigor@sysoev.ru 45*358Sigor@sysoev.ru /* A cache hist used to place sockaddr into appropriate free list. */ 46*358Sigor@sysoev.ru uint8_t cache_hint; 470Sigor@sysoev.ru 480Sigor@sysoev.ru union { 490Sigor@sysoev.ru struct sockaddr sockaddr; 500Sigor@sysoev.ru struct sockaddr_in sockaddr_in; 510Sigor@sysoev.ru #if (NXT_INET6) 520Sigor@sysoev.ru struct sockaddr_in6 sockaddr_in6; 530Sigor@sysoev.ru #endif 540Sigor@sysoev.ru #if (NXT_HAVE_UNIX_DOMAIN) 550Sigor@sysoev.ru struct sockaddr_un sockaddr_un; 560Sigor@sysoev.ru #endif 570Sigor@sysoev.ru } u; 580Sigor@sysoev.ru }; 590Sigor@sysoev.ru 600Sigor@sysoev.ru 610Sigor@sysoev.ru typedef struct { 620Sigor@sysoev.ru nxt_job_resolve_t resolve; 630Sigor@sysoev.ru nxt_str_t addr; 640Sigor@sysoev.ru 650Sigor@sysoev.ru uint8_t wildcard; /* 1 bit */ 660Sigor@sysoev.ru uint8_t no_port; /* 1 bit */ 670Sigor@sysoev.ru } nxt_job_sockaddr_parse_t; 680Sigor@sysoev.ru 690Sigor@sysoev.ru 70337Sigor@sysoev.ru nxt_sockaddr_t *nxt_sockaddr_cache_alloc(nxt_event_engine_t *engine, 71*358Sigor@sysoev.ru nxt_listen_socket_t *ls); 72337Sigor@sysoev.ru void nxt_sockaddr_cache_free(nxt_event_engine_t *engine, nxt_conn_t *c); 73337Sigor@sysoev.ru 7465Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_alloc(nxt_mp_t *mp, socklen_t socklen, 7565Sigor@sysoev.ru size_t address_length) 760Sigor@sysoev.ru NXT_MALLOC_LIKE; 7765Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_create(nxt_mp_t *mp, 7813Sigor@sysoev.ru struct sockaddr *sockaddr, socklen_t socklen, size_t address_length) 790Sigor@sysoev.ru NXT_MALLOC_LIKE; 8065Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_copy(nxt_mp_t *mp, nxt_sockaddr_t *src) 810Sigor@sysoev.ru NXT_MALLOC_LIKE; 8265Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_getsockname(nxt_task_t *task, nxt_mp_t *mp, 8365Sigor@sysoev.ru nxt_socket_t s) 840Sigor@sysoev.ru NXT_MALLOC_LIKE; 8513Sigor@sysoev.ru NXT_EXPORT void nxt_sockaddr_text(nxt_sockaddr_t *sa); 860Sigor@sysoev.ru 870Sigor@sysoev.ru 8813Sigor@sysoev.ru NXT_EXPORT uint32_t nxt_sockaddr_port_number(nxt_sockaddr_t *sa); 890Sigor@sysoev.ru NXT_EXPORT nxt_bool_t nxt_sockaddr_cmp(nxt_sockaddr_t *sa1, 900Sigor@sysoev.ru nxt_sockaddr_t *sa2); 910Sigor@sysoev.ru NXT_EXPORT size_t nxt_sockaddr_ntop(nxt_sockaddr_t *sa, u_char *buf, 9213Sigor@sysoev.ru u_char *end, nxt_bool_t port); 9399Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_parse(nxt_mp_t *mp, nxt_str_t *addr); 940Sigor@sysoev.ru NXT_EXPORT void nxt_job_sockaddr_parse(nxt_job_sockaddr_parse_t *jbs); 950Sigor@sysoev.ru NXT_EXPORT in_addr_t nxt_inet_addr(u_char *buf, size_t len); 960Sigor@sysoev.ru #if (NXT_INET6) 970Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_inet6_addr(struct in6_addr *in6_addr, u_char *buf, 980Sigor@sysoev.ru size_t len); 990Sigor@sysoev.ru #endif 1000Sigor@sysoev.ru 1010Sigor@sysoev.ru 10213Sigor@sysoev.ru #define NXT_INET_ADDR_STR_LEN (sizeof("255.255.255.255:65535") - 1) 1030Sigor@sysoev.ru 1040Sigor@sysoev.ru #define NXT_INET6_ADDR_STR_LEN \ 10513Sigor@sysoev.ru (sizeof("[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535") - 1) 1060Sigor@sysoev.ru 1070Sigor@sysoev.ru 108*358Sigor@sysoev.ru #define nxt_sockaddr_size(sa) \ 109*358Sigor@sysoev.ru (offsetof(nxt_sockaddr_t, u) + sa->socklen + sa->length) 11098Svbart@nginx.com #define nxt_sockaddr_start(sa) nxt_pointer_to(sa, (sa)->start) 11198Svbart@nginx.com #define nxt_sockaddr_address(sa) nxt_pointer_to(sa, (sa)->address_start) 11298Svbart@nginx.com #define nxt_sockaddr_port(sa) nxt_pointer_to(sa, (sa)->port_start) 113110Sigor@sysoev.ru #define nxt_sockaddr_port_length(sa) \ 114110Sigor@sysoev.ru (((sa)->start + (sa)->length) - (sa)->port_start) 1150Sigor@sysoev.ru 1160Sigor@sysoev.ru 1170Sigor@sysoev.ru #endif /* _NXT_SOCKADDR_H_INCLUDED_ */ 118