Skip to content

Commit 3672fcd

Browse files
MAC address assignment improvements
1 parent 56a39e6 commit 3672fcd

File tree

16 files changed

+79
-29
lines changed

16 files changed

+79
-29
lines changed

api/src/main/java/com/cloud/network/NetworkModel.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ public interface NetworkModel {
125125
*/
126126
String getNextAvailableMacAddressInNetwork(long networkConfigurationId) throws InsufficientAddressCapacityException;
127127

128+
default boolean isMACUnique(String mac, long networkId) {
129+
return true;
130+
}
131+
128132
PublicIpAddress getPublicIpAddress(long ipAddressId);
129133

130134
List<? extends Vlan> listPodVlans(long podId);
@@ -362,4 +366,8 @@ List<String[]> generateVmData(String userData, String userDataDetails, String se
362366

363367
boolean checkSecurityGroupSupportForNetwork(Account account, DataCenter zone, List<Long> networkIds,
364368
List<Long> securityGroupsIds);
369+
370+
default long getMacIdentifier(Long dataCenterId) {
371+
return 0;
372+
}
365373
}

engine/components-api/src/main/java/com/cloud/network/addr/PublicIp.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ public PublicIp(IPAddressVO addr, VlanVO vlan, long macAddress) {
4040
}
4141

4242
public static PublicIp createFromAddrAndVlan(IPAddressVO addr, VlanVO vlan) {
43-
return new PublicIp(addr, vlan, NetUtils.createSequenceBasedMacAddress(addr.getMacAddress(), NetworkModel.MACIdentifier.value()));
43+
long macIdentifier = NetworkModel.MACIdentifier.valueIn(addr.getDataCenterId());
44+
if (macIdentifier == 0) {
45+
macIdentifier = addr.getDataCenterId();
46+
}
47+
return new PublicIp(addr, vlan, NetUtils.createSequenceBasedMacAddress(addr.getMacAddress(), macIdentifier));
4448
}
4549

4650
@Override
@@ -274,6 +278,4 @@ public void setRuleState(State ruleState) {
274278
public boolean isForSystemVms() {
275279
return false;
276280
}
277-
278-
279281
}

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1270,7 +1270,7 @@ protected void configureNicProfileBasedOnRequestedIp(NicProfile requestedNicProf
12701270
nicProfile.setIPv4Gateway(ipv4Gateway);
12711271
nicProfile.setIPv4Netmask(ipv4Netmask);
12721272

1273-
if (nicProfile.getMacAddress() == null) {
1273+
if (nicProfile.getMacAddress() == null || !_networkModel.isMACUnique(nicProfile.getMacAddress(), network.getId())) {
12741274
try {
12751275
String macAddress = _networkModel.getNextAvailableMacAddressInNetwork(network.getId());
12761276
nicProfile.setMacAddress(macAddress);

engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -432,8 +432,8 @@ public List<NetworkVO> getAllPersistentNetworksFromZone(long dataCenterId) {
432432
public String getNextAvailableMacAddress(final long networkConfigId, Integer zoneMacIdentifier) {
433433
final SequenceFetcher fetch = SequenceFetcher.getInstance();
434434
long seq = fetch.getNextSequence(Long.class, _tgMacAddress, networkConfigId);
435-
if(zoneMacIdentifier != null && zoneMacIdentifier.intValue() != 0 ){
436-
seq = seq | _prefix << 40 | (long)zoneMacIdentifier << 32 | networkConfigId << 16 & 0x00000000ffff0000l;
435+
if (zoneMacIdentifier != null && zoneMacIdentifier != 0 ) {
436+
seq = seq | _prefix << 40 | (long)zoneMacIdentifier << 32 | networkConfigId << 16 & 0x00000000ffff0000L;
437437
}
438438
return NetUtils.long2Mac(seq);
439439
}

engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public interface NicDao extends GenericDao<NicVO, Long> {
9191

9292
List<NicVO> listByVmIdAndKeyword(long instanceId, String keyword);
9393

94-
NicVO findByMacAddress(String macAddress);
94+
NicVO findByMacAddress(String macAddress, long networkId);
9595

9696
NicVO findByNetworkIdAndMacAddressIncludingRemoved(long networkId, String mac);
9797

engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,9 +400,10 @@ public List<NicVO> listByVmIdAndKeyword(long instanceId, String keyword) {
400400
}
401401

402402
@Override
403-
public NicVO findByMacAddress(String macAddress) {
403+
public NicVO findByMacAddress(String macAddress, long networkId) {
404404
SearchCriteria<NicVO> sc = AllFieldsSearch.create();
405405
sc.setParameters("macAddress", macAddress);
406+
sc.setParameters("networkId", networkId);
406407
return findOneBy(sc);
407408
}
408409

server/src/main/java/com/cloud/network/IpAddressManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2372,7 +2372,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) throws Insuff
23722372

23732373
nic.setBroadcastUri(network.getBroadcastUri());
23742374
nic.setFormat(AddressFormat.Ip4);
2375-
if(nic.getMacAddress() == null) {
2375+
if (nic.getMacAddress() == null || !_networkModel.isMACUnique(nic.getMacAddress(), network.getId())) {
23762376
nic.setMacAddress(_networkModel.getNextAvailableMacAddressInNetwork(network.getId()));
23772377
}
23782378
}

server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ private void setNicPropertiesFromNetwork(NicProfile nic, Network network) throws
241241
if (nic.getBroadCastUri() == null) {
242242
nic.setBroadcastUri(network.getBroadcastUri());
243243
}
244-
if (nic.getMacAddress() == null) {
244+
if (nic.getMacAddress() == null || !_networkModel.isMACUnique(nic.getMacAddress(), network.getId())) {
245245
nic.setMacAddress(_networkModel.getNextAvailableMacAddressInNetwork(network.getId()));
246246
}
247247
}

server/src/main/java/com/cloud/network/NetworkModelImpl.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -593,22 +593,23 @@ public List<? extends Nic> getNics(long vmId) {
593593
@Override
594594
public String getNextAvailableMacAddressInNetwork(long networkId) throws InsufficientAddressCapacityException {
595595
NetworkVO network = _networksDao.findById(networkId);
596-
Integer zoneIdentifier = MACIdentifier.value();
597-
if (zoneIdentifier.intValue() == 0) {
598-
zoneIdentifier = Long.valueOf(network.getDataCenterId()).intValue();
596+
if (network == null) {
597+
throw new CloudRuntimeException("Could not find network with id " + networkId);
599598
}
599+
600+
Integer zoneMacIdentifier = Long.valueOf(getMacIdentifier(network.getDataCenterId())).intValue();
600601
String mac;
601602
do {
602-
mac = _networksDao.getNextAvailableMacAddress(networkId, zoneIdentifier);
603+
mac = _networksDao.getNextAvailableMacAddress(networkId, zoneMacIdentifier);
603604
if (mac == null) {
604605
throw new InsufficientAddressCapacityException("Unable to create another mac address", Network.class, networkId);
605606
}
606-
} while(! isMACUnique(mac));
607+
} while(! isMACUnique(mac, networkId));
607608
return mac;
608609
}
609610

610-
private boolean isMACUnique(String mac) {
611-
return (_nicDao.findByMacAddress(mac) == null);
611+
public boolean isMACUnique(String mac, long networkId) {
612+
return (_nicDao.findByMacAddress(mac, networkId) == null);
612613
}
613614

614615
@Override
@@ -2815,4 +2816,18 @@ public boolean checkSecurityGroupSupportForNetwork(Account account, DataCenter z
28152816
}
28162817
return false;
28172818
}
2819+
2820+
@Override
2821+
public long getMacIdentifier(Long dataCenterId) {
2822+
long macAddress = 0;
2823+
if (dataCenterId == null) {
2824+
macAddress = NetworkModel.MACIdentifier.value();
2825+
} else {
2826+
macAddress = NetworkModel.MACIdentifier.valueIn(dataCenterId);
2827+
if (macAddress == 0) {
2828+
macAddress = dataCenterId;
2829+
}
2830+
}
2831+
return macAddress;
2832+
}
28182833
}

server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ public NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfil
293293
allocateDirectIp(nic, network, vm, dc, nic.getRequestedIPv4(), nic.getRequestedIPv6());
294294
nic.setReservationStrategy(ReservationStrategy.Create);
295295

296-
if (nic.getMacAddress() == null) {
296+
if (nic.getMacAddress() == null || !_networkModel.isMACUnique(nic.getMacAddress(), network.getId())) {
297297
nic.setMacAddress(_networkModel.getNextAvailableMacAddressInNetwork(network.getId()));
298298
if (nic.getMacAddress() == null) {
299299
throw new InsufficientAddressCapacityException("Unable to allocate more mac addresses", Network.class, network.getId());

0 commit comments

Comments
 (0)