46 lines
1.0 KiB
Go
46 lines
1.0 KiB
Go
|
package nftables
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
"fmt"
|
||
|
"github.com/mdlayher/netlink"
|
||
|
"golang.org/x/sys/unix"
|
||
|
)
|
||
|
|
||
|
type GenMsg struct {
|
||
|
ID uint32
|
||
|
ProcPID uint32
|
||
|
ProcComm string // [16]byte - max 16bytes - kernel TASK_COMM_LEN
|
||
|
}
|
||
|
|
||
|
var genHeaderType = netlink.HeaderType((unix.NFNL_SUBSYS_NFTABLES << 8) | unix.NFT_MSG_NEWGEN)
|
||
|
|
||
|
func genFromMsg(msg netlink.Message) (*GenMsg, error) {
|
||
|
if got, want := msg.Header.Type, genHeaderType; got != want {
|
||
|
return nil, fmt.Errorf("unexpected header type: got %v, want %v", got, want)
|
||
|
}
|
||
|
ad, err := netlink.NewAttributeDecoder(msg.Data[4:])
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
ad.ByteOrder = binary.BigEndian
|
||
|
|
||
|
msgOut := &GenMsg{}
|
||
|
for ad.Next() {
|
||
|
switch ad.Type() {
|
||
|
case unix.NFTA_GEN_ID:
|
||
|
msgOut.ID = ad.Uint32()
|
||
|
case unix.NFTA_GEN_PROC_PID:
|
||
|
msgOut.ProcPID = ad.Uint32()
|
||
|
case unix.NFTA_GEN_PROC_NAME:
|
||
|
msgOut.ProcComm = ad.String()
|
||
|
default:
|
||
|
return nil, fmt.Errorf("Unknown attribute: %d %v\n", ad.Type(), ad.Bytes())
|
||
|
}
|
||
|
}
|
||
|
if err := ad.Err(); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return msgOut, nil
|
||
|
}
|