github.com/mem/u-root@v2.0.1-0.20181004165302-9b18b4636a33+incompatible/cmds/ip/ops.go (about) 1 // Copyright 2012-2017 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "fmt" 9 "io" 10 "math" 11 "strings" 12 13 "github.com/vishvananda/netlink" 14 ) 15 16 func showLinks(w io.Writer, withAddresses bool) error { 17 ifaces, err := netlink.LinkList() 18 if err != nil { 19 return fmt.Errorf("Can't enumerate interfaces? %v", err) 20 } 21 22 for _, v := range ifaces { 23 l := v.Attrs() 24 25 fmt.Fprintf(w, "%d: %s: <%s> mtu %d state %s\n", l.Index, l.Name, 26 strings.Replace(strings.ToUpper(fmt.Sprintf("%s", l.Flags)), "|", ",", -1), 27 l.MTU, strings.ToUpper(l.OperState.String())) 28 29 fmt.Fprintf(w, " link/%s %s\n", l.EncapType, l.HardwareAddr) 30 31 if withAddresses { 32 showLinkAddresses(w, v) 33 } 34 } 35 return nil 36 } 37 38 func showLinkAddresses(w io.Writer, link netlink.Link) error { 39 addrs, err := netlink.AddrList(link, netlink.FAMILY_ALL) 40 if err != nil { 41 return fmt.Errorf("Can't enumerate addresses: %v", err) 42 } 43 44 for _, addr := range addrs { 45 46 var inet string 47 switch len(addr.IPNet.IP) { 48 case 4: 49 inet = "inet" 50 case 16: 51 inet = "inet6" 52 default: 53 return fmt.Errorf("Can't figure out IP protocol version") 54 } 55 56 fmt.Fprintf(w, " %s %s", inet, addr.IP) 57 if addr.Broadcast != nil { 58 fmt.Fprintf(w, " brd %s", addr.Broadcast) 59 } 60 fmt.Fprintf(w, " scope %s %s\n", addrScopes[netlink.Scope(addr.Scope)], addr.Label) 61 62 var validLft, preferredLft string 63 // TODO: fix vishnavanda/netlink. *Lft should be uint32, not int. 64 if uint32(addr.PreferedLft) == math.MaxUint32 { 65 preferredLft = "forever" 66 } else { 67 preferredLft = fmt.Sprintf("%dsec", addr.PreferedLft) 68 } 69 if uint32(addr.ValidLft) == math.MaxUint32 { 70 validLft = "forever" 71 } else { 72 validLft = fmt.Sprintf("%dsec", addr.ValidLft) 73 } 74 fmt.Fprintf(w, " valid_lft %s preferred_lft %s\n", validLft, preferredLft) 75 } 76 return nil 77 }