blob: 0ce91d56a5f264c989ee5b17a027b489eaabc593 [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
5#define SIP_PORT 5060
6#define SIP_TIMEOUT 3600
7
Patrick McHardy0f32a402008-03-25 20:25:13 -07008struct nf_ct_sip_master {
9 unsigned int register_cseq;
Patrick McHardyef75d492008-05-08 01:15:21 -070010 unsigned int invite_cseq;
Patrick McHardy0f32a402008-03-25 20:25:13 -070011};
12
13enum sip_expectation_classes {
14 SIP_EXPECT_SIGNALLING,
15 SIP_EXPECT_AUDIO,
Patrick McHardy0d0ab032008-03-25 20:26:24 -070016 SIP_EXPECT_VIDEO,
Patrick McHardy9d288df2010-02-11 12:30:21 +010017 SIP_EXPECT_IMAGE,
Patrick McHardy0f32a402008-03-25 20:25:13 -070018 __SIP_EXPECT_MAX
19};
20#define SIP_EXPECT_MAX (__SIP_EXPECT_MAX - 1)
21
Patrick McHardy0d0ab032008-03-25 20:26:24 -070022struct sdp_media_type {
23 const char *name;
24 unsigned int len;
25 enum sip_expectation_classes class;
26};
27
28#define SDP_MEDIA_TYPE(__name, __class) \
29{ \
30 .name = (__name), \
31 .len = sizeof(__name) - 1, \
32 .class = (__class), \
33}
34
Patrick McHardy30f33e62008-03-25 20:22:20 -070035struct sip_handler {
36 const char *method;
37 unsigned int len;
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +010038 int (*request)(struct sk_buff *skb, unsigned int dataoff,
Patrick McHardy30f33e62008-03-25 20:22:20 -070039 const char **dptr, unsigned int *datalen,
40 unsigned int cseq);
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +010041 int (*response)(struct sk_buff *skb, unsigned int dataoff,
Patrick McHardy30f33e62008-03-25 20:22:20 -070042 const char **dptr, unsigned int *datalen,
43 unsigned int cseq, unsigned int code);
44};
45
46#define SIP_HANDLER(__method, __request, __response) \
47{ \
48 .method = (__method), \
49 .len = sizeof(__method) - 1, \
50 .request = (__request), \
51 .response = (__response), \
52}
53
Patrick McHardy3e9b4600b2008-03-25 20:17:55 -070054struct sip_header {
55 const char *name;
56 const char *cname;
57 const char *search;
58 unsigned int len;
59 unsigned int clen;
60 unsigned int slen;
61 int (*match_len)(const struct nf_conn *ct,
62 const char *dptr, const char *limit,
63 int *shift);
64};
65
66#define __SIP_HDR(__name, __cname, __search, __match) \
67{ \
68 .name = (__name), \
69 .len = sizeof(__name) - 1, \
70 .cname = (__cname), \
71 .clen = (__cname) ? sizeof(__cname) - 1 : 0, \
72 .search = (__search), \
73 .slen = (__search) ? sizeof(__search) - 1 : 0, \
74 .match_len = (__match), \
75}
76
Patrick McHardyea45f122008-03-25 20:18:57 -070077#define SIP_HDR(__name, __cname, __search, __match) \
78 __SIP_HDR(__name, __cname, __search, __match)
79
Patrick McHardy3e9b4600b2008-03-25 20:17:55 -070080#define SDP_HDR(__name, __search, __match) \
81 __SIP_HDR(__name, NULL, __search, __match)
82
Patrick McHardyea45f122008-03-25 20:18:57 -070083enum sip_header_types {
Patrick McHardy30f33e62008-03-25 20:22:20 -070084 SIP_HDR_CSEQ,
Patrick McHardyea45f122008-03-25 20:18:57 -070085 SIP_HDR_FROM,
86 SIP_HDR_TO,
87 SIP_HDR_CONTACT,
Patrick McHardyf5b321b2010-02-11 12:26:19 +010088 SIP_HDR_VIA_UDP,
89 SIP_HDR_VIA_TCP,
Patrick McHardy0f32a402008-03-25 20:25:13 -070090 SIP_HDR_EXPIRES,
Patrick McHardyea45f122008-03-25 20:18:57 -070091 SIP_HDR_CONTENT_LENGTH,
Simon Horman001985b2010-08-22 21:37:51 +090092 SIP_HDR_CALL_ID,
Patrick McHardyea45f122008-03-25 20:18:57 -070093};
94
Patrick McHardy3e9b4600b2008-03-25 20:17:55 -070095enum sdp_header_types {
96 SDP_HDR_UNSPEC,
97 SDP_HDR_VERSION,
98 SDP_HDR_OWNER_IP4,
99 SDP_HDR_CONNECTION_IP4,
100 SDP_HDR_OWNER_IP6,
101 SDP_HDR_CONNECTION_IP6,
102 SDP_HDR_MEDIA,
Patrick McHardy9fafcd72006-12-02 22:09:57 -0800103};
104
Herbert Xu3db05fe2007-10-15 00:53:15 -0700105extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100106 unsigned int dataoff,
Patrick McHardy2a6cfb22008-03-25 20:16:54 -0700107 const char **dptr,
108 unsigned int *datalen);
Patrick McHardy48f8ac22010-02-11 12:29:38 +0100109extern void (*nf_nat_sip_seq_adjust_hook)(struct sk_buff *skb, s16 off);
Patrick McHardy0f32a402008-03-25 20:25:13 -0700110extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100111 unsigned int dataoff,
Patrick McHardy0f32a402008-03-25 20:25:13 -0700112 const char **dptr,
113 unsigned int *datalen,
114 struct nf_conntrack_expect *exp,
115 unsigned int matchoff,
116 unsigned int matchlen);
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700117extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700118 unsigned int dataoff,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100119 const char **dptr,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700120 unsigned int *datalen,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100121 unsigned int sdpoff,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700122 enum sdp_header_types type,
123 enum sdp_header_types term,
124 const union nf_inet_addr *addr);
Patrick McHardyc7f485a2008-03-25 20:26:43 -0700125extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100126 unsigned int dataoff,
Patrick McHardyc7f485a2008-03-25 20:26:43 -0700127 const char **dptr,
128 unsigned int *datalen,
129 unsigned int matchoff,
130 unsigned int matchlen,
131 u_int16_t port);
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700132extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700133 unsigned int dataoff,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100134 const char **dptr,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700135 unsigned int *datalen,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100136 unsigned int sdpoff,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700137 const union nf_inet_addr *addr);
138extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb,
Patrick McHardy3b6b9fa2010-02-11 12:23:53 +0100139 unsigned int dataoff,
Patrick McHardy4ab9e642008-03-25 20:26:08 -0700140 const char **dptr,
141 unsigned int *datalen,
142 struct nf_conntrack_expect *rtp_exp,
143 struct nf_conntrack_expect *rtcp_exp,
144 unsigned int mediaoff,
145 unsigned int medialen,
146 union nf_inet_addr *rtp_addr);
Patrick McHardy9fafcd72006-12-02 22:09:57 -0800147
Patrick McHardyac367742008-03-25 20:18:40 -0700148extern int ct_sip_parse_request(const struct nf_conn *ct,
149 const char *dptr, unsigned int datalen,
Patrick McHardy624f8b72008-03-25 20:19:30 -0700150 unsigned int *matchoff, unsigned int *matchlen,
151 union nf_inet_addr *addr, __be16 *port);
Patrick McHardyea45f122008-03-25 20:18:57 -0700152extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr,
153 unsigned int dataoff, unsigned int datalen,
154 enum sip_header_types type,
155 unsigned int *matchoff, unsigned int *matchlen);
Patrick McHardy05e3ced2008-03-25 20:19:13 -0700156extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
157 unsigned int *dataoff, unsigned int datalen,
158 enum sip_header_types type, int *in_header,
159 unsigned int *matchoff, unsigned int *matchlen,
160 union nf_inet_addr *addr, __be16 *port);
Patrick McHardy2bbb2112008-03-25 20:24:24 -0700161extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
162 unsigned int dataoff, unsigned int datalen,
163 const char *name,
164 unsigned int *matchoff, unsigned int *matchlen,
165 union nf_inet_addr *addr);
166extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
167 unsigned int off, unsigned int datalen,
168 const char *name,
169 unsigned int *matchoff, unsigned int *matchen,
170 unsigned int *val);
Patrick McHardy3e9b4600b2008-03-25 20:17:55 -0700171
172extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
173 unsigned int dataoff, unsigned int datalen,
174 enum sdp_header_types type,
175 enum sdp_header_types term,
176 unsigned int *matchoff, unsigned int *matchlen);
177
Patrick McHardy9fafcd72006-12-02 22:09:57 -0800178#endif /* __KERNEL__ */
179#endif /* __NF_CONNTRACK_SIP_H__ */