github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/libnetwork/drivers/overlay/ov_utils.go (about)

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