mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-11 23:50:25 +00:00
netfilter: nf_conntrack_sip: Add callid parser
Signed-off-by: Simon Horman <horms@verge.net.au> Acked-by: Julian Anastasov <ja@ssi.bg>
This commit is contained in:
parent
5adbb9fb0c
commit
001985b2c0
@ -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,
|
|||||||
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[] = {
|
|||||||
[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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user