Compare commits
2 Commits
a8e056d949
...
b5406ff95a
Author | SHA1 | Date |
---|---|---|
|
b5406ff95a | |
|
912dee68b1 |
47
expr/expr.go
47
expr/expr.go
|
@ -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,21 +79,25 @@ func Unmarshal(fam byte, data []byte, e Any) error {
|
||||||
return e.unmarshal(fam, data)
|
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) {
|
||||||
|
var exprs []Any
|
||||||
|
e := exprFromName(name)
|
||||||
|
ad.Do(func(b []byte) error {
|
||||||
|
if err := Unmarshal(fam, b, e); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
exprs = append(exprs, e)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return exprs, ad.Err()
|
||||||
|
}
|
||||||
|
|
||||||
// exprsFromBytes parses nested raw expressions bytes
|
// exprsFromBytes parses nested raw expressions bytes
|
||||||
// to construct nftables expressions
|
// to construct nftables expressions
|
||||||
func exprsFromBytes(fam byte, ad *netlink.AttributeDecoder, args ...string) ([]Any, error) {
|
func exprsFromBytes(fam byte, ad *netlink.AttributeDecoder) ([]Any, error) {
|
||||||
var exprs []Any
|
var exprs []Any
|
||||||
if len(args) > 0 {
|
|
||||||
e := exprFromName(args[0])
|
|
||||||
ad.Do(func(b []byte) error {
|
|
||||||
if err := Unmarshal(fam, b, e); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
exprs = append(exprs, e)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
return exprs, ad.Err()
|
|
||||||
}
|
|
||||||
|
|
||||||
ad.Do(func(b []byte) error {
|
ad.Do(func(b []byte) error {
|
||||||
ad, err := netlink.NewAttributeDecoder(b)
|
ad, err := netlink.NewAttributeDecoder(b)
|
||||||
|
|
|
@ -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
2
obj.go
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue