ct: Add optional direction fields (#317)

This commit is contained in:
Gleb Zhizhchenko 2025-06-06 12:18:25 +03:00 committed by GitHub
parent 68e1406c13
commit 8a8ad2be81
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 40 additions and 2 deletions

View File

@ -110,6 +110,12 @@ const (
CtStateUDPREPLIED CtStateUDPREPLIED
) )
const (
// https://git.netfilter.org/libnftnl/tree/src/expr/ct.c?id=116e95aa7b6358c917de8c69f6f173874030b46b#n31
CtDirOriginal = iota
CtDirReply
)
// https://git.netfilter.org/libnftnl/tree/src/obj/ct_timeout.c?id=116e95aa7b6358c917de8c69f6f173874030b46b#n57 // https://git.netfilter.org/libnftnl/tree/src/obj/ct_timeout.c?id=116e95aa7b6358c917de8c69f6f173874030b46b#n57
var CtStateUDPTimeoutDefaults CtStatePolicyTimeout = map[uint16]uint32{ var CtStateUDPTimeoutDefaults CtStatePolicyTimeout = map[uint16]uint32{
CtStateUDPUNREPLIED: 30, CtStateUDPUNREPLIED: 30,
@ -122,6 +128,7 @@ type Ct struct {
SourceRegister bool SourceRegister bool
Key CtKey Key CtKey
Direction uint32 Direction uint32
OptDirection bool
} }
func (e *Ct) marshal(fam byte) ([]byte, error) { func (e *Ct) marshal(fam byte) ([]byte, error) {
@ -165,10 +172,16 @@ func (e *Ct) marshalData(fam byte) ([]byte, error) {
exprData = append(exprData, regData...) exprData = append(exprData, regData...)
switch e.Key { switch e.Key {
case CtKeyPKTS, CtKeyBYTES, CtKeyAVGPKT, CtKeyL3PROTOCOL, CtKeyPROTOCOL:
if !e.OptDirection {
break
}
fallthrough
case CtKeySRC, CtKeyDST, CtKeyPROTOSRC, CtKeyPROTODST, CtKeySRCIP, CtKeyDSTIP, CtKeySRCIP6, CtKeyDSTIP6: case CtKeySRC, CtKeyDST, CtKeyPROTOSRC, CtKeyPROTODST, CtKeySRCIP, CtKeyDSTIP, CtKeySRCIP6, CtKeyDSTIP6:
regData, err = netlink.MarshalAttributes( regData, err = netlink.MarshalAttributes(
[]netlink.Attribute{ []netlink.Attribute{
{Type: unix.NFTA_CT_DIRECTION, Data: binaryutil.BigEndian.PutUint32(e.Direction)}, {Type: unix.NFTA_CT_DIRECTION, Data: []byte{uint8(e.Direction)}},
}, },
) )
if err != nil { if err != nil {
@ -186,6 +199,8 @@ func (e *Ct) unmarshal(fam byte, data []byte) error {
return err return err
} }
ad.ByteOrder = binary.BigEndian ad.ByteOrder = binary.BigEndian
var hasDirection bool
for ad.Next() { for ad.Next() {
switch ad.Type() { switch ad.Type() {
case unix.NFTA_CT_KEY: case unix.NFTA_CT_KEY:
@ -193,12 +208,19 @@ func (e *Ct) unmarshal(fam byte, data []byte) error {
case unix.NFTA_CT_DREG: case unix.NFTA_CT_DREG:
e.Register = ad.Uint32() e.Register = ad.Uint32()
case unix.NFTA_CT_DIRECTION: case unix.NFTA_CT_DIRECTION:
e.Direction = ad.Uint32() e.Direction = uint32(ad.Uint8())
hasDirection = true
case unix.NFTA_CT_SREG: case unix.NFTA_CT_SREG:
e.SourceRegister = true e.SourceRegister = true
e.Register = ad.Uint32() e.Register = ad.Uint32()
} }
} }
switch e.Key {
case CtKeyPKTS, CtKeyBYTES, CtKeyAVGPKT, CtKeyL3PROTOCOL, CtKeyPROTOCOL:
e.OptDirection = hasDirection
}
return ad.Err() return ad.Err()
} }

View File

@ -78,6 +78,22 @@ func TestCt(t *testing.T) {
Direction: 1, Direction: 1,
}, },
}, },
{
name: "Unmarshal Ct packets direction original case",
ct: Ct{
Register: 1,
Key: CtKeyPKTS,
Direction: CtDirOriginal,
OptDirection: true,
},
},
{
name: "Unmarshal Ct bytes without direction case",
ct: Ct{
Register: 1,
Key: CtKeyBYTES,
},
},
} }
for _, tt := range tests { for _, tt := range tests {