1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#ifndef _NGX_INET_H_INCLUDED_
9e18a033bSKonstantin Ananyev#define _NGX_INET_H_INCLUDED_
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev#include <ngx_config.h>
13e18a033bSKonstantin Ananyev#include <ngx_core.h>
14e18a033bSKonstantin Ananyev
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyev#define NGX_INET_ADDRSTRLEN   (sizeof("255.255.255.255") - 1)
17e18a033bSKonstantin Ananyev#define NGX_INET6_ADDRSTRLEN                                                 \
18e18a033bSKonstantin Ananyev    (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1)
19e18a033bSKonstantin Ananyev#define NGX_UNIX_ADDRSTRLEN                                                  \
20e18a033bSKonstantin Ananyev    (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path))
21e18a033bSKonstantin Ananyev
22e18a033bSKonstantin Ananyev#if (NGX_HAVE_UNIX_DOMAIN)
23e18a033bSKonstantin Ananyev#define NGX_SOCKADDR_STRLEN   (sizeof("unix:") - 1 + NGX_UNIX_ADDRSTRLEN)
24e18a033bSKonstantin Ananyev#elif (NGX_HAVE_INET6)
25e18a033bSKonstantin Ananyev#define NGX_SOCKADDR_STRLEN   (NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1)
26e18a033bSKonstantin Ananyev#else
27e18a033bSKonstantin Ananyev#define NGX_SOCKADDR_STRLEN   (NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1)
28e18a033bSKonstantin Ananyev#endif
29e18a033bSKonstantin Ananyev
30e18a033bSKonstantin Ananyev/* compatibility */
31e18a033bSKonstantin Ananyev#define NGX_SOCKADDRLEN       sizeof(ngx_sockaddr_t)
32e18a033bSKonstantin Ananyev
33e18a033bSKonstantin Ananyev
34e18a033bSKonstantin Ananyevtypedef union {
35e18a033bSKonstantin Ananyev    struct sockaddr           sockaddr;
36e18a033bSKonstantin Ananyev    struct sockaddr_in        sockaddr_in;
37e18a033bSKonstantin Ananyev#if (NGX_HAVE_INET6)
38e18a033bSKonstantin Ananyev    struct sockaddr_in6       sockaddr_in6;
39e18a033bSKonstantin Ananyev#endif
40e18a033bSKonstantin Ananyev#if (NGX_HAVE_UNIX_DOMAIN)
41e18a033bSKonstantin Ananyev    struct sockaddr_un        sockaddr_un;
42e18a033bSKonstantin Ananyev#endif
43e18a033bSKonstantin Ananyev} ngx_sockaddr_t;
44e18a033bSKonstantin Ananyev
45e18a033bSKonstantin Ananyev
46e18a033bSKonstantin Ananyevtypedef struct {
47e18a033bSKonstantin Ananyev    in_addr_t                 addr;
48e18a033bSKonstantin Ananyev    in_addr_t                 mask;
49e18a033bSKonstantin Ananyev} ngx_in_cidr_t;
50e18a033bSKonstantin Ananyev
51e18a033bSKonstantin Ananyev
52e18a033bSKonstantin Ananyev#if (NGX_HAVE_INET6)
53e18a033bSKonstantin Ananyev
54e18a033bSKonstantin Ananyevtypedef struct {
55e18a033bSKonstantin Ananyev    struct in6_addr           addr;
56e18a033bSKonstantin Ananyev    struct in6_addr           mask;
57e18a033bSKonstantin Ananyev} ngx_in6_cidr_t;
58e18a033bSKonstantin Ananyev
59e18a033bSKonstantin Ananyev#endif
60e18a033bSKonstantin Ananyev
61e18a033bSKonstantin Ananyev
62e18a033bSKonstantin Ananyevtypedef struct {
63e18a033bSKonstantin Ananyev    ngx_uint_t                family;
64e18a033bSKonstantin Ananyev    union {
65e18a033bSKonstantin Ananyev        ngx_in_cidr_t         in;
66e18a033bSKonstantin Ananyev#if (NGX_HAVE_INET6)
67e18a033bSKonstantin Ananyev        ngx_in6_cidr_t        in6;
68e18a033bSKonstantin Ananyev#endif
69e18a033bSKonstantin Ananyev    } u;
70e18a033bSKonstantin Ananyev} ngx_cidr_t;
71e18a033bSKonstantin Ananyev
72e18a033bSKonstantin Ananyev
73e18a033bSKonstantin Ananyevtypedef struct {
74e18a033bSKonstantin Ananyev    struct sockaddr          *sockaddr;
75e18a033bSKonstantin Ananyev    socklen_t                 socklen;
76e18a033bSKonstantin Ananyev    ngx_str_t                 name;
77e18a033bSKonstantin Ananyev} ngx_addr_t;
78e18a033bSKonstantin Ananyev
79e18a033bSKonstantin Ananyev
80e18a033bSKonstantin Ananyevtypedef struct {
81e18a033bSKonstantin Ananyev    ngx_str_t                 url;
82e18a033bSKonstantin Ananyev    ngx_str_t                 host;
83e18a033bSKonstantin Ananyev    ngx_str_t                 port_text;
84e18a033bSKonstantin Ananyev    ngx_str_t                 uri;
85e18a033bSKonstantin Ananyev
86e18a033bSKonstantin Ananyev    in_port_t                 port;
87e18a033bSKonstantin Ananyev    in_port_t                 default_port;
88e18a033bSKonstantin Ananyev    int                       family;
89e18a033bSKonstantin Ananyev
90e18a033bSKonstantin Ananyev    unsigned                  listen:1;
91e18a033bSKonstantin Ananyev    unsigned                  uri_part:1;
92e18a033bSKonstantin Ananyev    unsigned                  no_resolve:1;
93e18a033bSKonstantin Ananyev
94e18a033bSKonstantin Ananyev    unsigned                  no_port:1;
95e18a033bSKonstantin Ananyev    unsigned                  wildcard:1;
96e18a033bSKonstantin Ananyev
97e18a033bSKonstantin Ananyev    socklen_t                 socklen;
98e18a033bSKonstantin Ananyev    ngx_sockaddr_t            sockaddr;
99e18a033bSKonstantin Ananyev
100e18a033bSKonstantin Ananyev    ngx_addr_t               *addrs;
101e18a033bSKonstantin Ananyev    ngx_uint_t                naddrs;
102e18a033bSKonstantin Ananyev
103e18a033bSKonstantin Ananyev    char                     *err;
104e18a033bSKonstantin Ananyev} ngx_url_t;
105e18a033bSKonstantin Ananyev
106e18a033bSKonstantin Ananyev
107e18a033bSKonstantin Ananyevin_addr_t ngx_inet_addr(u_char *text, size_t len);
108e18a033bSKonstantin Ananyev#if (NGX_HAVE_INET6)
109e18a033bSKonstantin Ananyevngx_int_t ngx_inet6_addr(u_char *p, size_t len, u_char *addr);
110e18a033bSKonstantin Ananyevsize_t ngx_inet6_ntop(u_char *p, u_char *text, size_t len);
111e18a033bSKonstantin Ananyev#endif
112e18a033bSKonstantin Ananyevsize_t ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text,
113e18a033bSKonstantin Ananyev    size_t len, ngx_uint_t port);
114e18a033bSKonstantin Ananyevsize_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len);
115e18a033bSKonstantin Ananyevngx_int_t ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr);
116e18a033bSKonstantin Ananyevngx_int_t ngx_cidr_match(struct sockaddr *sa, ngx_array_t *cidrs);
117e18a033bSKonstantin Ananyevngx_int_t ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text,
118e18a033bSKonstantin Ananyev    size_t len);
119e18a033bSKonstantin Ananyevngx_int_t ngx_parse_addr_port(ngx_pool_t *pool, ngx_addr_t *addr,
120e18a033bSKonstantin Ananyev    u_char *text, size_t len);
121e18a033bSKonstantin Ananyevngx_int_t ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u);
122e18a033bSKonstantin Ananyevngx_int_t ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u);
123e18a033bSKonstantin Ananyevngx_int_t ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1,
124e18a033bSKonstantin Ananyev    struct sockaddr *sa2, socklen_t slen2, ngx_uint_t cmp_port);
125e18a033bSKonstantin Ananyevin_port_t ngx_inet_get_port(struct sockaddr *sa);
126e18a033bSKonstantin Ananyevvoid ngx_inet_set_port(struct sockaddr *sa, in_port_t port);
127e18a033bSKonstantin Ananyev
128e18a033bSKonstantin Ananyev
129e18a033bSKonstantin Ananyev#endif /* _NGX_INET_H_INCLUDED_ */
130