Compare commits

..

2 Commits

Author SHA1 Message Date
turekt b5406ff95a 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-24 18:04:09 +02:00
turekt 912dee68b1
Refactor expr for obj reimplementation (#265)
Added marshalData func to expressions
Prepare parseexprfunc for obj implementation refactor

related to #253
2024-07-24 08:26:13 +02:00
3 changed files with 35 additions and 19 deletions

View File

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

View File

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

2
obj.go
View File

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