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; 44358Sigor@sysoev.ru 45358Sigor@sysoev.ru /* A cache hist used to place sockaddr into appropriate free list. */ 46358Sigor@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 61337Sigor@sysoev.ru nxt_sockaddr_t *nxt_sockaddr_cache_alloc(nxt_event_engine_t *engine, 62358Sigor@sysoev.ru nxt_listen_socket_t *ls); 63337Sigor@sysoev.ru void nxt_sockaddr_cache_free(nxt_event_engine_t *engine, nxt_conn_t *c); 64337Sigor@sysoev.ru 6565Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_alloc(nxt_mp_t *mp, socklen_t socklen, 6665Sigor@sysoev.ru size_t address_length) 670Sigor@sysoev.ru NXT_MALLOC_LIKE; 6865Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_create(nxt_mp_t *mp, 6913Sigor@sysoev.ru struct sockaddr *sockaddr, socklen_t socklen, size_t address_length) 700Sigor@sysoev.ru NXT_MALLOC_LIKE; 7165Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_copy(nxt_mp_t *mp, nxt_sockaddr_t *src) 720Sigor@sysoev.ru NXT_MALLOC_LIKE; 7365Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_getsockname(nxt_task_t *task, nxt_mp_t *mp, 7465Sigor@sysoev.ru nxt_socket_t s) 750Sigor@sysoev.ru NXT_MALLOC_LIKE; 7613Sigor@sysoev.ru NXT_EXPORT void nxt_sockaddr_text(nxt_sockaddr_t *sa); 770Sigor@sysoev.ru 780Sigor@sysoev.ru 7913Sigor@sysoev.ru NXT_EXPORT uint32_t nxt_sockaddr_port_number(nxt_sockaddr_t *sa); 800Sigor@sysoev.ru NXT_EXPORT nxt_bool_t nxt_sockaddr_cmp(nxt_sockaddr_t *sa1, 810Sigor@sysoev.ru nxt_sockaddr_t *sa2); 8299Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_parse(nxt_mp_t *mp, nxt_str_t *addr); 83*1935So.canty@f5.com NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_parse_optport(nxt_mp_t *mp, 84*1935So.canty@f5.com nxt_str_t *addr); 850Sigor@sysoev.ru NXT_EXPORT in_addr_t nxt_inet_addr(u_char *buf, size_t len); 860Sigor@sysoev.ru #if (NXT_INET6) 870Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_inet6_addr(struct in6_addr *in6_addr, u_char *buf, 880Sigor@sysoev.ru size_t len); 890Sigor@sysoev.ru #endif 90*1935So.canty@f5.com NXT_EXPORT nxt_bool_t nxt_inet6_probe(nxt_str_t *addr); 910Sigor@sysoev.ru 920Sigor@sysoev.ru 93703Svbart@nginx.com #define NXT_INET_ADDR_STR_LEN nxt_length("255.255.255.255:65535") 940Sigor@sysoev.ru 950Sigor@sysoev.ru #define NXT_INET6_ADDR_STR_LEN \ 96703Svbart@nginx.com nxt_length("[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535") 970Sigor@sysoev.ru 980Sigor@sysoev.ru 99358Sigor@sysoev.ru #define nxt_sockaddr_size(sa) \ 100358Sigor@sysoev.ru (offsetof(nxt_sockaddr_t, u) + sa->socklen + sa->length) 10198Svbart@nginx.com #define nxt_sockaddr_start(sa) nxt_pointer_to(sa, (sa)->start) 10298Svbart@nginx.com #define nxt_sockaddr_address(sa) nxt_pointer_to(sa, (sa)->address_start) 10398Svbart@nginx.com #define nxt_sockaddr_port(sa) nxt_pointer_to(sa, (sa)->port_start) 104110Sigor@sysoev.ru #define nxt_sockaddr_port_length(sa) \ 105110Sigor@sysoev.ru (((sa)->start + (sa)->length) - (sa)->port_start) 1060Sigor@sysoev.ru 1070Sigor@sysoev.ru 1080Sigor@sysoev.ru #endif /* _NXT_SOCKADDR_H_INCLUDED_ */ 109