blob: 89f2a627f3f086febbcf1a93ab0fe9f42b6eac30 [file] [log] [blame]
Patrick McHardy9fafcd72006-12-02 22:09:57 -08001#ifndef __NF_CONNTRACK_SIP_H__
2#define __NF_CONNTRACK_SIP_H__
3#ifdef __KERNEL__
4
Pablo Neira Ayuso1afc5672012-06-07 12:11:50 +02005#include <net/netfilter/nf_conntrack_expect.h>
6
Patrick McHardy9fafcd72006-12-02 22:09:57 -08007#define SIP_PORT 5060
8#define SIP_TIMEOUT 3600
9
Patrick McHardy0f32a402008-03-25 20:25:13 -070010struct nf_ct_sip_master {
11 unsigned int register_cseq;
Patrick McHardyef75d492008-05-08 01:15:21 -070012 unsigned int invite_cseq;
Patrick McHardy0f32a402008-03-25 20:25:13 -070013};
14
15enum sip_expectation_classes {
16 SIP_EXPECT_SIGNALLING,
17 SIP_EXPECT_AUDIO,
Patrick McHardy0d0ab032008-03-25 20:26:24 -070018 SIP_EXPECT_VIDEO,
Patrick McHardy9d288df2010-02-11 12:30:21 +010019 SIP_EXPECT_IMAGE,
Patrick McHardy0f32a402008-03-25 20:25:13 -070020 __SIP_EXPECT_MAX
21};
22#define SIP_EXPECT_MAX (__SIP_EXPECT_MAX - 1)
23
Patrick McHardy0d0ab032008-03-25 20:26:24 -070024struct sdp_media_type {
25 const char *name;
26 unsigned int len;
27 enum sip_expectation_classes class;
28};
29
30#define SDP_MEDIA_TYPE(__name, __class) \
31{ \
32 .name = (__name), \
33 .len = sizeof(__name) - 1, \
34 .class = (__class), \
35}
36
Patrick McHardy30f33e62008-03-25 20:22:20 -070037struct sip_handler {
38 const char *method;
39 unsigned int len;
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +010040 int (*request)(struct sk_buff *skb, unsigned int dataoff,
Patrick McHardy30f33e62008-03-25 20:22:20 -070041 const char **dptr, unsigned int *datalen,
42 unsigned int cseq);
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +010043 int (*response)(struct sk_buff *skb, unsigned int dataoff,
Patrick McHardy30f33e62008-03-25 20:22:20 -070044 const char **dptr, unsigned int *datalen,
45 unsigned int cseq, unsigned int code);
46};
47
48#define SIP_HANDLER(__method, __request, __response) \
49{ \
50 .method = (__method), \
51 .len = sizeof(__method) - 1, \
52 .request = (__request), \
53 .response = (__response), \
54}
55
Patrick McHardy3e9b4600b2008-03-25 20:17:55 -070056struct sip_header {
57 const char *name;
58 const char *cname;
59 const char *search;
60 unsigned int len;
61 unsigned int clen;
62 unsigned int slen;
63 int (*match_len)(const struct nf_conn *ct,
64 const char *dptr, const char *limit,
65 int *shift);
66};
67
68#define __SIP_HDR(__name, __cname, __search, __match) \
69{ \
70 .name = (__name), \
71 .len = sizeof(__name) - 1, \
72 .cname = (__cname), \
73 .clen = (__cname) ? sizeof(__cname) - 1 : 0, \
74 .search = (__search), \
75 .slen = (__search) ? sizeof(__search) - 1 : 0, \
76 .match_len = (__match), \
77}
78
Patrick McHardyea45f122008-03-25 20:18:57 -070079#define SIP_HDR(__name, __cname, __search, __match) \
80 __SIP_HDR(__name, __cname, __search, __match)
81
Patrick McHardy3e9b4600b2008-03-25 20:17:55 -070082#define SDP_HDR(__name, __search, __match) \
83 __SIP_HDR(__name, NULL, __search, __match)
84
Patrick McHardyea45f122008-03-25 20:18:57 -070085enum sip_header_types {
Patrick McHardy30f33e62008-03-25 20:22:20 -070086 SIP_HDR_CSEQ,
Patrick McHardyea45f122008-03-25 20:18:57 -070087 SIP_HDR_FROM,
88 SIP_HDR_TO,
89 SIP_HDR_CONTACT,
Patrick McHardyf5b321b2010-02-11 12:26:19 +010090 SIP_HDR_VIA_UDP,
91 SIP_HDR_VIA_TCP,
Patrick McHardy0f32a402008-03-25 20:25:13 -070092 SIP_HDR_EXPIRES,
Patrick McHardyea45f122008-03-25 20:18:57 -070093 SIP_HDR_CONTENT_LENGTH,
Simon Horman001985b2010-08-22 21:37:51 +090094 SIP_HDR_CALL_ID,
Patrick McHardyea45f122008-03-25 20:18:57 -070095};
96
Patrick McHardy3e9b4600b2008-03-25 20:17:55 -070097enum sdp_header_types {
98 SDP_HDR_UNSPEC,
99 SDP_HDR_VERSION,
100 SDP_HDR_OWNER_IP4,
101 SDP_HDR_CONNECTION_IP4,
102 SDP_HDR_OWNER_IP6,
103 SDP_HDR_CONNECTION_IP6,
104 SDP_HDR_MEDIA,
Patrick McHardy9fafcd72006-12-02 22:09:57 -0800105};
106
Herbert Xu3db05fe2007-10-15 00:53:15 -0700107extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100108 unsigned int dataoff,
Patrick McHardy2a6cfb22008-03-25 20:16:54 -0700109 const char **dptr,
110 unsigned int *datalen);
Patrick McHardy48f8ac22010-02-11 12:29:38 +0100111extern void (*nf_nat_sip_seq_adjust_hook)(struct sk_buff *skb, s16 off);
Patrick McHardy0f32a402008-03-25 20:25:13 -0700112extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100113 unsigned int dataoff,
Patrick McHardy0f32a402008-03-25 20:25:13 -0700114 const char **dptr,
115 unsigned int *datalen,
116 struct nf_conntrack_expect *exp,
117 unsigned int matchoff,
118 unsigned int matchlen);
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700119extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700120 unsigned int dataoff,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100121 const char **dptr,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700122 unsigned int *datalen,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100123 unsigned int sdpoff,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700124 enum sdp_header_types type,
125 enum sdp_header_types term,
126 const union nf_inet_addr *addr);
Patrick McHardyc7f485a2008-03-25 20:26:43 -0700127extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100128 unsigned int dataoff,
Patrick McHardyc7f485a2008-03-25 20:26:43 -0700129 const char **dptr,
130 unsigned int *datalen,
131 unsigned int matchoff,
132 unsigned int matchlen,
133 u_int16_t port);
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700134extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700135 unsigned int dataoff,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100136 const char **dptr,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700137 unsigned int *datalen,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100138 unsigned int sdpoff,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700139 const union nf_inet_addr *addr);
140extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100141 unsigned int dataoff,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700142 const char **dptr,
143 unsigned int *datalen,
144 struct nf_conntrack_expect *rtp_exp,
145 struct nf_conntrack_expect *rtcp_exp,
146 unsigned int mediaoff,
147 unsigned int medialen,
148 union nf_inet_addr *rtp_addr);
Patrick McHardy9fafcd72006-12-02 22:09:57 -0800149
Patrick McHardyac367742008-03-25 20:18:40 -0700150extern int ct_sip_parse_request(const struct nf_conn *ct,
151 const char *dptr, unsigned int datalen,
Patrick McHardy624f8b72008-03-25 20:19:30 -0700152 unsigned int *matchoff, unsigned int *matchlen,
153 union nf_inet_addr *addr, __be16 *port);
Patrick McHardyea45f122008-03-25 20:18:57 -0700154extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr,
155 unsigned int dataoff, unsigned int datalen,
156 enum sip_header_types type,
157 unsigned int *matchoff, unsigned int *matchlen);
Patrick McHardy05e3ced2008-03-25 20:19:13 -0700158extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
159 unsigned int *dataoff, unsigned int datalen,
160 enum sip_header_types type, int *in_header,
161 unsigned int *matchoff, unsigned int *matchlen,
162 union nf_inet_addr *addr, __be16 *port);
Patrick McHardy2bbb2112008-03-25 20:24:24 -0700163extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
164 unsigned int dataoff, unsigned int datalen,
165 const char *name,
166 unsigned int *matchoff, unsigned int *matchlen,
Patrick McHardy02b69cb2012-08-09 10:08:46 +0000167 union nf_inet_addr *addr, bool delim);
Patrick McHardy2bbb2112008-03-25 20:24:24 -0700168extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
169 unsigned int off, unsigned int datalen,
170 const char *name,
171 unsigned int *matchoff, unsigned int *matchen,
172 unsigned int *val);
Patrick McHardy3e9b4600b2008-03-25 20:17:55 -0700173
174extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
175 unsigned int dataoff, unsigned int datalen,
176 enum sdp_header_types type,
177 enum sdp_header_types term,
178 unsigned int *matchoff, unsigned int *matchlen);
179
Patrick McHardy9fafcd72006-12-02 22:09:57 -0800180#endif /* __KERNEL__ */
181#endif /* __NF_CONNTRACK_SIP_H__ */