Skip to content

Commit

Permalink
rule: add String() method
Browse files Browse the repository at this point in the history
Before this commit: the printing of a rule results in
a pointer address.

After this commit: the printing of a rules results in
a human-readable text.

Resolves: google#104

Signed-off-by: Paul Greenberg <greenpau@outlook.com>
  • Loading branch information
greenpau committed Aug 3, 2020
1 parent c25e4f6 commit dae73ea
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
nftables.test
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,12 @@ the data types/API will be identified as more functionality is added.

Contributions are very welcome!

### Testing Changes

Run the following commands to test your changes:

```bash
go test ./...
go test -c github.com/google/nftables
sudo ./nftables.test -test.v -run_system_tests
```
43 changes: 43 additions & 0 deletions expr/verdict.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ import (
"golang.org/x/sys/unix"
)

const (
NFT_DROP = 0
NFT_ACCEPT = 1
NFT_STOLEN = 2
NFT_QUEUE = 3
NFT_REPEAT = 4
NFT_STOP = 5
)

// This code assembles the verdict structure, as expected by the
// nftables netlink API.
// For further information, consult:
Expand Down Expand Up @@ -126,3 +135,37 @@ func (e *Verdict) unmarshal(data []byte) error {
}
return ad.Err()
}

func (e *Verdict) String() string {
var v string
switch e.Kind {
case unix.NFT_RETURN:
v = "return" // -0x5
case unix.NFT_GOTO:
v = "goto" // -0x4
case unix.NFT_JUMP:
v = "jump" // NFT_JUMP = -0x3
case unix.NFT_BREAK:
v = "break" // NFT_BREAK = -0x2
case unix.NFT_CONTINUE:
v = "continue" // NFT_CONTINUE = -0x1
case NFT_DROP:
v = "drop"
case NFT_ACCEPT:
v = "accept"
case NFT_STOLEN:
v = "stolen"
case NFT_QUEUE:
v = "queue"
case NFT_REPEAT:
v = "repeat"
case NFT_STOP:
v = "stop"
default:
v = fmt.Sprintf("verdict %v", e.Kind)
}
if e.Chain != "" {
return v + " " + e.Chain
}
return v
}
15 changes: 15 additions & 0 deletions nftables_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -252,12 +252,27 @@ func TestRuleOperations(t *testing.T) {
expr.VerdictDrop,
}

wantStrings := []string{
"queue",
"accept",
"queue",
"accept",
"drop",
"drop",
}

for i, r := range rules {
rr, _ := r.Exprs[0].(*expr.Verdict)

if rr.Kind != want[i] {
t.Fatalf("bad verdict kind at %d", i)
}

if rr.String() != wantStrings[i] {
t.Fatalf("bad verdict string at %d: %s (received) vs. %s (expected)", i, rr.String(), wantStrings[i])
}

t.Logf("%s", rr)
}
}

Expand Down
3 changes: 3 additions & 0 deletions nftables_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
go test ./...
go test -c github.com/google/nftables
sudo ./nftables.test -test.v -run_system_tests

0 comments on commit dae73ea

Please sign in to comment.