Commit 05465343bf74e00c8c2c5a310740157de3149f27

Authored by Patrick McHardy
Committed by David S. Miller
1 parent 764d8a9f24

[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;