mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-23 14:51:27 +02:00
[MINOR] frontend: add a make_proxy_line function
This function will build a PROXY protocol line header from two addresses (IPv4 or IPv6). AF_UNIX family will be reported as UNKNOWN.
This commit is contained in:
parent
1b6e608c11
commit
a73fcaf424
@ -2,7 +2,7 @@
|
|||||||
* include/proto/frontend.h
|
* include/proto/frontend.h
|
||||||
* This file declares frontend-specific functions.
|
* This file declares frontend-specific functions.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2000-2010 Willy Tarreau - w@1wt.eu
|
* Copyright (C) 2000-2011 Willy Tarreau - w@1wt.eu
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -28,6 +28,7 @@
|
|||||||
void get_frt_addr(struct session *s);
|
void get_frt_addr(struct session *s);
|
||||||
int frontend_accept(struct session *s);
|
int frontend_accept(struct session *s);
|
||||||
int frontend_decode_proxy_request(struct session *s, struct buffer *req, int an_bit);
|
int frontend_decode_proxy_request(struct session *s, struct buffer *req, int an_bit);
|
||||||
|
int make_proxy_line(char *buf, int buf_len, struct sockaddr_storage *src, struct sockaddr_storage *dst);
|
||||||
|
|
||||||
|
|
||||||
#endif /* _PROTO_FRONTEND_H */
|
#endif /* _PROTO_FRONTEND_H */
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Frontend variables and functions.
|
* Frontend variables and functions.
|
||||||
*
|
*
|
||||||
* Copyright 2000-2010 Willy Tarreau <w@1wt.eu>
|
* Copyright 2000-2011 Willy Tarreau <w@1wt.eu>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@ -460,6 +460,85 @@ int frontend_decode_proxy_request(struct session *s, struct buffer *req, int an_
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Makes a PROXY protocol line from the two addresses. The output is sent to
|
||||||
|
* buffer <buf> for a maximum size of <buf_len> (including the trailing zero).
|
||||||
|
* It returns the number of bytes composing this line (including the trailing
|
||||||
|
* LF), or zero in case of failure (eg: not enough space). It supports TCP4,
|
||||||
|
* TCP6 and "UNKNOWN" formats.
|
||||||
|
*/
|
||||||
|
int make_proxy_line(char *buf, int buf_len, struct sockaddr_storage *src, struct sockaddr_storage *dst)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (src->ss_family == dst->ss_family && src->ss_family == AF_INET) {
|
||||||
|
ret = snprintf(buf + ret, buf_len - ret, "PROXY TCP4 ");
|
||||||
|
if (ret >= buf_len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* IPv4 src */
|
||||||
|
if (!inet_ntop(src->ss_family, &((struct sockaddr_in *)src)->sin_addr, buf + ret, buf_len - ret))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret += strlen(buf + ret);
|
||||||
|
if (ret >= buf_len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
buf[ret++] = ' ';
|
||||||
|
|
||||||
|
/* IPv4 dst */
|
||||||
|
if (!inet_ntop(dst->ss_family, &((struct sockaddr_in *)dst)->sin_addr, buf + ret, buf_len - ret))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret += strlen(buf + ret);
|
||||||
|
if (ret >= buf_len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* source and destination ports */
|
||||||
|
ret += snprintf(buf + ret, buf_len - ret, " %u %u\r\n",
|
||||||
|
ntohs(((struct sockaddr_in *)src)->sin_port),
|
||||||
|
ntohs(((struct sockaddr_in *)dst)->sin_port));
|
||||||
|
if (ret >= buf_len)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (src->ss_family == dst->ss_family && src->ss_family == AF_INET6) {
|
||||||
|
ret = snprintf(buf + ret, buf_len - ret, "PROXY TCP6 ");
|
||||||
|
if (ret >= buf_len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* IPv6 src */
|
||||||
|
if (!inet_ntop(src->ss_family, &((struct sockaddr_in6 *)src)->sin6_addr, buf + ret, buf_len - ret))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret += strlen(buf + ret);
|
||||||
|
if (ret >= buf_len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
buf[ret++] = ' ';
|
||||||
|
|
||||||
|
/* IPv6 dst */
|
||||||
|
if (!inet_ntop(dst->ss_family, &((struct sockaddr_in6 *)dst)->sin6_addr, buf + ret, buf_len - ret))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret += strlen(buf + ret);
|
||||||
|
if (ret >= buf_len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* source and destination ports */
|
||||||
|
ret += snprintf(buf + ret, buf_len - ret, " %u %u\r\n",
|
||||||
|
ntohs(((struct sockaddr_in6 *)src)->sin6_port),
|
||||||
|
ntohs(((struct sockaddr_in6 *)dst)->sin6_port));
|
||||||
|
if (ret >= buf_len)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* unknown family combination */
|
||||||
|
ret = snprintf(buf, buf_len, "PROXY UNKNOWN\r\n");
|
||||||
|
if (ret >= buf_len)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* set test->i to the id of the frontend */
|
/* set test->i to the id of the frontend */
|
||||||
static int
|
static int
|
||||||
acl_fetch_fe_id(struct proxy *px, struct session *l4, void *l7, int dir,
|
acl_fetch_fe_id(struct proxy *px, struct session *l4, void *l7, int dir,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user