github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/libnetwork/drivers/overlay/ov_endpoint.go (about) 1 //go:build linux 2 3 package overlay 4 5 import ( 6 "context" 7 "fmt" 8 "net" 9 10 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/driverapi" 11 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/netutils" 12 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/ns" 13 "github.com/containerd/log" 14 ) 15 16 type endpointTable map[string]*endpoint 17 18 type endpoint struct { 19 id string 20 nid string 21 ifName string 22 mac net.HardwareAddr 23 addr *net.IPNet 24 } 25 26 func (n *network) endpoint(eid string) *endpoint { 27 n.Lock() 28 defer n.Unlock() 29 30 return n.endpoints[eid] 31 } 32 33 func (n *network) addEndpoint(ep *endpoint) { 34 n.Lock() 35 n.endpoints[ep.id] = ep 36 n.Unlock() 37 } 38 39 func (n *network) deleteEndpoint(eid string) { 40 n.Lock() 41 delete(n.endpoints, eid) 42 n.Unlock() 43 } 44 45 func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, epOptions map[string]interface{}) error { 46 var err error 47 if err = validateID(nid, eid); err != nil { 48 return err 49 } 50 51 // Since we perform lazy configuration make sure we try 52 // configuring the driver when we enter CreateEndpoint since 53 // CreateNetwork may not be called in every node. 54 if err := d.configure(); err != nil { 55 return err 56 } 57 58 n := d.network(nid) 59 if n == nil { 60 return fmt.Errorf("network id %q not found", nid) 61 } 62 63 ep := &endpoint{ 64 id: eid, 65 nid: n.id, 66 addr: ifInfo.Address(), 67 mac: ifInfo.MacAddress(), 68 } 69 if ep.addr == nil { 70 return fmt.Errorf("create endpoint was not passed interface IP address") 71 } 72 73 if s := n.getSubnetforIP(ep.addr); s == nil { 74 return fmt.Errorf("no matching subnet for IP %q in network %q", ep.addr, nid) 75 } 76 77 if ep.mac == nil { 78 ep.mac = netutils.GenerateMACFromIP(ep.addr.IP) 79 if err := ifInfo.SetMacAddress(ep.mac); err != nil { 80 return err 81 } 82 } 83 84 n.addEndpoint(ep) 85 86 return nil 87 } 88 89 func (d *driver) DeleteEndpoint(nid, eid string) error { 90 nlh := ns.NlHandle() 91 92 if err := validateID(nid, eid); err != nil { 93 return err 94 } 95 96 n := d.network(nid) 97 if n == nil { 98 return fmt.Errorf("network id %q not found", nid) 99 } 100 101 ep := n.endpoint(eid) 102 if ep == nil { 103 return fmt.Errorf("endpoint id %q not found", eid) 104 } 105 106 n.deleteEndpoint(eid) 107 108 if ep.ifName == "" { 109 return nil 110 } 111 112 link, err := nlh.LinkByName(ep.ifName) 113 if err != nil { 114 log.G(context.TODO()).Debugf("Failed to retrieve interface (%s)'s link on endpoint (%s) delete: %v", ep.ifName, ep.id, err) 115 return nil 116 } 117 if err := nlh.LinkDel(link); err != nil { 118 log.G(context.TODO()).Debugf("Failed to delete interface (%s)'s link on endpoint (%s) delete: %v", ep.ifName, ep.id, err) 119 } 120 121 return nil 122 } 123 124 func (d *driver) EndpointOperInfo(nid, eid string) (map[string]interface{}, error) { 125 return make(map[string]interface{}), nil 126 }