When accept-proxy or accept-netscaler-cip are being used, this gives the
ability to log upstream proxy source IP and port.
---
 doc/configuration.txt |  4 ++++
 include/types/log.h   |  4 ++++
 src/log.c             | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 74 insertions(+)

diff --git a/doc/configuration.txt b/doc/configuration.txt
index a8036abf9f22..6d92a4530749 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -15328,6 +15328,10 @@ Please refer to the table below for currently defined 
variables :
   |   | %bq  | backend_queue                                 | numeric     |
   |   | %ci  | client_ip                 (accepted address)  | IP          |
   |   | %cp  | client_port               (accepted address)  | numeric     |
+  |   | %psi | proxy_source_ip                               | IP          |
+  |   | %psp | proxy_source_port                             | numeric     |
+  |   | %pdi | proxy_destination_ip                          | IP          |
+  |   | %pdp | proxy_destination_port                        | numeric     |
   |   | %f   | frontend_name                                 | string      |
   |   | %fc  | feconn     (frontend concurrent connections)  | numeric     |
   |   | %fi  | frontend_ip              (accepting address)  | IP          |
diff --git a/include/types/log.h b/include/types/log.h
index 0fdb77577103..4ca9197b8ba6 100644
--- a/include/types/log.h
+++ b/include/types/log.h
@@ -55,6 +55,10 @@ enum {
        LOG_FMT_GLOBAL,
        LOG_FMT_CLIENTIP,
        LOG_FMT_CLIENTPORT,
+       LOG_FMT_PROXY_SRC_IP,
+       LOG_FMT_PROXY_SRC_PORT,
+       LOG_FMT_PROXY_DST_IP,
+       LOG_FMT_PROXY_DST_PORT,
        LOG_FMT_BACKENDIP,
        LOG_FMT_BACKENDPORT,
        LOG_FMT_FRONTENDIP,
diff --git a/src/log.c b/src/log.c
index 12329888130e..5d21a12926ff 100644
--- a/src/log.c
+++ b/src/log.c
@@ -145,6 +145,10 @@ static const struct logformat_type logformat_keywords[] = {
        { "bq", LOG_FMT_BCKQUEUE, PR_MODE_TCP, LW_BYTES, NULL }, /* 
backend_queue */
        { "ci", LOG_FMT_CLIENTIP, PR_MODE_TCP, LW_CLIP, NULL },  /* client ip */
        { "cp", LOG_FMT_CLIENTPORT, PR_MODE_TCP, LW_CLIP, NULL }, /* client 
port */
+       { "psi", LOG_FMT_PROXY_SRC_IP, PR_MODE_TCP, LW_CLIP, NULL },  /* proxy 
source ip */
+       { "psp", LOG_FMT_PROXY_SRC_PORT, PR_MODE_TCP, LW_CLIP, NULL }, /* proxy 
source port */
+       { "pdi", LOG_FMT_PROXY_DST_IP, PR_MODE_TCP, LW_CLIP, NULL },  /* proxy 
destination ip */
+       { "pdp", LOG_FMT_PROXY_DST_PORT, PR_MODE_TCP, LW_CLIP, NULL }, /* proxy 
destination port */
        { "f", LOG_FMT_FRONTEND, PR_MODE_TCP, LW_INIT, NULL },  /* frontend */
        { "fc", LOG_FMT_FECONN, PR_MODE_TCP, LW_BYTES, NULL },   /* feconn */
        { "fi", LOG_FMT_FRONTENDIP, PR_MODE_TCP, LW_FRTIP, NULL }, /* frontend 
ip */
@@ -1399,6 +1403,68 @@ int build_logline(struct stream *s, char *dst, size_t 
maxsize, struct list *list
                                last_isspace = 0;
                                break;
 
+                       case LOG_FMT_PROXY_SRC_IP:  // %psi
+                               conn = objt_conn(sess->origin);
+                               if (conn)
+                                       ret = lf_ip(tmplog, (struct sockaddr 
*)&conn->proxy_addr.from, dst + maxsize - tmplog, tmp);
+                               else
+                                       ret = lf_text_len(tmplog, NULL, 0, dst 
+ maxsize - tmplog, tmp);
+                               if (ret == NULL)
+                                       goto out;
+                               tmplog = ret;
+                               last_isspace = 0;
+                               break;
+
+                       case LOG_FMT_PROXY_SRC_PORT:  // %psp
+                               conn = objt_conn(sess->origin);
+                               if (conn) {
+                                       if (conn->proxy_addr.from.ss_family == 
AF_UNIX) {
+                                               ret = 
ltoa_o(sess->listener->luid, tmplog, dst + maxsize - tmplog);
+                                       } else {
+                                               ret = lf_port(tmplog, (struct 
sockaddr *)&conn->proxy_addr.from,
+                                                             dst + maxsize - 
tmplog, tmp);
+                                       }
+                               }
+                               else
+                                       ret = lf_text_len(tmplog, NULL, 0, dst 
+ maxsize - tmplog, tmp);
+
+                               if (ret == NULL)
+                                       goto out;
+                               tmplog = ret;
+                               last_isspace = 0;
+                               break;
+
+                       case LOG_FMT_PROXY_DST_IP:  // %pdi
+                               conn = objt_conn(sess->origin);
+                               if (conn)
+                                       ret = lf_ip(tmplog, (struct sockaddr 
*)&conn->proxy_addr.to, dst + maxsize - tmplog, tmp);
+                               else
+                                       ret = lf_text_len(tmplog, NULL, 0, dst 
+ maxsize - tmplog, tmp);
+                               if (ret == NULL)
+                                       goto out;
+                               tmplog = ret;
+                               last_isspace = 0;
+                               break;
+
+                       case LOG_FMT_PROXY_DST_PORT:  // %pdp
+                               conn = objt_conn(sess->origin);
+                               if (conn) {
+                                       if (conn->proxy_addr.to.ss_family == 
AF_UNIX) {
+                                               ret = 
ltoa_o(sess->listener->luid, tmplog, dst + maxsize - tmplog);
+                                       } else {
+                                               ret = lf_port(tmplog, (struct 
sockaddr *)&conn->proxy_addr.to,
+                                                             dst + maxsize - 
tmplog, tmp);
+                                       }
+                               }
+                               else
+                                       ret = lf_text_len(tmplog, NULL, 0, dst 
+ maxsize - tmplog, tmp);
+
+                               if (ret == NULL)
+                                       goto out;
+                               tmplog = ret;
+                               last_isspace = 0;
+                               break;
+
                        case LOG_FMT_FRONTENDIP: // %fi
                                conn = objt_conn(sess->origin);
                                if (conn) {

Reply via email to