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 }