Changeset 7253:63e91f263a49 in nginx


Ignore:
Timestamp:
04/02/18 15:40:04 (2 years ago)
Author:
Ruslan Ermilov <ru@…>
Branch:
default
Phase:
public
Message:

Core: revised the PROXY protocol v2 code.

  • use normal prefixes for types and macros
  • removed some macros and types
  • revised debug messages
  • removed useless check of ngx_sock_ntop() returning 0
  • removed special processing of AF_UNSPEC
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/core/ngx_proxy_protocol.c

    r7252 r7253  
    1010
    1111
    12 #define NGX_PP_V2_SIGLEN         12
    13 #define NGX_PP_V2_CMD_PROXY      1
    14 #define NGX_PP_V2_STREAM         1
    15 
    16 #define NGX_PP_V2_AF_UNSPEC      0
    17 #define NGX_PP_V2_AF_INET        1
    18 #define NGX_PP_V2_AF_INET6       2
    19 
    20 
    21 #define ngx_pp_v2_get_u16(p)     ((p)[0] << 8 | (p)[1])
     12#define NGX_PROXY_PROTOCOL_AF_INET          1
     13#define NGX_PROXY_PROTOCOL_AF_INET6         2
     14
     15
     16#define ngx_proxy_protocol_parse_uint16(p)  ((p)[0] << 8 | (p)[1])
    2217
    2318
    2419typedef struct {
    25     u_char                       signature[NGX_PP_V2_SIGLEN];
    26     u_char                       ver_cmd;
    27     u_char                       family_transport;
    28     u_char                       len[2];
    29 } ngx_pp_v2_header_t;
     20    u_char                                  signature[12];
     21    u_char                                  version_command;
     22    u_char                                  family_transport;
     23    u_char                                  len[2];
     24} ngx_proxy_protocol_header_t;
    3025
    3126
    3227typedef struct {
    33     u_char                       src[4];
    34     u_char                       dst[4];
    35     u_char                       sport[2];
    36     u_char                       dport[2];
    37 } ngx_pp_v2_inet_addrs_t;
     28    u_char                                  s_addr[4];
     29    u_char                                  d_addr[4];
     30    u_char                                  s_port[2];
     31    u_char                                  d_port[2];
     32} ngx_proxy_protocol_inet_addrs_t;
    3833
    3934
    4035typedef struct {
    41     u_char                       src[16];
    42     u_char                       dst[16];
    43     u_char                       sport[2];
    44     u_char                       dport[2];
    45 } ngx_pp_v2_inet6_addrs_t;
    46 
    47 
    48 typedef union {
    49     ngx_pp_v2_inet_addrs_t       inet;
    50     ngx_pp_v2_inet6_addrs_t      inet6;
    51 } ngx_pp_v2_addrs_t;
     36    u_char                                  s_addr[16];
     37    u_char                                  d_addr[16];
     38    u_char                                  s_port[2];
     39    u_char                                  d_port[2];
     40} ngx_proxy_protocol_inet6_addrs_t;
    5241
    5342
    5443static u_char *ngx_proxy_protocol_v2_read(ngx_connection_t *c, u_char *buf,
    5544    u_char *last);
    56 
    57 static const u_char ngx_pp_v2_signature[NGX_PP_V2_SIGLEN] =
    58     { 0x0d, 0x0a, 0x0d, 0x0a, 0x00, 0x0d, 0x0a, 0x51, 0x55, 0x49, 0x54, 0x0a };
    5945
    6046
     
    6652    ngx_int_t  n;
    6753
     54    static const u_char signature[] = "\r\n\r\n\0\r\nQUIT\n";
     55
    6856    p = buf;
    6957    len = last - buf;
    7058
    71     if (len >= sizeof(ngx_pp_v2_header_t)
    72         && memcmp(p, ngx_pp_v2_signature, NGX_PP_V2_SIGLEN) == 0)
     59    if (len >= sizeof(ngx_proxy_protocol_header_t)
     60        && memcmp(p, signature, sizeof(signature) - 1) == 0)
    7361    {
    7462        return ngx_proxy_protocol_v2_read(c, buf, last);
     
    228216ngx_proxy_protocol_v2_read(ngx_connection_t *c, u_char *buf, u_char *last)
    229217{
    230     u_char              *end;
    231     size_t               len;
    232     socklen_t            socklen;
    233     ngx_str_t           *name;
    234     ngx_uint_t           ver, cmd, family, transport;
    235     ngx_sockaddr_t       sockaddr;
    236     ngx_pp_v2_addrs_t   *addrs;
    237     ngx_pp_v2_header_t  *hdr;
    238 
    239     hdr = (ngx_pp_v2_header_t *) buf;
    240 
    241     buf += sizeof(ngx_pp_v2_header_t);
    242 
    243     ver = hdr->ver_cmd >> 4;
    244 
    245     if (ver != 2) {
     218    u_char                             *end;
     219    size_t                              len;
     220    socklen_t                           socklen;
     221    ngx_uint_t                          version, command, family, transport;
     222    ngx_sockaddr_t                      sockaddr;
     223    ngx_proxy_protocol_header_t        *header;
     224    ngx_proxy_protocol_inet_addrs_t    *inet;
     225#if (NGX_HAVE_INET6)
     226    ngx_proxy_protocol_inet6_addrs_t   *inet6;
     227#endif
     228
     229    header = (ngx_proxy_protocol_header_t *) buf;
     230
     231    buf += sizeof(ngx_proxy_protocol_header_t);
     232
     233    version = header->version_command >> 4;
     234
     235    if (version != 2) {
    246236        ngx_log_error(NGX_LOG_ERR, c->log, 0,
    247                       "unsupported PROXY protocol version: %ui", ver);
    248         return NULL;
    249     }
    250 
    251     len = ngx_pp_v2_get_u16(hdr->len);
     237                      "unknown PROXY protocol version: %ui", version);
     238        return NULL;
     239    }
     240
     241    len = ngx_proxy_protocol_parse_uint16(header->len);
    252242
    253243    if ((size_t) (last - buf) < len) {
     
    258248    end = buf + len;
    259249
    260     cmd = hdr->ver_cmd & 0x0f;
    261 
    262     if (cmd != NGX_PP_V2_CMD_PROXY) {
     250    command = header->version_command & 0x0f;
     251
     252    /* only PROXY is supported */
     253    if (command != 1) {
    263254        ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
    264                        "PROXY protocol v2 unsupported command 0x%xi", cmd);
     255                       "PROXY protocol v2 unsupported command %ui", command);
    265256        return end;
    266257    }
    267258
    268     transport = hdr->family_transport & 0x0f;
    269 
    270     if (transport != NGX_PP_V2_STREAM) {
     259    transport = header->family_transport & 0x0f;
     260
     261    /* only STREAM is supported */
     262    if (transport != 1) {
    271263        ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
    272                        "PROXY protocol v2 unsupported transport 0x%xi",
     264                       "PROXY protocol v2 unsupported transport %ui",
    273265                       transport);
    274266        return end;
    275267    }
    276268
    277     family = hdr->family_transport >> 4;
    278 
    279     addrs = (ngx_pp_v2_addrs_t *) buf;
     269    family = header->family_transport >> 4;
    280270
    281271    switch (family) {
    282272
    283     case NGX_PP_V2_AF_UNSPEC:
    284         ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0,
    285                        "PROXY protocol v2 AF_UNSPEC ignored");
    286         return end;
    287 
    288     case NGX_PP_V2_AF_INET:
    289 
    290         if ((size_t) (end - buf) < sizeof(ngx_pp_v2_inet_addrs_t)) {
     273    case NGX_PROXY_PROTOCOL_AF_INET:
     274
     275        if ((size_t) (end - buf) < sizeof(ngx_proxy_protocol_inet_addrs_t)) {
    291276            return NULL;
    292277        }
     278
     279        inet = (ngx_proxy_protocol_inet_addrs_t *) buf;
    293280
    294281        sockaddr.sockaddr_in.sin_family = AF_INET;
    295282        sockaddr.sockaddr_in.sin_port = 0;
    296         memcpy(&sockaddr.sockaddr_in.sin_addr, addrs->inet.src, 4);
    297 
    298         c->proxy_protocol_port = ngx_pp_v2_get_u16(addrs->inet.sport);
     283        memcpy(&sockaddr.sockaddr_in.sin_addr, inet->s_addr, 4);
     284
     285        c->proxy_protocol_port = ngx_proxy_protocol_parse_uint16(inet->s_port);
    299286
    300287        socklen = sizeof(struct sockaddr_in);
    301288
    302         buf += sizeof(ngx_pp_v2_inet_addrs_t);
     289        buf += sizeof(ngx_proxy_protocol_inet_addrs_t);
    303290
    304291        break;
     
    306293#if (NGX_HAVE_INET6)
    307294
    308     case NGX_PP_V2_AF_INET6:
    309 
    310         if ((size_t) (end - buf) < sizeof(ngx_pp_v2_inet6_addrs_t)) {
     295    case NGX_PROXY_PROTOCOL_AF_INET6:
     296
     297        if ((size_t) (end - buf) < sizeof(ngx_proxy_protocol_inet6_addrs_t)) {
    311298            return NULL;
    312299        }
     300
     301        inet6 = (ngx_proxy_protocol_inet6_addrs_t *) buf;
    313302
    314303        sockaddr.sockaddr_in6.sin6_family = AF_INET6;
    315304        sockaddr.sockaddr_in6.sin6_port = 0;
    316         memcpy(&sockaddr.sockaddr_in6.sin6_addr, addrs->inet6.src, 16);
    317 
    318         c->proxy_protocol_port = ngx_pp_v2_get_u16(addrs->inet6.sport);
     305        memcpy(&sockaddr.sockaddr_in6.sin6_addr, inet6->s_addr, 16);
     306
     307        c->proxy_protocol_port = ngx_proxy_protocol_parse_uint16(inet6->s_port);
    319308
    320309        socklen = sizeof(struct sockaddr_in6);
    321310
    322         buf += sizeof(ngx_pp_v2_inet6_addrs_t);
     311        buf += sizeof(ngx_proxy_protocol_inet6_addrs_t);
    323312
    324313        break;
     
    327316
    328317    default:
    329 
    330318        ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
    331                        "PROXY protocol v2 unsupported address family 0x%xi",
     319                       "PROXY protocol v2 unsupported address family %ui",
    332320                       family);
    333321        return end;
    334322    }
    335323
    336     name = &c->proxy_protocol_addr;
    337 
    338     name->data = ngx_pnalloc(c->pool, NGX_SOCKADDR_STRLEN);
    339     if (name->data == NULL) {
    340         return NULL;
    341     }
    342 
    343     name->len = ngx_sock_ntop(&sockaddr.sockaddr, socklen, name->data,
    344                               NGX_SOCKADDR_STRLEN, 0);
    345     if (name->len == 0) {
    346         return NULL;
    347     }
     324    c->proxy_protocol_addr.data = ngx_pnalloc(c->pool, NGX_SOCKADDR_STRLEN);
     325    if (c->proxy_protocol_addr.data == NULL) {
     326        return NULL;
     327    }
     328
     329    c->proxy_protocol_addr.len = ngx_sock_ntop(&sockaddr.sockaddr, socklen,
     330                                               c->proxy_protocol_addr.data,
     331                                               NGX_SOCKADDR_STRLEN, 0);
    348332
    349333    ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0,
    350                    "PROXY protocol v2 address: %V %d", name,
     334                   "PROXY protocol v2 address: %V %d", &c->proxy_protocol_addr,
    351335                   c->proxy_protocol_port);
    352336
    353337    if (buf < end) {
    354338        ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
    355                        "PROXY protocol v2 %z bytes tlv ignored", end - buf);
     339                       "PROXY protocol v2 %z bytes of tlv ignored", end - buf);
    356340    }
    357341
Note: See TracChangeset for help on using the changeset viewer.