]> git.karo-electronics.de Git - karo-tx-linux.git/blob - include/linux/netfilter/nf_conntrack_sip.h
raid1: Add some macros to make code clearly.
[karo-tx-linux.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 #include <linux/types.h>
8
9 #define SIP_PORT        5060
10 #define SIP_TIMEOUT     3600
11
12 struct nf_ct_sip_master {
13         unsigned int    register_cseq;
14         unsigned int    invite_cseq;
15         __be16          forced_dport;
16 };
17
18 enum sip_expectation_classes {
19         SIP_EXPECT_SIGNALLING,
20         SIP_EXPECT_AUDIO,
21         SIP_EXPECT_VIDEO,
22         SIP_EXPECT_IMAGE,
23         __SIP_EXPECT_MAX
24 };
25 #define SIP_EXPECT_MAX  (__SIP_EXPECT_MAX - 1)
26
27 struct sdp_media_type {
28         const char                      *name;
29         unsigned int                    len;
30         enum sip_expectation_classes    class;
31 };
32
33 #define SDP_MEDIA_TYPE(__name, __class)                                 \
34 {                                                                       \
35         .name   = (__name),                                             \
36         .len    = sizeof(__name) - 1,                                   \
37         .class  = (__class),                                            \
38 }
39
40 struct sip_handler {
41         const char      *method;
42         unsigned int    len;
43         int             (*request)(struct sk_buff *skb, unsigned int protoff,
44                                    unsigned int dataoff,
45                                    const char **dptr, unsigned int *datalen,
46                                    unsigned int cseq);
47         int             (*response)(struct sk_buff *skb, unsigned int protoff,
48                                     unsigned int dataoff,
49                                     const char **dptr, unsigned int *datalen,
50                                     unsigned int cseq, unsigned int code);
51 };
52
53 #define SIP_HANDLER(__method, __request, __response)                    \
54 {                                                                       \
55         .method         = (__method),                                   \
56         .len            = sizeof(__method) - 1,                         \
57         .request        = (__request),                                  \
58         .response       = (__response),                                 \
59 }
60
61 struct sip_header {
62         const char      *name;
63         const char      *cname;
64         const char      *search;
65         unsigned int    len;
66         unsigned int    clen;
67         unsigned int    slen;
68         int             (*match_len)(const struct nf_conn *ct,
69                                      const char *dptr, const char *limit,
70                                      int *shift);
71 };
72
73 #define __SIP_HDR(__name, __cname, __search, __match)                   \
74 {                                                                       \
75         .name           = (__name),                                     \
76         .len            = sizeof(__name) - 1,                           \
77         .cname          = (__cname),                                    \
78         .clen           = (__cname) ? sizeof(__cname) - 1 : 0,          \
79         .search         = (__search),                                   \
80         .slen           = (__search) ? sizeof(__search) - 1 : 0,        \
81         .match_len      = (__match),                                    \
82 }
83
84 #define SIP_HDR(__name, __cname, __search, __match) \
85         __SIP_HDR(__name, __cname, __search, __match)
86
87 #define SDP_HDR(__name, __search, __match) \
88         __SIP_HDR(__name, NULL, __search, __match)
89
90 enum sip_header_types {
91         SIP_HDR_CSEQ,
92         SIP_HDR_FROM,
93         SIP_HDR_TO,
94         SIP_HDR_CONTACT,
95         SIP_HDR_VIA_UDP,
96         SIP_HDR_VIA_TCP,
97         SIP_HDR_EXPIRES,
98         SIP_HDR_CONTENT_LENGTH,
99         SIP_HDR_CALL_ID,
100 };
101
102 enum sdp_header_types {
103         SDP_HDR_UNSPEC,
104         SDP_HDR_VERSION,
105         SDP_HDR_OWNER,
106         SDP_HDR_CONNECTION,
107         SDP_HDR_MEDIA,
108 };
109
110 extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb,
111                                        unsigned int protoff,
112                                        unsigned int dataoff,
113                                        const char **dptr,
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,
120                                               const char **dptr,
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,
128                                             const char **dptr,
129                                             unsigned int *datalen,
130                                             unsigned int sdpoff,
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,
137                                             const char **dptr,
138                                             unsigned int *datalen,
139                                             unsigned int matchoff,
140                                             unsigned int matchlen,
141                                             u_int16_t port);
142 extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb,
143                                                unsigned int protoff,
144                                                unsigned int dataoff,
145                                                const char **dptr,
146                                                unsigned int *datalen,
147                                                unsigned int sdpoff,
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,
152                                              const char **dptr,
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);
159
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,
175                                       const char *name,
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,
180                                         const char *name,
181                                         unsigned int *matchoff, unsigned int *matchen,
182                                         unsigned int *val);
183
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);
189
190 #endif /* __KERNEL__ */
191 #endif /* __NF_CONNTRACK_SIP_H__ */