Compare commits

..

2 Commits

Author SHA1 Message Date
turekt 1cef3a6218
Merge a8e056d949 into aa8348f790 2024-07-23 23:35:24 +02:00
turekt a8e056d949 Objects implementation refactor
Refactored obj.go to a more generic approach
Added object support for already implemented expressions
Added test for limit object
Fixes https://github.com/google/nftables/issues/253
2024-07-23 23:34:58 +02:00
3 changed files with 19 additions and 35 deletions

View File

@ -25,8 +25,8 @@ import (
)
func init() {
parseExprBytesCommonFunc := func(exprsFromBytesFunc func() ([]Any, error)) ([]interface{}, error) {
exprs, err := exprsFromBytesFunc()
parseexprfunc.ParseExprBytesFunc = func(fam byte, ad *netlink.AttributeDecoder, args ...string) ([]interface{}, error) {
exprs, err := exprsFromBytes(fam, ad, args...)
if err != nil {
return nil, err
}
@ -36,18 +36,7 @@ func init() {
}
return result, nil
}
parseexprfunc.ParseExprBytesFromNameFunc = func(fam byte, ad *netlink.AttributeDecoder, exprName string) ([]interface{}, error) {
return parseExprBytesCommonFunc(func() ([]Any, error) {
return exprsBytesFromName(fam, ad, exprName)
})
}
parseexprfunc.ParseExprBytesFunc = func(fam byte, ad *netlink.AttributeDecoder) ([]interface{}, error) {
return parseExprBytesCommonFunc(func() ([]Any, error) {
return exprsFromBytes(fam, ad)
})
}
parseexprfunc.ParseExprMsgFunc = func(fam byte, b []byte) ([]interface{}, error) {
parseexprfunc.ParseExprMsgFunc = func(fam byte, b []byte, args ...string) ([]interface{}, error) {
ad, err := netlink.NewAttributeDecoder(b)
if err != nil {
return nil, err
@ -55,7 +44,7 @@ func init() {
ad.ByteOrder = binary.BigEndian
var exprs []interface{}
for ad.Next() {
e, err := parseexprfunc.ParseExprBytesFunc(fam, ad)
e, err := parseexprfunc.ParseExprBytesFunc(fam, ad, args...)
if err != nil {
return e, err
}
@ -79,11 +68,12 @@ func Unmarshal(fam byte, data []byte, e Any) error {
return e.unmarshal(fam, data)
}
// exprsBytesFromName parses raw expressions bytes
// based on provided expr name
func exprsBytesFromName(fam byte, ad *netlink.AttributeDecoder, name string) ([]Any, error) {
// exprsFromBytes parses nested raw expressions bytes
// to construct nftables expressions
func exprsFromBytes(fam byte, ad *netlink.AttributeDecoder, args ...string) ([]Any, error) {
var exprs []Any
e := exprFromName(name)
if len(args) > 0 {
e := exprFromName(args[0])
ad.Do(func(b []byte) error {
if err := Unmarshal(fam, b, e); err != nil {
return err
@ -92,12 +82,7 @@ func exprsBytesFromName(fam byte, ad *netlink.AttributeDecoder, name string) ([]
return nil
})
return exprs, ad.Err()
}
// exprsFromBytes parses nested raw expressions bytes
// to construct nftables expressions
func exprsFromBytes(fam byte, ad *netlink.AttributeDecoder) ([]Any, error) {
var exprs []Any
}
ad.Do(func(b []byte) error {
ad, err := netlink.NewAttributeDecoder(b)

View File

@ -5,7 +5,6 @@ import (
)
var (
ParseExprBytesFromNameFunc func(fam byte, ad *netlink.AttributeDecoder, exprName string) ([]interface{}, error)
ParseExprBytesFunc func(fam byte, ad *netlink.AttributeDecoder) ([]interface{}, error)
ParseExprMsgFunc func(fam byte, b []byte) ([]interface{}, error)
ParseExprBytesFunc func(fam byte, ad *netlink.AttributeDecoder, args ...string) ([]interface{}, error)
ParseExprMsgFunc func(fam byte, b []byte, args ...string) ([]interface{}, error)
)

2
obj.go
View File

@ -256,7 +256,7 @@ func objFromMsg(msg netlink.Message, returnLegacyType bool) (Obj, error) {
Type: ObjType(objectType),
}
objs, err := parseexprfunc.ParseExprBytesFromNameFunc(byte(o.family()), ad, objByObjTypeMagic[o.Type])
objs, err := parseexprfunc.ParseExprBytesFunc(byte(o.family()), ad, objByObjTypeMagic[o.Type])
if err != nil {
return nil, err
}