7 "github.com/vishvananda/netlink/nl"
15 type GenlMulticastGroup struct {
20 type GenlFamily struct {
27 Groups []GenlMulticastGroup
30 func parseOps(b []byte) ([]GenlOp, error) {
31 attrs, err := nl.ParseRouteAttr(b)
35 ops := make([]GenlOp, 0, len(attrs))
36 for _, a := range attrs {
37 nattrs, err := nl.ParseRouteAttr(a.Value)
42 for _, na := range nattrs {
44 case nl.GENL_CTRL_ATTR_OP_ID:
45 op.ID = native.Uint32(na.Value)
46 case nl.GENL_CTRL_ATTR_OP_FLAGS:
47 op.Flags = native.Uint32(na.Value)
55 func parseMulticastGroups(b []byte) ([]GenlMulticastGroup, error) {
56 attrs, err := nl.ParseRouteAttr(b)
60 groups := make([]GenlMulticastGroup, 0, len(attrs))
61 for _, a := range attrs {
62 nattrs, err := nl.ParseRouteAttr(a.Value)
66 var g GenlMulticastGroup
67 for _, na := range nattrs {
69 case nl.GENL_CTRL_ATTR_MCAST_GRP_NAME:
70 g.Name = nl.BytesToString(na.Value)
71 case nl.GENL_CTRL_ATTR_MCAST_GRP_ID:
72 g.ID = native.Uint32(na.Value)
75 groups = append(groups, g)
80 func (f *GenlFamily) parseAttributes(attrs []syscall.NetlinkRouteAttr) error {
81 for _, a := range attrs {
83 case nl.GENL_CTRL_ATTR_FAMILY_NAME:
84 f.Name = nl.BytesToString(a.Value)
85 case nl.GENL_CTRL_ATTR_FAMILY_ID:
86 f.ID = native.Uint16(a.Value)
87 case nl.GENL_CTRL_ATTR_VERSION:
88 f.Version = native.Uint32(a.Value)
89 case nl.GENL_CTRL_ATTR_HDRSIZE:
90 f.HdrSize = native.Uint32(a.Value)
91 case nl.GENL_CTRL_ATTR_MAXATTR:
92 f.MaxAttr = native.Uint32(a.Value)
93 case nl.GENL_CTRL_ATTR_OPS:
94 ops, err := parseOps(a.Value)
99 case nl.GENL_CTRL_ATTR_MCAST_GROUPS:
100 groups, err := parseMulticastGroups(a.Value)
111 func parseFamilies(msgs [][]byte) ([]*GenlFamily, error) {
112 families := make([]*GenlFamily, 0, len(msgs))
113 for _, m := range msgs {
114 attrs, err := nl.ParseRouteAttr(m[nl.SizeofGenlmsg:])
118 family := &GenlFamily{}
119 if err := family.parseAttributes(attrs); err != nil {
123 families = append(families, family)
128 func (h *Handle) GenlFamilyList() ([]*GenlFamily, error) {
130 Command: nl.GENL_CTRL_CMD_GETFAMILY,
131 Version: nl.GENL_CTRL_VERSION,
133 req := h.newNetlinkRequest(nl.GENL_ID_CTRL, syscall.NLM_F_DUMP)
135 msgs, err := req.Execute(syscall.NETLINK_GENERIC, 0)
139 return parseFamilies(msgs)
142 func GenlFamilyList() ([]*GenlFamily, error) {
143 return pkgHandle.GenlFamilyList()
146 func (h *Handle) GenlFamilyGet(name string) (*GenlFamily, error) {
148 Command: nl.GENL_CTRL_CMD_GETFAMILY,
149 Version: nl.GENL_CTRL_VERSION,
151 req := h.newNetlinkRequest(nl.GENL_ID_CTRL, 0)
153 req.AddData(nl.NewRtAttr(nl.GENL_CTRL_ATTR_FAMILY_NAME, nl.ZeroTerminated(name)))
154 msgs, err := req.Execute(syscall.NETLINK_GENERIC, 0)
158 families, err := parseFamilies(msgs)
159 if len(families) != 1 {
160 return nil, fmt.Errorf("invalid response for GENL_CTRL_CMD_GETFAMILY")
162 return families[0], nil
165 func GenlFamilyGet(name string) (*GenlFamily, error) {
166 return pkgHandle.GenlFamilyGet(name)