@@ -822,7 +822,7 @@ impl Chains {
822822}
823823
824824pub ( super ) fn apply_filter_rules (
825- rules : Vec < FilterRule > ,
825+ rules : & [ FilterRule ] ,
826826 batch : & mut Batch ,
827827 ifname : & str ,
828828) -> Result < ( ) , FirewallError > {
@@ -832,7 +832,7 @@ pub(super) fn apply_filter_rules(
832832 let forward_chain = Chains :: Forward . to_chain ( & table) ;
833833 batch. add ( & forward_chain, MsgType :: Add ) ;
834834
835- for rule in rules. iter ( ) {
835+ for rule in rules {
836836 let chain_rule = rule. to_chain_rule ( & forward_chain, batch) ?;
837837 batch. add ( & chain_rule, MsgType :: Add ) ;
838838 }
@@ -842,17 +842,26 @@ pub(super) fn apply_filter_rules(
842842
843843pub ( crate ) fn send_batch ( batch : & FinalizedBatch ) -> Result < ( ) , FirewallError > {
844844 let socket = mnl:: Socket :: new ( mnl:: Bus :: Netfilter )
845- . map_err ( |e | FirewallError :: NetlinkError ( format ! ( "Failed to create socket: {e :?}" ) ) ) ?;
846- socket. send_all ( batch) . map_err ( |e | {
847- FirewallError :: NetlinkError ( format ! ( "Failed to send batch through socket: {e :?}" ) )
845+ . map_err ( |err | FirewallError :: NetlinkError ( format ! ( "Failed to create socket: {err :?}" ) ) ) ?;
846+ socket. send_all ( batch) . map_err ( |err | {
847+ FirewallError :: NetlinkError ( format ! ( "Failed to send batch through socket: {err :?}" ) )
848848 } ) ?;
849849
850850 let portid = socket. portid ( ) ;
851851 let mut buffer = vec ! [ 0 ; nft_nlmsg_maxsize( ) as usize ] ;
852852
853- // TODO: Why is it supposed to be 2?
854- let seq = 2 ;
855- while let Some ( message) = socket_recv ( & socket, & mut buffer[ ..] ) ? {
853+ let mut expected_seqs = batch. sequence_numbers ( ) ;
854+ for message in socket. recv ( & mut buffer) . map_err ( |err| {
855+ FirewallError :: NetlinkError ( format ! ( "Failed reading message from socket: {err:?}" ) )
856+ } ) ? {
857+ let Ok ( message) = message else {
858+ warn ! ( "Invalid netlink message" ) ;
859+ continue ;
860+ } ;
861+ let Some ( seq) = expected_seqs. next ( ) else {
862+ warn ! ( "Unexpected ACK in netlink messages" ) ;
863+ continue ;
864+ } ;
856865 match mnl:: cb_run ( message, seq, portid) {
857866 Ok ( mnl:: CbResult :: Stop ) => {
858867 debug ! ( "Received stop signal from netlink callback" ) ;
@@ -872,22 +881,6 @@ pub(crate) fn send_batch(batch: &FinalizedBatch) -> Result<(), FirewallError> {
872881 Ok ( ( ) )
873882}
874883
875- fn socket_recv < ' a > (
876- socket : & mnl:: Socket ,
877- buf : & ' a mut [ u8 ] ,
878- ) -> Result < Option < & ' a [ u8 ] > , FirewallError > {
879- let ret = socket. recv_raw ( buf) . map_err ( |err| {
880- FirewallError :: NetlinkError ( format ! (
881- "Failed while reading a message from socket: {err:?}"
882- ) )
883- } ) ?;
884- if ret > 0 {
885- Ok ( Some ( & buf[ ..ret] ) )
886- } else {
887- Ok ( None )
888- }
889- }
890-
891884fn new_anon_set < T > ( table : & Table , family : ProtoFamily , interval_set : bool ) -> Set < ' _ , T >
892885where
893886 T : SetKey ,
0 commit comments