diff options
author | Jan Engelhardt <jengelh@medozas.de> | 2009-07-09 17:00:19 -0400 |
---|---|---|
committer | Jan Engelhardt <jengelh@medozas.de> | 2009-08-10 07:35:27 -0400 |
commit | 47901dc2c4a3f1f9af453486a005d31fe9b393f0 (patch) | |
tree | 12bcbe4b7add3cc9beff300165ac4d962015ad15 /net/ipv4 | |
parent | e5afbba1869a5d9509c61f8962be9bdebf95f7d3 (diff) |
netfilter: xtables: use memcmp in unconditional check
Instead of inspecting each u32/char open-coded, clean up and make use
of memcmp. On some arches, memcmp is implemented as assembly or GCC's
__builtin_memcmp which can possibly take advantages of known
alignment.
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/netfilter/arp_tables.c | 10 | ||||
-rw-r--r-- | net/ipv4/netfilter/ip_tables.c | 11 |
2 files changed, 6 insertions, 15 deletions
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index 7505dff4ffdf..b9f7243f4220 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
@@ -341,15 +341,11 @@ unsigned int arpt_do_table(struct sk_buff *skb, | |||
341 | } | 341 | } |
342 | 342 | ||
343 | /* All zeroes == unconditional rule. */ | 343 | /* All zeroes == unconditional rule. */ |
344 | static inline int unconditional(const struct arpt_arp *arp) | 344 | static inline bool unconditional(const struct arpt_arp *arp) |
345 | { | 345 | { |
346 | unsigned int i; | 346 | static const struct arpt_arp uncond; |
347 | |||
348 | for (i = 0; i < sizeof(*arp)/sizeof(__u32); i++) | ||
349 | if (((__u32 *)arp)[i]) | ||
350 | return 0; | ||
351 | 347 | ||
352 | return 1; | 348 | return memcmp(arp, &uncond, sizeof(uncond)) == 0; |
353 | } | 349 | } |
354 | 350 | ||
355 | /* Figures out from what hook each rule can be called: returns 0 if | 351 | /* Figures out from what hook each rule can be called: returns 0 if |
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 3856aa3f231e..3431a771ff1f 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c | |||
@@ -190,16 +190,11 @@ get_entry(void *base, unsigned int offset) | |||
190 | 190 | ||
191 | /* All zeroes == unconditional rule. */ | 191 | /* All zeroes == unconditional rule. */ |
192 | /* Mildly perf critical (only if packet tracing is on) */ | 192 | /* Mildly perf critical (only if packet tracing is on) */ |
193 | static inline int | 193 | static inline bool unconditional(const struct ipt_ip *ip) |
194 | unconditional(const struct ipt_ip *ip) | ||
195 | { | 194 | { |
196 | unsigned int i; | 195 | static const struct ipt_ip uncond; |
197 | 196 | ||
198 | for (i = 0; i < sizeof(*ip)/sizeof(__u32); i++) | 197 | return memcmp(ip, &uncond, sizeof(uncond)) == 0; |
199 | if (((__u32 *)ip)[i]) | ||
200 | return 0; | ||
201 | |||
202 | return 1; | ||
203 | #undef FWINV | 198 | #undef FWINV |
204 | } | 199 | } |
205 | 200 | ||