[master] 86a62bb Add VPX_tlv interface to extract PROXY tlv attributes.

Emmanuel Hocdet manu at gandi.net
Wed Mar 14 16:10:09 UTC 2018


commit 86a62bbe83d2c6ea4f247387b6a1c568c8c475ae
Author: Emmanuel Hocdet <manu at gandi.net>
Date:   Tue Feb 27 12:21:22 2018 +0100

    Add VPX_tlv interface to extract PROXY tlv attributes.

diff --git a/bin/varnishd/proxy/cache_proxy.h b/bin/varnishd/proxy/cache_proxy.h
index c3cfcb1..1e4dd25 100644
--- a/bin/varnishd/proxy/cache_proxy.h
+++ b/bin/varnishd/proxy/cache_proxy.h
@@ -37,3 +37,5 @@
 #define PP2_SUBTYPE_SSL_SIG_ALG 0x24
 #define PP2_SUBTYPE_SSL_KEY_ALG 0x25
 #define PP2_SUBTYPE_SSL_MAX     0x25
+
+int VPX_tlv(const struct req *req, int tlv, void **dst, int *len);
diff --git a/bin/varnishd/proxy/cache_proxy_proto.c b/bin/varnishd/proxy/cache_proxy_proto.c
index 44083c2..fee5ac2 100644
--- a/bin/varnishd/proxy/cache_proxy_proto.c
+++ b/bin/varnishd/proxy/cache_proxy_proto.c
@@ -250,6 +250,60 @@ static uint32_t crc32c(const uint8_t *buf, int len)
 	return (crc ^ 0xffffffff);
 }
 
+int
+VPX_tlv(const struct req *req, int tlv, void **dst, int *len)
+{
+	uintptr_t *p;
+	uint16_t l;
+	char *d;
+	int ssltlv = 0;
+
+	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+	CHECK_OBJ_NOTNULL(req->sp, SESS_MAGIC);
+
+	if (SES_Get_xport_priv(req->sp, &p) != 0) {
+		*dst = NULL;
+		return (-1);
+	}
+	d = (char *)*p;
+	l = *(uint16_t *)d;
+	d += 2;
+
+	if (tlv > PP2_TYPE_SSL && tlv <= PP2_SUBTYPE_SSL_MAX) {
+		ssltlv = tlv;
+		tlv = PP2_TYPE_SSL;
+	}
+	while (l > sizeof(struct pp2_tlv)) {
+		uint16_t v_len = vbe16dec(d + 1);
+		if (d[0] == tlv) {
+			if (ssltlv) {
+				char *sd;
+				int sl;
+				sd = d + sizeof(struct pp2_tlv) + sizeof(struct pp2_tlv_ssl);
+				sl = l - sizeof(struct pp2_tlv) - sizeof(struct pp2_tlv_ssl);
+				while (sl > sizeof(struct pp2_tlv)) {
+					uint16_t subv_len = vbe16dec(sd + 1);
+					if (sd[0] == ssltlv) {
+						*dst = sd + 3;
+						*len = subv_len;
+						return (0);
+					}
+					sd += (subv_len + 3);
+					sl -= (subv_len + 3);
+				}
+			} else {
+				*dst = d + 3;
+				*len = v_len;
+				return (0);
+			}
+		}
+		d += (v_len + 3);
+		l -= (v_len + 3);
+	}
+	*dst = NULL;
+	return (-1);
+}
+
 static int
 vpx_proto2(const struct worker *wrk, struct req *req)
 {


More information about the varnish-commit mailing list