xref: /openbmc/ipmitool/lib/ipmi_oem.c (revision 2d79e69f)
1c18ec02fSPetter Reinholdtsen /*
2c18ec02fSPetter Reinholdtsen  * Redistribution and use in source and binary forms, with or without
3c18ec02fSPetter Reinholdtsen  * modification, are permitted provided that the following conditions
4c18ec02fSPetter Reinholdtsen  * are met:
5c18ec02fSPetter Reinholdtsen  *
6c18ec02fSPetter Reinholdtsen  * Redistribution of source code must retain the above copyright
7c18ec02fSPetter Reinholdtsen  * notice, this list of conditions and the following disclaimer.
8c18ec02fSPetter Reinholdtsen  *
9c18ec02fSPetter Reinholdtsen  * Redistribution in binary form must reproduce the above copyright
10c18ec02fSPetter Reinholdtsen  * notice, this list of conditions and the following disclaimer in the
11c18ec02fSPetter Reinholdtsen  * documentation and/or other materials provided with the distribution.
12c18ec02fSPetter Reinholdtsen  *
13c18ec02fSPetter Reinholdtsen  * Neither the name of Sun Microsystems, Inc. or the names of
14c18ec02fSPetter Reinholdtsen  * contributors may be used to endorse or promote products derived
15c18ec02fSPetter Reinholdtsen  * from this software without specific prior written permission.
16c18ec02fSPetter Reinholdtsen  *
17c18ec02fSPetter Reinholdtsen  * This software is provided "AS IS," without a warranty of any kind.
18c18ec02fSPetter Reinholdtsen  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
19c18ec02fSPetter Reinholdtsen  * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
20c18ec02fSPetter Reinholdtsen  * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
21c18ec02fSPetter Reinholdtsen  * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
22c18ec02fSPetter Reinholdtsen  * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
23c18ec02fSPetter Reinholdtsen  * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.  IN NO EVENT WILL
24c18ec02fSPetter Reinholdtsen  * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
25c18ec02fSPetter Reinholdtsen  * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
26c18ec02fSPetter Reinholdtsen  * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
27c18ec02fSPetter Reinholdtsen  * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
28c18ec02fSPetter Reinholdtsen  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
29c18ec02fSPetter Reinholdtsen  */
30c18ec02fSPetter Reinholdtsen 
31c18ec02fSPetter Reinholdtsen #include <string.h>
32c18ec02fSPetter Reinholdtsen 
33c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi.h>
34c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_intf.h>
35c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_constants.h>
36c18ec02fSPetter Reinholdtsen #include <ipmitool/log.h>
37c18ec02fSPetter Reinholdtsen #include <ipmitool/helper.h>
38c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_sel.h>
39c18ec02fSPetter Reinholdtsen 
40c18ec02fSPetter Reinholdtsen static int ipmi_oem_supermicro(struct ipmi_intf * intf);
41c18ec02fSPetter Reinholdtsen static int ipmi_oem_ibm(struct ipmi_intf * intf);
42c18ec02fSPetter Reinholdtsen 
43c18ec02fSPetter Reinholdtsen static struct ipmi_oem_handle ipmi_oem_list[] = {
44c18ec02fSPetter Reinholdtsen 	{
45*70984dcaSZdenek Styblik 		.name = "supermicro",
46*70984dcaSZdenek Styblik 		.desc = "Supermicro IPMIv1.5 BMC with OEM LAN authentication support",
47*70984dcaSZdenek Styblik 		.setup = ipmi_oem_supermicro,
48c18ec02fSPetter Reinholdtsen 	},
49c18ec02fSPetter Reinholdtsen 	{
50*70984dcaSZdenek Styblik 		.name = "intelwv2",
51*70984dcaSZdenek Styblik 		.desc = "Intel SE7501WV2 IPMIv1.5 BMC with extra LAN communication support",
52c18ec02fSPetter Reinholdtsen 	},
53c18ec02fSPetter Reinholdtsen 	{
54*70984dcaSZdenek Styblik 		.name = "intelplus",
55*70984dcaSZdenek Styblik 		.desc = "Intel IPMI 2.0 BMC with RMCP+ communication support",
56c18ec02fSPetter Reinholdtsen 	},
57c18ec02fSPetter Reinholdtsen 	{
58*70984dcaSZdenek Styblik 		.name = "icts",
59*70984dcaSZdenek Styblik 		.desc = "IPMI 2.0 ICTS compliance support",
60c18ec02fSPetter Reinholdtsen 	},
61c18ec02fSPetter Reinholdtsen 	{
62*70984dcaSZdenek Styblik 		.name = "ibm",
63*70984dcaSZdenek Styblik 		.desc = "IBM OEM support",
64*70984dcaSZdenek Styblik 		.setup = ipmi_oem_ibm,
65c18ec02fSPetter Reinholdtsen 	},
66c18ec02fSPetter Reinholdtsen 	{
67*70984dcaSZdenek Styblik 		.name = "i82571spt",
68*70984dcaSZdenek Styblik 		.desc = "Intel 82571 MAC with integrated RMCP+ support in super pass-through mode",
69c18ec02fSPetter Reinholdtsen 	},
7023e9340bSZdenek Styblik 	{
71*70984dcaSZdenek Styblik 		.name = "kontron",
72*70984dcaSZdenek Styblik 		.desc = "Kontron OEM big buffer support"
7323e9340bSZdenek Styblik 	},
74c18ec02fSPetter Reinholdtsen 	{ 0 }
75c18ec02fSPetter Reinholdtsen };
76c18ec02fSPetter Reinholdtsen 
77c18ec02fSPetter Reinholdtsen /* Supermicro IPMIv2 BMCs use OEM authtype */
78c18ec02fSPetter Reinholdtsen static int
ipmi_oem_supermicro(struct ipmi_intf * intf)79c18ec02fSPetter Reinholdtsen ipmi_oem_supermicro(struct ipmi_intf * intf)
80c18ec02fSPetter Reinholdtsen {
81c18ec02fSPetter Reinholdtsen 	ipmi_intf_session_set_authtype(intf, IPMI_SESSION_AUTHTYPE_OEM);
82c18ec02fSPetter Reinholdtsen 	return 0;
83c18ec02fSPetter Reinholdtsen }
84c18ec02fSPetter Reinholdtsen 
85c18ec02fSPetter Reinholdtsen static int
ipmi_oem_ibm(struct ipmi_intf * intf)86c18ec02fSPetter Reinholdtsen ipmi_oem_ibm(struct ipmi_intf * intf)
87c18ec02fSPetter Reinholdtsen {
88c18ec02fSPetter Reinholdtsen 	char * filename;
89c18ec02fSPetter Reinholdtsen 	if ((filename = getenv("IPMI_OEM_IBM_DATAFILE")) == NULL) {
90c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Unable to read IPMI_OEM_IBM_DATAFILE from environment");
91c18ec02fSPetter Reinholdtsen 		return -1;
92c18ec02fSPetter Reinholdtsen 	}
93c18ec02fSPetter Reinholdtsen 	return ipmi_sel_oem_init((const char *)filename);
94c18ec02fSPetter Reinholdtsen }
95c18ec02fSPetter Reinholdtsen 
96c18ec02fSPetter Reinholdtsen /* ipmi_oem_print  -  print list of OEM handles
97c18ec02fSPetter Reinholdtsen  */
98c18ec02fSPetter Reinholdtsen void
ipmi_oem_print(void)99c18ec02fSPetter Reinholdtsen ipmi_oem_print(void)
100c18ec02fSPetter Reinholdtsen {
101c18ec02fSPetter Reinholdtsen 	struct ipmi_oem_handle * oem;
102c18ec02fSPetter Reinholdtsen 	lprintf(LOG_NOTICE, "\nOEM Support:");
103c18ec02fSPetter Reinholdtsen 	for (oem=ipmi_oem_list; oem->name != NULL && oem->desc != NULL; oem++) {
104c18ec02fSPetter Reinholdtsen 		lprintf(LOG_NOTICE, "\t%-12s %s", oem->name, oem->desc);
105c18ec02fSPetter Reinholdtsen 	}
106c18ec02fSPetter Reinholdtsen 	lprintf(LOG_NOTICE, "");
107c18ec02fSPetter Reinholdtsen }
108c18ec02fSPetter Reinholdtsen 
109c18ec02fSPetter Reinholdtsen /* ipmi_oem_setup  -  do initial setup of OEM handle
110c18ec02fSPetter Reinholdtsen  *
111c18ec02fSPetter Reinholdtsen  * @intf:	ipmi interface
112c18ec02fSPetter Reinholdtsen  * @oemtype:	OEM handle name
113c18ec02fSPetter Reinholdtsen  *
114c18ec02fSPetter Reinholdtsen  * returns 0 on success
115c18ec02fSPetter Reinholdtsen  * returns -1 on error
116c18ec02fSPetter Reinholdtsen  */
117c18ec02fSPetter Reinholdtsen int
ipmi_oem_setup(struct ipmi_intf * intf,char * oemtype)118c18ec02fSPetter Reinholdtsen ipmi_oem_setup(struct ipmi_intf * intf, char * oemtype)
119c18ec02fSPetter Reinholdtsen {
120c18ec02fSPetter Reinholdtsen 	struct ipmi_oem_handle * oem;
121c18ec02fSPetter Reinholdtsen 	int rc = 0;
122c18ec02fSPetter Reinholdtsen 
123c18ec02fSPetter Reinholdtsen 	if (oemtype == NULL ||
124c18ec02fSPetter Reinholdtsen 			strncmp(oemtype, "help", 4) == 0 ||
125c18ec02fSPetter Reinholdtsen 			strncmp(oemtype, "list", 4) == 0) {
126c18ec02fSPetter Reinholdtsen 		ipmi_oem_print();
127c18ec02fSPetter Reinholdtsen 		return -1;
128c18ec02fSPetter Reinholdtsen 	}
129c18ec02fSPetter Reinholdtsen 
130c18ec02fSPetter Reinholdtsen 	for (oem=ipmi_oem_list; oem->name != NULL; oem++) {
131c18ec02fSPetter Reinholdtsen 		if (strncmp(oemtype, oem->name, strlen(oem->name)) == 0)
132c18ec02fSPetter Reinholdtsen 			break;
133c18ec02fSPetter Reinholdtsen 	}
134c18ec02fSPetter Reinholdtsen 
135c18ec02fSPetter Reinholdtsen 	if (oem->name == NULL)
136c18ec02fSPetter Reinholdtsen 		return -1;
137c18ec02fSPetter Reinholdtsen 
138c18ec02fSPetter Reinholdtsen 	/* save pointer for later use */
139c18ec02fSPetter Reinholdtsen 	intf->oem = oem;
140c18ec02fSPetter Reinholdtsen 
141c18ec02fSPetter Reinholdtsen 	/* run optional setup function if it is defined */
142c18ec02fSPetter Reinholdtsen 	if (oem->setup != NULL) {
143c18ec02fSPetter Reinholdtsen 		lprintf(LOG_DEBUG, "Running OEM setup for \"%s\"", oem->desc);
144c18ec02fSPetter Reinholdtsen 		rc = oem->setup(intf);
145c18ec02fSPetter Reinholdtsen 	}
146c18ec02fSPetter Reinholdtsen 
147c18ec02fSPetter Reinholdtsen 	return rc;
148c18ec02fSPetter Reinholdtsen }
149c18ec02fSPetter Reinholdtsen 
150c18ec02fSPetter Reinholdtsen /* ipmi_oem_active  -  used to determine if a particular OEM type is set
151c18ec02fSPetter Reinholdtsen  *
152c18ec02fSPetter Reinholdtsen  * @intf:	ipmi interface
153c18ec02fSPetter Reinholdtsen  * @oemtype:	string containing name of ipmi handle to check
154c18ec02fSPetter Reinholdtsen  *
155c18ec02fSPetter Reinholdtsen  * returns 1 if requested ipmi handle is active
156c18ec02fSPetter Reinholdtsen  * returns 0 otherwise
157c18ec02fSPetter Reinholdtsen  */
158c18ec02fSPetter Reinholdtsen int
ipmi_oem_active(struct ipmi_intf * intf,const char * oemtype)159c18ec02fSPetter Reinholdtsen ipmi_oem_active(struct ipmi_intf * intf, const char * oemtype)
160c18ec02fSPetter Reinholdtsen {
161c18ec02fSPetter Reinholdtsen 	if (intf->oem == NULL)
162c18ec02fSPetter Reinholdtsen 		return 0;
163c18ec02fSPetter Reinholdtsen 
164c18ec02fSPetter Reinholdtsen 	if (strncmp(intf->oem->name, oemtype, strlen(oemtype)) == 0)
165c18ec02fSPetter Reinholdtsen 		return 1;
166c18ec02fSPetter Reinholdtsen 
167c18ec02fSPetter Reinholdtsen 	return 0;
168c18ec02fSPetter Reinholdtsen }
169