aboutsummaryrefslogtreecommitdiffstats
path: root/net/netfilter/nf_conntrack_sip.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2008-03-25 23:19:30 -0400
committerDavid S. Miller <davem@davemloft.net>2008-03-25 23:19:30 -0400
commit624f8b7bba98c27a1464f5f858c4a861d5d3e8d7 (patch)
tree4abd5e353784665ba9f7c17ae340ad630672c48e /net/netfilter/nf_conntrack_sip.c
parent05e3ced297fe755093140e7487e292fb7603316e (diff)
[NETFILTER]: nf_nat_sip: get rid of text based header translation
Use the URI parsing helper to get the numerical addresses and get rid of the text based header translation. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/netfilter/nf_conntrack_sip.c')
-rw-r--r--net/netfilter/nf_conntrack_sip.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c
index a74d76a9731..f20fa2d94c0 100644
--- a/net/netfilter/nf_conntrack_sip.c
+++ b/net/netfilter/nf_conntrack_sip.c
@@ -151,10 +151,12 @@ static int skp_epaddr_len(const struct nf_conn *ct, const char *dptr,
151 */ 151 */
152int ct_sip_parse_request(const struct nf_conn *ct, 152int ct_sip_parse_request(const struct nf_conn *ct,
153 const char *dptr, unsigned int datalen, 153 const char *dptr, unsigned int datalen,
154 unsigned int *matchoff, unsigned int *matchlen) 154 unsigned int *matchoff, unsigned int *matchlen,
155 union nf_inet_addr *addr, __be16 *port)
155{ 156{
156 const char *start = dptr, *limit = dptr + datalen; 157 const char *start = dptr, *limit = dptr + datalen, *end;
157 unsigned int mlen; 158 unsigned int mlen;
159 unsigned int p;
158 int shift = 0; 160 int shift = 0;
159 161
160 /* Skip method and following whitespace */ 162 /* Skip method and following whitespace */
@@ -173,10 +175,25 @@ int ct_sip_parse_request(const struct nf_conn *ct,
173 if (strnicmp(dptr, "sip:", strlen("sip:")) == 0) 175 if (strnicmp(dptr, "sip:", strlen("sip:")) == 0)
174 break; 176 break;
175 } 177 }
176 *matchlen = skp_epaddr_len(ct, dptr, limit, &shift); 178 if (!skp_epaddr_len(ct, dptr, limit, &shift))
177 if (!*matchlen)
178 return 0; 179 return 0;
179 *matchoff = dptr - start + shift; 180 dptr += shift;
181
182 if (!parse_addr(ct, dptr, &end, addr, limit))
183 return -1;
184 if (end < limit && *end == ':') {
185 end++;
186 p = simple_strtoul(end, (char **)&end, 10);
187 if (p < 1024 || p > 65535)
188 return -1;
189 *port = htons(p);
190 } else
191 *port = htons(SIP_PORT);
192
193 if (end == dptr)
194 return 0;
195 *matchoff = dptr - start;
196 *matchlen = end - dptr;
180 return 1; 197 return 1;
181} 198}
182EXPORT_SYMBOL_GPL(ct_sip_parse_request); 199EXPORT_SYMBOL_GPL(ct_sip_parse_request);