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  }