github.com/adityamillind98/moby@v23.0.0-rc.4+incompatible/libnetwork/drivers/overlay/ov_utils.go (about) 1 //go:build linux 2 // +build linux 3 4 package overlay 5 6 import ( 7 "fmt" 8 "strings" 9 "syscall" 10 11 "github.com/docker/docker/libnetwork/drivers/overlay/overlayutils" 12 "github.com/docker/docker/libnetwork/netutils" 13 "github.com/docker/docker/libnetwork/ns" 14 "github.com/docker/docker/libnetwork/osl" 15 "github.com/sirupsen/logrus" 16 "github.com/vishvananda/netlink" 17 "github.com/vishvananda/netns" 18 ) 19 20 var soTimeout = ns.NetlinkSocketsTimeout 21 22 func validateID(nid, eid string) error { 23 if nid == "" { 24 return fmt.Errorf("invalid network id") 25 } 26 27 if eid == "" { 28 return fmt.Errorf("invalid endpoint id") 29 } 30 31 return nil 32 } 33 34 func createVethPair() (string, string, error) { 35 defer osl.InitOSContext()() 36 nlh := ns.NlHandle() 37 38 // Generate a name for what will be the host side pipe interface 39 name1, err := netutils.GenerateIfaceName(nlh, vethPrefix, vethLen) 40 if err != nil { 41 return "", "", fmt.Errorf("error generating veth name1: %v", err) 42 } 43 44 // Generate a name for what will be the sandbox side pipe interface 45 name2, err := netutils.GenerateIfaceName(nlh, vethPrefix, vethLen) 46 if err != nil { 47 return "", "", fmt.Errorf("error generating veth name2: %v", err) 48 } 49 50 // Generate and add the interface pipe host <-> sandbox 51 veth := &netlink.Veth{ 52 LinkAttrs: netlink.LinkAttrs{Name: name1, TxQLen: 0}, 53 PeerName: name2} 54 if err := nlh.LinkAdd(veth); err != nil { 55 return "", "", fmt.Errorf("error creating veth pair: %v", err) 56 } 57 58 return name1, name2, nil 59 } 60 61 func createVxlan(name string, vni uint32, mtu int) error { 62 defer osl.InitOSContext()() 63 64 vxlan := &netlink.Vxlan{ 65 LinkAttrs: netlink.LinkAttrs{Name: name, MTU: mtu}, 66 VxlanId: int(vni), 67 Learning: true, 68 Port: int(overlayutils.VXLANUDPPort()), 69 Proxy: true, 70 L3miss: true, 71 L2miss: true, 72 } 73 74 if err := ns.NlHandle().LinkAdd(vxlan); err != nil { 75 return fmt.Errorf("error creating vxlan interface: %v", err) 76 } 77 78 return nil 79 } 80 81 func deleteInterfaceBySubnet(brPrefix string, s *subnet) error { 82 defer osl.InitOSContext()() 83 84 nlh := ns.NlHandle() 85 links, err := nlh.LinkList() 86 if err != nil { 87 return fmt.Errorf("failed to list interfaces while deleting bridge interface by subnet: %v", err) 88 } 89 90 for _, l := range links { 91 name := l.Attrs().Name 92 if _, ok := l.(*netlink.Bridge); ok && strings.HasPrefix(name, brPrefix) { 93 addrList, err := nlh.AddrList(l, netlink.FAMILY_V4) 94 if err != nil { 95 logrus.Errorf("error getting AddressList for bridge %s", name) 96 continue 97 } 98 for _, addr := range addrList { 99 if netutils.NetworkOverlaps(addr.IPNet, s.subnetIP) { 100 err = nlh.LinkDel(l) 101 if err != nil { 102 logrus.Errorf("error deleting bridge (%s) with subnet %v: %v", name, addr.IPNet, err) 103 } 104 } 105 } 106 } 107 } 108 return nil 109 } 110 111 func deleteInterface(name string) error { 112 defer osl.InitOSContext()() 113 114 link, err := ns.NlHandle().LinkByName(name) 115 if err != nil { 116 return fmt.Errorf("failed to find interface with name %s: %v", name, err) 117 } 118 119 if err := ns.NlHandle().LinkDel(link); err != nil { 120 return fmt.Errorf("error deleting interface with name %s: %v", name, err) 121 } 122 123 return nil 124 } 125 126 func deleteVxlanByVNI(path string, vni uint32) error { 127 defer osl.InitOSContext()() 128 129 nlh := ns.NlHandle() 130 if path != "" { 131 ns, err := netns.GetFromPath(path) 132 if err != nil { 133 return fmt.Errorf("failed to get ns handle for %s: %v", path, err) 134 } 135 defer ns.Close() 136 137 nlh, err = netlink.NewHandleAt(ns, syscall.NETLINK_ROUTE) 138 if err != nil { 139 return fmt.Errorf("failed to get netlink handle for ns %s: %v", path, err) 140 } 141 defer nlh.Close() 142 err = nlh.SetSocketTimeout(soTimeout) 143 if err != nil { 144 logrus.Warnf("Failed to set the timeout on the netlink handle sockets for vxlan deletion: %v", err) 145 } 146 } 147 148 links, err := nlh.LinkList() 149 if err != nil { 150 return fmt.Errorf("failed to list interfaces while deleting vxlan interface by vni: %v", err) 151 } 152 153 for _, l := range links { 154 if l.Type() == "vxlan" && (vni == 0 || l.(*netlink.Vxlan).VxlanId == int(vni)) { 155 err = nlh.LinkDel(l) 156 if err != nil { 157 return fmt.Errorf("error deleting vxlan interface with id %d: %v", vni, err) 158 } 159 return nil 160 } 161 } 162 163 return fmt.Errorf("could not find a vxlan interface to delete with id %d", vni) 164 }