diff options
author | Patrick McHardy <kaber@trash.net> | 2008-03-25 23:19:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-03-25 23:19:30 -0400 |
commit | 624f8b7bba98c27a1464f5f858c4a861d5d3e8d7 (patch) | |
tree | 4abd5e353784665ba9f7c17ae340ad630672c48e /net/netfilter/nf_conntrack_sip.c | |
parent | 05e3ced297fe755093140e7487e292fb7603316e (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.c | 27 |
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 | */ |
152 | int ct_sip_parse_request(const struct nf_conn *ct, | 152 | int 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 | } |
182 | EXPORT_SYMBOL_GPL(ct_sip_parse_request); | 199 | EXPORT_SYMBOL_GPL(ct_sip_parse_request); |