github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/libnetwork/drivers/overlay/ov_utils.go (about) 1 //go:build linux 2 3 package overlay 4 5 import ( 6 "context" 7 "fmt" 8 "syscall" 9 10 "github.com/containerd/log" 11 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/drivers/overlay/overlayutils" 12 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/netutils" 13 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/ns" 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 } 52 if err := nlh.LinkAdd(veth); err != nil { 53 return "", "", fmt.Errorf("error creating veth pair: %v", err) 54 } 55 56 return name1, name2, nil 57 } 58 59 func createVxlan(name string, vni uint32, mtu int) error { 60 vxlan := &netlink.Vxlan{ 61 LinkAttrs: netlink.LinkAttrs{Name: name, MTU: mtu}, 62 VxlanId: int(vni), 63 Learning: true, 64 Port: int(overlayutils.VXLANUDPPort()), 65 Proxy: true, 66 L3miss: true, 67 L2miss: true, 68 } 69 70 if err := ns.NlHandle().LinkAdd(vxlan); err != nil { 71 return fmt.Errorf("error creating vxlan interface: %v", err) 72 } 73 74 return nil 75 } 76 77 func deleteInterface(name string) error { 78 link, err := ns.NlHandle().LinkByName(name) 79 if err != nil { 80 return fmt.Errorf("failed to find interface with name %s: %v", name, err) 81 } 82 83 if err := ns.NlHandle().LinkDel(link); err != nil { 84 return fmt.Errorf("error deleting interface with name %s: %v", name, err) 85 } 86 87 return nil 88 } 89 90 func deleteVxlanByVNI(path string, vni uint32) error { 91 nlh := ns.NlHandle() 92 if path != "" { 93 ns, err := netns.GetFromPath(path) 94 if err != nil { 95 return fmt.Errorf("failed to get ns handle for %s: %v", path, err) 96 } 97 defer ns.Close() 98 99 nlh, err = netlink.NewHandleAt(ns, syscall.NETLINK_ROUTE) 100 if err != nil { 101 return fmt.Errorf("failed to get netlink handle for ns %s: %v", path, err) 102 } 103 defer nlh.Close() 104 err = nlh.SetSocketTimeout(soTimeout) 105 if err != nil { 106 log.G(context.TODO()).Warnf("Failed to set the timeout on the netlink handle sockets for vxlan deletion: %v", err) 107 } 108 } 109 110 links, err := nlh.LinkList() 111 if err != nil { 112 return fmt.Errorf("failed to list interfaces while deleting vxlan interface by vni: %v", err) 113 } 114 115 for _, l := range links { 116 if l.Type() == "vxlan" && (vni == 0 || l.(*netlink.Vxlan).VxlanId == int(vni)) { 117 err = nlh.LinkDel(l) 118 if err != nil { 119 return fmt.Errorf("error deleting vxlan interface with id %d: %v", vni, err) 120 } 121 return nil 122 } 123 } 124 125 return fmt.Errorf("could not find a vxlan interface to delete with id %d", vni) 126 }