<div dir="ltr"><div><div><div><div><div><div>Hi there,<br><br></div>If I have the following (somewhat contrived) example:<br><br>table filter {<br>  chain INPUT {<br>    protocol ( tcp udp ) mod multiport destination-ports ( 7937:9936 10001:30000 ) @subchain foo {<br>      saddr host1 ACCEPT;<br>      saddr host2 ACCEPT;<br>    }           <br>  }     <br>}<br><br></div>This outputs the following:<br><br># Generated by ferm 2.3 on Sun May 22 17:33:24 2016<br>*filter<br>:INPUT ACCEPT [0:0]<br>:foo - [0:0]<br>-A INPUT --protocol tcp --match multiport --destination-ports 7937:9936,10001:30000 --jump foo<br>-A INPUT --protocol udp --match multiport --destination-ports 7937:9936,10001:30000 --jump foo<br>-A foo --protocol tcp --source host1 --jump ACCEPT<br>-A foo --protocol udp --source host1 --jump ACCEPT<br>-A foo --protocol tcp --source host2 --jump ACCEPT<br>-A foo --protocol udp --source host2 --jump ACCEPT<br>COMMIT<br><br></div>However, I believe that this is unnecessarily wasteful and due to what I believe to be a bug at line 2316. If lines 2136 - 2320 are commented out, you get the following output.<br><br># Generated by ferm 2.3 on Sun May 22 17:36:10 2016<br>*filter<br>:INPUT ACCEPT [0:0]<br>:foo - [0:0]<br>-A INPUT --protocol tcp --match multiport --destination-ports 7937:9936,10001:30000 --jump foo<br>-A INPUT --protocol udp --match multiport --destination-ports 7937:9936,10001:30000 --jump foo<br>-A foo --source host1 --jump ACCEPT<br>-A foo --source host2 --jump ACCEPT<br>COMMIT<br><br></div>Which appears to be equally correct, but uses less rules and matches. I can't see the reason for making protocol a special case at this point in the code so wondered if there were a particular reason that I am missing?<br><br></div>Regards,<br><br></div>Bret<br></div>