Commit 001985b2 authored by Simon Horman's avatar Simon Horman

netfilter: nf_conntrack_sip: Add callid parser

Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
Acked-by: default avatarJulian Anastasov <ja@ssi.bg>
parent 5adbb9fb
...@@ -89,6 +89,7 @@ enum sip_header_types { ...@@ -89,6 +89,7 @@ enum sip_header_types {
SIP_HDR_VIA_TCP, SIP_HDR_VIA_TCP,
SIP_HDR_EXPIRES, SIP_HDR_EXPIRES,
SIP_HDR_CONTENT_LENGTH, SIP_HDR_CONTENT_LENGTH,
SIP_HDR_CALL_ID,
}; };
enum sdp_header_types { enum sdp_header_types {
......
...@@ -130,6 +130,44 @@ static int digits_len(const struct nf_conn *ct, const char *dptr, ...@@ -130,6 +130,44 @@ static int digits_len(const struct nf_conn *ct, const char *dptr,
return len; return len;
} }
static int iswordc(const char c)
{
if (isalnum(c) || c == '!' || c == '"' || c == '%' ||
(c >= '(' && c <= '/') || c == ':' || c == '<' || c == '>' ||
c == '?' || (c >= '[' && c <= ']') || c == '_' || c == '`' ||
c == '{' || c == '}' || c == '~')
return 1;
return 0;
}
static int word_len(const char *dptr, const char *limit)
{
int len = 0;
while (dptr < limit && iswordc(*dptr)) {
dptr++;
len++;
}
return len;
}
static int callid_len(const struct nf_conn *ct, const char *dptr,
const char *limit, int *shift)
{
int len, domain_len;
len = word_len(dptr, limit);
dptr += len;
if (!len || dptr == limit || *dptr != '@')
return len;
dptr++;
len++;
domain_len = word_len(dptr, limit);
if (!domain_len)
return 0;
return len + domain_len;
}
/* get media type + port length */ /* get media type + port length */
static int media_len(const struct nf_conn *ct, const char *dptr, static int media_len(const struct nf_conn *ct, const char *dptr,
const char *limit, int *shift) const char *limit, int *shift)
...@@ -299,6 +337,7 @@ static const struct sip_header ct_sip_hdrs[] = { ...@@ -299,6 +337,7 @@ static const struct sip_header ct_sip_hdrs[] = {
[SIP_HDR_VIA_TCP] = SIP_HDR("Via", "v", "TCP ", epaddr_len), [SIP_HDR_VIA_TCP] = SIP_HDR("Via", "v", "TCP ", epaddr_len),
[SIP_HDR_EXPIRES] = SIP_HDR("Expires", NULL, NULL, digits_len), [SIP_HDR_EXPIRES] = SIP_HDR("Expires", NULL, NULL, digits_len),
[SIP_HDR_CONTENT_LENGTH] = SIP_HDR("Content-Length", "l", NULL, digits_len), [SIP_HDR_CONTENT_LENGTH] = SIP_HDR("Content-Length", "l", NULL, digits_len),
[SIP_HDR_CALL_ID] = SIP_HDR("Call-Id", "i", NULL, callid_len),
}; };
static const char *sip_follow_continuation(const char *dptr, const char *limit) static const char *sip_follow_continuation(const char *dptr, const char *limit)
......
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