[NETFILTER]: nf_conntrack_sip: create RTCP expectations
[pandora-kernel.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 #define SIP_PORT        5060
6 #define SIP_TIMEOUT     3600
7
8 struct nf_ct_sip_master {
9         unsigned int    register_cseq;
10 };
11
12 enum sip_expectation_classes {
13         SIP_EXPECT_SIGNALLING,
14         SIP_EXPECT_AUDIO,
15         __SIP_EXPECT_MAX
16 };
17 #define SIP_EXPECT_MAX  (__SIP_EXPECT_MAX - 1)
18
19 struct sip_handler {
20         const char      *method;
21         unsigned int    len;
22         int             (*request)(struct sk_buff *skb,
23                                    const char **dptr, unsigned int *datalen,
24                                    unsigned int cseq);
25         int             (*response)(struct sk_buff *skb,
26                                     const char **dptr, unsigned int *datalen,
27                                     unsigned int cseq, unsigned int code);
28 };
29
30 #define SIP_HANDLER(__method, __request, __response)                    \
31 {                                                                       \
32         .method         = (__method),                                   \
33         .len            = sizeof(__method) - 1,                         \
34         .request        = (__request),                                  \
35         .response       = (__response),                                 \
36 }
37
38 struct sip_header {
39         const char      *name;
40         const char      *cname;
41         const char      *search;
42         unsigned int    len;
43         unsigned int    clen;
44         unsigned int    slen;
45         int             (*match_len)(const struct nf_conn *ct,
46                                      const char *dptr, const char *limit,
47                                      int *shift);
48 };
49
50 #define __SIP_HDR(__name, __cname, __search, __match)                   \
51 {                                                                       \
52         .name           = (__name),                                     \
53         .len            = sizeof(__name) - 1,                           \
54         .cname          = (__cname),                                    \
55         .clen           = (__cname) ? sizeof(__cname) - 1 : 0,          \
56         .search         = (__search),                                   \
57         .slen           = (__search) ? sizeof(__search) - 1 : 0,        \
58         .match_len      = (__match),                                    \
59 }
60
61 #define SIP_HDR(__name, __cname, __search, __match) \
62         __SIP_HDR(__name, __cname, __search, __match)
63
64 #define SDP_HDR(__name, __search, __match) \
65         __SIP_HDR(__name, NULL, __search, __match)
66
67 enum sip_header_types {
68         SIP_HDR_CSEQ,
69         SIP_HDR_FROM,
70         SIP_HDR_TO,
71         SIP_HDR_CONTACT,
72         SIP_HDR_VIA,
73         SIP_HDR_EXPIRES,
74         SIP_HDR_CONTENT_LENGTH,
75 };
76
77 enum sdp_header_types {
78         SDP_HDR_UNSPEC,
79         SDP_HDR_VERSION,
80         SDP_HDR_OWNER_IP4,
81         SDP_HDR_CONNECTION_IP4,
82         SDP_HDR_OWNER_IP6,
83         SDP_HDR_CONNECTION_IP6,
84         SDP_HDR_MEDIA,
85 };
86
87 extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb,
88                                        const char **dptr,
89                                        unsigned int *datalen);
90 extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb,
91                                               const char **dptr,
92                                               unsigned int *datalen,
93                                               struct nf_conntrack_expect *exp,
94                                               unsigned int matchoff,
95                                               unsigned int matchlen);
96 extern unsigned int (*nf_nat_sdp_hook)(struct sk_buff *skb,
97                                        const char **dptr,
98                                        unsigned int *datalen,
99                                        struct nf_conntrack_expect *rtp_exp,
100                                        struct nf_conntrack_expect *rtcp_exp);
101
102 extern int ct_sip_parse_request(const struct nf_conn *ct,
103                                 const char *dptr, unsigned int datalen,
104                                 unsigned int *matchoff, unsigned int *matchlen,
105                                 union nf_inet_addr *addr, __be16 *port);
106 extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr,
107                              unsigned int dataoff, unsigned int datalen,
108                              enum sip_header_types type,
109                              unsigned int *matchoff, unsigned int *matchlen);
110 extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
111                                    unsigned int *dataoff, unsigned int datalen,
112                                    enum sip_header_types type, int *in_header,
113                                    unsigned int *matchoff, unsigned int *matchlen,
114                                    union nf_inet_addr *addr, __be16 *port);
115 extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
116                                       unsigned int dataoff, unsigned int datalen,
117                                       const char *name,
118                                       unsigned int *matchoff, unsigned int *matchlen,
119                                       union nf_inet_addr *addr);
120 extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
121                                         unsigned int off, unsigned int datalen,
122                                         const char *name,
123                                         unsigned int *matchoff, unsigned int *matchen,
124                                         unsigned int *val);
125
126 extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
127                                  unsigned int dataoff, unsigned int datalen,
128                                  enum sdp_header_types type,
129                                  enum sdp_header_types term,
130                                  unsigned int *matchoff, unsigned int *matchlen);
131
132 #endif /* __KERNEL__ */
133 #endif /* __NF_CONNTRACK_SIP_H__ */