#include <bea_mediummemory.h>


Definition at line 84 of file bea_mediummemory.h.
Public Member Functions | |
| bea_MicMemory (scsi_IO *const a_scsiIO_p) | |
| virtual | ~bea_MicMemory () |
| virtual UInt16_t | GetAvailable () |
| virtual void | Detect () |
| virtual string | GetSerialNumber () |
| virtual string | GetManufacturer () |
| virtual UInt8_t | GetSecondaryID () |
| virtual UInt8_t | GetChecksum () |
| virtual void | Read () |
| virtual void | Write () |
Private Member Functions | |
| UInt16_t | GetSize (UInt16_t a_paramCode) |
Private Attributes | |
| log_CLASSID_m | |
| bea_MicMemory::bea_MicMemory | ( | scsi_IO *const | a_scsiIO_p | ) |
Definition at line 33 of file bea_micmemory.cpp.
References log_FUNC_m.
00034 : bea_MediumMemory(a_scsiIO_p) { 00035 00036 log_FUNC_m(bea_MicMemory); 00037 }
| bea_MicMemory::~bea_MicMemory | ( | ) | [virtual] |
Definition at line 41 of file bea_micmemory.cpp.
References log_FUNC_m.
00041 { 00042 log_FUNC_m(~bea_MicMemory); 00043 }
| UInt16_t bea_MicMemory::GetAvailable | ( | ) | [virtual] |
Implements bea_MediumMemory.
Definition at line 125 of file bea_micmemory.cpp.
References data_Log::GetMICAvailSize(), scsi_IO::IOCtl(), log_FUNC_m, bea_MediumMemory::m_scsiIO_p, mic_AVAILABLE_d, and data_Log::pg_MICFIXED.
Referenced by Detect().
00125 { 00126 log_FUNC_m(GetAvailable); 00127 00128 data_Log micSize(data_Log::pg_MICFIXED, mic_AVAILABLE_d); 00129 cdb_LogSense logSns(micSize); 00130 m_scsiIO_p->IOCtl(logSns); 00131 00132 return micSize.GetMICAvailSize(); 00133 }


| void bea_MicMemory::Detect | ( | ) | [virtual] |
Implements bea_MediumMemory.
Definition at line 160 of file bea_micmemory.cpp.
References data_ModeAITConfigPage_t::ait, data_Mode_t::ait, data_ModeAIT_t::aitPage, cmn_GetEnvVariable(), dbg_LOW, dbg_NORM, GetAvailable(), ivd_BaseException::GetFriendly(), data_Mode::GetModeStruct(), scsi_IO::IOCtl(), log_DBG_m, log_FUNC_m, bea_MediumMemory::m_detected, bea_MediumMemory::m_scsiIO_p, data_ModeAITConfigPage_t::mic, and data_Mode::pg_AITCFG.
00160 { 00161 log_FUNC_m(Detect); 00162 m_detected = false; 00163 { 00164 static const char* const useMIC_c("HSM_USE_MIC"); 00165 string useMIC = cmn_GetEnvVariable(useMIC_c); 00166 // Is the MIC functionality enabled at all? 00167 if (useMIC == "no" || useMIC == "false") { 00168 log_DBG_m(dbg_LOW, 00169 useMIC_c << " = \'" << useMIC << 00170 "\'. MIC functionality explicitly disabled."); 00171 return; 00172 } 00173 } 00174 { 00175 static const char* const useMIC_c("HSM_USE_CM"); 00176 string useMIC = cmn_GetEnvVariable(useMIC_c); 00177 // Is the MIC functionality enabled at all? 00178 if (useMIC == "no" || useMIC == "false") { 00179 log_DBG_m(dbg_LOW, 00180 useMIC_c << " = \'" << useMIC << 00181 "\'. MIC functionality explicitly disabled."); 00182 return; 00183 } 00184 } 00185 00186 try { 00187 data_Mode ad(data_Mode::pg_AITCFG); 00188 cdb_ModeSense aitInfo(ad); 00189 m_scsiIO_p->IOCtl(aitInfo); 00190 00191 if ( ad.GetModeStruct().ait.aitPage.ait == 0 ) { 00192 log_DBG_m(dbg_NORM, "AIT tape in DDS mode. MIC will not be used. "); 00193 } 00194 else if ( ad.GetModeStruct().ait.aitPage.mic != 0 ) { 00195 // Was MIC detected by the tape drive? 00196 log_DBG_m(dbg_LOW, "MIC detected."); 00197 log_DBG_m(dbg_NORM, "MIC space left: " << GetAvailable()); 00198 m_detected = true; 00199 } 00200 else { 00201 log_DBG_m(dbg_LOW, "MIC NOT detected."); 00202 } 00203 } 00204 catch (ivd_Exception &ie) { 00205 log_DBG_m(dbg_NORM, "MIC not detected: " << ie.GetFriendly()); 00206 } 00207 catch (...) { 00208 log_DBG_m(dbg_NORM, "MIC not detected. Unknown exception."); 00209 } 00210 }

| string bea_MicMemory::GetSerialNumber | ( | ) | [virtual] |
Implements bea_MediumMemory.
Definition at line 213 of file bea_micmemory.cpp.
References data_Log::GetMICSerialNumber(), scsi_IO::IOCtl(), log_FUNC_m, bea_MediumMemory::m_scsiIO_p, mic_SERNUM_d, and data_Log::pg_MICFIXED.
00213 { 00214 log_FUNC_m(GetSerialNumber); 00215 00216 data_Log sn(data_Log::pg_MICFIXED, mic_SERNUM_d); 00217 cdb_LogSense logSns(sn); 00218 m_scsiIO_p->IOCtl(logSns); 00219 return sn.GetMICSerialNumber(); 00220 }

| string bea_MicMemory::GetManufacturer | ( | ) | [virtual] |
Implements bea_MediumMemory.
Definition at line 223 of file bea_micmemory.cpp.
References cmn_Num2Str(), data_Log::GetMICManufacturer(), scsi_IO::IOCtl(), log_FUNC_m, bea_MediumMemory::m_scsiIO_p, mic_SERNUM_d, and data_Log::pg_MICFIXED.
00223 { 00224 log_FUNC_m(GetManufacturer); 00225 data_Log sn(data_Log::pg_MICFIXED, mic_SERNUM_d); 00226 cdb_LogSense logSns(sn); 00227 m_scsiIO_p->IOCtl(logSns); 00228 return cmn_Num2Str(sn.GetMICManufacturer()); 00229 }

| UInt8_t bea_MicMemory::GetSecondaryID | ( | ) | [virtual] |
Implements bea_MediumMemory.
Definition at line 232 of file bea_micmemory.cpp.
References data_Log::GetMICSecondaryID(), scsi_IO::IOCtl(), log_FUNC_m, bea_MediumMemory::m_scsiIO_p, mic_SERNUM_d, and data_Log::pg_MICFIXED.
00232 { 00233 log_FUNC_m(GetSecondaryID); 00234 00235 data_Log sn(data_Log::pg_MICFIXED, mic_SERNUM_d); 00236 cdb_LogSense logSns(sn); 00237 m_scsiIO_p->IOCtl(logSns); 00238 return sn.GetMICSecondaryID(); 00239 }

| UInt8_t bea_MicMemory::GetChecksum | ( | ) | [virtual] |
Implements bea_MediumMemory.
Definition at line 242 of file bea_micmemory.cpp.
References data_Log::GetMICChecksum(), scsi_IO::IOCtl(), log_FUNC_m, bea_MediumMemory::m_scsiIO_p, mic_SERNUM_d, and data_Log::pg_MICFIXED.
00242 { 00243 log_FUNC_m(GetChecksum); 00244 00245 data_Log sn(data_Log::pg_MICFIXED, mic_SERNUM_d); 00246 cdb_LogSense logSns(sn); 00247 m_scsiIO_p->IOCtl(logSns); 00248 return sn.GetMICChecksum(); 00249 }

| void bea_MicMemory::Read | ( | ) | [virtual] |
Implements bea_MediumMemory.
Definition at line 47 of file bea_micmemory.cpp.
References cmn_HexDump(), dbg_DETAIL, dbg_LOW, data_Log::GetMICNote(), data_Log::GetMICNoteLength(), bea_MediumMemory::GetNeededSpace(), GetSize(), scsi_IO::IOCtl(), log_DBG_m, log_FUNC_m, log_WRN_m, bea_MediumMemory::m_scsiIO_p, bea_MediumMemory::m_tcmmedia_vol, bea_MediumMemory::m_tcmmedium, mic_DATAVOLNOTE_d, mic_SIZEVOLNOTE_d, min, data_Log::pg_MICVARIABLE, and data_Log::UpdateMICNoteSize().
00047 { 00048 log_FUNC_m(Read); 00049 00050 if (GetSize(mic_SIZEVOLNOTE_d) == 0) { 00051 log_DBG_m(dbg_LOW, "Nothing in MIC. micNoteSize is 0."); 00052 return; 00053 }; 00054 00055 log_DBG_m(dbg_LOW, "Reading contents from MIC."); 00056 00057 UInt16_t neededSpace(GetNeededSpace()); 00058 data_Log micNote(data_Log::pg_MICVARIABLE, mic_DATAVOLNOTE_d); 00059 micNote.UpdateMICNoteSize(neededSpace); 00060 00061 cdb_LogSense logSns(micNote); 00062 m_scsiIO_p->IOCtl(logSns); 00063 00064 UInt16_t micNoteLen(micNote.GetMICNoteLength()); 00065 00066 log_DBG_m(dbg_DETAIL, "Read " << micNoteLen << " bytes. Needed " << neededSpace); 00067 00068 log_DBG_m(dbg_DETAIL, 00069 "MIC Note contents:" << endl << 00070 cmn_HexDump(micNote.GetMICNote(), micNoteLen, 16, true) ); 00071 00072 if (micNoteLen > neededSpace) { 00073 ostringstream sstr; 00074 log_WRN_m( 00075 "MIC note size does not match requested. Broken MIC? " 00076 << micNoteLen << " != " << neededSpace 00077 << " parameter: 0x" << hex << data_Log::pg_MICVARIABLE ); 00078 } 00079 00080 UInt16_t toCopy(min(neededSpace, micNoteLen)); 00081 00082 vector<char> contents(neededSpace, 0); 00083 00084 memcpy(&(contents[0]), micNote.GetMICNote(), toCopy); 00085 00086 memcpy(&m_tcmmedium, &(contents[0]), sizeof(m_tcmmedium)); 00087 00088 // WARNING: Vector uses contiguous memory region in memory. 00089 // We'll copy contents from internal buffer to m_tcmmedia_vol 00090 // for all volumes with one memcpy. 00091 memcpy( 00092 &(m_tcmmedia_vol[0]), 00093 &(contents[0]) + sizeof(m_tcmmedium), 00094 neededSpace - sizeof(m_tcmmedium)); 00095 }

| void bea_MicMemory::Write | ( | ) | [virtual] |
Implements bea_MediumMemory.
Definition at line 99 of file bea_micmemory.cpp.
References bea_MediumMemory::GetNeededSpace(), scsi_IO::IOCtl(), log_FUNC_m, bea_MediumMemory::m_scsiIO_p, bea_MediumMemory::m_tcmmedia_vol, bea_MediumMemory::m_tcmmedium, mic_DATAVOLNOTE_d, data_Log::pg_MICVARIABLE, and data_Log::SetMICNote().
00099 { 00100 00101 log_FUNC_m(Write); 00102 00103 vector<char> contents(GetNeededSpace(), 0); 00104 memcpy(&(contents[0]), &m_tcmmedium, sizeof(m_tcmmedium)); 00105 00106 // WARNING: Vector uses contiguous memory region in memory. 00107 // We'll copy contents to internal buffer to m_tcmmedia_vol 00108 // for all volumes with one memcpy. 00109 memcpy( 00110 &(contents[0]) + sizeof(m_tcmmedium), 00111 &(m_tcmmedia_vol[0]), 00112 GetNeededSpace() - sizeof(m_tcmmedium)); 00113 00114 data_Log micNote(data_Log::pg_MICVARIABLE, mic_DATAVOLNOTE_d); 00115 00116 micNote.SetMICNote(&(contents[0]), GetNeededSpace()); 00117 cdb_LogSelect logSel(micNote); 00118 00119 m_scsiIO_p->IOCtl(logSel); 00120 }

Definition at line 137 of file bea_micmemory.cpp.
References dbg_NORM, data_Log::GetMICNoteSize(), ie_INVALID_ARG, scsi_IO::IOCtl(), log_DBG_m, log_FUNC_m, bea_MediumMemory::m_scsiIO_p, mic_SIZEPARTNOTE_d, mic_SIZEVOLNOTE_d, and data_Log::pg_MICFIXED.
Referenced by Read().
00137 { 00138 log_FUNC_m(GetSize); 00139 00140 // Check valid ranges. 00141 if ( a_paramCode != mic_SIZEVOLNOTE_d && 00142 (a_paramCode < mic_SIZEPARTNOTE_d || 00143 a_paramCode > (mic_SIZEPARTNOTE_d+64)) ) { 00144 00145 throw ivd_InternalError( 00146 ie_INVALID_ARG, "MIC size argument out of range."); 00147 }; 00148 00149 data_Log micNoteSize(data_Log::pg_MICFIXED, a_paramCode); 00150 cdb_LogSense logSns(micNoteSize); 00151 m_scsiIO_p->IOCtl(logSns); 00152 00153 log_DBG_m(dbg_NORM, "MIC Note size: " << micNoteSize.GetMICNoteSize()); 00154 00155 return micNoteSize.GetMICNoteSize(); 00156 }


bea_MicMemory::log_CLASSID_m [private] |
1.5.6