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