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