From 695079ebffbbd1e2f68b3e235977ceb42e21c182 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Wed, 3 Oct 2018 18:23:26 +0200 Subject: [PATCH] objFromMsg: correctly set Table.Family This fixes an issue in router7 where firewall rules would fail to be installed on all but the first tries (the first try had no counter values, so the passed-in Table would be returned as-is, with correct family). --- nftables.go | 2 +- nftables_test.go | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/nftables.go b/nftables.go index 06965f7..c266724 100644 --- a/nftables.go +++ b/nftables.go @@ -520,7 +520,7 @@ func objFromMsg(msg netlink.Message) (Obj, error) { for ad.Next() { switch ad.Type() { case unix.NFTA_OBJ_TABLE: - table = &Table{Name: ad.String()} + table = &Table{Name: ad.String(), Family: TableFamily(msg.Data[0])} case unix.NFTA_OBJ_NAME: name = ad.String() case unix.NFTA_OBJ_TYPE: diff --git a/nftables_test.go b/nftables_test.go index c2571b7..bbf9351 100644 --- a/nftables_test.go +++ b/nftables_test.go @@ -47,7 +47,7 @@ func TestConfigureNAT(t *testing.T) { []byte("\x02\x00\x00\x00\x08\x00\x01\x00\x6e\x61\x74\x00\x08\x00\x02\x00\x00\x00\x00\x00"), // nft add chain nat prerouting '{' type nat hook prerouting priority 0 \; '}' []byte("\x02\x00\x00\x00\x08\x00\x01\x00\x6e\x61\x74\x00\x0f\x00\x03\x00\x70\x72\x65\x72\x6f\x75\x74\x69\x6e\x67\x00\x00\x14\x00\x04\x80\x08\x00\x01\x00\x00\x00\x00\x00\x08\x00\x02\x00\x00\x00\x00\x00\x08\x00\x07\x00\x6e\x61\x74\x00"), - // nft add chain nat postrouting { type nat hook postrouting priority 100 \; } + // nft add chain nat postrouting '{' type nat hook postrouting priority 100 \; '}' []byte("\x02\x00\x00\x00\x08\x00\x01\x00\x6e\x61\x74\x00\x10\x00\x03\x00\x70\x6f\x73\x74\x72\x6f\x75\x74\x69\x6e\x67\x00\x14\x00\x04\x80\x08\x00\x01\x00\x00\x00\x00\x04\x08\x00\x02\x00\x00\x00\x00\x64\x08\x00\x07\x00\x6e\x61\x74\x00"), // nft add rule nat postrouting oifname uplink0 masquerade []byte("\x02\x00\x00\x00\x08\x00\x01\x00\x6e\x61\x74\x00\x10\x00\x02\x00\x70\x6f\x73\x74\x72\x6f\x75\x74\x69\x6e\x67\x00\x74\x00\x04\x80\x24\x00\x01\x80\x09\x00\x01\x00\x6d\x65\x74\x61\x00\x00\x00\x00\x14\x00\x02\x80\x08\x00\x02\x00\x00\x00\x00\x07\x08\x00\x01\x00\x00\x00\x00\x01\x38\x00\x01\x80\x08\x00\x01\x00\x63\x6d\x70\x00\x2c\x00\x02\x80\x08\x00\x01\x00\x00\x00\x00\x01\x08\x00\x02\x00\x00\x00\x00\x00\x18\x00\x03\x80\x14\x00\x01\x00\x75\x70\x6c\x69\x6e\x6b\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x01\x80\x09\x00\x01\x00\x6d\x61\x73\x71\x00\x00\x00\x00\x04\x00\x02\x80"), @@ -436,8 +436,9 @@ func TestGetObjReset(t *testing.T) { }, } + filter := &nftables.Table{Name: "filter", Family: nftables.TableFamilyIPv4} objs, err := c.GetObjReset(&nftables.CounterObj{ - Table: &nftables.Table{Name: "filter", Family: nftables.TableFamilyIPv4}, + Table: filter, Name: "fwded", }) @@ -454,6 +455,12 @@ func TestGetObjReset(t *testing.T) { if !ok { t.Fatalf("unexpected type: got %T, want *nftables.CounterObj", obj) } + if got, want := co.Table.Name, filter.Name; got != want { + t.Errorf("unexpected table name: got %q, want %q", got, want) + } + if got, want := co.Table.Family, filter.Family; got != want { + t.Errorf("unexpected table family: got %d, want %d", got, want) + } if got, want := co.Packets, uint64(9); got != want { t.Errorf("unexpected number of packets: got %d, want %d", got, want) }