44 "encoding/json"
55 "fmt"
66 "math/big"
7+ "net"
78 "os"
89 "time"
910
@@ -25,11 +26,15 @@ const (
2526 defaultWaitInterval = 5 * time .Second
2627
2728 reservedVIPCount = 12
28- reservedVIPCountForVlan int64 = 7
29+ reservedVIPCountForVlan int64 = 7 //reserve 1/7 ip for hostnic br
2930
3031 TunnelTypeVlan = "vlan"
3132)
3233
34+ var (
35+ customReservedIPCount int64 = 0
36+ )
37+
3338type Options struct {
3439 Tag string
3540}
@@ -468,9 +473,19 @@ func (q *qingcloudAPIWrapper) getVxNets(ids []string, public bool) ([]*rpc.VxNet
468473 vxnetItem .TunnelType = * qcVxNet .TunnelType
469474 }
470475 if vxnetItem .TunnelType == TunnelTypeVlan {
471- vxnetItem .IPEnd = getIPEndAfterReservedForVlan (* qcVxNet .Router .DYNIPStart , * qcVxNet .Router .DYNIPEnd , reservedVIPCountForVlan )
476+ // parse ip_network to get mask; if mask is 24, reserve more ip than specifc in config
477+ _ , ipNet , err := net .ParseCIDR (vxnetItem .Network )
478+ if err != nil {
479+ log .Errorf ("parse ip_network to get mask error: %v" , err )
480+ }
481+ maskLength , _ := ipNet .Mask .Size ()
482+ if maskLength == 24 {
483+ log .Infof ("vxnet %s ip network %s mask is 24, reserve another 64 ip" , * qcVxNet .VxNetID , vxnetItem .Network )
484+ customReservedIPCount = 64
485+ }
486+ vxnetItem .IPEnd = getIPEndAfterReservedForVlan (* qcVxNet .Router .DYNIPStart , * qcVxNet .Router .DYNIPEnd , reservedVIPCountForVlan , customReservedIPCount )
472487 } else {
473- vxnetItem .IPEnd = getIPEndAfterReserved (* qcVxNet .Router .DYNIPEnd , reservedVIPCount )
488+ vxnetItem .IPEnd = getIPEndAfterReserved (* qcVxNet .Router .DYNIPEnd , reservedVIPCount , customReservedIPCount )
474489 }
475490 } else {
476491 return nil , fmt .Errorf ("vxnet %s should bind to vpc" , * qcVxNet .VxNetID )
@@ -746,15 +761,15 @@ func IPRangeCount(from, to string) int {
746761 return int (big .NewInt (0 ).Sub (endInt , startInt ).Int64 () + 1 )
747762}
748763
749- func getIPEndAfterReserved (end string , reservedCount int64 ) string {
764+ func getIPEndAfterReserved (end string , reservedCount , customReservedCount int64 ) string {
750765 e := cnet .ParseIP (end )
751- i := big .NewInt (0 ).Sub (cnet .IPToBigInt (* e ), big .NewInt (reservedCount ))
766+ i := big .NewInt (0 ).Sub (cnet .IPToBigInt (* e ), big .NewInt (reservedCount + customReservedCount ))
752767 return cnet .BigIntToIP (i ).String ()
753768}
754769
755- func getIPEndAfterReservedForVlan (start , end string , reservedCount int64 ) string {
770+ func getIPEndAfterReservedForVlan (start , end string , reservedCount , customReservedCount int64 ) string {
756771 s := cnet .ParseIP (start )
757772 e := cnet .ParseIP (end )
758- i := big .NewInt (0 ).Sub (cnet .IPToBigInt (* e ), big .NewInt ((cnet .IPToBigInt (* e ).Int64 ()- cnet .IPToBigInt (* s ).Int64 ()+ 1 )/ reservedCount ))
773+ i := big .NewInt (0 ).Sub (cnet .IPToBigInt (* e ), big .NewInt ((cnet .IPToBigInt (* e ).Int64 ()- cnet .IPToBigInt (* s ).Int64 ()+ 1 )/ reservedCount + customReservedCount ))
759774 return cnet .BigIntToIP (i ).String ()
760775}
0 commit comments