]>
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, | |
87 | SIP_HDR_VIA, | |
0f32a40f | 88 | SIP_HDR_EXPIRES, |
ea45f12a PM |
89 | SIP_HDR_CONTENT_LENGTH, |
90 | }; | |
91 | ||
3e9b4600 PM |
92 | enum sdp_header_types { |
93 | SDP_HDR_UNSPEC, | |
94 | SDP_HDR_VERSION, | |
95 | SDP_HDR_OWNER_IP4, | |
96 | SDP_HDR_CONNECTION_IP4, | |
97 | SDP_HDR_OWNER_IP6, | |
98 | SDP_HDR_CONNECTION_IP6, | |
99 | SDP_HDR_MEDIA, | |
9fafcd7b PM |
100 | }; |
101 | ||
3db05fea | 102 | extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb, |
3b6b9fab | 103 | unsigned int dataoff, |
2a6cfb22 PM |
104 | const char **dptr, |
105 | unsigned int *datalen); | |
0f32a40f | 106 | extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb, |
3b6b9fab | 107 | unsigned int dataoff, |
0f32a40f PM |
108 | const char **dptr, |
109 | unsigned int *datalen, | |
110 | struct nf_conntrack_expect *exp, | |
111 | unsigned int matchoff, | |
112 | unsigned int matchlen); | |
4ab9e64e | 113 | extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb, |
4ab9e64e | 114 | unsigned int dataoff, |
3b6b9fab | 115 | const char **dptr, |
4ab9e64e | 116 | unsigned int *datalen, |
3b6b9fab | 117 | unsigned int sdpoff, |
4ab9e64e PM |
118 | enum sdp_header_types type, |
119 | enum sdp_header_types term, | |
120 | const union nf_inet_addr *addr); | |
c7f485ab | 121 | extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb, |
3b6b9fab | 122 | unsigned int dataoff, |
c7f485ab PM |
123 | const char **dptr, |
124 | unsigned int *datalen, | |
125 | unsigned int matchoff, | |
126 | unsigned int matchlen, | |
127 | u_int16_t port); | |
4ab9e64e | 128 | extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb, |
4ab9e64e | 129 | unsigned int dataoff, |
3b6b9fab | 130 | const char **dptr, |
4ab9e64e | 131 | unsigned int *datalen, |
3b6b9fab | 132 | unsigned int sdpoff, |
4ab9e64e PM |
133 | const union nf_inet_addr *addr); |
134 | extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb, | |
3b6b9fab | 135 | unsigned int dataoff, |
4ab9e64e PM |
136 | const char **dptr, |
137 | unsigned int *datalen, | |
138 | struct nf_conntrack_expect *rtp_exp, | |
139 | struct nf_conntrack_expect *rtcp_exp, | |
140 | unsigned int mediaoff, | |
141 | unsigned int medialen, | |
142 | union nf_inet_addr *rtp_addr); | |
9fafcd7b | 143 | |
ac367740 PM |
144 | extern int ct_sip_parse_request(const struct nf_conn *ct, |
145 | const char *dptr, unsigned int datalen, | |
624f8b7b PM |
146 | unsigned int *matchoff, unsigned int *matchlen, |
147 | union nf_inet_addr *addr, __be16 *port); | |
ea45f12a PM |
148 | extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr, |
149 | unsigned int dataoff, unsigned int datalen, | |
150 | enum sip_header_types type, | |
151 | unsigned int *matchoff, unsigned int *matchlen); | |
05e3ced2 PM |
152 | extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr, |
153 | unsigned int *dataoff, unsigned int datalen, | |
154 | enum sip_header_types type, int *in_header, | |
155 | unsigned int *matchoff, unsigned int *matchlen, | |
156 | union nf_inet_addr *addr, __be16 *port); | |
2bbb2116 PM |
157 | extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr, |
158 | unsigned int dataoff, unsigned int datalen, | |
159 | const char *name, | |
160 | unsigned int *matchoff, unsigned int *matchlen, | |
161 | union nf_inet_addr *addr); | |
162 | extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr, | |
163 | unsigned int off, unsigned int datalen, | |
164 | const char *name, | |
165 | unsigned int *matchoff, unsigned int *matchen, | |
166 | unsigned int *val); | |
3e9b4600 PM |
167 | |
168 | extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr, | |
169 | unsigned int dataoff, unsigned int datalen, | |
170 | enum sdp_header_types type, | |
171 | enum sdp_header_types term, | |
172 | unsigned int *matchoff, unsigned int *matchlen); | |
173 | ||
9fafcd7b PM |
174 | #endif /* __KERNEL__ */ |
175 | #endif /* __NF_CONNTRACK_SIP_H__ */ |