MCPcopy Create free account
hub / github.com/OpenSIPS/opensips / parse_net_proxy_protocol

Function parse_net_proxy_protocol

net/proxy_protocol.c:215–359  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

213}
214
215char *parse_net_proxy_protocol(char *buf, int size, struct proxy_protocol *proxy)
216{
217 int af, max;
218 char *p, *end;
219 str _buf, tmp;
220 struct ip_addr *ip;
221 unsigned int port;
222 enum proxy_tok_match m;
223
224 if (size < PROXY_PROTOCOL_V1_HDR_LEN ||
225 memcmp(buf, PROXY_PROTOCOL_V1_HDR, PROXY_PROTOCOL_V1_HDR_LEN) != 0)
226 goto error;
227
228 _buf.s = buf + PROXY_PROTOCOL_V1_HDR_LEN;
229 _buf.len = size - PROXY_PROTOCOL_V1_HDR_LEN;
230
231 m = match_proxy_token(&_buf, PROXY_PROTOCOL_TCP4, PROXY_PROTOCOL_TCP4_LEN);
232 if (m == PP_TOK_MATCH) {
233 af = AF_INET;
234 _buf.s += PROXY_PROTOCOL_TCP4_LEN;
235 _buf.len -= PROXY_PROTOCOL_TCP4_LEN;
236 if (_buf.len > PROXY_PROTOCOL_TCP4_PAYLOAD_MAX)
237 _buf.len = PROXY_PROTOCOL_TCP4_PAYLOAD_MAX;
238 max = PROXY_PROTOCOL_TCP4_MAX;
239 } else if (m == PP_TOK_PARTIAL) {
240 return NULL;
241 } else {
242 m = match_proxy_token(&_buf, PROXY_PROTOCOL_TCP6, PROXY_PROTOCOL_TCP6_LEN);
243 if (m == PP_TOK_MATCH) {
244 af = AF_INET6;
245 _buf.s += PROXY_PROTOCOL_TCP6_LEN;
246 _buf.len -= PROXY_PROTOCOL_TCP6_LEN;
247 if (_buf.len > PROXY_PROTOCOL_TCP6_PAYLOAD_MAX)
248 _buf.len = PROXY_PROTOCOL_TCP6_PAYLOAD_MAX;
249 max = PROXY_PROTOCOL_TCP6_MAX;
250 } else if (m == PP_TOK_PARTIAL) {
251 return NULL;
252 } else {
253 m = match_proxy_token(&_buf, PROXY_PROTOCOL_UNKN, PROXY_PROTOCOL_UNKN_LEN);
254 if (m == PP_TOK_MATCH) {
255 _buf.s += PROXY_PROTOCOL_UNKN_LEN;
256 _buf.len -= PROXY_PROTOCOL_UNKN_LEN;
257 if (_buf.len == 0)
258 return NULL;
259 if (_buf.s[0] != PROXY_PROTOCOL_SEP &&
260 _buf.s[0] != PROXY_PROTOCOL_END[0]) {
261 LM_DBG("bad separator after proxy_protocol UNKNOWN: 0x%x\n",
262 (unsigned char)_buf.s[0]);
263 goto error;
264 }
265 if (_buf.len > PROXY_PROTOCOL_UNKN_PAYLOAD_MAX)
266 _buf.len = PROXY_PROTOCOL_UNKN_PAYLOAD_MAX;
267 af = AF_UNSPEC;
268 max = PROXY_PROTOCOL_UNKN_MAX;
269 } else if (m == PP_TOK_PARTIAL) {
270 return NULL;
271 } else {
272 LM_DBG("unknown proxy_protocol proto [%.*s]\n", _buf.len, _buf.s);

Callers 2

check_tcp_proxy_protocolFunction · 0.85
check_udp_proxy_protocolFunction · 0.85

Calls 7

match_proxy_tokenFunction · 0.85
str_strstrFunction · 0.85
_strClass · 0.85
q_memchrFunction · 0.85
str2ipFunction · 0.85
str2ip6Function · 0.85
str2intFunction · 0.85

Tested by

no test coverage detected