]>
Commit | Line | Data |
---|---|---|
9fafcd7b PM |
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 | ||
0f32a40f PM |
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, | |
0d0ab037 | 15 | SIP_EXPECT_VIDEO, |
0f32a40f PM |
16 | __SIP_EXPECT_MAX |
17 | }; | |
18 | #define SIP_EXPECT_MAX (__SIP_EXPECT_MAX - 1) | |
19 | ||
0d0ab037 PM |
20 | struct sdp_media_type { |
21 | const char *name; | |
22 | unsigned int len; | |
23 | enum sip_expectation_classes class; | |
24 | }; | |
25 | ||
26 | #define SDP_MEDIA_TYPE(__name, __class) \ | |
27 | { \ | |
28 | .name = (__name), \ | |
29 | .len = sizeof(__name) - 1, \ | |
30 | .class = (__class), \ | |
31 | } | |
32 | ||
30f33e6d PM |
33 | struct sip_handler { |
34 | const char *method; | |
35 | unsigned int len; | |
36 | int (*request)(struct sk_buff *skb, | |
37 | const char **dptr, unsigned int *datalen, | |
38 | unsigned int cseq); | |
39 | int (*response)(struct sk_buff *skb, | |
40 | const char **dptr, unsigned int *datalen, | |
41 | unsigned int cseq, unsigned int code); | |
42 | }; | |
43 | ||
44 | #define SIP_HANDLER(__method, __request, __response) \ | |
45 | { \ | |
46 | .method = (__method), \ | |
47 | .len = sizeof(__method) - 1, \ | |
48 | .request = (__request), \ | |
49 | .response = (__response), \ | |
50 | } | |
51 | ||
3e9b4600 PM |
52 | struct sip_header { |
53 | const char *name; | |
54 | const char *cname; | |
55 | const char *search; | |
56 | unsigned int len; | |
57 | unsigned int clen; | |
58 | unsigned int slen; | |
59 | int (*match_len)(const struct nf_conn *ct, | |
60 | const char *dptr, const char *limit, | |
61 | int *shift); | |
62 | }; | |
63 | ||
64 | #define __SIP_HDR(__name, __cname, __search, __match) \ | |
65 | { \ | |
66 | .name = (__name), \ | |
67 | .len = sizeof(__name) - 1, \ | |
68 | .cname = (__cname), \ | |
69 | .clen = (__cname) ? sizeof(__cname) - 1 : 0, \ | |
70 | .search = (__search), \ | |
71 | .slen = (__search) ? sizeof(__search) - 1 : 0, \ | |
72 | .match_len = (__match), \ | |
73 | } | |
74 | ||
ea45f12a PM |
75 | #define SIP_HDR(__name, __cname, __search, __match) \ |
76 | __SIP_HDR(__name, __cname, __search, __match) | |
77 | ||
3e9b4600 PM |
78 | #define SDP_HDR(__name, __search, __match) \ |
79 | __SIP_HDR(__name, NULL, __search, __match) | |
80 | ||
ea45f12a | 81 | enum sip_header_types { |
30f33e6d | 82 | SIP_HDR_CSEQ, |
ea45f12a PM |
83 | SIP_HDR_FROM, |
84 | SIP_HDR_TO, | |
85 | SIP_HDR_CONTACT, | |
86 | SIP_HDR_VIA, | |
0f32a40f | 87 | SIP_HDR_EXPIRES, |
ea45f12a PM |
88 | SIP_HDR_CONTENT_LENGTH, |
89 | }; | |
90 | ||
3e9b4600 PM |
91 | enum sdp_header_types { |
92 | SDP_HDR_UNSPEC, | |
93 | SDP_HDR_VERSION, | |
94 | SDP_HDR_OWNER_IP4, | |
95 | SDP_HDR_CONNECTION_IP4, | |
96 | SDP_HDR_OWNER_IP6, | |
97 | SDP_HDR_CONNECTION_IP6, | |
98 | SDP_HDR_MEDIA, | |
9fafcd7b PM |
99 | }; |
100 | ||
3db05fea | 101 | extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb, |
2a6cfb22 PM |
102 | const char **dptr, |
103 | unsigned int *datalen); | |
0f32a40f PM |
104 | extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb, |
105 | const char **dptr, | |
106 | unsigned int *datalen, | |
107 | struct nf_conntrack_expect *exp, | |
108 | unsigned int matchoff, | |
109 | unsigned int matchlen); | |
4ab9e64e PM |
110 | extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb, |
111 | const char **dptr, | |
112 | unsigned int dataoff, | |
113 | unsigned int *datalen, | |
114 | enum sdp_header_types type, | |
115 | enum sdp_header_types term, | |
116 | const union nf_inet_addr *addr); | |
c7f485ab PM |
117 | extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb, |
118 | const char **dptr, | |
119 | unsigned int *datalen, | |
120 | unsigned int matchoff, | |
121 | unsigned int matchlen, | |
122 | u_int16_t port); | |
4ab9e64e PM |
123 | extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb, |
124 | const char **dptr, | |
125 | unsigned int dataoff, | |
126 | unsigned int *datalen, | |
127 | const union nf_inet_addr *addr); | |
128 | extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb, | |
129 | const char **dptr, | |
130 | unsigned int *datalen, | |
131 | struct nf_conntrack_expect *rtp_exp, | |
132 | struct nf_conntrack_expect *rtcp_exp, | |
133 | unsigned int mediaoff, | |
134 | unsigned int medialen, | |
135 | union nf_inet_addr *rtp_addr); | |
9fafcd7b | 136 | |
ac367740 PM |
137 | extern int ct_sip_parse_request(const struct nf_conn *ct, |
138 | const char *dptr, unsigned int datalen, | |
624f8b7b PM |
139 | unsigned int *matchoff, unsigned int *matchlen, |
140 | union nf_inet_addr *addr, __be16 *port); | |
ea45f12a PM |
141 | extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr, |
142 | unsigned int dataoff, unsigned int datalen, | |
143 | enum sip_header_types type, | |
144 | unsigned int *matchoff, unsigned int *matchlen); | |
05e3ced2 PM |
145 | extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr, |
146 | unsigned int *dataoff, unsigned int datalen, | |
147 | enum sip_header_types type, int *in_header, | |
148 | unsigned int *matchoff, unsigned int *matchlen, | |
149 | union nf_inet_addr *addr, __be16 *port); | |
2bbb2116 PM |
150 | extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr, |
151 | unsigned int dataoff, unsigned int datalen, | |
152 | const char *name, | |
153 | unsigned int *matchoff, unsigned int *matchlen, | |
154 | union nf_inet_addr *addr); | |
155 | extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr, | |
156 | unsigned int off, unsigned int datalen, | |
157 | const char *name, | |
158 | unsigned int *matchoff, unsigned int *matchen, | |
159 | unsigned int *val); | |
3e9b4600 PM |
160 | |
161 | extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr, | |
162 | unsigned int dataoff, unsigned int datalen, | |
163 | enum sdp_header_types type, | |
164 | enum sdp_header_types term, | |
165 | unsigned int *matchoff, unsigned int *matchlen); | |
166 | ||
9fafcd7b PM |
167 | #endif /* __KERNEL__ */ |
168 | #endif /* __NF_CONNTRACK_SIP_H__ */ |