1package netlink 2 3import ( 4 "fmt" 5 "syscall" 6 7 "github.com/vishvananda/netlink/nl" 8) 9 10func LinkGetProtinfo(link Link) (Protinfo, error) { 11 base := link.Attrs() 12 ensureIndex(base) 13 var pi Protinfo 14 req := nl.NewNetlinkRequest(syscall.RTM_GETLINK, syscall.NLM_F_DUMP) 15 msg := nl.NewIfInfomsg(syscall.AF_BRIDGE) 16 req.AddData(msg) 17 msgs, err := req.Execute(syscall.NETLINK_ROUTE, 0) 18 if err != nil { 19 return pi, err 20 } 21 22 for _, m := range msgs { 23 ans := nl.DeserializeIfInfomsg(m) 24 if int(ans.Index) != base.Index { 25 continue 26 } 27 attrs, err := nl.ParseRouteAttr(m[ans.Len():]) 28 if err != nil { 29 return pi, err 30 } 31 for _, attr := range attrs { 32 if attr.Attr.Type != syscall.IFLA_PROTINFO|syscall.NLA_F_NESTED { 33 continue 34 } 35 infos, err := nl.ParseRouteAttr(attr.Value) 36 if err != nil { 37 return pi, err 38 } 39 var pi Protinfo 40 for _, info := range infos { 41 switch info.Attr.Type { 42 case nl.IFLA_BRPORT_MODE: 43 pi.Hairpin = byteToBool(info.Value[0]) 44 case nl.IFLA_BRPORT_GUARD: 45 pi.Guard = byteToBool(info.Value[0]) 46 case nl.IFLA_BRPORT_FAST_LEAVE: 47 pi.FastLeave = byteToBool(info.Value[0]) 48 case nl.IFLA_BRPORT_PROTECT: 49 pi.RootBlock = byteToBool(info.Value[0]) 50 case nl.IFLA_BRPORT_LEARNING: 51 pi.Learning = byteToBool(info.Value[0]) 52 case nl.IFLA_BRPORT_UNICAST_FLOOD: 53 pi.Flood = byteToBool(info.Value[0]) 54 } 55 } 56 return pi, nil 57 } 58 } 59 return pi, fmt.Errorf("Device with index %d not found", base.Index) 60} 61