func (d *driver) checkEncryption(nid string, rIP net.IP, vxlanID uint32, isLocal, add bool) error { log.Debugf("checkEncryption(%s, %v, %d, %t)", nid[0:7], rIP, vxlanID, isLocal) n := d.network(nid) if n == nil || !n.secure { return nil } if len(d.keys) == 0 { return types.ForbiddenErrorf("encryption key is not present") } lIP := types.GetMinimalIP(net.ParseIP(d.bindAddress)) nodes := map[string]net.IP{} switch { case isLocal: if err := d.peerDbNetworkWalk(nid, func(pKey *peerKey, pEntry *peerEntry) bool { if !lIP.Equal(pEntry.vtep) { nodes[pEntry.vtep.String()] = types.GetMinimalIP(pEntry.vtep) } return false }); err != nil { log.Warnf("Failed to retrieve list of participating nodes in overlay network %s: %v", nid[0:5], err) } default: if len(d.network(nid).endpoints) > 0 { nodes[rIP.String()] = types.GetMinimalIP(rIP) } } log.Debugf("List of nodes: %s", nodes) if add { for _, rIP := range nodes { if err := setupEncryption(lIP, rIP, vxlanID, d.secMap, d.keys); err != nil { log.Warnf("Failed to program network encryption between %s and %s: %v", lIP, rIP, err) } } } else { if len(nodes) == 0 { if err := removeEncryption(lIP, rIP, d.secMap); err != nil { log.Warnf("Failed to remove network encryption between %s and %s: %v", lIP, rIP, err) } } } return nil }
func (a *Allocator) getAddress(nw *net.IPNet, bitmask *bitseq.Handle, prefAddress net.IP, ipr *AddressRange) (net.IP, error) { var ( ordinal uint64 err error base *net.IPNet ) base = types.GetIPNetCopy(nw) if bitmask.Unselected() <= 0 { return nil, ipamapi.ErrNoAvailableIPs } if ipr == nil && prefAddress == nil { ordinal, err = bitmask.SetAny() } else if prefAddress != nil { hostPart, e := types.GetHostPartIP(prefAddress, base.Mask) if e != nil { return nil, fmt.Errorf("failed to allocate preferred address %s: %v", prefAddress.String(), e) } ordinal = ipToUint64(types.GetMinimalIP(hostPart)) err = bitmask.Set(ordinal) } else { base.IP = ipr.Sub.IP ordinal, err = bitmask.SetAnyInRange(ipr.Start, ipr.End) } if err != nil { return nil, ipamapi.ErrNoAvailableIPs } // Convert IP ordinal for this subnet into IP address return generateAddress(ordinal, base), nil }
func (a *Allocator) getAddress(subnet *net.IPNet, bitmask *bitseq.Handle, prefAddress net.IP, ver ipVersion) (net.IP, error) { var ( ordinal uint32 err error ) if bitmask.Unselected() <= 0 { return nil, ErrNoAvailableIPs } if prefAddress == nil { ordinal, err = bitmask.SetAny() } else { hostPart, e := types.GetHostPartIP(prefAddress, subnet.Mask) if e != nil { return nil, fmt.Errorf("failed to allocate preferred address %s: %v", prefAddress.String(), e) } ordinal = ipToUint32(types.GetMinimalIP(hostPart)) err = bitmask.Set(ordinal) } if err != nil { return nil, ErrNoAvailableIPs } // Convert IP ordinal for this subnet into IP address return generateAddress(ordinal, subnet), nil }
// Convert an ordinal to the respective IP address func ipToUint64(ip []byte) (value uint64) { cip := types.GetMinimalIP(ip) for i := 0; i < len(cip); i++ { j := len(cip) - 1 - i value += uint64(cip[i]) << uint(j*8) } return value }
func getAddressRange(pool string) (*AddressRange, error) { ip, nw, err := net.ParseCIDR(pool) if err != nil { return nil, ipamapi.ErrInvalidSubPool } lIP, e := types.GetHostPartIP(nw.IP, nw.Mask) if e != nil { return nil, fmt.Errorf("failed to compute range's lowest ip address: %v", e) } bIP, e := types.GetBroadcastIP(nw.IP, nw.Mask) if e != nil { return nil, fmt.Errorf("failed to compute range's broadcast ip address: %v", e) } hIP, e := types.GetHostPartIP(bIP, nw.Mask) if e != nil { return nil, fmt.Errorf("failed to compute range's highest ip address: %v", e) } nw.IP = ip return &AddressRange{nw, ipToUint64(types.GetMinimalIP(lIP)), ipToUint64(types.GetMinimalIP(hIP))}, nil }
func (a *Allocator) getAddress(nw *net.IPNet, bitmask *bitseq.Handle, prefAddress net.IP, ipr *AddressRange) (net.IP, error) { var ( ordinal uint64 err error base *net.IPNet ) base = types.GetIPNetCopy(nw) if bitmask.Unselected() <= 0 { return nil, ipamapi.ErrNoAvailableIPs } if ipr == nil && prefAddress == nil { ordinal, err = bitmask.SetAny() } else if prefAddress != nil { hostPart, e := types.GetHostPartIP(prefAddress, base.Mask) if e != nil { return nil, types.InternalErrorf("failed to allocate requested address %s: %v", prefAddress.String(), e) } ordinal = ipToUint64(types.GetMinimalIP(hostPart)) err = bitmask.Set(ordinal) } else { ordinal, err = bitmask.SetAnyInRange(ipr.Start, ipr.End) } switch err { case nil: // Convert IP ordinal for this subnet into IP address return generateAddress(ordinal, base), nil case bitseq.ErrBitAllocated: return nil, ipamapi.ErrIPAlreadyAllocated case bitseq.ErrNoBitAvailable: return nil, ipamapi.ErrNoAvailableIPs default: return nil, err } }
// updateKeys allows to add a new key and/or change the primary key and/or prune an existing key // The primary key is the key used in transmission and will go in first position in the list. func (d *driver) updateKeys(newKey, primary, pruneKey *key) error { log.Debugf("Updating Keys. New: %v, Primary: %v, Pruned: %v", newKey, primary, pruneKey) log.Debugf("Current: %v", d.keys) var ( newIdx = -1 priIdx = -1 delIdx = -1 lIP = types.GetMinimalIP(net.ParseIP(d.bindAddress)) ) d.Lock() // add new if newKey != nil { d.keys = append(d.keys, newKey) newIdx += len(d.keys) } for i, k := range d.keys { if primary != nil && k.tag == primary.tag { priIdx = i } if pruneKey != nil && k.tag == pruneKey.tag { delIdx = i } } d.Unlock() if (newKey != nil && newIdx == -1) || (primary != nil && priIdx == -1) || (pruneKey != nil && delIdx == -1) { err := types.BadRequestErrorf("cannot find proper key indices while processing key update:"+ "(newIdx,priIdx,delIdx):(%d, %d, %d)", newIdx, priIdx, delIdx) log.Warn(err) return err } d.secMapWalk(func(rIPs string, spis []*spi) ([]*spi, bool) { rIP := types.GetMinimalIP(net.ParseIP(rIPs)) return updateNodeKey(lIP, rIP, spis, d.keys, newIdx, priIdx, delIdx), false }) d.Lock() // swap primary if priIdx != -1 { swp := d.keys[0] d.keys[0] = d.keys[priIdx] d.keys[priIdx] = swp } // prune if delIdx != -1 { if delIdx == 0 { delIdx = priIdx } d.keys = append(d.keys[:delIdx], d.keys[delIdx+1:]...) } d.Unlock() log.Debugf("Updated: %v", d.keys) return nil }