1 #ifndef __NF_CONNTRACK_SIP_H__
2 #define __NF_CONNTRACK_SIP_H__
5 #include <net/netfilter/nf_conntrack_expect.h>
7 #include <linux/types.h>
10 #define SIP_TIMEOUT 3600
12 struct nf_ct_sip_master {
13 unsigned int register_cseq;
14 unsigned int invite_cseq;
18 enum sip_expectation_classes {
19 SIP_EXPECT_SIGNALLING,
25 #define SIP_EXPECT_MAX (__SIP_EXPECT_MAX - 1)
27 struct sdp_media_type {
30 enum sip_expectation_classes class;
33 #define SDP_MEDIA_TYPE(__name, __class) \
36 .len = sizeof(__name) - 1, \
43 int (*request)(struct sk_buff *skb, unsigned int protoff,
45 const char **dptr, unsigned int *datalen,
47 int (*response)(struct sk_buff *skb, unsigned int protoff,
49 const char **dptr, unsigned int *datalen,
50 unsigned int cseq, unsigned int code);
53 #define SIP_HANDLER(__method, __request, __response) \
55 .method = (__method), \
56 .len = sizeof(__method) - 1, \
57 .request = (__request), \
58 .response = (__response), \
68 int (*match_len)(const struct nf_conn *ct,
69 const char *dptr, const char *limit,
73 #define __SIP_HDR(__name, __cname, __search, __match) \
76 .len = sizeof(__name) - 1, \
78 .clen = (__cname) ? sizeof(__cname) - 1 : 0, \
79 .search = (__search), \
80 .slen = (__search) ? sizeof(__search) - 1 : 0, \
81 .match_len = (__match), \
84 #define SIP_HDR(__name, __cname, __search, __match) \
85 __SIP_HDR(__name, __cname, __search, __match)
87 #define SDP_HDR(__name, __search, __match) \
88 __SIP_HDR(__name, NULL, __search, __match)
90 enum sip_header_types {
98 SIP_HDR_CONTENT_LENGTH,
102 enum sdp_header_types {
110 extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb,
111 unsigned int protoff,
112 unsigned int dataoff,
114 unsigned int *datalen);
115 extern void (*nf_nat_sip_seq_adjust_hook)(struct sk_buff *skb,
116 unsigned int protoff, s16 off);
117 extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb,
118 unsigned int protoff,
119 unsigned int dataoff,
121 unsigned int *datalen,
122 struct nf_conntrack_expect *exp,
123 unsigned int matchoff,
124 unsigned int matchlen);
125 extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb,
126 unsigned int protoff,
127 unsigned int dataoff,
129 unsigned int *datalen,
131 enum sdp_header_types type,
132 enum sdp_header_types term,
133 const union nf_inet_addr *addr);
134 extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb,
135 unsigned int protoff,
136 unsigned int dataoff,
138 unsigned int *datalen,
139 unsigned int matchoff,
140 unsigned int matchlen,
142 extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb,
143 unsigned int protoff,
144 unsigned int dataoff,
146 unsigned int *datalen,
148 const union nf_inet_addr *addr);
149 extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb,
150 unsigned int protoff,
151 unsigned int dataoff,
153 unsigned int *datalen,
154 struct nf_conntrack_expect *rtp_exp,
155 struct nf_conntrack_expect *rtcp_exp,
156 unsigned int mediaoff,
157 unsigned int medialen,
158 union nf_inet_addr *rtp_addr);
160 extern int ct_sip_parse_request(const struct nf_conn *ct,
161 const char *dptr, unsigned int datalen,
162 unsigned int *matchoff, unsigned int *matchlen,
163 union nf_inet_addr *addr, __be16 *port);
164 extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr,
165 unsigned int dataoff, unsigned int datalen,
166 enum sip_header_types type,
167 unsigned int *matchoff, unsigned int *matchlen);
168 extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
169 unsigned int *dataoff, unsigned int datalen,
170 enum sip_header_types type, int *in_header,
171 unsigned int *matchoff, unsigned int *matchlen,
172 union nf_inet_addr *addr, __be16 *port);
173 extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
174 unsigned int dataoff, unsigned int datalen,
176 unsigned int *matchoff, unsigned int *matchlen,
177 union nf_inet_addr *addr, bool delim);
178 extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
179 unsigned int off, unsigned int datalen,
181 unsigned int *matchoff, unsigned int *matchen,
184 extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
185 unsigned int dataoff, unsigned int datalen,
186 enum sdp_header_types type,
187 enum sdp_header_types term,
188 unsigned int *matchoff, unsigned int *matchlen);
190 #endif /* __KERNEL__ */
191 #endif /* __NF_CONNTRACK_SIP_H__ */