[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