From 6925991d822c9529eb7a50fa4a2bf54a87e26702 Mon Sep 17 00:00:00 2001 From: Serguei Bezverkhi Date: Mon, 19 Aug 2019 17:36:36 -0400 Subject: [PATCH] Meta SREG and DREG (#51) * meta requires to use source and destination registers Signed-off-by: Serguei Bezverkhi --- expr/expr.go | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/expr/expr.go b/expr/expr.go index 5e4810c..3735fbd 100644 --- a/expr/expr.go +++ b/expr/expr.go @@ -76,20 +76,39 @@ const ( // Meta loads packet meta information for later comparisons. See also // https://wiki.nftables.org/wiki-nftables/index.php/Matching_packet_metainformation type Meta struct { - Key MetaKey - Register uint32 + Key MetaKey + SourceRegister bool + Register uint32 } func (e *Meta) marshal() ([]byte, error) { + regData := []byte{} exprData, err := netlink.MarshalAttributes( []netlink.Attribute{ {Type: unix.NFTA_META_KEY, Data: binaryutil.BigEndian.PutUint32(uint32(e.Key))}, - {Type: unix.NFTA_META_DREG, Data: binaryutil.BigEndian.PutUint32(e.Register)}, }, ) if err != nil { return nil, err } + if e.SourceRegister { + regData, err = netlink.MarshalAttributes( + []netlink.Attribute{ + {Type: unix.NFTA_META_SREG, Data: binaryutil.BigEndian.PutUint32(e.Register)}, + }, + ) + } else { + regData, err = netlink.MarshalAttributes( + []netlink.Attribute{ + {Type: unix.NFTA_META_DREG, Data: binaryutil.BigEndian.PutUint32(e.Register)}, + }, + ) + } + if err != nil { + return nil, err + } + exprData = append(exprData, regData...) + return netlink.MarshalAttributes([]netlink.Attribute{ {Type: unix.NFTA_EXPR_NAME, Data: []byte("meta\x00")}, {Type: unix.NLA_F_NESTED | unix.NFTA_EXPR_DATA, Data: exprData},