github.com/rawahars/moby@v24.0.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 "syscall" 9 10 "github.com/docker/docker/libnetwork/drivers/overlay/overlayutils" 11 "github.com/docker/docker/libnetwork/netutils" 12 "github.com/docker/docker/libnetwork/ns" 13 "github.com/sirupsen/logrus" 14 "github.com/vishvananda/netlink" 15 "github.com/vishvananda/netns" 16 ) 17 18 var soTimeout = ns.NetlinkSocketsTimeout 19 20 func validateID(nid, eid string) error { 21 if nid == "" { 22 return fmt.Errorf("invalid network id") 23 } 24 25 if eid == "" { 26 return fmt.Errorf("invalid endpoint id") 27 } 28 29 return nil 30 } 31 32 func createVethPair() (string, string, error) { 33 nlh := ns.NlHandle() 34 35 // Generate a name for what will be the host side pipe interface 36 name1, err := netutils.GenerateIfaceName(nlh, vethPrefix, vethLen) 37 if err != nil { 38 return "", "", fmt.Errorf("error generating veth name1: %v", err) 39 } 40 41 // Generate a name for what will be the sandbox side pipe interface 42 name2, err := netutils.GenerateIfaceName(nlh, vethPrefix, vethLen) 43 if err != nil { 44 return "", "", fmt.Errorf("error generating veth name2: %v", err) 45 } 46 47 // Generate and add the interface pipe host <-> sandbox 48 veth := &netlink.Veth{ 49 LinkAttrs: netlink.LinkAttrs{Name: name1, TxQLen: 0}, 50 PeerName: name2} 51 if err := nlh.LinkAdd(veth); err != nil { 52 return "", "", fmt.Errorf("error creating veth pair: %v", err) 53 } 54 55 return name1, name2, nil 56 } 57 58 func createVxlan(name string, vni uint32, mtu int) error { 59 vxlan := &netlink.Vxlan{ 60 LinkAttrs: netlink.LinkAttrs{Name: name, MTU: mtu}, 61 VxlanId: int(vni), 62 Learning: true, 63 Port: int(overlayutils.VXLANUDPPort()), 64 Proxy: true, 65 L3miss: true, 66 L2miss: true, 67 } 68 69 if err := ns.NlHandle().LinkAdd(vxlan); err != nil { 70 return fmt.Errorf("error creating vxlan interface: %v", err) 71 } 72 73 return nil 74 } 75 76 func deleteInterface(name string) error { 77 link, err := ns.NlHandle().LinkByName(name) 78 if err != nil { 79 return fmt.Errorf("failed to find interface with name %s: %v", name, err) 80 } 81 82 if err := ns.NlHandle().LinkDel(link); err != nil { 83 return fmt.Errorf("error deleting interface with name %s: %v", name, err) 84 } 85 86 return nil 87 } 88 89 func deleteVxlanByVNI(path string, vni uint32) error { 90 nlh := ns.NlHandle() 91 if path != "" { 92 ns, err := netns.GetFromPath(path) 93 if err != nil { 94 return fmt.Errorf("failed to get ns handle for %s: %v", path, err) 95 } 96 defer ns.Close() 97 98 nlh, err = netlink.NewHandleAt(ns, syscall.NETLINK_ROUTE) 99 if err != nil { 100 return fmt.Errorf("failed to get netlink handle for ns %s: %v", path, err) 101 } 102 defer nlh.Close() 103 err = nlh.SetSocketTimeout(soTimeout) 104 if err != nil { 105 logrus.Warnf("Failed to set the timeout on the netlink handle sockets for vxlan deletion: %v", err) 106 } 107 } 108 109 links, err := nlh.LinkList() 110 if err != nil { 111 return fmt.Errorf("failed to list interfaces while deleting vxlan interface by vni: %v", err) 112 } 113 114 for _, l := range links { 115 if l.Type() == "vxlan" && (vni == 0 || l.(*netlink.Vxlan).VxlanId == int(vni)) { 116 err = nlh.LinkDel(l) 117 if err != nil { 118 return fmt.Errorf("error deleting vxlan interface with id %d: %v", vni, err) 119 } 120 return nil 121 } 122 } 123 124 return fmt.Errorf("could not find a vxlan interface to delete with id %d", vni) 125 }