netfilter: nf_nat: support IPv6 in amanda NAT helper
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / include / linux / netfilter / nf_conntrack_sip.h
1 #ifndef __NF_CONNTRACK_SIP_H__
2 #define __NF_CONNTRACK_SIP_H__
3 #ifdef __KERNEL__
4
5 #include <net/netfilter/nf_conntrack_expect.h>
6
7 #define SIP_PORT 5060
8 #define SIP_TIMEOUT 3600
9
10 struct nf_ct_sip_master {
11 unsigned int register_cseq;
12 unsigned int invite_cseq;
13 };
14
15 enum sip_expectation_classes {
16 SIP_EXPECT_SIGNALLING,
17 SIP_EXPECT_AUDIO,
18 SIP_EXPECT_VIDEO,
19 SIP_EXPECT_IMAGE,
20 __SIP_EXPECT_MAX
21 };
22 #define SIP_EXPECT_MAX (__SIP_EXPECT_MAX - 1)
23
24 struct 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
37 struct sip_handler {
38 const char *method;
39 unsigned int len;
40 int (*request)(struct sk_buff *skb, unsigned int protoff,
41 unsigned int dataoff,
42 const char **dptr, unsigned int *datalen,
43 unsigned int cseq);
44 int (*response)(struct sk_buff *skb, unsigned int protoff,
45 unsigned int dataoff,
46 const char **dptr, unsigned int *datalen,
47 unsigned int cseq, unsigned int code);
48 };
49
50 #define SIP_HANDLER(__method, __request, __response) \
51 { \
52 .method = (__method), \
53 .len = sizeof(__method) - 1, \
54 .request = (__request), \
55 .response = (__response), \
56 }
57
58 struct sip_header {
59 const char *name;
60 const char *cname;
61 const char *search;
62 unsigned int len;
63 unsigned int clen;
64 unsigned int slen;
65 int (*match_len)(const struct nf_conn *ct,
66 const char *dptr, const char *limit,
67 int *shift);
68 };
69
70 #define __SIP_HDR(__name, __cname, __search, __match) \
71 { \
72 .name = (__name), \
73 .len = sizeof(__name) - 1, \
74 .cname = (__cname), \
75 .clen = (__cname) ? sizeof(__cname) - 1 : 0, \
76 .search = (__search), \
77 .slen = (__search) ? sizeof(__search) - 1 : 0, \
78 .match_len = (__match), \
79 }
80
81 #define SIP_HDR(__name, __cname, __search, __match) \
82 __SIP_HDR(__name, __cname, __search, __match)
83
84 #define SDP_HDR(__name, __search, __match) \
85 __SIP_HDR(__name, NULL, __search, __match)
86
87 enum sip_header_types {
88 SIP_HDR_CSEQ,
89 SIP_HDR_FROM,
90 SIP_HDR_TO,
91 SIP_HDR_CONTACT,
92 SIP_HDR_VIA_UDP,
93 SIP_HDR_VIA_TCP,
94 SIP_HDR_EXPIRES,
95 SIP_HDR_CONTENT_LENGTH,
96 SIP_HDR_CALL_ID,
97 };
98
99 enum sdp_header_types {
100 SDP_HDR_UNSPEC,
101 SDP_HDR_VERSION,
102 SDP_HDR_OWNER_IP4,
103 SDP_HDR_CONNECTION_IP4,
104 SDP_HDR_OWNER_IP6,
105 SDP_HDR_CONNECTION_IP6,
106 SDP_HDR_MEDIA,
107 };
108
109 extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb,
110 unsigned int protoff,
111 unsigned int dataoff,
112 const char **dptr,
113 unsigned int *datalen);
114 extern void (*nf_nat_sip_seq_adjust_hook)(struct sk_buff *skb, s16 off);
115 extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb,
116 unsigned int protoff,
117 unsigned int dataoff,
118 const char **dptr,
119 unsigned int *datalen,
120 struct nf_conntrack_expect *exp,
121 unsigned int matchoff,
122 unsigned int matchlen);
123 extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb,
124 unsigned int protoff,
125 unsigned int dataoff,
126 const char **dptr,
127 unsigned int *datalen,
128 unsigned int sdpoff,
129 enum sdp_header_types type,
130 enum sdp_header_types term,
131 const union nf_inet_addr *addr);
132 extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb,
133 unsigned int protoff,
134 unsigned int dataoff,
135 const char **dptr,
136 unsigned int *datalen,
137 unsigned int matchoff,
138 unsigned int matchlen,
139 u_int16_t port);
140 extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb,
141 unsigned int protoff,
142 unsigned int dataoff,
143 const char **dptr,
144 unsigned int *datalen,
145 unsigned int sdpoff,
146 const union nf_inet_addr *addr);
147 extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb,
148 unsigned int protoff,
149 unsigned int dataoff,
150 const char **dptr,
151 unsigned int *datalen,
152 struct nf_conntrack_expect *rtp_exp,
153 struct nf_conntrack_expect *rtcp_exp,
154 unsigned int mediaoff,
155 unsigned int medialen,
156 union nf_inet_addr *rtp_addr);
157
158 extern int ct_sip_parse_request(const struct nf_conn *ct,
159 const char *dptr, unsigned int datalen,
160 unsigned int *matchoff, unsigned int *matchlen,
161 union nf_inet_addr *addr, __be16 *port);
162 extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr,
163 unsigned int dataoff, unsigned int datalen,
164 enum sip_header_types type,
165 unsigned int *matchoff, unsigned int *matchlen);
166 extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
167 unsigned int *dataoff, unsigned int datalen,
168 enum sip_header_types type, int *in_header,
169 unsigned int *matchoff, unsigned int *matchlen,
170 union nf_inet_addr *addr, __be16 *port);
171 extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
172 unsigned int dataoff, unsigned int datalen,
173 const char *name,
174 unsigned int *matchoff, unsigned int *matchlen,
175 union nf_inet_addr *addr, bool delim);
176 extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
177 unsigned int off, unsigned int datalen,
178 const char *name,
179 unsigned int *matchoff, unsigned int *matchen,
180 unsigned int *val);
181
182 extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
183 unsigned int dataoff, unsigned int datalen,
184 enum sdp_header_types type,
185 enum sdp_header_types term,
186 unsigned int *matchoff, unsigned int *matchlen);
187
188 #endif /* __KERNEL__ */
189 #endif /* __NF_CONNTRACK_SIP_H__ */