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  }