From 8e67db162aa831e6eca0a3d3a66baa6a1f30e991 Mon Sep 17 00:00:00 2001 From: Jukka Jokiniva Date: Wed, 7 May 2025 09:16:43 +0300 Subject: [PATCH] Use Round Robin in Address Ranges Signed-off-by: Jukka Jokiniva --- include/AddressRange.h | 8 ++++++- include/AddressRangeInternal.h | 9 ++----- share/doc/xsd/vnet_pool.xsd | 3 ++- .../schemas/virtualnetwork/virtualnetwork.go | 1 + src/vnm/AddressRange.cc | 24 ++++++++++++++++++- src/vnm/AddressRangeInternal.cc | 18 +++++++++----- 6 files changed, 47 insertions(+), 16 deletions(-) diff --git a/include/AddressRange.h b/include/AddressRange.h index e98569722f1..5bd2c7dbe0a 100644 --- a/include/AddressRange.h +++ b/include/AddressRange.h @@ -120,6 +120,7 @@ class AddressRange * - IP * - ULA_PREFIX * - GLOBAL_PREFIX + * - NEXT_INDEX* * * The following can be defined to override VNET values: * - BRIDGE @@ -437,7 +438,7 @@ class AddressRange * Base constructor it cannot be called directly but from the * AddressRange factory constructor. */ - AddressRange(unsigned int _id):id(_id) {}; + AddressRange(unsigned int _id):id(_id), next(0) {}; /* ---------------------------------------------------------------------- */ /* Address/AR helper functions to build/parse driver messages */ @@ -557,6 +558,11 @@ class AddressRange */ std::map allocated; + /** + * Lookup index for the next free address lease + */ + unsigned int next; + private: /* ---------------------------------------------------------------------- */ /* String to binary conversion functions for different address types */ diff --git a/include/AddressRangeInternal.h b/include/AddressRangeInternal.h index b1cbac748ca..3fed8f0d93d 100644 --- a/include/AddressRangeInternal.h +++ b/include/AddressRangeInternal.h @@ -26,7 +26,7 @@ class VectorAttribute; class AddressRangeInternal : public AddressRange { public: - AddressRangeInternal(unsigned int _id):AddressRange(_id), next(0) {}; + AddressRangeInternal(unsigned int _id):AddressRange(_id) {}; virtual ~AddressRangeInternal() {}; @@ -90,11 +90,6 @@ class AddressRangeInternal : public AddressRange }; private: - /** - * Lookup index for the next free address lease - */ - unsigned int next; - /** * Get a free lease * @param index of the free lease, undefined if error @@ -110,7 +105,7 @@ class AddressRangeInternal : public AddressRange * @param msg with error description if any * @return 0 on success -1 otherwise */ - int get_range_addr(unsigned int& index, unsigned int sz, std::string& msg) const; + int get_range_addr(unsigned int& index, unsigned int sz, std::string& msg); }; #endif diff --git a/share/doc/xsd/vnet_pool.xsd b/share/doc/xsd/vnet_pool.xsd index 6aba20cdfc8..3287e3e490e 100644 --- a/share/doc/xsd/vnet_pool.xsd +++ b/share/doc/xsd/vnet_pool.xsd @@ -97,6 +97,7 @@ + @@ -112,4 +113,4 @@ - \ No newline at end of file + diff --git a/src/oca/go/src/goca/schemas/virtualnetwork/virtualnetwork.go b/src/oca/go/src/goca/schemas/virtualnetwork/virtualnetwork.go index 079556e5ae3..f28328d107a 100644 --- a/src/oca/go/src/goca/schemas/virtualnetwork/virtualnetwork.go +++ b/src/oca/go/src/goca/schemas/virtualnetwork/virtualnetwork.go @@ -67,6 +67,7 @@ type AR struct { MAC string `xml:"MAC,omitempty"` ParentNetworkARID string `xml:"PARENT_NETWORK_AR_ID,omitempty"` // minOccurs=0 Size int `xml:"SIZE"` + NextIndex int `xml:"NEXT_INDEX,omitempty"` Type string `xml:"TYPE"` ULAPrefix string `xml:"ULA_PREFIX,omitempty"` // minOccurs=0 VNMAD string `xml:"VN_MAD,omitempty"` // minOccurs=0 diff --git a/src/vnm/AddressRange.cc b/src/vnm/AddressRange.cc index 452be4ced2b..386c2bb2895 100644 --- a/src/vnm/AddressRange.cc +++ b/src/vnm/AddressRange.cc @@ -263,6 +263,13 @@ int AddressRange::from_attr(VectorAttribute *vattr, string& error_msg) return -1; } + /* ------------------------- Next Index -------------------------------- */ + + if ( vattr->vector_value("NEXT_INDEX", next) != 0 ) + { + next = 0; + } + /* ------------------------- Security Groups ---------------------------- */ value = vattr->vector_value("SECURITY_GROUPS"); @@ -488,6 +495,8 @@ int AddressRange::update_attributes( vup->replace("SIZE", size); + vup->replace("NEXT_INDEX", next); + string value = vup->vector_value("SECURITY_GROUPS"); security_groups.clear(); @@ -562,6 +571,11 @@ int AddressRange::from_vattr_db(VectorAttribute *vattr) rc += vattr->vector_value("SIZE", size); + if ( vattr->vector_value("NEXT_INDEX", next) != 0 ) + { + next = 0; + } + rc += mac_to_i(vattr->vector_value("MAC"), mac); if (is_ipv4()) @@ -737,6 +751,7 @@ void AddressRange::to_xml(ostringstream &oss) const } oss << "" << get_used_addr() << ""; + oss << "" << next << ""; oss << ""; } @@ -907,7 +922,7 @@ void AddressRange::to_xml(ostringstream &oss, const vector& vms, oss << ""; } - + oss << "" << next << ""; oss << ""; } @@ -1429,6 +1444,8 @@ void AddressRange::allocated_to_attr() } attr->replace("ALLOCATED", oss.str()); + + attr->replace("NEXT_INDEX", next); } /* -------------------------------------------------------------------------- */ @@ -1854,6 +1871,7 @@ const char * AddressRange::SG_RULE_ATTRIBUTES[] = "AR_ID", "TYPE", "SIZE", + "NEXT_INDEX", "MAC", "IP", "IP6" @@ -2005,6 +2023,8 @@ int AddressRange::reserve_addr(int vid, unsigned int rsize, AddressRange *rar) new_ar->replace("SIZE", rsize); + new_ar->replace("NEXT_INDEX", next); + new_ar->remove("IPAM_MAD"); rar->from_vattr(new_ar, errmsg); @@ -2064,6 +2084,8 @@ int AddressRange::reserve_addr_by_index(int vid, unsigned int rsize, new_ar->replace("SIZE", rsize); + new_ar->replace("NEXT_INDEX", next); + new_ar->remove("IPAM_MAD"); rar->from_vattr(new_ar, errmsg); diff --git a/src/vnm/AddressRangeInternal.cc b/src/vnm/AddressRangeInternal.cc index f1d5051efcc..0fca36a8572 100644 --- a/src/vnm/AddressRangeInternal.cc +++ b/src/vnm/AddressRangeInternal.cc @@ -19,38 +19,42 @@ int AddressRangeInternal::get_single_addr(unsigned int& index, std::string& msg) { unsigned int ar_size = get_size(); + unsigned int next_original = next; for ( unsigned int i=0; i= ar_size ) + if ( allocated.count(next) != 0 || i >= ar_size || next >= ar_size ) { valid = false; break; @@ -59,11 +63,13 @@ int AddressRangeInternal::get_range_addr(unsigned int& index, if (valid == true) { - index = i - rsize; + index = next - rsize; + next = next%ar_size; return 0; } } + next = next_original; msg = "There isn't a continuous range big enough"; return -1; }