#include "HandlePort.h"
#include "Exceptions.h"
#include "Trace.h"
#include <iostream>
#include <iomanip>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stropts.h>
using namespace std;
HandlePort::HandlePort(Handle *myHandle, HBA *myHBA, HBAPort *myPort) :
handle(myHandle), hba(myHBA), port(myPort), active(false) {
Trace log("HandlePort::HandlePort");
}
void HandlePort::refresh() {
Trace log("HandlePort::refresh");
lock();
active = false;
unlock();
}
void HandlePort::validate(uint64_t newState) {
Trace log("HandlePort::validate");
log.debug("Port %016llx state %016llx", port->getPortWWN(), newState);
lock();
if (active) {
if (lastState != newState) {
unlock();
throw StaleDataException();
}
} else {
active = true;
lastState = newState;
}
unlock();
}
bool HandlePort::match(uint64_t portWWN) {
Trace log("HandlePort::match(wwn)");
bool ret = false;
ret = (portWWN == port->getPortWWN());
return (ret);
}
bool HandlePort::match(int index) {
Trace log("HandlePort::match(index)");
return (*port == *(hba->getPortByIndex(index)));
}
HBA_PORTATTRIBUTES HandlePort::getDiscoveredAttributes(uint64_t wwn) {
Trace log("HandlePort::getDiscoveredAttributes(wwn)");
uint64_t newState;
HBA_PORTATTRIBUTES attributes = port->getDiscoveredAttributes(
wwn, newState);
return (attributes);
}
HBA_PORTATTRIBUTES HandlePort::getPortAttributes() {
Trace log("HandlePort::getPortAttributes");
uint64_t newState;
HBA_PORTATTRIBUTES attributes = port->getPortAttributes(newState);
validate(newState);
return (attributes);
}
HBA_PORTATTRIBUTES
HandlePort::getDiscoveredAttributes(HBA_UINT32 discoveredport) {
Trace log("HandlePort::getDiscoveredAttributes(index)");
uint64_t newState;
HBA_PORTATTRIBUTES attributes = port->getDiscoveredAttributes(
discoveredport, newState);
validate(newState);
return (attributes);
}
HBA_PORTNPIVATTRIBUTES HandlePort::getPortNPIVAttributes() {
Trace log("HandlePort::getPortNPIVAttributes");
uint64_t newState;
HBA_PORTNPIVATTRIBUTES attributes = port->getPortNPIVAttributes(newState);
validate(newState);
return (attributes);
}
uint32_t HandlePort::deleteNPIVPort(uint64_t vportwwn) {
Trace log("HandlePort::deleteNPIVPort");
uint32_t ret = port->deleteNPIVPort(vportwwn);
return (ret);
}
uint32_t HandlePort::createNPIVPort(uint64_t vnodewwn,
uint64_t vportwwn, uint32_t vindex) {
Trace log("HandlePort::createNPIVPort");
uint32_t vportindex;
vportindex = port->createNPIVPort(vnodewwn, vportwwn, vindex);
return (vportindex);
}
HandleNPIVPort* HandlePort::getHandleNPIVPortByIndex(int index) {
Trace log("HandlePort::getHandleNPIVPortByIndex(int index)");
HBANPIVPort* vport = port->getPortByIndex(index);
return (getHandleNPIVPort(vport->getPortWWN()));
}
HandleNPIVPort* HandlePort::getHandleNPIVPort(uint64_t wwn) {
Trace log("HandlePort::getHandleNPIVPort");
lock();
try {
if (npivportHandles.find(wwn) == npivportHandles.end()) {
HBANPIVPort* vport = port->getPort(wwn);
npivportHandles[wwn] = new HandleNPIVPort(handle, this, hba, port, vport);
}
HandleNPIVPort *npivportHandle = npivportHandles[wwn];
unlock();
return (npivportHandle);
} catch (...) {
unlock();
throw;
}
}