aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/netfilter/nf_nat_sip.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2008-03-25 23:17:55 -0400
committerDavid S. Miller <davem@davemloft.net>2008-03-25 23:17:55 -0400
commit3e9b4600b4e71beaa9d943251bfe9c25f6a97b8c (patch)
treecb04b3e40f545d104207784982fb55485f231da5 /net/ipv4/netfilter/nf_nat_sip.c
parent779382eb324ad0c39f8c4d10a47a813b490ab82c (diff)
[NETFILTER]: nf_conntrack_sip: add seperate SDP header parsing function
SDP and SIP headers are quite different, SIP can have continuation lines, leading and trailing whitespace after the colon and is mostly case-insensitive while SDP headers always begin on a new line and are followed by an equal sign and the value, without any whitespace. Introduce new SDP header parsing function and convert all users that used the SIP header parsing function. This will allow to properly deal with the special SIP cases in the SIP header parsing function later. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/netfilter/nf_nat_sip.c')
-rw-r--r--net/ipv4/netfilter/nf_nat_sip.c69
1 files changed, 32 insertions, 37 deletions
diff --git a/net/ipv4/netfilter/nf_nat_sip.c b/net/ipv4/netfilter/nf_nat_sip.c
index dd1b2d86dee..aa8a4f492ba 100644
--- a/net/ipv4/netfilter/nf_nat_sip.c
+++ b/net/ipv4/netfilter/nf_nat_sip.c
@@ -147,51 +147,46 @@ static unsigned int ip_nat_sip(struct sk_buff *skb,
147 return NF_ACCEPT; 147 return NF_ACCEPT;
148} 148}
149 149
150static unsigned int mangle_sip_packet(struct sk_buff *skb, 150static int mangle_content_len(struct sk_buff *skb,
151 const char **dptr, unsigned int *datalen, 151 const char **dptr, unsigned int *datalen)
152 char *buffer, int bufflen,
153 enum sip_header_pos pos)
154{ 152{
155 enum ip_conntrack_info ctinfo; 153 enum ip_conntrack_info ctinfo;
156 struct nf_conn *ct = nf_ct_get(skb, &ctinfo); 154 struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
157 unsigned int matchlen, matchoff; 155 unsigned int matchoff, matchlen;
156 char buffer[sizeof("65536")];
157 int buflen, c_len;
158 158
159 /* Get actual SDP length */
160 if (ct_sip_get_sdp_header(ct, *dptr, 0, *datalen,
161 SDP_HDR_VERSION, SDP_HDR_UNSPEC,
162 &matchoff, &matchlen) <= 0)
163 return 0;
164 c_len = *datalen - matchoff + strlen("v=");
165
166 /* Now, update SDP length */
159 if (ct_sip_get_info(ct, *dptr, *datalen, &matchoff, &matchlen, 167 if (ct_sip_get_info(ct, *dptr, *datalen, &matchoff, &matchlen,
160 pos) <= 0) 168 POS_CONTENT) <= 0)
161 return 0; 169 return 0;
162 170
171 buflen = sprintf(buffer, "%u", c_len);
163 return mangle_packet(skb, dptr, datalen, matchoff, matchlen, 172 return mangle_packet(skb, dptr, datalen, matchoff, matchlen,
164 buffer, bufflen); 173 buffer, buflen);
165} 174}
166 175
167static int mangle_content_len(struct sk_buff *skb, 176static unsigned mangle_sdp_packet(struct sk_buff *skb,
168 const char **dptr, unsigned int *datalen) 177 const char **dptr, unsigned int *datalen,
178 enum sdp_header_types type,
179 char *buffer, int buflen)
169{ 180{
170 enum ip_conntrack_info ctinfo; 181 enum ip_conntrack_info ctinfo;
171 struct nf_conn *ct = nf_ct_get(skb, &ctinfo); 182 struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
172 unsigned int matchoff, matchlen; 183 unsigned int matchlen, matchoff;
173 char buffer[sizeof("65536")];
174 int bufflen;
175 184
176 /* Get actual SDP length */ 185 if (ct_sip_get_sdp_header(ct, *dptr, 0, *datalen, type, SDP_HDR_UNSPEC,
177 if (ct_sip_get_info(ct, *dptr, *datalen, &matchoff, 186 &matchoff, &matchlen) <= 0)
178 &matchlen, POS_SDP_HEADER) > 0) { 187 return 0;
179 188 return mangle_packet(skb, dptr, datalen, matchoff, matchlen,
180 /* since ct_sip_get_info() give us a pointer passing 'v=' 189 buffer, buflen);
181 we need to add 2 bytes in this count. */
182 int c_len = *datalen - matchoff + 2;
183
184 /* Now, update SDP length */
185 if (ct_sip_get_info(ct, *dptr, *datalen, &matchoff,
186 &matchlen, POS_CONTENT) > 0) {
187
188 bufflen = sprintf(buffer, "%u", c_len);
189 return mangle_packet(skb, dptr, datalen,
190 matchoff, matchlen,
191 buffer, bufflen);
192 }
193 }
194 return 0;
195} 190}
196 191
197static unsigned int mangle_sdp(struct sk_buff *skb, 192static unsigned int mangle_sdp(struct sk_buff *skb,
@@ -205,18 +200,18 @@ static unsigned int mangle_sdp(struct sk_buff *skb,
205 200
206 /* Mangle owner and contact info. */ 201 /* Mangle owner and contact info. */
207 bufflen = sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(newip)); 202 bufflen = sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(newip));
208 if (!mangle_sip_packet(skb, dptr, datalen, buffer, bufflen, 203 if (!mangle_sdp_packet(skb, dptr, datalen, SDP_HDR_OWNER_IP4,
209 POS_OWNER_IP4)) 204 buffer, bufflen))
210 return 0; 205 return 0;
211 206
212 if (!mangle_sip_packet(skb, dptr, datalen, buffer, bufflen, 207 if (!mangle_sdp_packet(skb, dptr, datalen, SDP_HDR_CONNECTION_IP4,
213 POS_CONNECTION_IP4)) 208 buffer, bufflen))
214 return 0; 209 return 0;
215 210
216 /* Mangle media port. */ 211 /* Mangle media port. */
217 bufflen = sprintf(buffer, "%u", port); 212 bufflen = sprintf(buffer, "%u", port);
218 if (!mangle_sip_packet(skb, dptr, datalen, buffer, bufflen, 213 if (!mangle_sdp_packet(skb, dptr, datalen, SDP_HDR_MEDIA,
219 POS_MEDIA)) 214 buffer, bufflen))
220 return 0; 215 return 0;
221 216
222 return mangle_content_len(skb, dptr, datalen); 217 return mangle_content_len(skb, dptr, datalen);