<div dir="ltr">Hi there,<br><br>I believe that there is a case to be made for a new location keyword @gotosubchain. This would be analogous to @subchain, but call the created subchain via goto rather than jump.I certainly have a number of use cases for this.<br><br>The following appears to be sufficient to implement this.<br><br><div>diff --git a/src/ferm b/src/ferm</div><div>index 7cdcae4..88cd57d 100755</div><div>--- a/src/ferm</div><div>+++ b/src/ferm</div><div>@@ -2248,11 +2248,15 @@ sub enter($$) {</div><div>             }</div><div> </div><div>             # create a subchain</div><div>-            if ($keyword eq '@subchain' or $keyword eq 'subchain') {</div><div>+            if ($keyword eq '@subchain' or $keyword eq 'subchain' or $keyword eq '@gotosubchain') {</div><div>                 error('Chain must be specified')</div><div>                   unless exists $rule{chain};</div><div> </div><div>-                error('No rule specified before "@subchain"')</div><div>+               my $jumptype = ( $keyword =~ /^\@go/ ) ? 'goto' : 'jump';</div><div>+               my $jumpkey = $keyword;</div><div>+               $jumpkey =~ s/^sub/\@sub/;</div><div>+</div><div>+                error('No rule specified before "$jumpkey"')</div><div>                   unless $rule{has_rule};</div><div> </div><div>                 my $subchain;</div><div>@@ -2275,9 +2279,9 @@ sub enter($$) {</div><div>                     $domains{$domain}{tables}{$table}{chains}{$subchain} ||= {};</div><div>                 }</div><div> </div><div>-                set_target(%rule, 'jump', $subchain);</div><div>+                set_target(%rule, $jumptype, $subchain);</div><div> </div><div>-                error('"{" or chain name expected after "@subchain"')</div><div>+                error('"{" or chain name expected after "$jumpkey"')</div><div>                   unless $keyword eq '{';</div><div> </div><div>                 # create a deep copy of %rule, only containing values</div><div><br></div><div><br></div><div><div>diff --git a/doc/ferm.pod b/doc/ferm.pod</div><div>index f721736..727db70 100644</div><div>--- a/doc/ferm.pod</div><div>+++ b/doc/ferm.pod</div><div>@@ -448,9 +448,13 @@ expression such as @cat("interface_", $iface) or @substr($var,0,20).</div><div> You can achieve the same by explicitly declaring a custom chain, but</div><div> you may feel that using B<@subchain> requires less typing.</div><div> </div><div>+=item B<@gotosubchain ["CHAIN-NAME"] { ... }></div><div> </div><div>-=back</div><div>+Works like B<@subchain> except that instead of using B<jump> target</div><div>+it uses B<realgoto> target. See discussion below for the difference</div><div>+between these two targets.</div><div> </div><div>+=back</div><div> </div><div> =head2 Basic iptables match keywords</div></div><div><br></div><div>I would appreciate it if this could be considered as a future enhancement - unless of course I have missed the obvious direct way of achieving this already.</div><div><br></div><div>Regards,</div><div><br></div><div>Bret</div><span class=""></span></div>