xref: /onnv-gate/usr/src/cmd/lms/ConfigConnection.cpp (revision 9203:3ebffd0a1b10)
1*9203SMark.Logan@Sun.COM /*******************************************************************************
2*9203SMark.Logan@Sun.COM  * Copyright (C) 2004-2008 Intel Corp. All rights reserved.
3*9203SMark.Logan@Sun.COM  *
4*9203SMark.Logan@Sun.COM  * Redistribution and use in source and binary forms, with or without
5*9203SMark.Logan@Sun.COM  * modification, are permitted provided that the following conditions are met:
6*9203SMark.Logan@Sun.COM  *
7*9203SMark.Logan@Sun.COM  *  - Redistributions of source code must retain the above copyright notice,
8*9203SMark.Logan@Sun.COM  *    this list of conditions and the following disclaimer.
9*9203SMark.Logan@Sun.COM  *
10*9203SMark.Logan@Sun.COM  *  - Redistributions in binary form must reproduce the above copyright notice,
11*9203SMark.Logan@Sun.COM  *    this list of conditions and the following disclaimer in the documentation
12*9203SMark.Logan@Sun.COM  *    and/or other materials provided with the distribution.
13*9203SMark.Logan@Sun.COM  *
14*9203SMark.Logan@Sun.COM  *  - Neither the name of Intel Corp. nor the names of its
15*9203SMark.Logan@Sun.COM  *    contributors may be used to endorse or promote products derived from this
16*9203SMark.Logan@Sun.COM  *    software without specific prior written permission.
17*9203SMark.Logan@Sun.COM  *
18*9203SMark.Logan@Sun.COM  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
19*9203SMark.Logan@Sun.COM  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*9203SMark.Logan@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*9203SMark.Logan@Sun.COM  * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
22*9203SMark.Logan@Sun.COM  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*9203SMark.Logan@Sun.COM  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*9203SMark.Logan@Sun.COM  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*9203SMark.Logan@Sun.COM  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*9203SMark.Logan@Sun.COM  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*9203SMark.Logan@Sun.COM  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*9203SMark.Logan@Sun.COM  * POSSIBILITY OF SUCH DAMAGE.
29*9203SMark.Logan@Sun.COM  *******************************************************************************/
30*9203SMark.Logan@Sun.COM 
31*9203SMark.Logan@Sun.COM #ifdef HAVE_CONFIG_H
32*9203SMark.Logan@Sun.COM #include "config.h"
33*9203SMark.Logan@Sun.COM #endif
34*9203SMark.Logan@Sun.COM #include "ConfigConnection.h"
35*9203SMark.Logan@Sun.COM #include "Lock.h"
36*9203SMark.Logan@Sun.COM 
ConfigConnection(bool verbose)37*9203SMark.Logan@Sun.COM ConfigConnection::ConfigConnection(bool verbose) :
38*9203SMark.Logan@Sun.COM _initState(ConfigConnection::INIT_STATE_DISCONNECTED),
39*9203SMark.Logan@Sun.COM _pthiCommand(verbose, 5000),
40*9203SMark.Logan@Sun.COM _fwulCommand(verbose)
41*9203SMark.Logan@Sun.COM {
42*9203SMark.Logan@Sun.COM }
43*9203SMark.Logan@Sun.COM 
~ConfigConnection()44*9203SMark.Logan@Sun.COM ConfigConnection::~ConfigConnection()
45*9203SMark.Logan@Sun.COM {
46*9203SMark.Logan@Sun.COM }
47*9203SMark.Logan@Sun.COM 
IsInitialized()48*9203SMark.Logan@Sun.COM bool ConfigConnection::IsInitialized()
49*9203SMark.Logan@Sun.COM {
50*9203SMark.Logan@Sun.COM 	Lock il(_initLock);
51*9203SMark.Logan@Sun.COM 	return ((_initState == INIT_STATE_CONNECTED) ? true : false);
52*9203SMark.Logan@Sun.COM }
53*9203SMark.Logan@Sun.COM 
IsAMTEnabled(bool useOpenPTHI)54*9203SMark.Logan@Sun.COM int ConfigConnection::IsAMTEnabled(bool useOpenPTHI)
55*9203SMark.Logan@Sun.COM {
56*9203SMark.Logan@Sun.COM 	FWU_GET_VERSION_MSG_REPLY verMsg;
57*9203SMark.Logan@Sun.COM 	FWU_GET_INFO_MSG_REPLY infoMsg;
58*9203SMark.Logan@Sun.COM 	HECI_STATUS heciRet;
59*9203SMark.Logan@Sun.COM 	int ret = _CFCON_AMT_UNKNOWN;
60*9203SMark.Logan@Sun.COM 
61*9203SMark.Logan@Sun.COM 	if (useOpenPTHI) {
62*9203SMark.Logan@Sun.COM 		CODE_VERSIONS ver;
63*9203SMark.Logan@Sun.COM 		AMT_STATUS ast = _pthiCommand.GetCodeVersions(ver);
64*9203SMark.Logan@Sun.COM 		if (PTHI_STATUS_EMPTY_RESPONSE == ast) {
65*9203SMark.Logan@Sun.COM 			return _CFCON_AMT_DISABLED;
66*9203SMark.Logan@Sun.COM 		}
67*9203SMark.Logan@Sun.COM 		if (AMT_STATUS_SUCCESS == ast) {
68*9203SMark.Logan@Sun.COM 			return _CFCON_AMT_ENABLED;
69*9203SMark.Logan@Sun.COM 		}
70*9203SMark.Logan@Sun.COM 		return ret;
71*9203SMark.Logan@Sun.COM 	}
72*9203SMark.Logan@Sun.COM 
73*9203SMark.Logan@Sun.COM 	if (_fwulCommand.FWULClient.Init()) {
74*9203SMark.Logan@Sun.COM 		heciRet = _fwulCommand.GetFWUVersionAndInfo(verMsg, infoMsg);
75*9203SMark.Logan@Sun.COM 		_fwulCommand.FWULClient.Deinit();
76*9203SMark.Logan@Sun.COM 		if (HECI_STATUS_OK == heciRet) {
77*9203SMark.Logan@Sun.COM 			if (infoMsg.MessageType == FWU_GET_INFO_REPLY) {
78*9203SMark.Logan@Sun.COM 				return ((MEFWCAPS_MANAGEABILITY_SUPP_AMT
79*9203SMark.Logan@Sun.COM 					 == infoMsg.ManageabilityMode)
80*9203SMark.Logan@Sun.COM 					    ? _CFCON_AMT_ENABLED
81*9203SMark.Logan@Sun.COM 					    : _CFCON_AMT_DISABLED);
82*9203SMark.Logan@Sun.COM 			}
83*9203SMark.Logan@Sun.COM 			ret = _CFCON_AMT_AT3;
84*9203SMark.Logan@Sun.COM 		}
85*9203SMark.Logan@Sun.COM 	}
86*9203SMark.Logan@Sun.COM 
87*9203SMark.Logan@Sun.COM 	return ret;
88*9203SMark.Logan@Sun.COM }
89*9203SMark.Logan@Sun.COM 
Init(bool checkEnabled)90*9203SMark.Logan@Sun.COM bool ConfigConnection::Init(bool checkEnabled)
91*9203SMark.Logan@Sun.COM {
92*9203SMark.Logan@Sun.COM 	{
93*9203SMark.Logan@Sun.COM 		Lock il(_initLock);
94*9203SMark.Logan@Sun.COM 		if (_initState == INIT_STATE_CONNECTING) {
95*9203SMark.Logan@Sun.COM 			return false;
96*9203SMark.Logan@Sun.COM 		}
97*9203SMark.Logan@Sun.COM 		_initState = INIT_STATE_CONNECTING;
98*9203SMark.Logan@Sun.COM 	}
99*9203SMark.Logan@Sun.COM 
100*9203SMark.Logan@Sun.COM 	if (!(_pthiCommand.PTHIClient.Init(1))) {
101*9203SMark.Logan@Sun.COM 		Deinit();
102*9203SMark.Logan@Sun.COM 		return false;
103*9203SMark.Logan@Sun.COM 	}
104*9203SMark.Logan@Sun.COM 
105*9203SMark.Logan@Sun.COM 	if (checkEnabled) {
106*9203SMark.Logan@Sun.COM 		if (_CFCON_AMT_ENABLED != IsAMTEnabled(true)) {
107*9203SMark.Logan@Sun.COM 			Deinit();
108*9203SMark.Logan@Sun.COM 			return false;
109*9203SMark.Logan@Sun.COM 		}
110*9203SMark.Logan@Sun.COM 	}
111*9203SMark.Logan@Sun.COM 
112*9203SMark.Logan@Sun.COM 	{
113*9203SMark.Logan@Sun.COM 		Lock il(_initLock);
114*9203SMark.Logan@Sun.COM 		if (_initState != INIT_STATE_CONNECTING) {
115*9203SMark.Logan@Sun.COM 			_pthiCommand.PTHIClient.Deinit();
116*9203SMark.Logan@Sun.COM 			return false;
117*9203SMark.Logan@Sun.COM 		}
118*9203SMark.Logan@Sun.COM 		_initState = INIT_STATE_CONNECTED;
119*9203SMark.Logan@Sun.COM 	}
120*9203SMark.Logan@Sun.COM 
121*9203SMark.Logan@Sun.COM 	return true;
122*9203SMark.Logan@Sun.COM }
123*9203SMark.Logan@Sun.COM 
Deinit()124*9203SMark.Logan@Sun.COM void ConfigConnection::Deinit()
125*9203SMark.Logan@Sun.COM {
126*9203SMark.Logan@Sun.COM 	Lock il(_initLock);
127*9203SMark.Logan@Sun.COM 	if (_initState != INIT_STATE_CONNECTING) {
128*9203SMark.Logan@Sun.COM 		_pthiCommand.PTHIClient.Deinit();
129*9203SMark.Logan@Sun.COM 	}
130*9203SMark.Logan@Sun.COM 	_initState = INIT_STATE_DISCONNECTED;
131*9203SMark.Logan@Sun.COM }
132*9203SMark.Logan@Sun.COM 
133*9203SMark.Logan@Sun.COM #ifdef _REMOTE_SUPPORT
134*9203SMark.Logan@Sun.COM 
RequestEntDNSSuffixList(std::list<std::string> & dnsSuffixList)135*9203SMark.Logan@Sun.COM AMT_STATUS ConfigConnection::RequestEntDNSSuffixList(std::list<std::string> &dnsSuffixList)
136*9203SMark.Logan@Sun.COM {
137*9203SMark.Logan@Sun.COM 	Lock l(_requestLock);
138*9203SMark.Logan@Sun.COM 
139*9203SMark.Logan@Sun.COM 	{
140*9203SMark.Logan@Sun.COM 		Lock il(_initLock);
141*9203SMark.Logan@Sun.COM 		if (_initState != INIT_STATE_CONNECTED) {
142*9203SMark.Logan@Sun.COM 			return PTSDK_STATUS_INTERNAL_ERROR;
143*9203SMark.Logan@Sun.COM 		}
144*9203SMark.Logan@Sun.COM 	}
145*9203SMark.Logan@Sun.COM 
146*9203SMark.Logan@Sun.COM 	AMT_STATUS result = _pthiCommand.GetDNSSuffixList(dnsSuffixList);
147*9203SMark.Logan@Sun.COM 
148*9203SMark.Logan@Sun.COM 	if (result == AMT_STATUS_INTERNAL_ERROR) {
149*9203SMark.Logan@Sun.COM 		Lock il(_initLock);
150*9203SMark.Logan@Sun.COM 		if (!_pthiCommand.PTHIClient.IsInitialized()) {
151*9203SMark.Logan@Sun.COM 			_initState = INIT_STATE_DISCONNECTED;
152*9203SMark.Logan@Sun.COM 		}
153*9203SMark.Logan@Sun.COM 	}
154*9203SMark.Logan@Sun.COM 
155*9203SMark.Logan@Sun.COM 	return result;
156*9203SMark.Logan@Sun.COM }
157*9203SMark.Logan@Sun.COM 
SendEnterpriseAccess(bool access,ATAddress & localIp)158*9203SMark.Logan@Sun.COM AMT_STATUS ConfigConnection::SendEnterpriseAccess(bool access, ATAddress &localIp)
159*9203SMark.Logan@Sun.COM {
160*9203SMark.Logan@Sun.COM 	UINT8 hlocalIP[16];
161*9203SMark.Logan@Sun.COM 	const struct sockaddr *addr = localIp.addr();
162*9203SMark.Logan@Sun.COM 
163*9203SMark.Logan@Sun.COM 	Lock l(_requestLock);
164*9203SMark.Logan@Sun.COM 
165*9203SMark.Logan@Sun.COM 	{
166*9203SMark.Logan@Sun.COM 		Lock il(_initLock);
167*9203SMark.Logan@Sun.COM 		if (_initState != INIT_STATE_CONNECTED) {
168*9203SMark.Logan@Sun.COM 			return PTSDK_STATUS_INTERNAL_ERROR;
169*9203SMark.Logan@Sun.COM 		}
170*9203SMark.Logan@Sun.COM 	}
171*9203SMark.Logan@Sun.COM 
172*9203SMark.Logan@Sun.COM 	memset(hlocalIP, 0, sizeof(hlocalIP));
173*9203SMark.Logan@Sun.COM 	memcpy(hlocalIP, addr->sa_data, localIp.size());
174*9203SMark.Logan@Sun.COM 
175*9203SMark.Logan@Sun.COM 	AMT_STATUS result = _pthiCommand.SetEnterpriseAccess(
176*9203SMark.Logan@Sun.COM 				((localIp.family() == AF_INET6) ? 1 : 0),
177*9203SMark.Logan@Sun.COM 				hlocalIP,
178*9203SMark.Logan@Sun.COM 				((access) ? 1 : 0));
179*9203SMark.Logan@Sun.COM 
180*9203SMark.Logan@Sun.COM 	if (result == AMT_STATUS_INTERNAL_ERROR) {
181*9203SMark.Logan@Sun.COM 		Lock il(_initLock);
182*9203SMark.Logan@Sun.COM 		if (!_pthiCommand.PTHIClient.IsInitialized()) {
183*9203SMark.Logan@Sun.COM 			_initState = INIT_STATE_DISCONNECTED;
184*9203SMark.Logan@Sun.COM 		}
185*9203SMark.Logan@Sun.COM 	}
186*9203SMark.Logan@Sun.COM 
187*9203SMark.Logan@Sun.COM 	return result;
188*9203SMark.Logan@Sun.COM }
189*9203SMark.Logan@Sun.COM 
190*9203SMark.Logan@Sun.COM #endif
191*9203SMark.Logan@Sun.COM 
192