|
30 | 30 |
|
31 | 31 | // SetAllocatedIpMap - set allocated ip map for networks
|
32 | 32 | func SetAllocatedIpMap() error {
|
| 33 | + if !servercfg.CacheEnabled() { |
| 34 | + return nil |
| 35 | + } |
33 | 36 | logger.Log(0, "start setting up allocated ip map")
|
34 | 37 | if allocatedIpMap == nil {
|
35 | 38 | allocatedIpMap = map[string]map[string]net.IP{}
|
@@ -84,30 +87,46 @@ func SetAllocatedIpMap() error {
|
84 | 87 |
|
85 | 88 | // ClearAllocatedIpMap - set allocatedIpMap to nil
|
86 | 89 | func ClearAllocatedIpMap() {
|
| 90 | + if !servercfg.CacheEnabled() { |
| 91 | + return |
| 92 | + } |
87 | 93 | allocatedIpMap = nil
|
88 | 94 | }
|
89 | 95 |
|
90 | 96 | func AddIpToAllocatedIpMap(networkName string, ip net.IP) {
|
| 97 | + if !servercfg.CacheEnabled() { |
| 98 | + return |
| 99 | + } |
91 | 100 | networkCacheMutex.Lock()
|
92 | 101 | allocatedIpMap[networkName][ip.String()] = ip
|
93 | 102 | networkCacheMutex.Unlock()
|
94 | 103 | }
|
95 | 104 |
|
96 | 105 | func RemoveIpFromAllocatedIpMap(networkName string, ip string) {
|
| 106 | + if !servercfg.CacheEnabled() { |
| 107 | + return |
| 108 | + } |
97 | 109 | networkCacheMutex.Lock()
|
98 | 110 | delete(allocatedIpMap[networkName], ip)
|
99 | 111 | networkCacheMutex.Unlock()
|
100 | 112 | }
|
101 | 113 |
|
102 | 114 | // AddNetworkToAllocatedIpMap - add network to allocated ip map when network is added
|
103 | 115 | func AddNetworkToAllocatedIpMap(networkName string) {
|
| 116 | + //add new network to allocated ip map |
| 117 | + if !servercfg.CacheEnabled() { |
| 118 | + return |
| 119 | + } |
104 | 120 | networkCacheMutex.Lock()
|
105 | 121 | allocatedIpMap[networkName] = make(map[string]net.IP)
|
106 | 122 | networkCacheMutex.Unlock()
|
107 | 123 | }
|
108 | 124 |
|
109 | 125 | // RemoveNetworkFromAllocatedIpMap - remove network from allocated ip map when network is deleted
|
110 | 126 | func RemoveNetworkFromAllocatedIpMap(networkName string) {
|
| 127 | + if !servercfg.CacheEnabled() { |
| 128 | + return |
| 129 | + } |
111 | 130 | networkCacheMutex.Lock()
|
112 | 131 | delete(allocatedIpMap, networkName)
|
113 | 132 | networkCacheMutex.Unlock()
|
@@ -354,7 +373,7 @@ func GetNetworkSettings(networkname string) (models.Network, error) {
|
354 | 373 | }
|
355 | 374 |
|
356 | 375 | // UniqueAddress - get a unique ipv4 address
|
357 |
| -func UniqueAddress(networkName string, reverse bool) (net.IP, error) { |
| 376 | +func UniqueAddressCache(networkName string, reverse bool) (net.IP, error) { |
358 | 377 | add := net.IP{}
|
359 | 378 | var network models.Network
|
360 | 379 | network, err := GetParentNetwork(networkName)
|
@@ -396,6 +415,49 @@ func UniqueAddress(networkName string, reverse bool) (net.IP, error) {
|
396 | 415 | return add, errors.New("ERROR: No unique addresses available. Check network subnet")
|
397 | 416 | }
|
398 | 417 |
|
| 418 | +// UniqueAddress - get a unique ipv4 address |
| 419 | +func UniqueAddressDB(networkName string, reverse bool) (net.IP, error) { |
| 420 | + add := net.IP{} |
| 421 | + var network models.Network |
| 422 | + network, err := GetParentNetwork(networkName) |
| 423 | + if err != nil { |
| 424 | + logger.Log(0, "UniqueAddressServer encountered an error") |
| 425 | + return add, err |
| 426 | + } |
| 427 | + |
| 428 | + if network.IsIPv4 == "no" { |
| 429 | + return add, fmt.Errorf("IPv4 not active on network " + networkName) |
| 430 | + } |
| 431 | + //ensure AddressRange is valid |
| 432 | + if _, _, err := net.ParseCIDR(network.AddressRange); err != nil { |
| 433 | + logger.Log(0, "UniqueAddress encountered an error") |
| 434 | + return add, err |
| 435 | + } |
| 436 | + net4 := iplib.Net4FromStr(network.AddressRange) |
| 437 | + newAddrs := net4.FirstAddress() |
| 438 | + |
| 439 | + if reverse { |
| 440 | + newAddrs = net4.LastAddress() |
| 441 | + } |
| 442 | + |
| 443 | + for { |
| 444 | + if IsIPUnique(networkName, newAddrs.String(), database.NODES_TABLE_NAME, false) && |
| 445 | + IsIPUnique(networkName, newAddrs.String(), database.EXT_CLIENT_TABLE_NAME, false) { |
| 446 | + return newAddrs, nil |
| 447 | + } |
| 448 | + if reverse { |
| 449 | + newAddrs, err = net4.PreviousIP(newAddrs) |
| 450 | + } else { |
| 451 | + newAddrs, err = net4.NextIP(newAddrs) |
| 452 | + } |
| 453 | + if err != nil { |
| 454 | + break |
| 455 | + } |
| 456 | + } |
| 457 | + |
| 458 | + return add, errors.New("ERROR: No unique addresses available. Check network subnet") |
| 459 | +} |
| 460 | + |
399 | 461 | // IsIPUnique - checks if an IP is unique
|
400 | 462 | func IsIPUnique(network string, ip string, tableName string, isIpv6 bool) bool {
|
401 | 463 |
|
@@ -439,9 +501,67 @@ func IsIPUnique(network string, ip string, tableName string, isIpv6 bool) bool {
|
439 | 501 |
|
440 | 502 | return isunique
|
441 | 503 | }
|
| 504 | +func UniqueAddress(networkName string, reverse bool) (net.IP, error) { |
| 505 | + if servercfg.CacheEnabled() { |
| 506 | + return UniqueAddressCache(networkName, reverse) |
| 507 | + } |
| 508 | + return UniqueAddressDB(networkName, reverse) |
| 509 | +} |
442 | 510 |
|
443 |
| -// UniqueAddress6 - see if ipv6 address is unique |
444 | 511 | func UniqueAddress6(networkName string, reverse bool) (net.IP, error) {
|
| 512 | + if servercfg.CacheEnabled() { |
| 513 | + return UniqueAddress6Cache(networkName, reverse) |
| 514 | + } |
| 515 | + return UniqueAddress6DB(networkName, reverse) |
| 516 | +} |
| 517 | + |
| 518 | +// UniqueAddress6DB - see if ipv6 address is unique |
| 519 | +func UniqueAddress6DB(networkName string, reverse bool) (net.IP, error) { |
| 520 | + add := net.IP{} |
| 521 | + var network models.Network |
| 522 | + network, err := GetParentNetwork(networkName) |
| 523 | + if err != nil { |
| 524 | + fmt.Println("Network Not Found") |
| 525 | + return add, err |
| 526 | + } |
| 527 | + if network.IsIPv6 == "no" { |
| 528 | + return add, fmt.Errorf("IPv6 not active on network " + networkName) |
| 529 | + } |
| 530 | + |
| 531 | + //ensure AddressRange is valid |
| 532 | + if _, _, err := net.ParseCIDR(network.AddressRange6); err != nil { |
| 533 | + return add, err |
| 534 | + } |
| 535 | + net6 := iplib.Net6FromStr(network.AddressRange6) |
| 536 | + |
| 537 | + newAddrs, err := net6.NextIP(net6.FirstAddress()) |
| 538 | + if reverse { |
| 539 | + newAddrs, err = net6.PreviousIP(net6.LastAddress()) |
| 540 | + } |
| 541 | + if err != nil { |
| 542 | + return add, err |
| 543 | + } |
| 544 | + |
| 545 | + for { |
| 546 | + if IsIPUnique(networkName, newAddrs.String(), database.NODES_TABLE_NAME, true) && |
| 547 | + IsIPUnique(networkName, newAddrs.String(), database.EXT_CLIENT_TABLE_NAME, true) { |
| 548 | + return newAddrs, nil |
| 549 | + } |
| 550 | + if reverse { |
| 551 | + newAddrs, err = net6.PreviousIP(newAddrs) |
| 552 | + } else { |
| 553 | + newAddrs, err = net6.NextIP(newAddrs) |
| 554 | + } |
| 555 | + if err != nil { |
| 556 | + break |
| 557 | + } |
| 558 | + } |
| 559 | + |
| 560 | + return add, errors.New("ERROR: No unique IPv6 addresses available. Check network subnet") |
| 561 | +} |
| 562 | + |
| 563 | +// UniqueAddress6Cache - see if ipv6 address is unique using cache |
| 564 | +func UniqueAddress6Cache(networkName string, reverse bool) (net.IP, error) { |
445 | 565 | add := net.IP{}
|
446 | 566 | var network models.Network
|
447 | 567 | network, err := GetParentNetwork(networkName)
|
|
0 commit comments