Commit 05465343bf74e00c8c2c5a310740157de3149f27
Committed by
David S. Miller
1 parent
764d8a9f24
Exists in
master
and in
7 other branches
[NETFILTER]: Add goto target
Originally written by Henrik Nordstrom <hno@marasystems.com>, taken from netfilter patch-o-matic and added ip6_tables support. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 4 changed files with 8 additions and 6 deletions Side-by-side Diff
include/linux/netfilter_ipv4/ip_tables.h
... | ... | @@ -109,7 +109,8 @@ |
109 | 109 | |
110 | 110 | /* Values for "flag" field in struct ipt_ip (general ip structure). */ |
111 | 111 | #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */ |
112 | -#define IPT_F_MASK 0x01 /* All possible flag bits mask. */ | |
112 | +#define IPT_F_GOTO 0x02 /* Set if jump is a goto */ | |
113 | +#define IPT_F_MASK 0x03 /* All possible flag bits mask. */ | |
113 | 114 | |
114 | 115 | /* Values for "inv" field in struct ipt_ip. */ |
115 | 116 | #define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */ |
include/linux/netfilter_ipv6/ip6_tables.h
... | ... | @@ -111,7 +111,8 @@ |
111 | 111 | #define IP6T_F_PROTO 0x01 /* Set if rule cares about upper |
112 | 112 | protocols */ |
113 | 113 | #define IP6T_F_TOS 0x02 /* Match the TOS. */ |
114 | -#define IP6T_F_MASK 0x03 /* All possible flag bits mask. */ | |
114 | +#define IP6T_F_GOTO 0x04 /* Set if jump is a goto */ | |
115 | +#define IP6T_F_MASK 0x07 /* All possible flag bits mask. */ | |
115 | 116 | |
116 | 117 | /* Values for "inv" field in struct ip6t_ip6. */ |
117 | 118 | #define IP6T_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */ |
net/ipv4/netfilter/ip_tables.c
... | ... | @@ -340,8 +340,8 @@ |
340 | 340 | back->comefrom); |
341 | 341 | continue; |
342 | 342 | } |
343 | - if (table_base + v | |
344 | - != (void *)e + e->next_offset) { | |
343 | + if (table_base + v != (void *)e + e->next_offset | |
344 | + && !(e->ip.flags & IPT_F_GOTO)) { | |
345 | 345 | /* Save old back ptr in next entry */ |
346 | 346 | struct ipt_entry *next |
347 | 347 | = (void *)e + e->next_offset; |
net/ipv6/netfilter/ip6_tables.c
... | ... | @@ -433,8 +433,8 @@ |
433 | 433 | back->comefrom); |
434 | 434 | continue; |
435 | 435 | } |
436 | - if (table_base + v | |
437 | - != (void *)e + e->next_offset) { | |
436 | + if (table_base + v != (void *)e + e->next_offset | |
437 | + && !(e->ipv6.flags & IP6T_F_GOTO)) { | |
438 | 438 | /* Save old back ptr in next entry */ |
439 | 439 | struct ip6t_entry *next |
440 | 440 | = (void *)e + e->next_offset; |