aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/netfilter/nf_conntrack_sip.h10
-rw-r--r--net/netfilter/nf_conntrack_sip.c58
2 files changed, 68 insertions, 0 deletions
diff --git a/include/linux/netfilter/nf_conntrack_sip.h b/include/linux/netfilter/nf_conntrack_sip.h
index da93e80804c2..87e402825dba 100644
--- a/include/linux/netfilter/nf_conntrack_sip.h
+++ b/include/linux/netfilter/nf_conntrack_sip.h
@@ -93,6 +93,16 @@ extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
93 enum sip_header_types type, int *in_header, 93 enum sip_header_types type, int *in_header,
94 unsigned int *matchoff, unsigned int *matchlen, 94 unsigned int *matchoff, unsigned int *matchlen,
95 union nf_inet_addr *addr, __be16 *port); 95 union nf_inet_addr *addr, __be16 *port);
96extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
97 unsigned int dataoff, unsigned int datalen,
98 const char *name,
99 unsigned int *matchoff, unsigned int *matchlen,
100 union nf_inet_addr *addr);
101extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
102 unsigned int off, unsigned int datalen,
103 const char *name,
104 unsigned int *matchoff, unsigned int *matchen,
105 unsigned int *val);
96 106
97extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr, 107extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
98 unsigned int dataoff, unsigned int datalen, 108 unsigned int dataoff, unsigned int datalen,
diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c
index 8e7e5b465ffb..126f30842d60 100644
--- a/net/netfilter/nf_conntrack_sip.c
+++ b/net/netfilter/nf_conntrack_sip.c
@@ -448,6 +448,64 @@ int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
448} 448}
449EXPORT_SYMBOL_GPL(ct_sip_parse_header_uri); 449EXPORT_SYMBOL_GPL(ct_sip_parse_header_uri);
450 450
451/* Parse address from header parameter and return address, offset and length */
452int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
453 unsigned int dataoff, unsigned int datalen,
454 const char *name,
455 unsigned int *matchoff, unsigned int *matchlen,
456 union nf_inet_addr *addr)
457{
458 const char *limit = dptr + datalen;
459 const char *start, *end;
460
461 limit = ct_sip_header_search(dptr + dataoff, limit, ",", strlen(","));
462 if (!limit)
463 limit = dptr + datalen;
464
465 start = ct_sip_header_search(dptr + dataoff, limit, name, strlen(name));
466 if (!start)
467 return 0;
468
469 start += strlen(name);
470 if (!parse_addr(ct, start, &end, addr, limit))
471 return 0;
472 *matchoff = start - dptr;
473 *matchlen = end - start;
474 return 1;
475}
476EXPORT_SYMBOL_GPL(ct_sip_parse_address_param);
477
478/* Parse numerical header parameter and return value, offset and length */
479int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
480 unsigned int dataoff, unsigned int datalen,
481 const char *name,
482 unsigned int *matchoff, unsigned int *matchlen,
483 unsigned int *val)
484{
485 const char *limit = dptr + datalen;
486 const char *start;
487 char *end;
488
489 limit = ct_sip_header_search(dptr + dataoff, limit, ",", strlen(","));
490 if (!limit)
491 limit = dptr + datalen;
492
493 start = ct_sip_header_search(dptr + dataoff, limit, name, strlen(name));
494 if (!start)
495 return 0;
496
497 start += strlen(name);
498 *val = simple_strtoul(start, &end, 0);
499 if (start == end)
500 return 0;
501 if (matchoff && matchlen) {
502 *matchoff = start - dptr;
503 *matchlen = end - start;
504 }
505 return 1;
506}
507EXPORT_SYMBOL_GPL(ct_sip_parse_numerical_param);
508
451/* SDP header parsing: a SDP session description contains an ordered set of 509/* SDP header parsing: a SDP session description contains an ordered set of
452 * headers, starting with a section containing general session parameters, 510 * headers, starting with a section containing general session parameters,
453 * optionally followed by multiple media descriptions. 511 * optionally followed by multiple media descriptions.