aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
authorJan Engelhardt <jengelh@medozas.de>2009-07-09 17:00:19 -0400
committerJan Engelhardt <jengelh@medozas.de>2009-08-10 07:35:27 -0400
commit47901dc2c4a3f1f9af453486a005d31fe9b393f0 (patch)
tree12bcbe4b7add3cc9beff300165ac4d962015ad15 /net/ipv4
parente5afbba1869a5d9509c61f8962be9bdebf95f7d3 (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.c10
-rw-r--r--net/ipv4/netfilter/ip_tables.c11
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. */
344static inline int unconditional(const struct arpt_arp *arp) 344static 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) */
193static inline int 193static inline bool unconditional(const struct ipt_ip *ip)
194unconditional(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