@@ -7560,3 +7560,229 @@ func TestFlushWithGenID(t *testing.T) {
75607560 t .Errorf ("expected table to not exist, got: %v" , table )
75617561 }
75627562}
7563+
7564+ func TestGetRuleByHandle (t * testing.T ) {
7565+ conn , newNS := nftest .OpenSystemConn (t , * enableSysTests )
7566+ defer nftest .CleanupSystemConn (t , newNS )
7567+ defer conn .FlushRuleset ()
7568+
7569+ table := conn .AddTable (& nftables.Table {
7570+ Name : "test-table" ,
7571+ Family : nftables .TableFamilyIPv4 ,
7572+ })
7573+
7574+ chain := conn .AddChain (& nftables.Chain {
7575+ Name : "test-chain" ,
7576+ Table : table ,
7577+ })
7578+
7579+ for i := range 3 {
7580+ conn .AddRule (& nftables.Rule {
7581+ Table : table ,
7582+ Chain : chain ,
7583+ UserData : fmt .Appendf ([]byte {}, "rule-%d" , i + 1 ),
7584+ Exprs : []expr.Any {
7585+ & expr.Verdict {
7586+ Kind : expr .VerdictAccept ,
7587+ },
7588+ },
7589+ })
7590+ }
7591+
7592+ if err := conn .Flush (); err != nil {
7593+ t .Fatalf ("failed to flush: %v" , err )
7594+ }
7595+
7596+ rules , err := conn .GetRules (table , chain )
7597+ if err != nil {
7598+ t .Fatalf ("GetRules failed: %v" , err )
7599+ }
7600+
7601+ want := rules [1 ]
7602+
7603+ got , err := conn .GetRuleByHandle (table , chain , want .Handle )
7604+ if err != nil {
7605+ t .Fatalf ("GetRuleByHandle failed: %v" , err )
7606+ }
7607+ if ! bytes .Equal (got .UserData , want .UserData ) {
7608+ t .Fatalf ("expected userdata %q, got %q" , got .UserData , want .UserData )
7609+ }
7610+ }
7611+
7612+ func TestResetRule (t * testing.T ) {
7613+ conn , newNS := nftest .OpenSystemConn (t , * enableSysTests )
7614+ defer nftest .CleanupSystemConn (t , newNS )
7615+ defer conn .FlushRuleset ()
7616+
7617+ table := conn .AddTable (& nftables.Table {
7618+ Name : "test-table" ,
7619+ Family : nftables .TableFamilyIPv4 ,
7620+ })
7621+
7622+ chain := conn .AddChain (& nftables.Chain {
7623+ Name : "test-chain" ,
7624+ Table : table ,
7625+ })
7626+
7627+ tests := [... ]struct {
7628+ Bytes uint64
7629+ Packets uint64
7630+ Reset bool
7631+ }{
7632+ {
7633+ Bytes : 1024 ,
7634+ Packets : 1 ,
7635+ Reset : false ,
7636+ },
7637+ {
7638+ Bytes : 2048 ,
7639+ Packets : 2 ,
7640+ Reset : true ,
7641+ },
7642+ {
7643+ Bytes : 4096 ,
7644+ Packets : 4 ,
7645+ Reset : false ,
7646+ },
7647+ }
7648+
7649+ for _ , tt := range tests {
7650+ conn .AddRule (& nftables.Rule {
7651+ Table : table ,
7652+ Chain : chain ,
7653+ Exprs : []expr.Any {
7654+ & expr.Counter {
7655+ Bytes : tt .Bytes ,
7656+ Packets : tt .Packets ,
7657+ },
7658+ & expr.Verdict {
7659+ Kind : expr .VerdictAccept ,
7660+ },
7661+ },
7662+ })
7663+ }
7664+
7665+ if err := conn .Flush (); err != nil {
7666+ t .Fatalf ("flush failed: %v" , err )
7667+ }
7668+
7669+ rules , err := conn .GetRules (table , chain )
7670+ if err != nil {
7671+ t .Fatalf ("GetRules failed: %v" , err )
7672+ }
7673+
7674+ if len (rules ) != len (tests ) {
7675+ t .Fatalf ("expected %d rules, got %d" , len (tests ), len (rules ))
7676+ }
7677+
7678+ for i , r := range rules {
7679+ if ! tests [i ].Reset {
7680+ continue
7681+ }
7682+ _ , err := conn .ResetRule (table , chain , r .Handle )
7683+ if err != nil {
7684+ t .Fatalf ("ResetRule failed: %v" , err )
7685+ }
7686+ }
7687+
7688+ rules , err = conn .GetRules (table , chain )
7689+ if err != nil {
7690+ t .Fatalf ("GetRules failed: %v" , err )
7691+ }
7692+
7693+ for i , r := range rules {
7694+ counter , ok := r .Exprs [0 ].(* expr.Counter )
7695+ if ! ok {
7696+ t .Errorf ("expected first expr to be Counter, got %T" , r .Exprs [0 ])
7697+ }
7698+
7699+ if tests [i ].Reset {
7700+ if counter .Bytes != 0 || counter .Packets != 0 {
7701+ t .Errorf (
7702+ "expected counter values to be reset to zero, got Bytes=%d, Packets=%d" ,
7703+ counter .Bytes ,
7704+ counter .Packets ,
7705+ )
7706+ }
7707+ } else {
7708+ // Making sure that only the selected rules were reset
7709+ if counter .Bytes != tests [i ].Bytes || counter .Packets != tests [i ].Packets {
7710+ t .Errorf (
7711+ "unexpected counter values: got Bytes=%d, Packets=%d, want Bytes=%d, Packets=%d" ,
7712+ counter .Bytes ,
7713+ counter .Packets ,
7714+ tests [i ].Bytes ,
7715+ tests [i ].Packets )
7716+ }
7717+ }
7718+ }
7719+ }
7720+
7721+ func TestResetRules (t * testing.T ) {
7722+ conn , newNS := nftest .OpenSystemConn (t , * enableSysTests )
7723+ defer nftest .CleanupSystemConn (t , newNS )
7724+ defer conn .FlushRuleset ()
7725+
7726+ table := conn .AddTable (& nftables.Table {
7727+ Name : "test-table" ,
7728+ Family : nftables .TableFamilyIPv4 ,
7729+ })
7730+
7731+ chain := conn .AddChain (& nftables.Chain {
7732+ Name : "test-chain" ,
7733+ Table : table ,
7734+ })
7735+
7736+ for range 3 {
7737+ conn .AddRule (& nftables.Rule {
7738+ Table : table ,
7739+ Chain : chain ,
7740+ Exprs : []expr.Any {
7741+ & expr.Counter {
7742+ Bytes : 1 ,
7743+ Packets : 1 ,
7744+ },
7745+ & expr.Verdict {
7746+ Kind : expr .VerdictAccept ,
7747+ },
7748+ },
7749+ })
7750+ }
7751+
7752+ if err := conn .Flush (); err != nil {
7753+ t .Fatalf ("flush failed: %v" , err )
7754+ }
7755+
7756+ rules , err := conn .GetRules (table , chain )
7757+ if err != nil {
7758+ t .Fatalf ("GetRules failed: %v" , err )
7759+ }
7760+
7761+ if len (rules ) != 3 {
7762+ t .Fatalf ("expected %d rules, got %d" , 3 , len (rules ))
7763+ }
7764+
7765+ if _ , err := conn .ResetRules (table , chain ); err != nil {
7766+ t .Fatalf ("ResetRules failed: %v" , err )
7767+ }
7768+
7769+ rules , err = conn .GetRules (table , chain )
7770+ if err != nil {
7771+ t .Fatalf ("GetRules failed: %v" , err )
7772+ }
7773+
7774+ for _ , r := range rules {
7775+ counter , ok := r .Exprs [0 ].(* expr.Counter )
7776+ if ! ok {
7777+ t .Errorf ("expected first expr to be Counter, got %T" , r .Exprs [0 ])
7778+ }
7779+
7780+ if counter .Bytes != 0 || counter .Packets != 0 {
7781+ t .Errorf (
7782+ "expected counter values to be reset to zero, got Bytes=%d, Packets=%d" ,
7783+ counter .Bytes ,
7784+ counter .Packets ,
7785+ )
7786+ }
7787+ }
7788+ }
0 commit comments