More proxy code cleanup thanks to VSA_BuildFAP

parent 358f7331
...@@ -323,7 +323,7 @@ vpx_proto2(const struct worker *wrk, struct req *req) ...@@ -323,7 +323,7 @@ vpx_proto2(const struct worker *wrk, struct req *req)
int l, hdr_len; int l, hdr_len;
uintptr_t *up; uintptr_t *up;
uint16_t tlv_len; uint16_t tlv_len;
const uint8_t *p; const uint8_t *p, *ap, *pp;
char *d, *tlv_start; char *d, *tlv_start;
sa_family_t pfam = 0xff; sa_family_t pfam = 0xff;
struct suckaddr *sa = NULL; struct suckaddr *sa = NULL;
...@@ -333,6 +333,8 @@ vpx_proto2(const struct worker *wrk, struct req *req) ...@@ -333,6 +333,8 @@ vpx_proto2(const struct worker *wrk, struct req *req)
char pb[VTCP_PORTBUFSIZE]; char pb[VTCP_PORTBUFSIZE];
struct vpx_tlv_iter vpi[1], vpi2[1]; struct vpx_tlv_iter vpi[1], vpi2[1];
struct vpx_tlv *tlv; struct vpx_tlv *tlv;
unsigned flen, alen;
unsigned const plen = 2, aoff = 16;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
...@@ -378,56 +380,50 @@ vpx_proto2(const struct worker *wrk, struct req *req) ...@@ -378,56 +380,50 @@ vpx_proto2(const struct worker *wrk, struct req *req)
case 0x11: case 0x11:
/* IPv4|TCP */ /* IPv4|TCP */
pfam = AF_INET; pfam = AF_INET;
if (l < 12) { alen = 4;
VSL(SLT_ProxyGarbage, req->sp->vxid,
"PROXY2: Ignoring short IPv4 addresses (%d)", l);
return (0);
}
l -= 12;
d += 12;
/* dst/server */
if (! SES_Reserve_server_addr(req->sp, &sa))
return (vpx_ws_err(req));
AN(VSA_BuildFAP(sa, pfam, p + 20, 4, p + 26, 2));
VTCP_name(sa, ha, sizeof ha, pa, sizeof pa);
/* src/client */
if (! SES_Reserve_client_addr(req->sp, &sa))
return (vpx_ws_err(req));
AN(VSA_BuildFAP(sa, pfam, p + 16, 4, p + 24, 2));
break; break;
case 0x21: case 0x21:
/* IPv6|TCP */ /* IPv6|TCP */
pfam = AF_INET6; pfam = AF_INET6;
if (l < 36) { alen = 16;
break;
default:
/* Ignore proxy header */
VSL(SLT_ProxyGarbage, req->sp->vxid, VSL(SLT_ProxyGarbage, req->sp->vxid,
"PROXY2: Ignoring short IPv6 addresses (%d)", l); "PROXY2: Ignoring unsupported protocol (0x%02x)", p[13]);
return (0); return (0);
} }
l -= 36;
d += 36;
/* dst/server */ flen = 2 * alen + 2 * plen;
if (! SES_Reserve_server_addr(req->sp, &sa))
return (vpx_ws_err(req));
AN(VSA_BuildFAP(sa, pfam, p + 32, 16, p + 50, 2));
VTCP_name(sa, ha, sizeof ha, pa, sizeof pa);
/* src/client */ if (l < flen) {
if (! SES_Reserve_client_addr(req->sp, &sa))
return (vpx_ws_err(req));
AN(VSA_BuildFAP(sa, pfam, p + 16, 16, p + 48, 2));
break;
default:
/* Ignore proxy header */
VSL(SLT_ProxyGarbage, req->sp->vxid, VSL(SLT_ProxyGarbage, req->sp->vxid,
"PROXY2: Ignoring unsupported protocol (0x%02x)", p[13]); "PROXY2: Ignoring short %s addresses (%d)",
pfam == AF_INET ? "IPv4" : "IPv6", l);
return (0); return (0);
} }
AN(sa); l -= flen;
d += flen;
ap = p + aoff;
pp = ap + 2 * alen;
/* src/client */
if (! SES_Reserve_client_addr(req->sp, &sa))
return (vpx_ws_err(req));
AN(VSA_BuildFAP(sa, pfam, ap, alen, pp, plen));
VTCP_name(sa, hb, sizeof hb, pb, sizeof pb); VTCP_name(sa, hb, sizeof hb, pb, sizeof pb);
ap += alen;
pp += plen;
/* dst/server */
if (! SES_Reserve_server_addr(req->sp, &sa))
return (vpx_ws_err(req));
AN(VSA_BuildFAP(sa, pfam, ap, alen, pp, plen));
VTCP_name(sa, ha, sizeof ha, pa, sizeof pa);
if (! SES_Set_String_Attr(req->sp, SA_CLIENT_IP, hb)) if (! SES_Set_String_Attr(req->sp, SA_CLIENT_IP, hb))
return (vpx_ws_err(req)); return (vpx_ws_err(req));
if (! SES_Set_String_Attr(req->sp, SA_CLIENT_PORT, pb)) if (! SES_Set_String_Attr(req->sp, SA_CLIENT_PORT, pb))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment