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