// Address specific func handleAddr(update netlink.AddrUpdate, callback func(supervisor.NetlinkUpdate)) { if update.NewAddr { fmt.Printf("[Add a address]") } else { fmt.Printf("[Delete a address]") } if update.LinkAddress.IP.To4() != nil { fmt.Printf("[IPv4]\t%+v\n", update) } else { // We would not like to handle IPv6 at present. fmt.Printf("[IPv6]\t%+v\n", update) return } netlinkUpdate := supervisor.NetlinkUpdate{} netlinkUpdate.Addr = update netlinkUpdate.UpdateType = supervisor.UpdateTypeAddr links, err := netlink.LinkList() if err != nil { glog.Error(err) } for _, link := range links { if link.Attrs().Index == update.LinkIndex && link.Type() == "veth" { netlinkUpdate.Veth = link.(*netlink.Veth) break } } callback(netlinkUpdate) }
// Route specific func handleRoute(update netlink.RouteUpdate, callback func(supervisor.NetlinkUpdate)) { // Route type is not a bit mask for a couple of values, but a single // unsigned int, that's why we use switch here not the "&" operator. switch update.Type { case syscall.RTM_NEWROUTE: fmt.Printf("[Create a route]\t%+v\n", update) case syscall.RTM_DELROUTE: fmt.Printf("[Remove a route]\t%+v\n", update) case syscall.RTM_GETROUTE: fmt.Printf("[Receive info of a route]\t%+v\n", update) } netlinkUpdate := supervisor.NetlinkUpdate{} netlinkUpdate.Route = update netlinkUpdate.UpdateType = supervisor.UpdateTypeRoute callback(netlinkUpdate) }
// Link specific func handleLink(update netlink.LinkUpdate, callback func(supervisor.NetlinkUpdate)) { if update.IfInfomsg.Flags&syscall.IFF_UP == 1 { fmt.Printf("[Link device up]\tupdateLink is:%+v, flag is:0x%x\n", update.Link.Attrs(), update.IfInfomsg.Flags) } else { if update.Link.Attrs().ParentIndex == 0 { fmt.Printf("[Link device !up][Deleted]\tupdateLink is:%+v, flag is:0x%x\n", update.Link.Attrs(), update.IfInfomsg.Flags) } else { fmt.Printf("[Link device !up]\tupdateLink is:%+v, flag is:0x%x\n", update.Link.Attrs(), update.IfInfomsg.Flags) } } netlinkUpdate := supervisor.NetlinkUpdate{} netlinkUpdate.UpdateType = supervisor.UpdateTypeLink // We would like to only handle the veth pair link at present. if veth, ok := (update.Link).(*netlink.Veth); ok { netlinkUpdate.Veth = veth callback(netlinkUpdate) } }