xref: /openbmc/ipmitool/lib/ipmi_lanp.c (revision 89e9e634)
1c18ec02fSPetter Reinholdtsen /*
2c18ec02fSPetter Reinholdtsen  * Copyright (c) 2003 Sun Microsystems, Inc.  All Rights Reserved.
3c18ec02fSPetter Reinholdtsen  *
4c18ec02fSPetter Reinholdtsen  * Redistribution and use in source and binary forms, with or without
5c18ec02fSPetter Reinholdtsen  * modification, are permitted provided that the following conditions
6c18ec02fSPetter Reinholdtsen  * are met:
7c18ec02fSPetter Reinholdtsen  *
8c18ec02fSPetter Reinholdtsen  * Redistribution of source code must retain the above copyright
9c18ec02fSPetter Reinholdtsen  * notice, this list of conditions and the following disclaimer.
10c18ec02fSPetter Reinholdtsen  *
11c18ec02fSPetter Reinholdtsen  * Redistribution in binary form must reproduce the above copyright
12c18ec02fSPetter Reinholdtsen  * notice, this list of conditions and the following disclaimer in the
13c18ec02fSPetter Reinholdtsen  * documentation and/or other materials provided with the distribution.
14c18ec02fSPetter Reinholdtsen  *
15c18ec02fSPetter Reinholdtsen  * Neither the name of Sun Microsystems, Inc. or the names of
16c18ec02fSPetter Reinholdtsen  * contributors may be used to endorse or promote products derived
17c18ec02fSPetter Reinholdtsen  * from this software without specific prior written permission.
18c18ec02fSPetter Reinholdtsen  *
19c18ec02fSPetter Reinholdtsen  * This software is provided "AS IS," without a warranty of any kind.
20c18ec02fSPetter Reinholdtsen  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
21c18ec02fSPetter Reinholdtsen  * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
22c18ec02fSPetter Reinholdtsen  * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
23c18ec02fSPetter Reinholdtsen  * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
24c18ec02fSPetter Reinholdtsen  * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
25c18ec02fSPetter Reinholdtsen  * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.  IN NO EVENT WILL
26c18ec02fSPetter Reinholdtsen  * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
27c18ec02fSPetter Reinholdtsen  * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
28c18ec02fSPetter Reinholdtsen  * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
29c18ec02fSPetter Reinholdtsen  * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
30c18ec02fSPetter Reinholdtsen  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
31c18ec02fSPetter Reinholdtsen  */
32c18ec02fSPetter Reinholdtsen 
33c18ec02fSPetter Reinholdtsen #include <stdlib.h>
34c18ec02fSPetter Reinholdtsen #include <stdio.h>
35c18ec02fSPetter Reinholdtsen #include <string.h>
36c18ec02fSPetter Reinholdtsen #include <strings.h>
37c18ec02fSPetter Reinholdtsen #include <sys/types.h>
38c18ec02fSPetter Reinholdtsen #include <sys/socket.h>
39c18ec02fSPetter Reinholdtsen #include <netinet/in.h>
40c18ec02fSPetter Reinholdtsen #include <arpa/inet.h>
41c18ec02fSPetter Reinholdtsen #include <errno.h>
42c18ec02fSPetter Reinholdtsen #include <unistd.h>
43c18ec02fSPetter Reinholdtsen #include <signal.h>
44c18ec02fSPetter Reinholdtsen #include <setjmp.h>
45c18ec02fSPetter Reinholdtsen #include <netdb.h>
46c18ec02fSPetter Reinholdtsen #include <limits.h>
47c18ec02fSPetter Reinholdtsen 
48c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi.h>
49c18ec02fSPetter Reinholdtsen #include <ipmitool/log.h>
50c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_intf.h>
51c18ec02fSPetter Reinholdtsen #include <ipmitool/helper.h>
52c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_constants.h>
53c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_strings.h>
54c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_lanp.h>
55c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_channel.h>
5690e21344SZdenek Styblik #include <ipmitool/ipmi_user.h>
57c18ec02fSPetter Reinholdtsen 
58c18ec02fSPetter Reinholdtsen extern int verbose;
59c18ec02fSPetter Reinholdtsen 
6075843864SZdenek Styblik static void print_lan_alert_print_usage(void);
6175843864SZdenek Styblik static void print_lan_alert_set_usage(void);
6275843864SZdenek Styblik static void print_lan_set_usage(void);
6375843864SZdenek Styblik static void print_lan_set_access_usage(void);
6475843864SZdenek Styblik static void print_lan_set_arp_usage(void);
6575843864SZdenek Styblik static void print_lan_set_auth_usage(void);
6675843864SZdenek Styblik static void print_lan_set_bakgw_usage(void);
6775843864SZdenek Styblik static void print_lan_set_cipher_privs_usage(void);
6875843864SZdenek Styblik static void print_lan_set_defgw_usage(void);
6975843864SZdenek Styblik static void print_lan_set_ipsrc_usage(void);
7075843864SZdenek Styblik static void print_lan_set_snmp_usage(void);
7175843864SZdenek Styblik static void print_lan_set_vlan_usage(void);
7275843864SZdenek Styblik static void print_lan_usage(void);
7375843864SZdenek Styblik 
74c18ec02fSPetter Reinholdtsen /* is_lan_channel - Check if channel is LAN medium
75c18ec02fSPetter Reinholdtsen  *
76c18ec02fSPetter Reinholdtsen  * return 1 if channel is LAN
77c18ec02fSPetter Reinholdtsen  * return 0 if channel is not LAN
78c18ec02fSPetter Reinholdtsen  *
79c18ec02fSPetter Reinholdtsen  * @intf:    ipmi interface handle
80c18ec02fSPetter Reinholdtsen  * @chan:    channel number to check
81c18ec02fSPetter Reinholdtsen  */
82c18ec02fSPetter Reinholdtsen static int
is_lan_channel(struct ipmi_intf * intf,uint8_t chan)83c18ec02fSPetter Reinholdtsen is_lan_channel(struct ipmi_intf * intf, uint8_t chan)
84c18ec02fSPetter Reinholdtsen {
85c18ec02fSPetter Reinholdtsen 	uint8_t medium;
86c18ec02fSPetter Reinholdtsen 
87c18ec02fSPetter Reinholdtsen 	if (chan < 1 || chan > IPMI_CHANNEL_NUMBER_MAX)
88c18ec02fSPetter Reinholdtsen 		return 0;
89c18ec02fSPetter Reinholdtsen 
90c18ec02fSPetter Reinholdtsen 	medium = ipmi_get_channel_medium(intf, chan);
91c18ec02fSPetter Reinholdtsen 
92c18ec02fSPetter Reinholdtsen 	if (medium == IPMI_CHANNEL_MEDIUM_LAN ||
93c18ec02fSPetter Reinholdtsen 	    medium == IPMI_CHANNEL_MEDIUM_LAN_OTHER)
94c18ec02fSPetter Reinholdtsen 		return 1;
95c18ec02fSPetter Reinholdtsen 
96c18ec02fSPetter Reinholdtsen 	return 0;
97c18ec02fSPetter Reinholdtsen }
98c18ec02fSPetter Reinholdtsen 
99c18ec02fSPetter Reinholdtsen /* find_lan_channel - Find first channel that is LAN
100c18ec02fSPetter Reinholdtsen  *
101c18ec02fSPetter Reinholdtsen  * return channel number if successful
102c18ec02fSPetter Reinholdtsen  * return 0 if no lan channel found, which is not a valid LAN channel
103c18ec02fSPetter Reinholdtsen  *
104c18ec02fSPetter Reinholdtsen  * @intf:    ipmi interface handle
105c18ec02fSPetter Reinholdtsen  * @start:   channel number to start searching from
106c18ec02fSPetter Reinholdtsen  */
107c18ec02fSPetter Reinholdtsen static uint8_t
find_lan_channel(struct ipmi_intf * intf,uint8_t start)108c18ec02fSPetter Reinholdtsen find_lan_channel(struct ipmi_intf * intf, uint8_t start)
109c18ec02fSPetter Reinholdtsen {
110c18ec02fSPetter Reinholdtsen 	uint8_t chan = 0;
111c18ec02fSPetter Reinholdtsen 
112c18ec02fSPetter Reinholdtsen 	for (chan = start; chan < IPMI_CHANNEL_NUMBER_MAX; chan++) {
113c18ec02fSPetter Reinholdtsen 		if (is_lan_channel(intf, chan)) {
114c18ec02fSPetter Reinholdtsen 			return chan;
115c18ec02fSPetter Reinholdtsen 		}
116c18ec02fSPetter Reinholdtsen 	}
117c18ec02fSPetter Reinholdtsen 	return 0;
118c18ec02fSPetter Reinholdtsen }
119c18ec02fSPetter Reinholdtsen 
120c18ec02fSPetter Reinholdtsen /* get_lan_param_select - Query BMC for LAN parameter data
121c18ec02fSPetter Reinholdtsen  *
122c18ec02fSPetter Reinholdtsen  * return pointer to lan_param if successful
123c18ec02fSPetter Reinholdtsen  * if parameter not supported then
124c18ec02fSPetter Reinholdtsen  *   return pointer to lan_param with
125c18ec02fSPetter Reinholdtsen  *   lan_param->data == NULL and lan_param->data_len == 0
126c18ec02fSPetter Reinholdtsen  * return NULL on error
127c18ec02fSPetter Reinholdtsen  *
128c18ec02fSPetter Reinholdtsen  * @intf:    ipmi interface handle
129c18ec02fSPetter Reinholdtsen  * @chan:    ipmi channel
130c18ec02fSPetter Reinholdtsen  * @param:   lan parameter id
131c18ec02fSPetter Reinholdtsen  * @select:  lan parameter set selector
132c18ec02fSPetter Reinholdtsen  */
133c18ec02fSPetter Reinholdtsen static struct lan_param *
get_lan_param_select(struct ipmi_intf * intf,uint8_t chan,int param,int select)134c18ec02fSPetter Reinholdtsen get_lan_param_select(struct ipmi_intf * intf, uint8_t chan, int param, int select)
135c18ec02fSPetter Reinholdtsen {
136c18ec02fSPetter Reinholdtsen 	struct lan_param * p = NULL;
137c18ec02fSPetter Reinholdtsen 	struct ipmi_rs * rsp;
138c18ec02fSPetter Reinholdtsen 	struct ipmi_rq req;
139c18ec02fSPetter Reinholdtsen 	int i = 0;
140c18ec02fSPetter Reinholdtsen 	uint8_t msg_data[4];
141c18ec02fSPetter Reinholdtsen 
142c18ec02fSPetter Reinholdtsen 	for (i = 0; ipmi_lan_params[i].cmd != (-1); i++) {
143c18ec02fSPetter Reinholdtsen 		if (ipmi_lan_params[i].cmd == param) {
144c18ec02fSPetter Reinholdtsen 			p = &ipmi_lan_params[i];
145c18ec02fSPetter Reinholdtsen 			break;
146c18ec02fSPetter Reinholdtsen 		}
147c18ec02fSPetter Reinholdtsen 	}
148c18ec02fSPetter Reinholdtsen 
149c18ec02fSPetter Reinholdtsen 	if (p == NULL) {
150c18ec02fSPetter Reinholdtsen 		lprintf(LOG_INFO, "Get LAN Parameter failed: Unknown parameter.");
151c18ec02fSPetter Reinholdtsen 		return NULL;
152c18ec02fSPetter Reinholdtsen 	}
153c18ec02fSPetter Reinholdtsen 
154c18ec02fSPetter Reinholdtsen 	msg_data[0] = chan;
155c18ec02fSPetter Reinholdtsen 	msg_data[1] = p->cmd;
156c18ec02fSPetter Reinholdtsen 	msg_data[2] = select;
157c18ec02fSPetter Reinholdtsen 	msg_data[3] = 0;
158c18ec02fSPetter Reinholdtsen 
159c18ec02fSPetter Reinholdtsen 	memset(&req, 0, sizeof(req));
160c18ec02fSPetter Reinholdtsen 	req.msg.netfn    = IPMI_NETFN_TRANSPORT;
161c18ec02fSPetter Reinholdtsen 	req.msg.cmd      = IPMI_LAN_GET_CONFIG;
162c18ec02fSPetter Reinholdtsen 	req.msg.data     = msg_data;
163c18ec02fSPetter Reinholdtsen 	req.msg.data_len = 4;
164c18ec02fSPetter Reinholdtsen 
165c18ec02fSPetter Reinholdtsen 	rsp = intf->sendrecv(intf, &req);
166c18ec02fSPetter Reinholdtsen 	if (rsp == NULL) {
167c18ec02fSPetter Reinholdtsen 		lprintf(LOG_INFO, "Get LAN Parameter '%s' command failed", p->desc);
168c18ec02fSPetter Reinholdtsen 		return NULL;
169c18ec02fSPetter Reinholdtsen 	}
170c18ec02fSPetter Reinholdtsen 
171c18ec02fSPetter Reinholdtsen 	switch (rsp->ccode)
172c18ec02fSPetter Reinholdtsen 	{
173c18ec02fSPetter Reinholdtsen 	case 0x00: /* successful */
174c18ec02fSPetter Reinholdtsen 		break;
175c18ec02fSPetter Reinholdtsen 
176c18ec02fSPetter Reinholdtsen 	case 0x80: /* parameter not supported */
177c18ec02fSPetter Reinholdtsen 	case 0xc9: /* parameter out of range */
178c18ec02fSPetter Reinholdtsen 	case 0xcc: /* invalid data field in request */
179c18ec02fSPetter Reinholdtsen 
180c18ec02fSPetter Reinholdtsen 		/* these completion codes usually mean parameter not supported */
181c18ec02fSPetter Reinholdtsen 		lprintf(LOG_INFO, "Get LAN Parameter '%s' command failed: %s",
182c18ec02fSPetter Reinholdtsen 			p->desc, val2str(rsp->ccode, completion_code_vals));
183c18ec02fSPetter Reinholdtsen 		p->data = NULL;
184c18ec02fSPetter Reinholdtsen 		p->data_len = 0;
185c18ec02fSPetter Reinholdtsen 		return p;
186c18ec02fSPetter Reinholdtsen 
187c18ec02fSPetter Reinholdtsen 	default:
188c18ec02fSPetter Reinholdtsen 
189c18ec02fSPetter Reinholdtsen 		/* other completion codes are treated as error */
190c18ec02fSPetter Reinholdtsen 		lprintf(LOG_INFO, "Get LAN Parameter '%s' command failed: %s",
191c18ec02fSPetter Reinholdtsen 			p->desc, val2str(rsp->ccode, completion_code_vals));
192c18ec02fSPetter Reinholdtsen 		return NULL;
193c18ec02fSPetter Reinholdtsen 	}
194c18ec02fSPetter Reinholdtsen 
195c18ec02fSPetter Reinholdtsen 	p->data = rsp->data + 1;
196c18ec02fSPetter Reinholdtsen 	p->data_len = rsp->data_len - 1;
197c18ec02fSPetter Reinholdtsen 
198c18ec02fSPetter Reinholdtsen 	return p;
199c18ec02fSPetter Reinholdtsen }
200c18ec02fSPetter Reinholdtsen 
201c18ec02fSPetter Reinholdtsen /* get_lan_param - Query BMC for LAN parameter data
202c18ec02fSPetter Reinholdtsen  *
203c18ec02fSPetter Reinholdtsen  * return pointer to lan_param if successful
204c18ec02fSPetter Reinholdtsen  * if parameter not supported then
205c18ec02fSPetter Reinholdtsen  *   return pointer to lan_param with
206c18ec02fSPetter Reinholdtsen  *   lan_param->data == NULL and lan_param->data_len == 0
207c18ec02fSPetter Reinholdtsen  * return NULL on error
208c18ec02fSPetter Reinholdtsen  *
209c18ec02fSPetter Reinholdtsen  * @intf:    ipmi interface handle
210c18ec02fSPetter Reinholdtsen  * @chan:    ipmi channel
211c18ec02fSPetter Reinholdtsen  * @param:   lan parameter id
212c18ec02fSPetter Reinholdtsen  */
213c18ec02fSPetter Reinholdtsen static struct lan_param *
get_lan_param(struct ipmi_intf * intf,uint8_t chan,int param)214c18ec02fSPetter Reinholdtsen get_lan_param(struct ipmi_intf * intf, uint8_t chan, int param)
215c18ec02fSPetter Reinholdtsen {
216c18ec02fSPetter Reinholdtsen 	return get_lan_param_select(intf, chan, param, 0);
217c18ec02fSPetter Reinholdtsen }
218c18ec02fSPetter Reinholdtsen 
219c18ec02fSPetter Reinholdtsen /* set_lan_param_wait - Wait for Set LAN Parameter command to complete
220c18ec02fSPetter Reinholdtsen  *
221c18ec02fSPetter Reinholdtsen  * On some systems this can take unusually long so we wait for the write
222c18ec02fSPetter Reinholdtsen  * to take effect and verify that the data was written successfully
223c18ec02fSPetter Reinholdtsen  * before continuing or retrying.
224c18ec02fSPetter Reinholdtsen  *
225c18ec02fSPetter Reinholdtsen  * returns 0 on success
226c18ec02fSPetter Reinholdtsen  * returns -1 on error
227c18ec02fSPetter Reinholdtsen  *
228c18ec02fSPetter Reinholdtsen  * @intf:    ipmi interface handle
229c18ec02fSPetter Reinholdtsen  * @chan:    ipmi channel
230c18ec02fSPetter Reinholdtsen  * @param:   lan parameter id
231c18ec02fSPetter Reinholdtsen  * @data:    lan parameter data
232c18ec02fSPetter Reinholdtsen  * @len:     length of lan parameter data
233c18ec02fSPetter Reinholdtsen  */
234c18ec02fSPetter Reinholdtsen static int
set_lan_param_wait(struct ipmi_intf * intf,uint8_t chan,int param,uint8_t * data,int len)235c18ec02fSPetter Reinholdtsen set_lan_param_wait(struct ipmi_intf * intf, uint8_t chan,
236c18ec02fSPetter Reinholdtsen 		   int param, uint8_t * data, int len)
237c18ec02fSPetter Reinholdtsen {
238c18ec02fSPetter Reinholdtsen 	struct lan_param * p;
239c18ec02fSPetter Reinholdtsen 	int retry = 10;		/* 10 retries */
240c18ec02fSPetter Reinholdtsen 
241c18ec02fSPetter Reinholdtsen 	lprintf(LOG_DEBUG, "Waiting for Set LAN Parameter to complete...");
242c18ec02fSPetter Reinholdtsen 	if (verbose > 1)
243c18ec02fSPetter Reinholdtsen 		printbuf(data, len, "SET DATA");
244c18ec02fSPetter Reinholdtsen 
245c18ec02fSPetter Reinholdtsen 	for (;;) {
246c18ec02fSPetter Reinholdtsen 		p = get_lan_param(intf, chan, param);
247c18ec02fSPetter Reinholdtsen 		if (p == NULL) {
248c18ec02fSPetter Reinholdtsen 			sleep(IPMI_LANP_TIMEOUT);
249c18ec02fSPetter Reinholdtsen 			if (retry-- == 0)
250c18ec02fSPetter Reinholdtsen 				return -1;
251c18ec02fSPetter Reinholdtsen 			continue;
252c18ec02fSPetter Reinholdtsen 		}
253c18ec02fSPetter Reinholdtsen 		if (verbose > 1)
254c18ec02fSPetter Reinholdtsen 			printbuf(p->data, p->data_len, "READ DATA");
255c18ec02fSPetter Reinholdtsen 		if (p->data_len != len) {
256c18ec02fSPetter Reinholdtsen 			sleep(IPMI_LANP_TIMEOUT);
257c18ec02fSPetter Reinholdtsen 			if (retry-- == 0) {
258c18ec02fSPetter Reinholdtsen 				lprintf(LOG_WARNING, "Mismatched data lengths: %d != %d",
259c18ec02fSPetter Reinholdtsen 				       p->data_len, len);
260c18ec02fSPetter Reinholdtsen 				return -1;
261c18ec02fSPetter Reinholdtsen 			}
262c18ec02fSPetter Reinholdtsen 			continue;
263c18ec02fSPetter Reinholdtsen 		}
264c18ec02fSPetter Reinholdtsen 		if (memcmp(data, p->data, len) != 0) {
265c18ec02fSPetter Reinholdtsen 			sleep(IPMI_LANP_TIMEOUT);
266c18ec02fSPetter Reinholdtsen 			if (retry-- == 0) {
267c18ec02fSPetter Reinholdtsen 				lprintf(LOG_WARNING, "LAN Parameter Data does not match!  "
268c18ec02fSPetter Reinholdtsen 				       "Write may have failed.");
269c18ec02fSPetter Reinholdtsen 				return -1;
270c18ec02fSPetter Reinholdtsen 			}
271c18ec02fSPetter Reinholdtsen 			continue;
272c18ec02fSPetter Reinholdtsen 		}
273c18ec02fSPetter Reinholdtsen 		break;
274c18ec02fSPetter Reinholdtsen 	}
275c18ec02fSPetter Reinholdtsen 	return 0;
276c18ec02fSPetter Reinholdtsen }
277c18ec02fSPetter Reinholdtsen 
278c18ec02fSPetter Reinholdtsen /* __set_lan_param - Write LAN Parameter data to BMC
279c18ec02fSPetter Reinholdtsen  *
280c18ec02fSPetter Reinholdtsen  * This function does the actual work of writing the LAN parameter
281c18ec02fSPetter Reinholdtsen  * to the BMC and calls set_lan_param_wait() if requested.
282c18ec02fSPetter Reinholdtsen  *
283c18ec02fSPetter Reinholdtsen  * returns 0 on success
284c18ec02fSPetter Reinholdtsen  * returns -1 on error
285c18ec02fSPetter Reinholdtsen  *
286c18ec02fSPetter Reinholdtsen  * @intf:    ipmi interface handle
287c18ec02fSPetter Reinholdtsen  * @chan:    ipmi channel
288c18ec02fSPetter Reinholdtsen  * @param:   lan parameter id
289c18ec02fSPetter Reinholdtsen  * @data:    lan parameter data
290c18ec02fSPetter Reinholdtsen  * @len:     length of lan parameter data
291c18ec02fSPetter Reinholdtsen  * @wait:    whether to wait for write completion
292c18ec02fSPetter Reinholdtsen  */
293c18ec02fSPetter Reinholdtsen static int
__set_lan_param(struct ipmi_intf * intf,uint8_t chan,int param,uint8_t * data,int len,int wait)294c18ec02fSPetter Reinholdtsen __set_lan_param(struct ipmi_intf * intf, uint8_t chan,
295c18ec02fSPetter Reinholdtsen 		int param, uint8_t * data, int len, int wait)
296c18ec02fSPetter Reinholdtsen {
297c18ec02fSPetter Reinholdtsen 	struct ipmi_rs * rsp;
298c18ec02fSPetter Reinholdtsen 	struct ipmi_rq req;
299c18ec02fSPetter Reinholdtsen 	uint8_t msg_data[32];
300c18ec02fSPetter Reinholdtsen 
301c18ec02fSPetter Reinholdtsen 	if (param < 0)
302c18ec02fSPetter Reinholdtsen 		return -1;
303c18ec02fSPetter Reinholdtsen 
304c18ec02fSPetter Reinholdtsen 	msg_data[0] = chan;
305c18ec02fSPetter Reinholdtsen 	msg_data[1] = param;
306c18ec02fSPetter Reinholdtsen 
307c18ec02fSPetter Reinholdtsen 	memcpy(&msg_data[2], data, len);
308c18ec02fSPetter Reinholdtsen 	memset(&req, 0, sizeof(req));
309c18ec02fSPetter Reinholdtsen 	req.msg.netfn = IPMI_NETFN_TRANSPORT;
310c18ec02fSPetter Reinholdtsen 	req.msg.cmd = IPMI_LAN_SET_CONFIG;
311c18ec02fSPetter Reinholdtsen 	req.msg.data = msg_data;
312c18ec02fSPetter Reinholdtsen 	req.msg.data_len = len+2;
313c18ec02fSPetter Reinholdtsen 
314c18ec02fSPetter Reinholdtsen 	rsp = intf->sendrecv(intf, &req);
315c18ec02fSPetter Reinholdtsen 	if (rsp == NULL) {
316c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Set LAN Parameter failed");
317c18ec02fSPetter Reinholdtsen 		return -1;
318c18ec02fSPetter Reinholdtsen 	}
319c18ec02fSPetter Reinholdtsen 	if ((rsp->ccode > 0) && (wait != 0)) {
320c18ec02fSPetter Reinholdtsen 		lprintf(LOG_DEBUG, "Warning: Set LAN Parameter failed: %s",
321c18ec02fSPetter Reinholdtsen 			val2str(rsp->ccode, completion_code_vals));
322c18ec02fSPetter Reinholdtsen 		if (rsp->ccode == 0xcc) {
323c18ec02fSPetter Reinholdtsen 			/* retry hack for invalid data field ccode */
324c18ec02fSPetter Reinholdtsen 			int retry = 10;		/* 10 retries */
325c18ec02fSPetter Reinholdtsen 			lprintf(LOG_DEBUG, "Retrying...");
326c18ec02fSPetter Reinholdtsen 			for (;;) {
327c18ec02fSPetter Reinholdtsen 				if (retry-- == 0)
328c18ec02fSPetter Reinholdtsen 					break;
329c18ec02fSPetter Reinholdtsen 				sleep(IPMI_LANP_TIMEOUT);
330c18ec02fSPetter Reinholdtsen 				rsp = intf->sendrecv(intf, &req);
331c18ec02fSPetter Reinholdtsen 				if (rsp == NULL)
332c18ec02fSPetter Reinholdtsen 					continue;
333c18ec02fSPetter Reinholdtsen 				if (rsp->ccode > 0)
334c18ec02fSPetter Reinholdtsen 					continue;
335c18ec02fSPetter Reinholdtsen 				return set_lan_param_wait(intf, chan, param, data, len);
336c18ec02fSPetter Reinholdtsen 			}
337c18ec02fSPetter Reinholdtsen 		}
338c18ec02fSPetter Reinholdtsen 		else if (rsp->ccode != 0xff) {
339c18ec02fSPetter Reinholdtsen 			/* let 0xff ccode continue */
340c18ec02fSPetter Reinholdtsen 			return -1;
341c18ec02fSPetter Reinholdtsen 		}
342c18ec02fSPetter Reinholdtsen 	}
343c18ec02fSPetter Reinholdtsen 
344c18ec02fSPetter Reinholdtsen 	if (wait == 0)
345c18ec02fSPetter Reinholdtsen 		return 0;
346c18ec02fSPetter Reinholdtsen 	return set_lan_param_wait(intf, chan, param, data, len);
347c18ec02fSPetter Reinholdtsen }
348c18ec02fSPetter Reinholdtsen 
349c18ec02fSPetter Reinholdtsen /* ipmi_lanp_lock_state - Retrieve set-in-progress status
350c18ec02fSPetter Reinholdtsen  *
351c18ec02fSPetter Reinholdtsen  * returns one of:
352c18ec02fSPetter Reinholdtsen  *  IPMI_LANP_WRITE_UNLOCK
353c18ec02fSPetter Reinholdtsen  *  IPMI_LANP_WRITE_LOCK
354c18ec02fSPetter Reinholdtsen  *  IPMI_LANP_WRITE_COMMIT
355c18ec02fSPetter Reinholdtsen  *  -1 on error/if not supported
356c18ec02fSPetter Reinholdtsen  *
357c18ec02fSPetter Reinholdtsen  * @intf:    ipmi interface handle
358c18ec02fSPetter Reinholdtsen  * @chan:    ipmi channel
359c18ec02fSPetter Reinholdtsen  */
360c18ec02fSPetter Reinholdtsen static int
ipmi_lanp_lock_state(struct ipmi_intf * intf,uint8_t chan)361c18ec02fSPetter Reinholdtsen ipmi_lanp_lock_state(struct ipmi_intf * intf, uint8_t chan)
362c18ec02fSPetter Reinholdtsen {
363c18ec02fSPetter Reinholdtsen 	struct lan_param * p;
364c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_SET_IN_PROGRESS);
365c18ec02fSPetter Reinholdtsen 	if (p == NULL)
366c18ec02fSPetter Reinholdtsen 		return -1;
367c18ec02fSPetter Reinholdtsen 	if (p->data == NULL)
368c18ec02fSPetter Reinholdtsen 		return -1;
369c18ec02fSPetter Reinholdtsen 	return (p->data[0] & 3);
370c18ec02fSPetter Reinholdtsen }
371c18ec02fSPetter Reinholdtsen 
372c18ec02fSPetter Reinholdtsen /* ipmi_lanp_lock - Lock set-in-progress bits for our use
373c18ec02fSPetter Reinholdtsen  *
374c18ec02fSPetter Reinholdtsen  * Write to the Set-In-Progress LAN parameter to indicate
375c18ec02fSPetter Reinholdtsen  * to other management software that we are modifying parameters.
376c18ec02fSPetter Reinholdtsen  *
377c18ec02fSPetter Reinholdtsen  * No meaningful return value because this is an optional
378c18ec02fSPetter Reinholdtsen  * requirement in IPMI spec and not found on many BMCs.
379c18ec02fSPetter Reinholdtsen  *
380c18ec02fSPetter Reinholdtsen  * @intf:    ipmi interface handle
381c18ec02fSPetter Reinholdtsen  * @chan:    ipmi channel
382c18ec02fSPetter Reinholdtsen  */
383c18ec02fSPetter Reinholdtsen static void
ipmi_lanp_lock(struct ipmi_intf * intf,uint8_t chan)384c18ec02fSPetter Reinholdtsen ipmi_lanp_lock(struct ipmi_intf * intf, uint8_t chan)
385c18ec02fSPetter Reinholdtsen {
386c18ec02fSPetter Reinholdtsen 	uint8_t val = IPMI_LANP_WRITE_LOCK;
387c18ec02fSPetter Reinholdtsen 	int retry = 3;
388c18ec02fSPetter Reinholdtsen 
389c18ec02fSPetter Reinholdtsen 	for (;;) {
390c18ec02fSPetter Reinholdtsen 		int state = ipmi_lanp_lock_state(intf, chan);
391c18ec02fSPetter Reinholdtsen 		if (state == -1)
392c18ec02fSPetter Reinholdtsen 			break;
393c18ec02fSPetter Reinholdtsen 		if (state == val)
394c18ec02fSPetter Reinholdtsen 			break;
395c18ec02fSPetter Reinholdtsen 		if (retry-- == 0)
396c18ec02fSPetter Reinholdtsen 			break;
397c18ec02fSPetter Reinholdtsen 		__set_lan_param(intf, chan, IPMI_LANP_SET_IN_PROGRESS,
398c18ec02fSPetter Reinholdtsen 				&val, 1, 0);
399c18ec02fSPetter Reinholdtsen 	}
400c18ec02fSPetter Reinholdtsen }
401c18ec02fSPetter Reinholdtsen 
402c18ec02fSPetter Reinholdtsen /* ipmi_lanp_unlock - Unlock set-in-progress bits
403c18ec02fSPetter Reinholdtsen  *
404c18ec02fSPetter Reinholdtsen  * Write to the Set-In-Progress LAN parameter, first with
405c18ec02fSPetter Reinholdtsen  * a "commit" instruction and then unlocking it.
406c18ec02fSPetter Reinholdtsen  *
407c18ec02fSPetter Reinholdtsen  * No meaningful return value because this is an optional
408c18ec02fSPetter Reinholdtsen  * requirement in IPMI spec and not found on many BMCs.
409c18ec02fSPetter Reinholdtsen  *
410c18ec02fSPetter Reinholdtsen  * @intf:    ipmi interface handle
411c18ec02fSPetter Reinholdtsen  * @chan:    ipmi channel
412c18ec02fSPetter Reinholdtsen  */
413c18ec02fSPetter Reinholdtsen static void
ipmi_lanp_unlock(struct ipmi_intf * intf,uint8_t chan)414c18ec02fSPetter Reinholdtsen ipmi_lanp_unlock(struct ipmi_intf * intf, uint8_t chan)
415c18ec02fSPetter Reinholdtsen {
416c18ec02fSPetter Reinholdtsen 	uint8_t val = IPMI_LANP_WRITE_COMMIT;
417c18ec02fSPetter Reinholdtsen 	int rc;
418c18ec02fSPetter Reinholdtsen 
419c18ec02fSPetter Reinholdtsen 	rc = __set_lan_param(intf, chan, IPMI_LANP_SET_IN_PROGRESS, &val, 1, 0);
420c18ec02fSPetter Reinholdtsen 	if (rc < 0) {
421c18ec02fSPetter Reinholdtsen 		lprintf(LOG_DEBUG, "LAN Parameter Commit not supported");
422c18ec02fSPetter Reinholdtsen 	}
423c18ec02fSPetter Reinholdtsen 
424c18ec02fSPetter Reinholdtsen 	val = IPMI_LANP_WRITE_UNLOCK;
425c18ec02fSPetter Reinholdtsen 	__set_lan_param(intf, chan, IPMI_LANP_SET_IN_PROGRESS, &val, 1, 0);
426c18ec02fSPetter Reinholdtsen }
427c18ec02fSPetter Reinholdtsen 
428c18ec02fSPetter Reinholdtsen /* set_lan_param - Wrap LAN parameter write with set-in-progress lock
429c18ec02fSPetter Reinholdtsen  *
430c18ec02fSPetter Reinholdtsen  * Returns value from __set_lan_param()
431c18ec02fSPetter Reinholdtsen  *
432c18ec02fSPetter Reinholdtsen  * @intf:    ipmi interface handle
433c18ec02fSPetter Reinholdtsen  * @chan:    ipmi channel
434c18ec02fSPetter Reinholdtsen  * @param:   lan parameter id
435c18ec02fSPetter Reinholdtsen  * @data:    lan parameter data
436c18ec02fSPetter Reinholdtsen  * @len:     length of lan parameter data
437c18ec02fSPetter Reinholdtsen  */
438c18ec02fSPetter Reinholdtsen static int
set_lan_param(struct ipmi_intf * intf,uint8_t chan,int param,uint8_t * data,int len)439c18ec02fSPetter Reinholdtsen set_lan_param(struct ipmi_intf * intf, uint8_t chan,
440c18ec02fSPetter Reinholdtsen 	      int param, uint8_t * data, int len)
441c18ec02fSPetter Reinholdtsen {
442c18ec02fSPetter Reinholdtsen 	int rc;
443c18ec02fSPetter Reinholdtsen 	ipmi_lanp_lock(intf, chan);
444c18ec02fSPetter Reinholdtsen 	rc = __set_lan_param(intf, chan, param, data, len, 1);
445c18ec02fSPetter Reinholdtsen 	ipmi_lanp_unlock(intf, chan);
446c18ec02fSPetter Reinholdtsen 	return rc;
447c18ec02fSPetter Reinholdtsen }
448c18ec02fSPetter Reinholdtsen 
449c18ec02fSPetter Reinholdtsen /* set_lan_param_nowait - Wrap LAN parameter write without set-in-progress lock
450c18ec02fSPetter Reinholdtsen  *
451c18ec02fSPetter Reinholdtsen  * Returns value from __set_lan_param()
452c18ec02fSPetter Reinholdtsen  *
453c18ec02fSPetter Reinholdtsen  * @intf:    ipmi interface handle
454c18ec02fSPetter Reinholdtsen  * @chan:    ipmi channel
455c18ec02fSPetter Reinholdtsen  * @param:   lan parameter id
456c18ec02fSPetter Reinholdtsen  * @data:    lan parameter data
457c18ec02fSPetter Reinholdtsen  * @len:     length of lan parameter data
458c18ec02fSPetter Reinholdtsen  */
459c18ec02fSPetter Reinholdtsen static int
set_lan_param_nowait(struct ipmi_intf * intf,uint8_t chan,int param,uint8_t * data,int len)460c18ec02fSPetter Reinholdtsen set_lan_param_nowait(struct ipmi_intf * intf, uint8_t chan,
461c18ec02fSPetter Reinholdtsen 		     int param, uint8_t * data, int len)
462c18ec02fSPetter Reinholdtsen {
463c18ec02fSPetter Reinholdtsen 	int rc;
464c18ec02fSPetter Reinholdtsen 	ipmi_lanp_lock(intf, chan);
465c18ec02fSPetter Reinholdtsen 	rc = __set_lan_param(intf, chan, param, data, len, 0);
466c18ec02fSPetter Reinholdtsen 	ipmi_lanp_unlock(intf, chan);
467c18ec02fSPetter Reinholdtsen 	return rc;
468c18ec02fSPetter Reinholdtsen }
469c18ec02fSPetter Reinholdtsen 
470c18ec02fSPetter Reinholdtsen static int
lan_set_arp_interval(struct ipmi_intf * intf,uint8_t chan,uint8_t ival)471c18ec02fSPetter Reinholdtsen lan_set_arp_interval(struct ipmi_intf * intf, uint8_t chan, uint8_t ival)
472c18ec02fSPetter Reinholdtsen {
473c18ec02fSPetter Reinholdtsen 	struct lan_param *lp;
474c18ec02fSPetter Reinholdtsen 	uint8_t interval = 0;
475c18ec02fSPetter Reinholdtsen 	int rc = 0;
476c18ec02fSPetter Reinholdtsen 
477c18ec02fSPetter Reinholdtsen 	lp = get_lan_param(intf, chan, IPMI_LANP_GRAT_ARP);
478c18ec02fSPetter Reinholdtsen 	if (lp == NULL)
479c18ec02fSPetter Reinholdtsen 		return -1;
480c18ec02fSPetter Reinholdtsen 	if (lp->data == NULL)
481c18ec02fSPetter Reinholdtsen 		return -1;
482c18ec02fSPetter Reinholdtsen 
483c18ec02fSPetter Reinholdtsen 	if (ival != 0) {
484c18ec02fSPetter Reinholdtsen 		if (((UINT8_MAX - 1) / 2) < ival) {
485c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Given ARP interval '%u' is too big.", ival);
486c18ec02fSPetter Reinholdtsen 			return (-1);
487c18ec02fSPetter Reinholdtsen 		}
488c18ec02fSPetter Reinholdtsen 		interval = (ival * 2) - 1;
489c18ec02fSPetter Reinholdtsen 		rc = set_lan_param(intf, chan, IPMI_LANP_GRAT_ARP, &interval, 1);
490c18ec02fSPetter Reinholdtsen 	} else {
491c18ec02fSPetter Reinholdtsen 		interval = lp->data[0];
492c18ec02fSPetter Reinholdtsen 	}
493c18ec02fSPetter Reinholdtsen 
494c18ec02fSPetter Reinholdtsen 	printf("BMC-generated Gratuitous ARP interval:  %.1f seconds\n",
495c18ec02fSPetter Reinholdtsen 	       (float)((interval + 1) / 2));
496c18ec02fSPetter Reinholdtsen 
497c18ec02fSPetter Reinholdtsen 	return rc;
498c18ec02fSPetter Reinholdtsen }
499c18ec02fSPetter Reinholdtsen 
500c18ec02fSPetter Reinholdtsen static int
lan_set_arp_generate(struct ipmi_intf * intf,uint8_t chan,uint8_t ctl)501c18ec02fSPetter Reinholdtsen lan_set_arp_generate(struct ipmi_intf * intf,
502c18ec02fSPetter Reinholdtsen 		     uint8_t chan, uint8_t ctl)
503c18ec02fSPetter Reinholdtsen {
504c18ec02fSPetter Reinholdtsen 	struct lan_param *lp;
505c18ec02fSPetter Reinholdtsen 	uint8_t data;
506c18ec02fSPetter Reinholdtsen 
507c18ec02fSPetter Reinholdtsen 	lp = get_lan_param(intf, chan, IPMI_LANP_BMC_ARP);
508c18ec02fSPetter Reinholdtsen 	if (lp == NULL)
509c18ec02fSPetter Reinholdtsen 		return -1;
510c18ec02fSPetter Reinholdtsen 	if (lp->data == NULL)
511c18ec02fSPetter Reinholdtsen 		return -1;
512c18ec02fSPetter Reinholdtsen 	data = lp->data[0];
513c18ec02fSPetter Reinholdtsen 
514c18ec02fSPetter Reinholdtsen 	/* set arp generate bitflag */
515c18ec02fSPetter Reinholdtsen 	if (ctl == 0)
516c18ec02fSPetter Reinholdtsen 		data &= ~0x1;
517c18ec02fSPetter Reinholdtsen 	else
518c18ec02fSPetter Reinholdtsen 		data |= 0x1;
519c18ec02fSPetter Reinholdtsen 
520c18ec02fSPetter Reinholdtsen 	printf("%sabling BMC-generated Gratuitous ARPs\n", ctl ? "En" : "Dis");
521c18ec02fSPetter Reinholdtsen 	return set_lan_param(intf, chan, IPMI_LANP_BMC_ARP, &data, 1);
522c18ec02fSPetter Reinholdtsen }
523c18ec02fSPetter Reinholdtsen 
524c18ec02fSPetter Reinholdtsen static int
lan_set_arp_respond(struct ipmi_intf * intf,uint8_t chan,uint8_t ctl)525c18ec02fSPetter Reinholdtsen lan_set_arp_respond(struct ipmi_intf * intf,
526c18ec02fSPetter Reinholdtsen 		    uint8_t chan, uint8_t ctl)
527c18ec02fSPetter Reinholdtsen {
528c18ec02fSPetter Reinholdtsen 	struct lan_param *lp;
529c18ec02fSPetter Reinholdtsen 	uint8_t data;
530c18ec02fSPetter Reinholdtsen 
531c18ec02fSPetter Reinholdtsen 	lp = get_lan_param(intf, chan, IPMI_LANP_BMC_ARP);
532c18ec02fSPetter Reinholdtsen 	if (lp == NULL)
533c18ec02fSPetter Reinholdtsen 		return -1;
534c18ec02fSPetter Reinholdtsen 	if (lp->data == NULL)
535c18ec02fSPetter Reinholdtsen 		return -1;
536c18ec02fSPetter Reinholdtsen 	data = lp->data[0];
537c18ec02fSPetter Reinholdtsen 
538c18ec02fSPetter Reinholdtsen 	/* set arp response bitflag */
539c18ec02fSPetter Reinholdtsen 	if (ctl == 0)
540c18ec02fSPetter Reinholdtsen 		data &= ~0x2;
541c18ec02fSPetter Reinholdtsen 	else
542c18ec02fSPetter Reinholdtsen 		data |= 0x2;
543c18ec02fSPetter Reinholdtsen 
544c18ec02fSPetter Reinholdtsen 	printf("%sabling BMC-generated ARP responses\n", ctl ? "En" : "Dis");
545c18ec02fSPetter Reinholdtsen 	return set_lan_param(intf, chan, IPMI_LANP_BMC_ARP, &data, 1);
546c18ec02fSPetter Reinholdtsen }
547c18ec02fSPetter Reinholdtsen 
54845c54aadSZdenek Styblik /* TODO - probably move elsewhere */
priv_level_to_char(unsigned char priv_level)549c18ec02fSPetter Reinholdtsen static char priv_level_to_char(unsigned char priv_level)
550c18ec02fSPetter Reinholdtsen {
551c18ec02fSPetter Reinholdtsen 	char ret = 'X';
552c18ec02fSPetter Reinholdtsen 
553c18ec02fSPetter Reinholdtsen 	switch (priv_level)
554c18ec02fSPetter Reinholdtsen 	{
555c18ec02fSPetter Reinholdtsen 	case IPMI_SESSION_PRIV_CALLBACK:
556c18ec02fSPetter Reinholdtsen 		ret = 'c';
557c18ec02fSPetter Reinholdtsen 		break;
558c18ec02fSPetter Reinholdtsen 	case IPMI_SESSION_PRIV_USER:
559c18ec02fSPetter Reinholdtsen 		ret = 'u';
560c18ec02fSPetter Reinholdtsen 		break;
561c18ec02fSPetter Reinholdtsen 	case IPMI_SESSION_PRIV_OPERATOR:
562c18ec02fSPetter Reinholdtsen 		ret = 'o';
563c18ec02fSPetter Reinholdtsen 		break;
564c18ec02fSPetter Reinholdtsen 	case IPMI_SESSION_PRIV_ADMIN:
565c18ec02fSPetter Reinholdtsen 		ret = 'a';
566c18ec02fSPetter Reinholdtsen 		break;
567c18ec02fSPetter Reinholdtsen 	case IPMI_SESSION_PRIV_OEM:
568c18ec02fSPetter Reinholdtsen 		ret = 'O';
569c18ec02fSPetter Reinholdtsen 		break;
570c18ec02fSPetter Reinholdtsen 	}
571c18ec02fSPetter Reinholdtsen 
572c18ec02fSPetter Reinholdtsen  	return ret;
573c18ec02fSPetter Reinholdtsen }
574c18ec02fSPetter Reinholdtsen 
575c18ec02fSPetter Reinholdtsen 
576c18ec02fSPetter Reinholdtsen static int
ipmi_lan_print(struct ipmi_intf * intf,uint8_t chan)577c18ec02fSPetter Reinholdtsen ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan)
578c18ec02fSPetter Reinholdtsen {
579c18ec02fSPetter Reinholdtsen 	struct lan_param * p;
580c18ec02fSPetter Reinholdtsen 
581c18ec02fSPetter Reinholdtsen 	if (chan < 1 || chan > IPMI_CHANNEL_NUMBER_MAX) {
582c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Invalid Channel %d", chan);
583c18ec02fSPetter Reinholdtsen 		return -1;
584c18ec02fSPetter Reinholdtsen 	}
585c18ec02fSPetter Reinholdtsen 
586c18ec02fSPetter Reinholdtsen 	/* find type of channel and only accept 802.3 LAN */
587c18ec02fSPetter Reinholdtsen 	if (!is_lan_channel(intf, chan)) {
588c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Channel %d is not a LAN channel", chan);
589c18ec02fSPetter Reinholdtsen 		return -1;
590c18ec02fSPetter Reinholdtsen 	}
591c18ec02fSPetter Reinholdtsen 
592c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_SET_IN_PROGRESS);
593c18ec02fSPetter Reinholdtsen 	if (p == NULL)
594c18ec02fSPetter Reinholdtsen 		return -1;
595c18ec02fSPetter Reinholdtsen 	if (p->data != NULL) {
596c18ec02fSPetter Reinholdtsen 		printf("%-24s: ", p->desc);
597c18ec02fSPetter Reinholdtsen 		p->data[0] &= 3;
598c18ec02fSPetter Reinholdtsen 		switch (p->data[0]) {
599c18ec02fSPetter Reinholdtsen 		case 0:
600c18ec02fSPetter Reinholdtsen 			printf("Set Complete\n");
601c18ec02fSPetter Reinholdtsen 			break;
602c18ec02fSPetter Reinholdtsen 		case 1:
603c18ec02fSPetter Reinholdtsen 			printf("Set In Progress\n");
604c18ec02fSPetter Reinholdtsen 			break;
605c18ec02fSPetter Reinholdtsen 		case 2:
606c18ec02fSPetter Reinholdtsen 			printf("Commit Write\n");
607c18ec02fSPetter Reinholdtsen 			break;
608c18ec02fSPetter Reinholdtsen 		case 3:
609c18ec02fSPetter Reinholdtsen 			printf("Reserved\n");
610c18ec02fSPetter Reinholdtsen 			break;
611c18ec02fSPetter Reinholdtsen 		default:
612c18ec02fSPetter Reinholdtsen 			printf("Unknown\n");
613c18ec02fSPetter Reinholdtsen 		}
614c18ec02fSPetter Reinholdtsen 	}
615c18ec02fSPetter Reinholdtsen 
616c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_AUTH_TYPE);
617c18ec02fSPetter Reinholdtsen 	if (p == NULL)
618c18ec02fSPetter Reinholdtsen 		return -1;
619c18ec02fSPetter Reinholdtsen 	if (p->data != NULL) {
620c18ec02fSPetter Reinholdtsen 		printf("%-24s: %s%s%s%s%s\n", p->desc,
621c18ec02fSPetter Reinholdtsen 		       (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_NONE) ? "NONE " : "",
622c18ec02fSPetter Reinholdtsen 		       (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_MD2) ? "MD2 " : "",
623c18ec02fSPetter Reinholdtsen 		       (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_MD5) ? "MD5 " : "",
624c18ec02fSPetter Reinholdtsen 		       (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_PASSWORD) ? "PASSWORD " : "",
625c18ec02fSPetter Reinholdtsen 		       (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_OEM) ? "OEM " : "");
626c18ec02fSPetter Reinholdtsen 	}
627c18ec02fSPetter Reinholdtsen 
628c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_AUTH_TYPE_ENABLE);
629c18ec02fSPetter Reinholdtsen 	if (p == NULL)
630c18ec02fSPetter Reinholdtsen 		return -1;
631c18ec02fSPetter Reinholdtsen 	if (p->data != NULL) {
632c18ec02fSPetter Reinholdtsen 		printf("%-24s: Callback : %s%s%s%s%s\n", p->desc,
633c18ec02fSPetter Reinholdtsen 		       (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_NONE) ? "NONE " : "",
634c18ec02fSPetter Reinholdtsen 		       (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_MD2) ? "MD2 " : "",
635c18ec02fSPetter Reinholdtsen 		       (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_MD5) ? "MD5 " : "",
636c18ec02fSPetter Reinholdtsen 		       (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_PASSWORD) ? "PASSWORD " : "",
637c18ec02fSPetter Reinholdtsen 		       (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_OEM) ? "OEM " : "");
638c18ec02fSPetter Reinholdtsen 		printf("%-24s: User     : %s%s%s%s%s\n", "",
639c18ec02fSPetter Reinholdtsen 		       (p->data[1] & 1<<IPMI_SESSION_AUTHTYPE_NONE) ? "NONE " : "",
640c18ec02fSPetter Reinholdtsen 		       (p->data[1] & 1<<IPMI_SESSION_AUTHTYPE_MD2) ? "MD2 " : "",
641c18ec02fSPetter Reinholdtsen 		       (p->data[1] & 1<<IPMI_SESSION_AUTHTYPE_MD5) ? "MD5 " : "",
642c18ec02fSPetter Reinholdtsen 		       (p->data[1] & 1<<IPMI_SESSION_AUTHTYPE_PASSWORD) ? "PASSWORD " : "",
643c18ec02fSPetter Reinholdtsen 		       (p->data[1] & 1<<IPMI_SESSION_AUTHTYPE_OEM) ? "OEM " : "");
644c18ec02fSPetter Reinholdtsen 		printf("%-24s: Operator : %s%s%s%s%s\n", "",
645c18ec02fSPetter Reinholdtsen 		       (p->data[2] & 1<<IPMI_SESSION_AUTHTYPE_NONE) ? "NONE " : "",
646c18ec02fSPetter Reinholdtsen 		       (p->data[2] & 1<<IPMI_SESSION_AUTHTYPE_MD2) ? "MD2 " : "",
647c18ec02fSPetter Reinholdtsen 		       (p->data[2] & 1<<IPMI_SESSION_AUTHTYPE_MD5) ? "MD5 " : "",
648c18ec02fSPetter Reinholdtsen 		       (p->data[2] & 1<<IPMI_SESSION_AUTHTYPE_PASSWORD) ? "PASSWORD " : "",
649c18ec02fSPetter Reinholdtsen 		       (p->data[2] & 1<<IPMI_SESSION_AUTHTYPE_OEM) ? "OEM " : "");
650c18ec02fSPetter Reinholdtsen 		printf("%-24s: Admin    : %s%s%s%s%s\n", "",
651c18ec02fSPetter Reinholdtsen 		       (p->data[3] & 1<<IPMI_SESSION_AUTHTYPE_NONE) ? "NONE " : "",
652c18ec02fSPetter Reinholdtsen 		       (p->data[3] & 1<<IPMI_SESSION_AUTHTYPE_MD2) ? "MD2 " : "",
653c18ec02fSPetter Reinholdtsen 		       (p->data[3] & 1<<IPMI_SESSION_AUTHTYPE_MD5) ? "MD5 " : "",
654c18ec02fSPetter Reinholdtsen 		       (p->data[3] & 1<<IPMI_SESSION_AUTHTYPE_PASSWORD) ? "PASSWORD " : "",
655c18ec02fSPetter Reinholdtsen 		       (p->data[3] & 1<<IPMI_SESSION_AUTHTYPE_OEM) ? "OEM " : "");
656c18ec02fSPetter Reinholdtsen 		printf("%-24s: OEM      : %s%s%s%s%s\n", "",
657c18ec02fSPetter Reinholdtsen 		       (p->data[4] & 1<<IPMI_SESSION_AUTHTYPE_NONE) ? "NONE " : "",
658c18ec02fSPetter Reinholdtsen 		       (p->data[4] & 1<<IPMI_SESSION_AUTHTYPE_MD2) ? "MD2 " : "",
659c18ec02fSPetter Reinholdtsen 		       (p->data[4] & 1<<IPMI_SESSION_AUTHTYPE_MD5) ? "MD5 " : "",
660c18ec02fSPetter Reinholdtsen 		       (p->data[4] & 1<<IPMI_SESSION_AUTHTYPE_PASSWORD) ? "PASSWORD " : "",
661c18ec02fSPetter Reinholdtsen 		       (p->data[4] & 1<<IPMI_SESSION_AUTHTYPE_OEM) ? "OEM " : "");
662c18ec02fSPetter Reinholdtsen 	}
663c18ec02fSPetter Reinholdtsen 
664c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_IP_ADDR_SRC);
665c18ec02fSPetter Reinholdtsen 	if (p == NULL)
666c18ec02fSPetter Reinholdtsen 		return -1;
667c18ec02fSPetter Reinholdtsen 	if (p->data != NULL) {
668c18ec02fSPetter Reinholdtsen 		printf("%-24s: ", p->desc);
669c18ec02fSPetter Reinholdtsen 		p->data[0] &= 0xf;
670c18ec02fSPetter Reinholdtsen 		switch (p->data[0]) {
671c18ec02fSPetter Reinholdtsen 		case 0:
672c18ec02fSPetter Reinholdtsen 			printf("Unspecified\n");
673c18ec02fSPetter Reinholdtsen 			break;
674c18ec02fSPetter Reinholdtsen 		case 1:
675c18ec02fSPetter Reinholdtsen 			printf("Static Address\n");
676c18ec02fSPetter Reinholdtsen 			break;
677c18ec02fSPetter Reinholdtsen 		case 2:
678c18ec02fSPetter Reinholdtsen 			printf("DHCP Address\n");
679c18ec02fSPetter Reinholdtsen 			break;
680c18ec02fSPetter Reinholdtsen 		case 3:
681c18ec02fSPetter Reinholdtsen 			printf("BIOS Assigned Address\n");
682c18ec02fSPetter Reinholdtsen 			break;
683c18ec02fSPetter Reinholdtsen 		default:
684c18ec02fSPetter Reinholdtsen 			printf("Other\n");
685c18ec02fSPetter Reinholdtsen 			break;
686c18ec02fSPetter Reinholdtsen 		}
687c18ec02fSPetter Reinholdtsen 	}
688c18ec02fSPetter Reinholdtsen 
689c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_IP_ADDR);
690c18ec02fSPetter Reinholdtsen 	if (p == NULL)
691c18ec02fSPetter Reinholdtsen 		return -1;
692c18ec02fSPetter Reinholdtsen 	if (p->data != NULL)
693c18ec02fSPetter Reinholdtsen 		printf("%-24s: %d.%d.%d.%d\n", p->desc,
694c18ec02fSPetter Reinholdtsen 		       p->data[0], p->data[1], p->data[2], p->data[3]);
695c18ec02fSPetter Reinholdtsen 
696c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_SUBNET_MASK);
697c18ec02fSPetter Reinholdtsen 	if (p == NULL)
698c18ec02fSPetter Reinholdtsen 		return -1;
699c18ec02fSPetter Reinholdtsen 	if (p->data != NULL)
700c18ec02fSPetter Reinholdtsen 		printf("%-24s: %d.%d.%d.%d\n", p->desc,
701c18ec02fSPetter Reinholdtsen 		       p->data[0], p->data[1], p->data[2], p->data[3]);
702c18ec02fSPetter Reinholdtsen 
703c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_MAC_ADDR);
704c18ec02fSPetter Reinholdtsen 	if (p == NULL)
705c18ec02fSPetter Reinholdtsen 		return -1;
706c18ec02fSPetter Reinholdtsen 	if (p->data != NULL)
707c18ec02fSPetter Reinholdtsen 		printf("%-24s: %02x:%02x:%02x:%02x:%02x:%02x\n", p->desc,
708c18ec02fSPetter Reinholdtsen 		       p->data[0], p->data[1], p->data[2], p->data[3], p->data[4], p->data[5]);
709c18ec02fSPetter Reinholdtsen 
710c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_SNMP_STRING);
711c18ec02fSPetter Reinholdtsen 	if (p == NULL)
712c18ec02fSPetter Reinholdtsen 		return -1;
713c18ec02fSPetter Reinholdtsen 	if (p->data != NULL)
714c18ec02fSPetter Reinholdtsen 		printf("%-24s: %s\n", p->desc, p->data);
715c18ec02fSPetter Reinholdtsen 
716c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_IP_HEADER);
717c18ec02fSPetter Reinholdtsen 	if (p == NULL)
718c18ec02fSPetter Reinholdtsen 		return -1;
719c18ec02fSPetter Reinholdtsen 	if (p->data != NULL)
720c18ec02fSPetter Reinholdtsen 		printf("%-24s: TTL=0x%02x Flags=0x%02x Precedence=0x%02x TOS=0x%02x\n",
721c18ec02fSPetter Reinholdtsen 		       p->desc, p->data[0], p->data[1] & 0xe0, p->data[2] & 0xe0, p->data[2] & 0x1e);
722c18ec02fSPetter Reinholdtsen 
723c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_BMC_ARP);
724c18ec02fSPetter Reinholdtsen 	if (p == NULL)
725c18ec02fSPetter Reinholdtsen 		return -1;
726c18ec02fSPetter Reinholdtsen 	if (p->data != NULL)
727c18ec02fSPetter Reinholdtsen 		printf("%-24s: ARP Responses %sabled, Gratuitous ARP %sabled\n", p->desc,
728c18ec02fSPetter Reinholdtsen 		       (p->data[0] & 2) ? "En" : "Dis", (p->data[0] & 1) ? "En" : "Dis");
729c18ec02fSPetter Reinholdtsen 
730c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_GRAT_ARP);
731c18ec02fSPetter Reinholdtsen 	if (p == NULL)
732c18ec02fSPetter Reinholdtsen 		return -1;
733c18ec02fSPetter Reinholdtsen 	if (p->data != NULL)
734c18ec02fSPetter Reinholdtsen 		printf("%-24s: %.1f seconds\n", p->desc, (float)((p->data[0] + 1) / 2));
735c18ec02fSPetter Reinholdtsen 
736c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_IP);
737c18ec02fSPetter Reinholdtsen 	if (p == NULL)
738c18ec02fSPetter Reinholdtsen 		return -1;
739c18ec02fSPetter Reinholdtsen 	if (p->data != NULL)
740c18ec02fSPetter Reinholdtsen 		printf("%-24s: %d.%d.%d.%d\n", p->desc,
741c18ec02fSPetter Reinholdtsen 		       p->data[0], p->data[1], p->data[2], p->data[3]);
742c18ec02fSPetter Reinholdtsen 
743c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_MAC);
744c18ec02fSPetter Reinholdtsen 	if (p == NULL)
745c18ec02fSPetter Reinholdtsen 		return -1;
746c18ec02fSPetter Reinholdtsen 	if (p->data != NULL)
747c18ec02fSPetter Reinholdtsen 		printf("%-24s: %02x:%02x:%02x:%02x:%02x:%02x\n", p->desc,
748c18ec02fSPetter Reinholdtsen 		       p->data[0], p->data[1], p->data[2], p->data[3], p->data[4], p->data[5]);
749c18ec02fSPetter Reinholdtsen 
750c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_IP);
751c18ec02fSPetter Reinholdtsen 	if (p == NULL)
752c18ec02fSPetter Reinholdtsen 		return -1;
753c18ec02fSPetter Reinholdtsen 	if (p->data != NULL)
754c18ec02fSPetter Reinholdtsen 		printf("%-24s: %d.%d.%d.%d\n", p->desc,
755c18ec02fSPetter Reinholdtsen 		       p->data[0], p->data[1], p->data[2], p->data[3]);
756c18ec02fSPetter Reinholdtsen 
757c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_MAC);
758c18ec02fSPetter Reinholdtsen 	if (p == NULL)
759c18ec02fSPetter Reinholdtsen 		return -1;
760c18ec02fSPetter Reinholdtsen 	if (p->data != NULL)
761c18ec02fSPetter Reinholdtsen 		printf("%-24s: %02x:%02x:%02x:%02x:%02x:%02x\n", p->desc,
762c18ec02fSPetter Reinholdtsen 		       p->data[0], p->data[1], p->data[2], p->data[3], p->data[4], p->data[5]);
763c18ec02fSPetter Reinholdtsen 
764c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_VLAN_ID);
765c18ec02fSPetter Reinholdtsen 	if (p != NULL && p->data != NULL) {
766c18ec02fSPetter Reinholdtsen 		int id = ((p->data[1] & 0x0f) << 8) + p->data[0];
767c18ec02fSPetter Reinholdtsen 		if (p->data[1] & 0x80)
768c18ec02fSPetter Reinholdtsen 			printf("%-24s: %d\n", p->desc, id);
769c18ec02fSPetter Reinholdtsen 		else
770c18ec02fSPetter Reinholdtsen 			printf("%-24s: Disabled\n", p->desc);
771c18ec02fSPetter Reinholdtsen 	}
772c18ec02fSPetter Reinholdtsen 
773c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_VLAN_PRIORITY);
774c18ec02fSPetter Reinholdtsen 	if (p != NULL && p->data != NULL)
775c18ec02fSPetter Reinholdtsen 		printf("%-24s: %d\n", p->desc, p->data[0] & 0x07);
776c18ec02fSPetter Reinholdtsen 
777c18ec02fSPetter Reinholdtsen 	/* Determine supported Cipher Suites -- Requires two calls */
778c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_RMCP_CIPHER_SUPPORT);
779c18ec02fSPetter Reinholdtsen 	if (p == NULL)
780c18ec02fSPetter Reinholdtsen 		return -1;
781c18ec02fSPetter Reinholdtsen 	else if (p->data != NULL)
782c18ec02fSPetter Reinholdtsen 	{
783c18ec02fSPetter Reinholdtsen 		unsigned char cipher_suite_count = p->data[0];
784c18ec02fSPetter Reinholdtsen 		p = get_lan_param(intf, chan, IPMI_LANP_RMCP_CIPHERS);
785c18ec02fSPetter Reinholdtsen 		if (p == NULL)
786c18ec02fSPetter Reinholdtsen 			return -1;
787c18ec02fSPetter Reinholdtsen 
788c18ec02fSPetter Reinholdtsen 		printf("%-24s: ", p->desc);
789c18ec02fSPetter Reinholdtsen 
790c18ec02fSPetter Reinholdtsen 		/* Now we're dangerous.  There are only 15 fixed cipher
791c18ec02fSPetter Reinholdtsen 		   suite IDs, but the spec allows for 16 in the return data.*/
792c18ec02fSPetter Reinholdtsen 		if ((p->data != NULL) && (p->data_len <= 17))
793c18ec02fSPetter Reinholdtsen 		{
794c18ec02fSPetter Reinholdtsen 			unsigned int i;
795c18ec02fSPetter Reinholdtsen 			for (i = 0; (i < 16) && (i < cipher_suite_count); ++i)
796c18ec02fSPetter Reinholdtsen 			{
797c18ec02fSPetter Reinholdtsen 				printf("%s%d",
798c18ec02fSPetter Reinholdtsen 				       (i > 0? ",": ""),
799c18ec02fSPetter Reinholdtsen 				       p->data[i + 1]);
800c18ec02fSPetter Reinholdtsen 			}
801c18ec02fSPetter Reinholdtsen 			printf("\n");
802c18ec02fSPetter Reinholdtsen 		}
803c18ec02fSPetter Reinholdtsen 		else
804c18ec02fSPetter Reinholdtsen 		{
805c18ec02fSPetter Reinholdtsen 			printf("None\n");
806c18ec02fSPetter Reinholdtsen 		}
807c18ec02fSPetter Reinholdtsen 	}
808c18ec02fSPetter Reinholdtsen 
809c18ec02fSPetter Reinholdtsen 	/* RMCP+ Messaging Cipher Suite Privilege Levels */
810c18ec02fSPetter Reinholdtsen 	/* These are the privilege levels for the 15 fixed cipher suites */
811c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, chan, IPMI_LANP_RMCP_PRIV_LEVELS);
812c18ec02fSPetter Reinholdtsen 	if (p == NULL)
813c18ec02fSPetter Reinholdtsen 		return -1;
814c18ec02fSPetter Reinholdtsen 	if ((p->data != NULL) && (p->data_len == 9))
815c18ec02fSPetter Reinholdtsen 	{
816c18ec02fSPetter Reinholdtsen 		printf("%-24s: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", p->desc,
817c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[1] & 0x0F),
818c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[1] >> 4),
819c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[2] & 0x0F),
820c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[2] >> 4),
821c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[3] & 0x0F),
822c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[3] >> 4),
823c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[4] & 0x0F),
824c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[4] >> 4),
825c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[5] & 0x0F),
826c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[5] >> 4),
827c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[6] & 0x0F),
828c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[6] >> 4),
829c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[7] & 0x0F),
830c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[7] >> 4),
831c18ec02fSPetter Reinholdtsen 		       priv_level_to_char(p->data[8] & 0x0F));
832c18ec02fSPetter Reinholdtsen 
833c18ec02fSPetter Reinholdtsen 		/* Now print a legend */
834c18ec02fSPetter Reinholdtsen 		printf("%-24s: %s\n", "", "    X=Cipher Suite Unused");
835c18ec02fSPetter Reinholdtsen 		printf("%-24s: %s\n", "", "    c=CALLBACK");
836c18ec02fSPetter Reinholdtsen 		printf("%-24s: %s\n", "", "    u=USER");
837c18ec02fSPetter Reinholdtsen 		printf("%-24s: %s\n", "", "    o=OPERATOR");
838c18ec02fSPetter Reinholdtsen 		printf("%-24s: %s\n", "", "    a=ADMIN");
839c18ec02fSPetter Reinholdtsen 		printf("%-24s: %s\n", "", "    O=OEM");
840c18ec02fSPetter Reinholdtsen 	}
841c18ec02fSPetter Reinholdtsen 	else
842c18ec02fSPetter Reinholdtsen 		printf("%-24s: Not Available\n", p->desc);
843c18ec02fSPetter Reinholdtsen 
844*89e9e634SDmitry Bazhenov 	/* Bad Password Threshold */
845*89e9e634SDmitry Bazhenov 	p = get_lan_param(intf, chan, IPMI_LANP_BAD_PASS_THRESH);
846*89e9e634SDmitry Bazhenov 	if (p == NULL)
847*89e9e634SDmitry Bazhenov 		return -1;
848*89e9e634SDmitry Bazhenov 	if ((p->data != NULL) && (p->data_len == 6)) {
849*89e9e634SDmitry Bazhenov 		int tmp;
850*89e9e634SDmitry Bazhenov 
851*89e9e634SDmitry Bazhenov 		printf("%-24s: %d\n", p->desc, p->data[1]);
852*89e9e634SDmitry Bazhenov 		printf("%-24s: %s\n", "Invalid password disable",
853*89e9e634SDmitry Bazhenov 				p->data[0] & 1 ? "yes" : "no" );
854*89e9e634SDmitry Bazhenov 		tmp = p->data[2] + (p->data[3] << 8);
855*89e9e634SDmitry Bazhenov 		printf("%-24s: %d\n", "Attempt Count Reset Int.", tmp * 10);
856*89e9e634SDmitry Bazhenov 		tmp = p->data[4] + (p->data[5] << 8);
857*89e9e634SDmitry Bazhenov 		printf("%-24s: %d\n", "User Lockout Interval", tmp * 10);
858*89e9e634SDmitry Bazhenov 	} else {
859*89e9e634SDmitry Bazhenov 		printf("%-24s: Not Available\n", p->desc);
860*89e9e634SDmitry Bazhenov 	}
861*89e9e634SDmitry Bazhenov 
862*89e9e634SDmitry Bazhenov 	return 0;
863c18ec02fSPetter Reinholdtsen }
864c18ec02fSPetter Reinholdtsen 
865c18ec02fSPetter Reinholdtsen /* Configure Authentication Types */
86645c54aadSZdenek Styblik /* TODO - probably some code duplication going on ??? */
867c18ec02fSPetter Reinholdtsen static int
ipmi_lan_set_auth(struct ipmi_intf * intf,uint8_t chan,char * level,char * types)868c18ec02fSPetter Reinholdtsen ipmi_lan_set_auth(struct ipmi_intf * intf, uint8_t chan, char * level, char * types)
869c18ec02fSPetter Reinholdtsen {
870c18ec02fSPetter Reinholdtsen 	uint8_t data[5];
871c18ec02fSPetter Reinholdtsen 	uint8_t authtype = 0;
872c18ec02fSPetter Reinholdtsen 	char * p;
873c18ec02fSPetter Reinholdtsen 	struct lan_param * lp;
874c18ec02fSPetter Reinholdtsen 
875c18ec02fSPetter Reinholdtsen 	if (level == NULL || types == NULL)
876c18ec02fSPetter Reinholdtsen 		return -1;
877c18ec02fSPetter Reinholdtsen 
878c18ec02fSPetter Reinholdtsen 	lp = get_lan_param(intf, chan, IPMI_LANP_AUTH_TYPE_ENABLE);
879c18ec02fSPetter Reinholdtsen 	if (lp == NULL)
880c18ec02fSPetter Reinholdtsen 		return -1;
881c18ec02fSPetter Reinholdtsen 	if (lp->data == NULL)
882c18ec02fSPetter Reinholdtsen 		return -1;
883c18ec02fSPetter Reinholdtsen 
884c18ec02fSPetter Reinholdtsen 	lprintf(LOG_DEBUG, "%-24s: callback=0x%02x user=0x%02x operator=0x%02x admin=0x%02x oem=0x%02x",
885c18ec02fSPetter Reinholdtsen 		lp->desc, lp->data[0], lp->data[1], lp->data[2], lp->data[3], lp->data[4]);
886c18ec02fSPetter Reinholdtsen 
887c18ec02fSPetter Reinholdtsen 	memset(data, 0, 5);
888c18ec02fSPetter Reinholdtsen 	memcpy(data, lp->data, 5);
889c18ec02fSPetter Reinholdtsen 
890c18ec02fSPetter Reinholdtsen 	p = types;
891c18ec02fSPetter Reinholdtsen 	while (p) {
892c18ec02fSPetter Reinholdtsen 		if (strncasecmp(p, "none", 4) == 0)
893c18ec02fSPetter Reinholdtsen 			authtype |= 1 << IPMI_SESSION_AUTHTYPE_NONE;
894c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(p, "md2", 3) == 0)
895c18ec02fSPetter Reinholdtsen 			authtype |= 1 << IPMI_SESSION_AUTHTYPE_MD2;
896c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(p, "md5", 3) == 0)
897c18ec02fSPetter Reinholdtsen 			authtype |= 1 << IPMI_SESSION_AUTHTYPE_MD5;
898c18ec02fSPetter Reinholdtsen 		else if ((strncasecmp(p, "password", 8) == 0) ||
899c18ec02fSPetter Reinholdtsen 			 (strncasecmp(p, "key", 3) == 0))
900c18ec02fSPetter Reinholdtsen 			authtype |= 1 << IPMI_SESSION_AUTHTYPE_KEY;
901c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(p, "oem", 3) == 0)
902c18ec02fSPetter Reinholdtsen 			authtype |= 1 << IPMI_SESSION_AUTHTYPE_OEM;
903c18ec02fSPetter Reinholdtsen 		else
904c18ec02fSPetter Reinholdtsen 			lprintf(LOG_WARNING, "Invalid authentication type: %s", p);
905c18ec02fSPetter Reinholdtsen 		p = strchr(p, ',');
906c18ec02fSPetter Reinholdtsen 		if (p)
907c18ec02fSPetter Reinholdtsen 			p++;
908c18ec02fSPetter Reinholdtsen 	}
909c18ec02fSPetter Reinholdtsen 
910c18ec02fSPetter Reinholdtsen 	p = level;
911c18ec02fSPetter Reinholdtsen 	while (p) {
912c18ec02fSPetter Reinholdtsen 		if (strncasecmp(p, "callback", 8) == 0)
913c18ec02fSPetter Reinholdtsen 			data[0] = authtype;
914c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(p, "user", 4) == 0)
915c18ec02fSPetter Reinholdtsen 			data[1] = authtype;
916c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(p, "operator", 8) == 0)
917c18ec02fSPetter Reinholdtsen 			data[2] = authtype;
918c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(p, "admin", 5) == 0)
919c18ec02fSPetter Reinholdtsen 			data[3] = authtype;
920c18ec02fSPetter Reinholdtsen 		else
921c18ec02fSPetter Reinholdtsen 			lprintf(LOG_WARNING, "Invalid authentication level: %s", p);
922c18ec02fSPetter Reinholdtsen 		p = strchr(p, ',');
923c18ec02fSPetter Reinholdtsen 		if (p)
924c18ec02fSPetter Reinholdtsen 			p++;
925c18ec02fSPetter Reinholdtsen 	}
926c18ec02fSPetter Reinholdtsen 
927c18ec02fSPetter Reinholdtsen 	if (verbose > 1)
928c18ec02fSPetter Reinholdtsen 		printbuf(data, 5, "authtype data");
929c18ec02fSPetter Reinholdtsen 
930c18ec02fSPetter Reinholdtsen 	return set_lan_param(intf, chan, IPMI_LANP_AUTH_TYPE_ENABLE, data, 5);
931c18ec02fSPetter Reinholdtsen }
932c18ec02fSPetter Reinholdtsen 
933c18ec02fSPetter Reinholdtsen static int
ipmi_lan_set_password(struct ipmi_intf * intf,uint8_t user_id,const char * password)934c18ec02fSPetter Reinholdtsen ipmi_lan_set_password(struct ipmi_intf *intf,
93590e21344SZdenek Styblik 		uint8_t user_id, const char *password)
936c18ec02fSPetter Reinholdtsen {
93790e21344SZdenek Styblik 	int ccode = 0;
93890e21344SZdenek Styblik 	ccode = _ipmi_set_user_password(intf, user_id,
93990e21344SZdenek Styblik 			IPMI_PASSWORD_SET_PASSWORD, password, 0);
94090e21344SZdenek Styblik 	if (eval_ccode(ccode) != 0) {
94190e21344SZdenek Styblik 		lprintf(LOG_ERR, "Unable to Set LAN Password for user %d",
94290e21344SZdenek Styblik 				user_id);
94390e21344SZdenek Styblik 		return (-1);
944c18ec02fSPetter Reinholdtsen 	}
945c18ec02fSPetter Reinholdtsen 	/* adjust our session password
946c18ec02fSPetter Reinholdtsen 	 * or we will no longer be able to communicate with BMC
947c18ec02fSPetter Reinholdtsen 	 */
948c18ec02fSPetter Reinholdtsen 	ipmi_intf_session_set_password(intf, (char *)password);
949c18ec02fSPetter Reinholdtsen 	printf("Password %s for user %d\n",
95090e21344SZdenek Styblik 	       (password == NULL) ? "cleared" : "set", user_id);
951c18ec02fSPetter Reinholdtsen 
952c18ec02fSPetter Reinholdtsen 	return 0;
953c18ec02fSPetter Reinholdtsen }
954c18ec02fSPetter Reinholdtsen 
9554725cfd6SZdenek Styblik /* ipmi_set_alert_enable - enable/disable PEF alerting for given channel.
9564725cfd6SZdenek Styblik  *
9574725cfd6SZdenek Styblik  * @channel - IPMI channel
9584725cfd6SZdenek Styblik  * @enable - whether to enable/disable PEF alerting for given channel
9594725cfd6SZdenek Styblik  *
9604725cfd6SZdenek Styblik  * returns - 0 on success, (-1) on error.
9614725cfd6SZdenek Styblik  */
962c18ec02fSPetter Reinholdtsen static int
ipmi_set_alert_enable(struct ipmi_intf * intf,uint8_t channel,uint8_t enable)963c18ec02fSPetter Reinholdtsen ipmi_set_alert_enable(struct ipmi_intf *intf, uint8_t channel, uint8_t enable)
964c18ec02fSPetter Reinholdtsen {
9654725cfd6SZdenek Styblik 	struct channel_access_t channel_access;
9664725cfd6SZdenek Styblik 	int ccode = 0;
9674725cfd6SZdenek Styblik 	memset(&channel_access, 0, sizeof(channel_access));
9684725cfd6SZdenek Styblik 	channel_access.channel = channel;
9694725cfd6SZdenek Styblik 	ccode = _ipmi_get_channel_access(intf, &channel_access, 0);
9704725cfd6SZdenek Styblik 	if (eval_ccode(ccode) != 0) {
9714725cfd6SZdenek Styblik 		lprintf(LOG_ERR,
9724725cfd6SZdenek Styblik 				"Unable to Get Channel Access(non-volatile) for channel %d",
9734725cfd6SZdenek Styblik 				channel);
9744725cfd6SZdenek Styblik 		return (-1);
975c18ec02fSPetter Reinholdtsen 	}
9764725cfd6SZdenek Styblik 	if (enable != 0) {
9774725cfd6SZdenek Styblik 		channel_access.alerting = 1;
9784725cfd6SZdenek Styblik 	} else {
9794725cfd6SZdenek Styblik 		channel_access.alerting = 0;
980c18ec02fSPetter Reinholdtsen 	}
9814725cfd6SZdenek Styblik 	/* non-volatile */
9824725cfd6SZdenek Styblik 	ccode = _ipmi_set_channel_access(intf, channel_access, 1, 0);
9834725cfd6SZdenek Styblik 	if (eval_ccode(ccode) != 0) {
9844725cfd6SZdenek Styblik 		lprintf(LOG_ERR,
9854725cfd6SZdenek Styblik 				"Unable to Set Channel Access(non-volatile) for channel %d",
9864725cfd6SZdenek Styblik 				channel);
9874725cfd6SZdenek Styblik 		return (-1);
988c18ec02fSPetter Reinholdtsen 	}
9894725cfd6SZdenek Styblik 	/* volatile */
9904725cfd6SZdenek Styblik 	ccode = _ipmi_set_channel_access(intf, channel_access, 2, 0);
9914725cfd6SZdenek Styblik 	if (eval_ccode(ccode) != 0) {
9924725cfd6SZdenek Styblik 		lprintf(LOG_ERR,
9934725cfd6SZdenek Styblik 				"Unable to Set Channel Access(volatile) for channel %d",
9944725cfd6SZdenek Styblik 				channel);
9954725cfd6SZdenek Styblik 		return (-1);
996c18ec02fSPetter Reinholdtsen 	}
9974725cfd6SZdenek Styblik 	printf("PEF alerts for channel %d %s.\n",
9984725cfd6SZdenek Styblik 			channel,
9994725cfd6SZdenek Styblik 			(enable) ? "enabled" : "disabled");
1000c18ec02fSPetter Reinholdtsen 	return 0;
1001c18ec02fSPetter Reinholdtsen }
1002c18ec02fSPetter Reinholdtsen 
100311bbf183SZdenek Styblik /* ipmi_set_channel_access - enable/disable IPMI messaging for given channel and
100411bbf183SZdenek Styblik  * set Privilege Level to Administrator.
100511bbf183SZdenek Styblik  *
100611bbf183SZdenek Styblik  * @channel - IPMI channel
100711bbf183SZdenek Styblik  * @enable - whether to enable/disable IPMI messaging for given channel.
100811bbf183SZdenek Styblik  *
100911bbf183SZdenek Styblik  * returns - 0 on success, (-1) on error
101011bbf183SZdenek Styblik  */
1011c18ec02fSPetter Reinholdtsen static int
ipmi_set_channel_access(struct ipmi_intf * intf,uint8_t channel,uint8_t enable)101211bbf183SZdenek Styblik ipmi_set_channel_access(struct ipmi_intf *intf, uint8_t channel,
101311bbf183SZdenek Styblik 		uint8_t enable)
1014c18ec02fSPetter Reinholdtsen {
101511bbf183SZdenek Styblik 	struct channel_access_t channel_access;
101611bbf183SZdenek Styblik 	int ccode = 0;
101711bbf183SZdenek Styblik 	memset(&channel_access, 0, sizeof(channel_access));
101811bbf183SZdenek Styblik 	channel_access.channel = channel;
101911bbf183SZdenek Styblik 	/* Get Non-Volatile Channel Access first */
102011bbf183SZdenek Styblik 	ccode = _ipmi_get_channel_access(intf, &channel_access, 0);
102111bbf183SZdenek Styblik 	if (eval_ccode(ccode) != 0) {
102211bbf183SZdenek Styblik 		lprintf(LOG_ERR,
102311bbf183SZdenek Styblik 				"Unable to Get Channel Access(non-volatile) for channel %d",
102411bbf183SZdenek Styblik 				channel);
102511bbf183SZdenek Styblik 		return (-1);
102611bbf183SZdenek Styblik 	}
1027c18ec02fSPetter Reinholdtsen 
102811bbf183SZdenek Styblik 	if (enable != 0) {
102911bbf183SZdenek Styblik 		channel_access.access_mode = 2;
1030c18ec02fSPetter Reinholdtsen 	} else {
103111bbf183SZdenek Styblik 		channel_access.access_mode = 0;
103211bbf183SZdenek Styblik 	}
103311bbf183SZdenek Styblik 	channel_access.privilege_limit = 0x04;
103411bbf183SZdenek Styblik 	ccode = _ipmi_set_channel_access(intf, channel_access, 1, 1);
103511bbf183SZdenek Styblik 	if (eval_ccode(ccode) != 0) {
103611bbf183SZdenek Styblik 		lprintf(LOG_ERR,
103711bbf183SZdenek Styblik 				"Unable to Set Channel Access(non-volatile) for channel %d",
103811bbf183SZdenek Styblik 				channel);
103911bbf183SZdenek Styblik 		return (-1);
1040c18ec02fSPetter Reinholdtsen 	}
1041c18ec02fSPetter Reinholdtsen 
104211bbf183SZdenek Styblik 	memset(&channel_access, 0, sizeof(channel_access));
104311bbf183SZdenek Styblik 	channel_access.channel = channel;
104411bbf183SZdenek Styblik 	/* Get Volatile Channel Access */
104511bbf183SZdenek Styblik 	ccode = _ipmi_get_channel_access(intf, &channel_access, 1);
104611bbf183SZdenek Styblik 	if (eval_ccode(ccode) != 0) {
104711bbf183SZdenek Styblik 		lprintf(LOG_ERR,
104811bbf183SZdenek Styblik 				"Unable to Get Channel Access(volatile) for channel %d",
104911bbf183SZdenek Styblik 				channel);
105011bbf183SZdenek Styblik 		return (-1);
1051c18ec02fSPetter Reinholdtsen 	}
1052c18ec02fSPetter Reinholdtsen 
105311bbf183SZdenek Styblik 	if (enable != 0) {
105411bbf183SZdenek Styblik 		channel_access.access_mode = 2;
1055c18ec02fSPetter Reinholdtsen 	} else {
105611bbf183SZdenek Styblik 		channel_access.access_mode = 0;
1057c18ec02fSPetter Reinholdtsen 	}
105811bbf183SZdenek Styblik 	channel_access.privilege_limit = 0x04;
105911bbf183SZdenek Styblik 	ccode = _ipmi_set_channel_access(intf, channel_access, 2, 2);
106011bbf183SZdenek Styblik 	if (eval_ccode(ccode) != 0) {
106111bbf183SZdenek Styblik 		lprintf(LOG_ERR,
106211bbf183SZdenek Styblik 				"Unable to Set Channel Access(volatile) for channel %d",
106311bbf183SZdenek Styblik 				channel);
106411bbf183SZdenek Styblik 		return (-1);
1065c18ec02fSPetter Reinholdtsen 	}
1066c18ec02fSPetter Reinholdtsen 
1067c18ec02fSPetter Reinholdtsen 	/* can't send close session if access off so abort instead */
106811bbf183SZdenek Styblik 	if (enable == 0) {
1069c18ec02fSPetter Reinholdtsen 		intf->abort = 1;
107011bbf183SZdenek Styblik 	}
107111bbf183SZdenek Styblik 	printf("Set Channel Access for channel %d was successful.\n",
107211bbf183SZdenek Styblik 			channel);
1073c18ec02fSPetter Reinholdtsen 	return 0;
1074c18ec02fSPetter Reinholdtsen }
1075c18ec02fSPetter Reinholdtsen 
1076410606e8SZdenek Styblik /* ipmi_set_user_access - set admin access for given user and channel.
1077410606e8SZdenek Styblik  *
1078410606e8SZdenek Styblik  * @intf - IPMI interface
1079410606e8SZdenek Styblik  * @channel - IPMI channel
1080410606e8SZdenek Styblik  * @user_id - IPMI User ID
1081410606e8SZdenek Styblik  *
1082410606e8SZdenek Styblik  * returns - 0 on success, (-1) on error.
1083410606e8SZdenek Styblik  */
1084c18ec02fSPetter Reinholdtsen static int
ipmi_set_user_access(struct ipmi_intf * intf,uint8_t channel,uint8_t user_id)1085410606e8SZdenek Styblik ipmi_set_user_access(struct ipmi_intf *intf, uint8_t channel, uint8_t user_id)
1086c18ec02fSPetter Reinholdtsen {
1087410606e8SZdenek Styblik 	struct user_access_t user_access;
1088410606e8SZdenek Styblik 	int ccode = 0;
1089410606e8SZdenek Styblik 	memset(&user_access, 0, sizeof(user_access));
1090410606e8SZdenek Styblik 	user_access.channel = channel;
1091410606e8SZdenek Styblik 	user_access.user_id = user_id;
1092410606e8SZdenek Styblik 	user_access.privilege_limit = 0x04;
1093c18ec02fSPetter Reinholdtsen 
1094410606e8SZdenek Styblik 	ccode = _ipmi_set_user_access(intf, &user_access, 1);
1095410606e8SZdenek Styblik 	if (eval_ccode(ccode) != 0) {
1096410606e8SZdenek Styblik 		lprintf(LOG_ERR, "Set User Access for channel %d failed",
1097410606e8SZdenek Styblik 				channel);
1098410606e8SZdenek Styblik 		return (-1);
1099410606e8SZdenek Styblik 	} else {
1100410606e8SZdenek Styblik 		printf("Set User Access for channel %d was successful.",
1101410606e8SZdenek Styblik 				channel);
1102c18ec02fSPetter Reinholdtsen 		return 0;
1103c18ec02fSPetter Reinholdtsen 	}
1104410606e8SZdenek Styblik }
1105c18ec02fSPetter Reinholdtsen 
1106b88a523dSZdenek Styblik /* get_cmdline_macaddr - parse-out MAC address from given string and store it
1107b88a523dSZdenek Styblik  * into buffer.
1108b88a523dSZdenek Styblik  *
1109b88a523dSZdenek Styblik  * @arg: string to be parsed.
1110b88a523dSZdenek Styblik  * @buf: buffer of 6 to hold parsed MAC address.
1111b88a523dSZdenek Styblik  *
1112b88a523dSZdenek Styblik  * returns zero on success, (-1) on error and error message is printed-out.
1113b88a523dSZdenek Styblik  */
1114c18ec02fSPetter Reinholdtsen static int
get_cmdline_macaddr(char * arg,uint8_t * buf)1115c18ec02fSPetter Reinholdtsen get_cmdline_macaddr(char *arg, uint8_t *buf)
1116c18ec02fSPetter Reinholdtsen {
1117b88a523dSZdenek Styblik 	uint32_t m1 = 0;
1118b88a523dSZdenek Styblik 	uint32_t m2 = 0;
1119b88a523dSZdenek Styblik 	uint32_t m3 = 0;
1120b88a523dSZdenek Styblik 	uint32_t m4 = 0;
1121b88a523dSZdenek Styblik 	uint32_t m5 = 0;
1122b88a523dSZdenek Styblik 	uint32_t m6 = 0;
1123c18ec02fSPetter Reinholdtsen 	if (sscanf(arg, "%02x:%02x:%02x:%02x:%02x:%02x",
1124c18ec02fSPetter Reinholdtsen 		   &m1, &m2, &m3, &m4, &m5, &m6) != 6) {
1125c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Invalid MAC address: %s", arg);
1126c18ec02fSPetter Reinholdtsen 		return -1;
1127c18ec02fSPetter Reinholdtsen 	}
1128b88a523dSZdenek Styblik 	if (m1 > UINT8_MAX || m2 > UINT8_MAX
1129b88a523dSZdenek Styblik 			|| m3 > UINT8_MAX || m4 > UINT8_MAX
1130b88a523dSZdenek Styblik 			|| m5 > UINT8_MAX || m6 > UINT8_MAX) {
1131b88a523dSZdenek Styblik 		lprintf(LOG_ERR, "Invalid MAC address: %s", arg);
1132b88a523dSZdenek Styblik 		return -1;
1133b88a523dSZdenek Styblik 	}
1134c18ec02fSPetter Reinholdtsen 	buf[0] = (uint8_t)m1;
1135c18ec02fSPetter Reinholdtsen 	buf[1] = (uint8_t)m2;
1136c18ec02fSPetter Reinholdtsen 	buf[2] = (uint8_t)m3;
1137c18ec02fSPetter Reinholdtsen 	buf[3] = (uint8_t)m4;
1138c18ec02fSPetter Reinholdtsen 	buf[4] = (uint8_t)m5;
1139c18ec02fSPetter Reinholdtsen 	buf[5] = (uint8_t)m6;
1140c18ec02fSPetter Reinholdtsen 	return 0;
1141c18ec02fSPetter Reinholdtsen }
1142c18ec02fSPetter Reinholdtsen 
1143c18ec02fSPetter Reinholdtsen 
1144c18ec02fSPetter Reinholdtsen static int
get_cmdline_cipher_suite_priv_data(char * arg,uint8_t * buf)1145c18ec02fSPetter Reinholdtsen get_cmdline_cipher_suite_priv_data(char * arg, uint8_t * buf)
1146c18ec02fSPetter Reinholdtsen {
1147c18ec02fSPetter Reinholdtsen 	int i, ret = 0;
1148c18ec02fSPetter Reinholdtsen 
1149c18ec02fSPetter Reinholdtsen 	if (strlen(arg) != 15)
1150c18ec02fSPetter Reinholdtsen 	{
1151c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Invalid privilege specification length: %d",
1152c18ec02fSPetter Reinholdtsen 			strlen(arg));
1153c18ec02fSPetter Reinholdtsen 		return -1;
1154c18ec02fSPetter Reinholdtsen 	}
1155c18ec02fSPetter Reinholdtsen 
1156c18ec02fSPetter Reinholdtsen 	/*
1157c18ec02fSPetter Reinholdtsen 	 * The first byte is reserved (0).  The rest of the buffer is setup
1158c18ec02fSPetter Reinholdtsen 	 * so that each nibble holds the maximum privilege level available for
1159c18ec02fSPetter Reinholdtsen 	 * that cipher suite number.  The number of nibbles (15) matches the number
1160c18ec02fSPetter Reinholdtsen 	 * of fixed cipher suite IDs.  This command documentation mentions 16 IDs
1161c18ec02fSPetter Reinholdtsen 	 * but table 22-19 shows that there are only 15 (0-14).
1162c18ec02fSPetter Reinholdtsen 	 *
1163c18ec02fSPetter Reinholdtsen 	 * data 1 - reserved
1164c18ec02fSPetter Reinholdtsen 	 * data 2 - maximum priv level for first (LSN) and second (MSN) ciphers
1165c18ec02fSPetter Reinholdtsen 	 * data 3 - maximum priv level for third (LSN) and fourth (MSN) ciphers
1166c18ec02fSPetter Reinholdtsen 	 * data 9 - maximum priv level for 15th (LSN) cipher.
1167c18ec02fSPetter Reinholdtsen 	 */
11680a1f5c03SZdenek Styblik 	memset(buf, 0, 9);
1169c18ec02fSPetter Reinholdtsen 	for (i = 0; i < 15; ++i)
1170c18ec02fSPetter Reinholdtsen 	{
1171c18ec02fSPetter Reinholdtsen 		unsigned char priv_level = IPMI_SESSION_PRIV_ADMIN;
1172c18ec02fSPetter Reinholdtsen 
1173c18ec02fSPetter Reinholdtsen 		switch (arg[i])
1174c18ec02fSPetter Reinholdtsen 		{
1175c18ec02fSPetter Reinholdtsen 		case 'X':
1176c18ec02fSPetter Reinholdtsen 			priv_level = IPMI_SESSION_PRIV_UNSPECIFIED; /* 0 */
1177c18ec02fSPetter Reinholdtsen 			break;
1178c18ec02fSPetter Reinholdtsen 		case 'c':
1179c18ec02fSPetter Reinholdtsen 			priv_level = IPMI_SESSION_PRIV_CALLBACK;    /* 1 */
1180c18ec02fSPetter Reinholdtsen 			break;
1181c18ec02fSPetter Reinholdtsen 		case 'u':
1182c18ec02fSPetter Reinholdtsen 			priv_level = IPMI_SESSION_PRIV_USER;        /* 2 */
1183c18ec02fSPetter Reinholdtsen 			break;
1184c18ec02fSPetter Reinholdtsen 		case 'o':
1185c18ec02fSPetter Reinholdtsen 			priv_level = IPMI_SESSION_PRIV_OPERATOR;    /* 3 */
1186c18ec02fSPetter Reinholdtsen 			break;
1187c18ec02fSPetter Reinholdtsen 		case 'a':
1188c18ec02fSPetter Reinholdtsen 			priv_level = IPMI_SESSION_PRIV_ADMIN;       /* 4 */
1189c18ec02fSPetter Reinholdtsen 			break;
1190c18ec02fSPetter Reinholdtsen 		case 'O':
1191c18ec02fSPetter Reinholdtsen 			priv_level = IPMI_SESSION_PRIV_OEM;         /* 5 */
1192c18ec02fSPetter Reinholdtsen 			break;
1193c18ec02fSPetter Reinholdtsen 		default:
1194c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Invalid privilege specification char: %c",
1195c18ec02fSPetter Reinholdtsen 				arg[i]);
1196c18ec02fSPetter Reinholdtsen 			ret = -1;
1197c18ec02fSPetter Reinholdtsen 			break;
1198c18ec02fSPetter Reinholdtsen 		}
1199c18ec02fSPetter Reinholdtsen 
1200c18ec02fSPetter Reinholdtsen 		if (ret != 0)
1201c18ec02fSPetter Reinholdtsen 			break;
1202c18ec02fSPetter Reinholdtsen 		else
1203c18ec02fSPetter Reinholdtsen 		{
1204c18ec02fSPetter Reinholdtsen 			if ((i + 1) % 2)
1205c18ec02fSPetter Reinholdtsen 			{
1206c18ec02fSPetter Reinholdtsen 				// Odd number cipher suites will be in the LSN
1207c18ec02fSPetter Reinholdtsen 				buf[1 + (i / 2)] += priv_level;
1208c18ec02fSPetter Reinholdtsen 			}
1209c18ec02fSPetter Reinholdtsen 			else
1210c18ec02fSPetter Reinholdtsen 			{
1211c18ec02fSPetter Reinholdtsen 				// Even number cipher suites will be in the MSN
1212c18ec02fSPetter Reinholdtsen 				buf[1 + (i / 2)] += (priv_level << 4);
1213c18ec02fSPetter Reinholdtsen 			}
1214c18ec02fSPetter Reinholdtsen 		}
1215c18ec02fSPetter Reinholdtsen 	}
1216c18ec02fSPetter Reinholdtsen 
1217c18ec02fSPetter Reinholdtsen 	return ret;
1218c18ec02fSPetter Reinholdtsen }
1219c18ec02fSPetter Reinholdtsen 
1220c18ec02fSPetter Reinholdtsen 
1221c18ec02fSPetter Reinholdtsen static int
get_cmdline_ipaddr(char * arg,uint8_t * buf)1222c18ec02fSPetter Reinholdtsen get_cmdline_ipaddr(char * arg, uint8_t * buf)
1223c18ec02fSPetter Reinholdtsen {
1224c18ec02fSPetter Reinholdtsen 	uint32_t ip1, ip2, ip3, ip4;
1225d36cfcb8SZdenek Styblik 	if (sscanf(arg,
1226d36cfcb8SZdenek Styblik 				"%" PRIu32 ".%" PRIu32 ".%" PRIu32 ".%" PRIu32,
1227d36cfcb8SZdenek Styblik 				&ip1, &ip2, &ip3, &ip4) != 4) {
1228c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Invalid IP address: %s", arg);
1229d36cfcb8SZdenek Styblik 		return (-1);
1230d36cfcb8SZdenek Styblik 	}
1231d36cfcb8SZdenek Styblik 	if (ip1 > UINT8_MAX || ip2 > UINT8_MAX
1232d36cfcb8SZdenek Styblik 			|| ip3 > UINT8_MAX || ip4 > UINT8_MAX) {
1233d36cfcb8SZdenek Styblik 		lprintf(LOG_ERR, "Invalid IP address: %s", arg);
1234d36cfcb8SZdenek Styblik 		return (-1);
1235c18ec02fSPetter Reinholdtsen 	}
1236c18ec02fSPetter Reinholdtsen 	buf[0] = (uint8_t)ip1;
1237c18ec02fSPetter Reinholdtsen 	buf[1] = (uint8_t)ip2;
1238c18ec02fSPetter Reinholdtsen 	buf[2] = (uint8_t)ip3;
1239c18ec02fSPetter Reinholdtsen 	buf[3] = (uint8_t)ip4;
1240c18ec02fSPetter Reinholdtsen 	return 0;
1241c18ec02fSPetter Reinholdtsen }
1242c18ec02fSPetter Reinholdtsen 
1243c18ec02fSPetter Reinholdtsen static int
ipmi_lan_set_vlan_id(struct ipmi_intf * intf,uint8_t chan,char * string)1244c18ec02fSPetter Reinholdtsen ipmi_lan_set_vlan_id(struct ipmi_intf *intf,  uint8_t chan, char *string)
1245c18ec02fSPetter Reinholdtsen {
1246c18ec02fSPetter Reinholdtsen 	uint8_t data[2];
1247c18ec02fSPetter Reinholdtsen 	int rc;
1248c18ec02fSPetter Reinholdtsen 
1249c18ec02fSPetter Reinholdtsen 	if (string == NULL) {
1250c18ec02fSPetter Reinholdtsen 		data[0] = 0;
1251c18ec02fSPetter Reinholdtsen 		data[1] = 0;
1252c18ec02fSPetter Reinholdtsen 	}
1253c18ec02fSPetter Reinholdtsen 	else {
1254c18ec02fSPetter Reinholdtsen 		int id = 0;
1255c18ec02fSPetter Reinholdtsen 		if (str2int(string, &id) != 0) {
1256c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Given VLAN ID '%s' is invalid.", string);
1257c18ec02fSPetter Reinholdtsen 			return (-1);
1258c18ec02fSPetter Reinholdtsen 		}
1259c18ec02fSPetter Reinholdtsen 
1260c18ec02fSPetter Reinholdtsen 		if (id < 1 || id > 4094) {
1261512ec41aSZdenek Styblik 			lprintf(LOG_NOTICE, "VLAN ID must be between 1 and 4094.");
1262f35ed010SZdenek Styblik 			return (-1);
1263c18ec02fSPetter Reinholdtsen 		}
1264c18ec02fSPetter Reinholdtsen 		else {
1265c18ec02fSPetter Reinholdtsen 			data[0] = (uint8_t)id;
1266c18ec02fSPetter Reinholdtsen 			data[1] = (uint8_t)(id >> 8) | 0x80;
1267c18ec02fSPetter Reinholdtsen 		}
1268c18ec02fSPetter Reinholdtsen 	}
1269c18ec02fSPetter Reinholdtsen 	rc = set_lan_param(intf, chan, IPMI_LANP_VLAN_ID, data, 2);
1270c18ec02fSPetter Reinholdtsen 	return rc;
1271c18ec02fSPetter Reinholdtsen }
1272c18ec02fSPetter Reinholdtsen 
1273c18ec02fSPetter Reinholdtsen static int
ipmi_lan_set_vlan_priority(struct ipmi_intf * intf,uint8_t chan,char * string)1274c18ec02fSPetter Reinholdtsen ipmi_lan_set_vlan_priority(struct ipmi_intf *intf,  uint8_t chan, char *string)
1275c18ec02fSPetter Reinholdtsen {
1276c18ec02fSPetter Reinholdtsen 	uint8_t data;
1277c18ec02fSPetter Reinholdtsen 	int rc;
1278c18ec02fSPetter Reinholdtsen 	int priority = 0;
1279c18ec02fSPetter Reinholdtsen 	if (str2int(string, &priority) != 0) {
1280c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Given VLAN priority '%s' is invalid.", string);
1281c18ec02fSPetter Reinholdtsen 		return (-1);
1282c18ec02fSPetter Reinholdtsen 	}
1283c18ec02fSPetter Reinholdtsen 
1284c18ec02fSPetter Reinholdtsen 	if (priority < 0 || priority > 7) {
1285512ec41aSZdenek Styblik 		lprintf(LOG_NOTICE, "VLAN priority must be between 0 and 7.");
1286f35ed010SZdenek Styblik 		return (-1);
1287c18ec02fSPetter Reinholdtsen 	}
1288c18ec02fSPetter Reinholdtsen 	data = (uint8_t)priority;
1289c18ec02fSPetter Reinholdtsen 	rc = set_lan_param(intf, chan, IPMI_LANP_VLAN_PRIORITY, &data, 1);
1290c18ec02fSPetter Reinholdtsen 	return rc;
1291c18ec02fSPetter Reinholdtsen }
1292c18ec02fSPetter Reinholdtsen 
1293*89e9e634SDmitry Bazhenov static void
print_lan_set_bad_pass_thresh_usage(void)1294*89e9e634SDmitry Bazhenov print_lan_set_bad_pass_thresh_usage(void)
1295*89e9e634SDmitry Bazhenov {
1296*89e9e634SDmitry Bazhenov 	lprintf(LOG_NOTICE,
1297*89e9e634SDmitry Bazhenov "lan set <chanel> bad_pass_thresh <thresh_num> <1|0> <reset_interval> <lockout_interval>\n"
1298*89e9e634SDmitry Bazhenov "        <thresh_num>         Bad Pasword Threshold number.\n"
1299*89e9e634SDmitry Bazhenov "        <1|0>                1 = generate a Session Audit sensor event.\n"
1300*89e9e634SDmitry Bazhenov "                             0 = do not generate an event.\n"
1301*89e9e634SDmitry Bazhenov "        <reset_interval>     Attempt Count Reset Interval. In tens of seconds.\n"
1302*89e9e634SDmitry Bazhenov "        <lockount_interval>  User Lockout Interval. In tens of seconds.");
1303*89e9e634SDmitry Bazhenov }
1304*89e9e634SDmitry Bazhenov 
1305*89e9e634SDmitry Bazhenov /* get_cmdline_bad_pass_thresh - parse-out bad password threshold from given
1306*89e9e634SDmitry Bazhenov  * string and store it into buffer.
1307*89e9e634SDmitry Bazhenov  *
1308*89e9e634SDmitry Bazhenov  * @arg: string to be parsed.
1309*89e9e634SDmitry Bazhenov  * @buf: buffer of 6 to hold parsed Bad Password Threshold.
1310*89e9e634SDmitry Bazhenov  *
1311*89e9e634SDmitry Bazhenov  * returns zero on success, (-1) on error.
1312*89e9e634SDmitry Bazhenov  */
1313*89e9e634SDmitry Bazhenov static int
get_cmdline_bad_pass_thresh(char * argv[],uint8_t * buf)1314*89e9e634SDmitry Bazhenov get_cmdline_bad_pass_thresh(char *argv[], uint8_t *buf)
1315*89e9e634SDmitry Bazhenov {
1316*89e9e634SDmitry Bazhenov 	uint16_t reset, lockout;
1317*89e9e634SDmitry Bazhenov 
1318*89e9e634SDmitry Bazhenov 	if (str2uchar(argv[0], &buf[1])) {
1319*89e9e634SDmitry Bazhenov 		return -1;
1320*89e9e634SDmitry Bazhenov 	}
1321*89e9e634SDmitry Bazhenov 
1322*89e9e634SDmitry Bazhenov 	if (str2uchar(argv[1], &buf[0]) || buf[0] > 1) {
1323*89e9e634SDmitry Bazhenov 		return -1;
1324*89e9e634SDmitry Bazhenov 	}
1325*89e9e634SDmitry Bazhenov 
1326*89e9e634SDmitry Bazhenov 	if (str2ushort(argv[2], &reset)) {
1327*89e9e634SDmitry Bazhenov 		return -1;
1328*89e9e634SDmitry Bazhenov 	}
1329*89e9e634SDmitry Bazhenov 
1330*89e9e634SDmitry Bazhenov 	if (str2ushort(argv[3], &lockout)) {
1331*89e9e634SDmitry Bazhenov 		return -1;
1332*89e9e634SDmitry Bazhenov 	}
1333*89e9e634SDmitry Bazhenov 
1334*89e9e634SDmitry Bazhenov 	/* store parsed data */
1335*89e9e634SDmitry Bazhenov 	buf[2] = reset & 0xFF;
1336*89e9e634SDmitry Bazhenov 	buf[3] = reset >> 8;
1337*89e9e634SDmitry Bazhenov 	buf[4] = lockout & 0xFF;
1338*89e9e634SDmitry Bazhenov 	buf[5] = lockout >> 8;
1339*89e9e634SDmitry Bazhenov 	return 0;
1340*89e9e634SDmitry Bazhenov }
1341*89e9e634SDmitry Bazhenov 
1342c18ec02fSPetter Reinholdtsen static int
ipmi_lan_set(struct ipmi_intf * intf,int argc,char ** argv)1343c18ec02fSPetter Reinholdtsen ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv)
1344c18ec02fSPetter Reinholdtsen {
1345c18ec02fSPetter Reinholdtsen 	uint8_t data[32];
1346c18ec02fSPetter Reinholdtsen 	uint8_t chan;
1347c18ec02fSPetter Reinholdtsen 	int rc = 0;
1348c18ec02fSPetter Reinholdtsen 
1349c18ec02fSPetter Reinholdtsen 	if (argc < 2) {
135075843864SZdenek Styblik 		print_lan_set_usage();
1351c18ec02fSPetter Reinholdtsen 		return (-1);
1352c18ec02fSPetter Reinholdtsen 	}
1353c18ec02fSPetter Reinholdtsen 
1354c18ec02fSPetter Reinholdtsen 	if (strncmp(argv[0], "help", 4) == 0 ||
1355c18ec02fSPetter Reinholdtsen 	    strncmp(argv[1], "help", 4) == 0) {
135675843864SZdenek Styblik 		print_lan_set_usage();
1357c18ec02fSPetter Reinholdtsen 		return 0;
1358c18ec02fSPetter Reinholdtsen 	}
1359c18ec02fSPetter Reinholdtsen 
1360c18ec02fSPetter Reinholdtsen 	if (str2uchar(argv[0], &chan) != 0) {
1361c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Invalid channel: %s", argv[0]);
1362c18ec02fSPetter Reinholdtsen 		return (-1);
1363c18ec02fSPetter Reinholdtsen 	}
1364c18ec02fSPetter Reinholdtsen 
1365c18ec02fSPetter Reinholdtsen 	/* find type of channel and only accept 802.3 LAN */
1366c18ec02fSPetter Reinholdtsen 	if (!is_lan_channel(intf, chan)) {
1367c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Channel %d is not a LAN channel!", chan);
136875843864SZdenek Styblik 		print_lan_set_usage();
1369c18ec02fSPetter Reinholdtsen 		return -1;
1370c18ec02fSPetter Reinholdtsen 	}
1371c18ec02fSPetter Reinholdtsen 
1372c18ec02fSPetter Reinholdtsen 	memset(&data, 0, sizeof(data));
1373c18ec02fSPetter Reinholdtsen 
1374c18ec02fSPetter Reinholdtsen 	/* set user access */
1375c18ec02fSPetter Reinholdtsen 	if (strncmp(argv[1], "user", 4) == 0) {
1376c18ec02fSPetter Reinholdtsen 		rc = ipmi_set_user_access(intf, chan, 1);
1377c18ec02fSPetter Reinholdtsen 	}
1378c18ec02fSPetter Reinholdtsen 	/* set channel access mode */
1379c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "access", 6) == 0) {
1380c18ec02fSPetter Reinholdtsen 		if (argc < 3) {
138175843864SZdenek Styblik 			print_lan_set_access_usage();
1382c18ec02fSPetter Reinholdtsen 			return (-1);
1383c18ec02fSPetter Reinholdtsen 		}
1384c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "help", 4) == 0) {
138575843864SZdenek Styblik 			print_lan_set_access_usage();
1386c18ec02fSPetter Reinholdtsen 			return 0;
1387c18ec02fSPetter Reinholdtsen 		}
1388c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "on", 2) == 0) {
1389c18ec02fSPetter Reinholdtsen 			rc = ipmi_set_channel_access(intf, chan, 1);
1390c18ec02fSPetter Reinholdtsen 		}
1391c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "off", 3) == 0) {
1392c18ec02fSPetter Reinholdtsen 			rc = ipmi_set_channel_access(intf, chan, 0);
1393c18ec02fSPetter Reinholdtsen 		}
1394c18ec02fSPetter Reinholdtsen 		else {
139575843864SZdenek Styblik 			print_lan_set_access_usage();
1396c18ec02fSPetter Reinholdtsen 			return (-1);
1397c18ec02fSPetter Reinholdtsen 		}
1398c18ec02fSPetter Reinholdtsen 	}
1399c18ec02fSPetter Reinholdtsen 	/* set ARP control */
1400c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "arp", 3) == 0) {
1401c18ec02fSPetter Reinholdtsen 		if (argc < 3) {
140275843864SZdenek Styblik 			print_lan_set_arp_usage();
1403c18ec02fSPetter Reinholdtsen 			return (-1);
1404c18ec02fSPetter Reinholdtsen 		}
1405c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "help", 4) == 0) {
140675843864SZdenek Styblik 			print_lan_set_arp_usage();
1407c18ec02fSPetter Reinholdtsen 		}
1408c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "interval", 8) == 0) {
1409c18ec02fSPetter Reinholdtsen 			uint8_t interval = 0;
1410c18ec02fSPetter Reinholdtsen 			if (str2uchar(argv[3], &interval) != 0) {
1411c18ec02fSPetter Reinholdtsen 				lprintf(LOG_ERR, "Given ARP interval '%s' is invalid.", argv[3]);
1412c18ec02fSPetter Reinholdtsen 				return (-1);
1413c18ec02fSPetter Reinholdtsen 			}
1414c18ec02fSPetter Reinholdtsen 			rc = lan_set_arp_interval(intf, chan, interval);
1415c18ec02fSPetter Reinholdtsen 		}
1416c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "generate", 8) == 0) {
1417c18ec02fSPetter Reinholdtsen 			if (argc < 4) {
141875843864SZdenek Styblik 				print_lan_set_arp_usage();
1419c18ec02fSPetter Reinholdtsen 				return (-1);
1420c18ec02fSPetter Reinholdtsen 			}
1421c18ec02fSPetter Reinholdtsen 			else if (strncmp(argv[3], "on", 2) == 0)
1422c18ec02fSPetter Reinholdtsen 				rc = lan_set_arp_generate(intf, chan, 1);
1423c18ec02fSPetter Reinholdtsen 			else if (strncmp(argv[3], "off", 3) == 0)
1424c18ec02fSPetter Reinholdtsen 				rc = lan_set_arp_generate(intf, chan, 0);
1425c18ec02fSPetter Reinholdtsen 			else {
142675843864SZdenek Styblik 				print_lan_set_arp_usage();
1427c18ec02fSPetter Reinholdtsen 				return (-1);
1428c18ec02fSPetter Reinholdtsen 			}
1429c18ec02fSPetter Reinholdtsen 		}
1430c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "respond", 7) == 0) {
1431c18ec02fSPetter Reinholdtsen 			if (argc < 4) {
143275843864SZdenek Styblik 				print_lan_set_arp_usage();
1433c18ec02fSPetter Reinholdtsen 				return (-1);
1434c18ec02fSPetter Reinholdtsen 			}
1435c18ec02fSPetter Reinholdtsen 			else if (strncmp(argv[3], "on", 2) == 0)
1436c18ec02fSPetter Reinholdtsen 				rc = lan_set_arp_respond(intf, chan, 1);
1437c18ec02fSPetter Reinholdtsen 			else if (strncmp(argv[3], "off", 3) == 0)
1438c18ec02fSPetter Reinholdtsen 				rc = lan_set_arp_respond(intf, chan, 0);
1439c18ec02fSPetter Reinholdtsen 			else {
144075843864SZdenek Styblik 				print_lan_set_arp_usage();
1441c18ec02fSPetter Reinholdtsen 				return (-1);
1442c18ec02fSPetter Reinholdtsen 			}
1443c18ec02fSPetter Reinholdtsen 		}
1444c18ec02fSPetter Reinholdtsen 		else {
144575843864SZdenek Styblik 			print_lan_set_arp_usage();
1446c18ec02fSPetter Reinholdtsen 		}
1447c18ec02fSPetter Reinholdtsen 	}
1448c18ec02fSPetter Reinholdtsen 	/* set authentication types */
1449c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "auth", 4) == 0) {
1450c18ec02fSPetter Reinholdtsen 		if (argc < 3) {
145175843864SZdenek Styblik 			print_lan_set_auth_usage();
1452c18ec02fSPetter Reinholdtsen 			return (-1);
1453c18ec02fSPetter Reinholdtsen 		}
1454c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "help", 4) == 0) {
145575843864SZdenek Styblik 			print_lan_set_auth_usage();
1456c18ec02fSPetter Reinholdtsen 			return 0;
1457c18ec02fSPetter Reinholdtsen 		} else {
1458c18ec02fSPetter Reinholdtsen 			rc = ipmi_lan_set_auth(intf, chan, argv[2], argv[3]);
1459c18ec02fSPetter Reinholdtsen 		}
1460c18ec02fSPetter Reinholdtsen 	}
1461c18ec02fSPetter Reinholdtsen 	/* ip address source */
1462c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "ipsrc", 5) == 0) {
1463c18ec02fSPetter Reinholdtsen 		if (argc < 3) {
146475843864SZdenek Styblik 			print_lan_set_ipsrc_usage();
1465c18ec02fSPetter Reinholdtsen 			return (-1);
1466c18ec02fSPetter Reinholdtsen 		}
1467c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "help", 4) == 0) {
146875843864SZdenek Styblik 			print_lan_set_ipsrc_usage();
1469c18ec02fSPetter Reinholdtsen 			return 0;
1470c18ec02fSPetter Reinholdtsen 		}
1471c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "none", 4) == 0)
1472c18ec02fSPetter Reinholdtsen 			data[0] = 0;
1473c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "static", 5) == 0)
1474c18ec02fSPetter Reinholdtsen 			data[0] = 1;
1475c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "dhcp", 4) == 0)
1476c18ec02fSPetter Reinholdtsen 			data[0] = 2;
1477c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "bios", 4) == 0)
1478c18ec02fSPetter Reinholdtsen 			data[0] = 3;
1479c18ec02fSPetter Reinholdtsen 		else {
148075843864SZdenek Styblik 			print_lan_set_ipsrc_usage();
1481c18ec02fSPetter Reinholdtsen 			return -1;
1482c18ec02fSPetter Reinholdtsen 		}
1483c18ec02fSPetter Reinholdtsen 		rc = set_lan_param(intf, chan, IPMI_LANP_IP_ADDR_SRC, data, 1);
1484c18ec02fSPetter Reinholdtsen 	}
1485c18ec02fSPetter Reinholdtsen 	/* session password
1486c18ec02fSPetter Reinholdtsen 	 * not strictly a lan setting, but its used for lan connections */
1487c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "password", 8) == 0) {
148890e21344SZdenek Styblik 		rc = ipmi_lan_set_password(intf, 1, argv[2]);
1489c18ec02fSPetter Reinholdtsen 	}
1490c18ec02fSPetter Reinholdtsen 	/* snmp community string */
1491c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "snmp", 4) == 0) {
1492c18ec02fSPetter Reinholdtsen 		if (argc < 3) {
149375843864SZdenek Styblik 			print_lan_set_snmp_usage();
1494c18ec02fSPetter Reinholdtsen 			return (-1);
1495c18ec02fSPetter Reinholdtsen 		}
1496c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "help", 4) == 0) {
149775843864SZdenek Styblik 			print_lan_set_snmp_usage();
1498c18ec02fSPetter Reinholdtsen 			return 0;
1499c18ec02fSPetter Reinholdtsen 		} else {
1500c18ec02fSPetter Reinholdtsen 			memcpy(data, argv[2], __min(strlen(argv[2]), 18));
1501c18ec02fSPetter Reinholdtsen 			printf("Setting LAN %s to %s\n",
1502c18ec02fSPetter Reinholdtsen 			       ipmi_lan_params[IPMI_LANP_SNMP_STRING].desc, data);
1503c18ec02fSPetter Reinholdtsen 			rc = set_lan_param(intf, chan, IPMI_LANP_SNMP_STRING, data, 18);
1504c18ec02fSPetter Reinholdtsen 		}
1505c18ec02fSPetter Reinholdtsen 	}
1506c18ec02fSPetter Reinholdtsen 	/* ip address */
1507c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "ipaddr", 6) == 0) {
1508c18ec02fSPetter Reinholdtsen 		if(argc != 3)
1509c18ec02fSPetter Reinholdtsen 		{
151075843864SZdenek Styblik 			print_lan_set_usage();
1511c18ec02fSPetter Reinholdtsen 			return -1;
1512c18ec02fSPetter Reinholdtsen 		}
1513c18ec02fSPetter Reinholdtsen 		rc = get_cmdline_ipaddr(argv[2], data);
1514c18ec02fSPetter Reinholdtsen 		if (rc == 0) {
1515c18ec02fSPetter Reinholdtsen 			printf("Setting LAN %s to %d.%d.%d.%d\n",
1516c18ec02fSPetter Reinholdtsen 				ipmi_lan_params[IPMI_LANP_IP_ADDR].desc,
1517c18ec02fSPetter Reinholdtsen 				data[0], data[1], data[2], data[3]);
1518c18ec02fSPetter Reinholdtsen 			rc = set_lan_param(intf, chan, IPMI_LANP_IP_ADDR, data, 4);
1519c18ec02fSPetter Reinholdtsen 		}
1520c18ec02fSPetter Reinholdtsen 	}
1521c18ec02fSPetter Reinholdtsen 	/* network mask */
1522c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "netmask", 7) == 0) {
1523c18ec02fSPetter Reinholdtsen 		if(argc != 3)
1524c18ec02fSPetter Reinholdtsen 		{
152575843864SZdenek Styblik 			print_lan_set_usage();
1526c18ec02fSPetter Reinholdtsen 			return -1;
1527c18ec02fSPetter Reinholdtsen 		}
1528c18ec02fSPetter Reinholdtsen 		rc = get_cmdline_ipaddr(argv[2], data);
1529c18ec02fSPetter Reinholdtsen 		if (rc == 0) {
1530c18ec02fSPetter Reinholdtsen 			printf("Setting LAN %s to %d.%d.%d.%d\n",
1531c18ec02fSPetter Reinholdtsen 		       		ipmi_lan_params[IPMI_LANP_SUBNET_MASK].desc,
1532c18ec02fSPetter Reinholdtsen 		       		data[0], data[1], data[2], data[3]);
1533c18ec02fSPetter Reinholdtsen 			rc = set_lan_param(intf, chan, IPMI_LANP_SUBNET_MASK, data, 4);
1534c18ec02fSPetter Reinholdtsen 		}
1535c18ec02fSPetter Reinholdtsen 	}
1536c18ec02fSPetter Reinholdtsen 	/* mac address */
1537c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "macaddr", 7) == 0) {
1538c18ec02fSPetter Reinholdtsen 		if(argc != 3)
1539c18ec02fSPetter Reinholdtsen 		{
154075843864SZdenek Styblik 			print_lan_set_usage();
1541c18ec02fSPetter Reinholdtsen 			return -1;
1542c18ec02fSPetter Reinholdtsen 		}
1543c18ec02fSPetter Reinholdtsen 		rc = get_cmdline_macaddr(argv[2], data);
1544c18ec02fSPetter Reinholdtsen 		if (rc == 0) {
1545c18ec02fSPetter Reinholdtsen 			printf("Setting LAN %s to %02x:%02x:%02x:%02x:%02x:%02x\n",
1546c18ec02fSPetter Reinholdtsen 		       		ipmi_lan_params[IPMI_LANP_MAC_ADDR].desc,
1547c18ec02fSPetter Reinholdtsen 		       		data[0], data[1], data[2], data[3], data[4], data[5]);
1548c18ec02fSPetter Reinholdtsen 			rc = set_lan_param(intf, chan, IPMI_LANP_MAC_ADDR, data, 6);
1549c18ec02fSPetter Reinholdtsen 		}
1550c18ec02fSPetter Reinholdtsen 	}
1551c18ec02fSPetter Reinholdtsen 	/* default gateway settings */
1552c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "defgw", 5) == 0) {
1553c18ec02fSPetter Reinholdtsen 		if (argc < 4) {
155475843864SZdenek Styblik 			print_lan_set_defgw_usage();
1555c18ec02fSPetter Reinholdtsen 			return (-1);
1556c18ec02fSPetter Reinholdtsen 		}
1557c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "help", 4) == 0) {
155875843864SZdenek Styblik 			print_lan_set_defgw_usage();
1559c18ec02fSPetter Reinholdtsen 			return 0;
1560c18ec02fSPetter Reinholdtsen 		}
1561c18ec02fSPetter Reinholdtsen 		else if ((strncmp(argv[2], "ipaddr", 5) == 0) &&
1562c18ec02fSPetter Reinholdtsen 			 (get_cmdline_ipaddr(argv[3], data) == 0)) {
1563c18ec02fSPetter Reinholdtsen 			printf("Setting LAN %s to %d.%d.%d.%d\n",
1564c18ec02fSPetter Reinholdtsen 			       ipmi_lan_params[IPMI_LANP_DEF_GATEWAY_IP].desc,
1565c18ec02fSPetter Reinholdtsen 			       data[0], data[1], data[2], data[3]);
1566c18ec02fSPetter Reinholdtsen 			rc = set_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_IP, data, 4);
1567c18ec02fSPetter Reinholdtsen 		}
1568c18ec02fSPetter Reinholdtsen 		else if ((strncmp(argv[2], "macaddr", 7) == 0) &&
1569c18ec02fSPetter Reinholdtsen 			 (get_cmdline_macaddr(argv[3], data) == 0)) {
1570c18ec02fSPetter Reinholdtsen 			printf("Setting LAN %s to %02x:%02x:%02x:%02x:%02x:%02x\n",
1571c18ec02fSPetter Reinholdtsen 			       ipmi_lan_params[IPMI_LANP_DEF_GATEWAY_MAC].desc,
1572c18ec02fSPetter Reinholdtsen 			       data[0], data[1], data[2], data[3], data[4], data[5]);
1573c18ec02fSPetter Reinholdtsen 			rc = set_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_MAC, data, 6);
1574c18ec02fSPetter Reinholdtsen 		}
1575c18ec02fSPetter Reinholdtsen 		else {
157675843864SZdenek Styblik 			print_lan_set_usage();
1577c18ec02fSPetter Reinholdtsen 			return -1;
1578c18ec02fSPetter Reinholdtsen 		}
1579c18ec02fSPetter Reinholdtsen 	}
1580c18ec02fSPetter Reinholdtsen 	/* backup gateway settings */
1581c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "bakgw", 5) == 0) {
1582c18ec02fSPetter Reinholdtsen 		if (argc < 4) {
158375843864SZdenek Styblik 			print_lan_set_bakgw_usage();
1584c18ec02fSPetter Reinholdtsen 			return (-1);
1585c18ec02fSPetter Reinholdtsen 		}
1586c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "help", 4) == 0) {
158775843864SZdenek Styblik 			print_lan_set_bakgw_usage();
1588c18ec02fSPetter Reinholdtsen 			return 0;
1589c18ec02fSPetter Reinholdtsen 		}
1590c18ec02fSPetter Reinholdtsen 		else if ((strncmp(argv[2], "ipaddr", 5) == 0) &&
1591c18ec02fSPetter Reinholdtsen 			 (get_cmdline_ipaddr(argv[3], data) == 0)) {
1592c18ec02fSPetter Reinholdtsen 			printf("Setting LAN %s to %d.%d.%d.%d\n",
1593c18ec02fSPetter Reinholdtsen 			       ipmi_lan_params[IPMI_LANP_BAK_GATEWAY_IP].desc,
1594c18ec02fSPetter Reinholdtsen 			       data[0], data[1], data[2], data[3]);
1595c18ec02fSPetter Reinholdtsen 			rc = set_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_IP, data, 4);
1596c18ec02fSPetter Reinholdtsen 		}
1597c18ec02fSPetter Reinholdtsen 		else if ((strncmp(argv[2], "macaddr", 7) == 0) &&
1598c18ec02fSPetter Reinholdtsen 			 (get_cmdline_macaddr(argv[3], data) == 0)) {
1599c18ec02fSPetter Reinholdtsen 			printf("Setting LAN %s to %02x:%02x:%02x:%02x:%02x:%02x\n",
1600c18ec02fSPetter Reinholdtsen 			       ipmi_lan_params[IPMI_LANP_BAK_GATEWAY_MAC].desc,
1601c18ec02fSPetter Reinholdtsen 			       data[0], data[1], data[2], data[3], data[4], data[5]);
1602c18ec02fSPetter Reinholdtsen 			rc = set_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_MAC, data, 6);
1603c18ec02fSPetter Reinholdtsen 		}
1604c18ec02fSPetter Reinholdtsen 		else {
160575843864SZdenek Styblik 			print_lan_set_usage();
1606c18ec02fSPetter Reinholdtsen 			return -1;
1607c18ec02fSPetter Reinholdtsen 		}
1608c18ec02fSPetter Reinholdtsen 	}
1609c18ec02fSPetter Reinholdtsen 	else if (strncasecmp(argv[1], "vlan", 4) == 0) {
1610c18ec02fSPetter Reinholdtsen 		if (argc < 4) {
161175843864SZdenek Styblik 			print_lan_set_vlan_usage();
1612c18ec02fSPetter Reinholdtsen 			return (-1);
1613c18ec02fSPetter Reinholdtsen 		}
1614c18ec02fSPetter Reinholdtsen 		else if (strncmp(argv[2], "help", 4) == 0) {
161575843864SZdenek Styblik 			print_lan_set_vlan_usage();
1616c18ec02fSPetter Reinholdtsen 			return 0;
1617c18ec02fSPetter Reinholdtsen 		}
1618c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(argv[2], "id", 2) == 0) {
1619c18ec02fSPetter Reinholdtsen 			if (strncasecmp(argv[3], "off", 3) == 0) {
1620c18ec02fSPetter Reinholdtsen 				ipmi_lan_set_vlan_id(intf, chan, NULL);
1621c18ec02fSPetter Reinholdtsen 			}
1622c18ec02fSPetter Reinholdtsen 			else {
1623c18ec02fSPetter Reinholdtsen 				ipmi_lan_set_vlan_id(intf, chan, argv[3]);
1624c18ec02fSPetter Reinholdtsen 			}
1625c18ec02fSPetter Reinholdtsen 		}
1626c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(argv[2], "priority", 8) == 0) {
1627c18ec02fSPetter Reinholdtsen 			ipmi_lan_set_vlan_priority(intf, chan, argv[3]);
1628c18ec02fSPetter Reinholdtsen 		}
1629c18ec02fSPetter Reinholdtsen 		else {
163075843864SZdenek Styblik 			print_lan_set_vlan_usage();
1631c18ec02fSPetter Reinholdtsen 			return (-1);
1632c18ec02fSPetter Reinholdtsen 		}
1633c18ec02fSPetter Reinholdtsen 	}
1634c18ec02fSPetter Reinholdtsen 	/* set PEF alerting on or off */
1635c18ec02fSPetter Reinholdtsen 	else if (strncasecmp(argv[1], "alert", 5) == 0) {
1636c18ec02fSPetter Reinholdtsen 		if (argc < 3) {
1637c18ec02fSPetter Reinholdtsen 			lprintf(LOG_NOTICE, "LAN set alert must be 'on' or 'off'");
1638c18ec02fSPetter Reinholdtsen 			return (-1);
1639c18ec02fSPetter Reinholdtsen 		}
1640c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(argv[2], "on", 2) == 0 ||
1641c18ec02fSPetter Reinholdtsen 			 strncasecmp(argv[2], "enable", 6) == 0) {
1642c18ec02fSPetter Reinholdtsen 			printf("Enabling PEF alerts for LAN channel %d\n", chan);
1643c18ec02fSPetter Reinholdtsen 			rc = ipmi_set_alert_enable(intf, chan, 1);
1644c18ec02fSPetter Reinholdtsen 		}
1645c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(argv[2], "off", 3) == 0 ||
1646c18ec02fSPetter Reinholdtsen 			 strncasecmp(argv[2], "disable", 7) == 0) {
1647c18ec02fSPetter Reinholdtsen 			printf("Disabling PEF alerts for LAN channel %d\n", chan);
1648c18ec02fSPetter Reinholdtsen 			rc = ipmi_set_alert_enable(intf, chan, 0);
1649c18ec02fSPetter Reinholdtsen 		}
1650c18ec02fSPetter Reinholdtsen 		else {
1651c18ec02fSPetter Reinholdtsen 			lprintf(LOG_NOTICE, "LAN set alert must be 'on' or 'off'");
1652c18ec02fSPetter Reinholdtsen 			return 0;
1653c18ec02fSPetter Reinholdtsen 		}
1654c18ec02fSPetter Reinholdtsen 	}
1655c18ec02fSPetter Reinholdtsen 	/* RMCP+ cipher suite privilege levels */
1656c18ec02fSPetter Reinholdtsen 	else if (strncmp(argv[1], "cipher_privs", 12) == 0)
1657c18ec02fSPetter Reinholdtsen 	{
1658c18ec02fSPetter Reinholdtsen 		if (argc != 3) {
165975843864SZdenek Styblik 			print_lan_set_cipher_privs_usage();
1660c18ec02fSPetter Reinholdtsen 			return (-1);
1661c18ec02fSPetter Reinholdtsen 		}
1662c18ec02fSPetter Reinholdtsen 		else if ((strncmp(argv[2], "help", 4) == 0) ||
1663c18ec02fSPetter Reinholdtsen 		    get_cmdline_cipher_suite_priv_data(argv[2], data))
1664c18ec02fSPetter Reinholdtsen 		{
166575843864SZdenek Styblik 			print_lan_set_cipher_privs_usage();
1666c18ec02fSPetter Reinholdtsen 			return 0;
1667c18ec02fSPetter Reinholdtsen 		}
1668c18ec02fSPetter Reinholdtsen 		else
1669c18ec02fSPetter Reinholdtsen 		{
1670c18ec02fSPetter Reinholdtsen 			rc = set_lan_param(intf, chan, IPMI_LANP_RMCP_PRIV_LEVELS, data, 9);
1671c18ec02fSPetter Reinholdtsen 		}
1672c18ec02fSPetter Reinholdtsen 	}
1673*89e9e634SDmitry Bazhenov 	else if (strncmp(argv[1], "bad_pass_thresh", 15) == 0)
1674*89e9e634SDmitry Bazhenov 	{
1675*89e9e634SDmitry Bazhenov 		if (argc == 3 && strncmp(argv[2], "help", 4) == 0) {
1676*89e9e634SDmitry Bazhenov 			print_lan_set_bad_pass_thresh_usage();
1677*89e9e634SDmitry Bazhenov 			return 0;
1678*89e9e634SDmitry Bazhenov 		}
1679*89e9e634SDmitry Bazhenov 		if (argc < 6 || get_cmdline_bad_pass_thresh(&argv[2], data)) {
1680*89e9e634SDmitry Bazhenov 			print_lan_set_bad_pass_thresh_usage();
1681*89e9e634SDmitry Bazhenov 			return (-1);
1682*89e9e634SDmitry Bazhenov 		}
1683*89e9e634SDmitry Bazhenov 		rc = set_lan_param(intf, chan, IPMI_LANP_BAD_PASS_THRESH, data, 6);
1684*89e9e634SDmitry Bazhenov 	}
1685c18ec02fSPetter Reinholdtsen 	else {
168675843864SZdenek Styblik 		print_lan_set_usage();
1687c18ec02fSPetter Reinholdtsen 		return (-1);
1688c18ec02fSPetter Reinholdtsen 	}
1689c18ec02fSPetter Reinholdtsen 
1690c18ec02fSPetter Reinholdtsen 	return rc;
1691c18ec02fSPetter Reinholdtsen }
1692c18ec02fSPetter Reinholdtsen 
1693c18ec02fSPetter Reinholdtsen 
1694c18ec02fSPetter Reinholdtsen static int
is_alert_destination(struct ipmi_intf * intf,uint8_t channel,uint8_t alert)1695c18ec02fSPetter Reinholdtsen is_alert_destination(struct ipmi_intf * intf, uint8_t channel, uint8_t alert)
1696c18ec02fSPetter Reinholdtsen {
1697c18ec02fSPetter Reinholdtsen 	struct lan_param * p;
1698c18ec02fSPetter Reinholdtsen 
1699c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, channel, IPMI_LANP_NUM_DEST);
1700c18ec02fSPetter Reinholdtsen 	if (p == NULL)
1701c18ec02fSPetter Reinholdtsen 		return 0;
1702c18ec02fSPetter Reinholdtsen 	if (p->data == NULL)
1703c18ec02fSPetter Reinholdtsen 		return 0;
1704c18ec02fSPetter Reinholdtsen 
1705c18ec02fSPetter Reinholdtsen 	if (alert <= (p->data[0] & 0xf))
1706c18ec02fSPetter Reinholdtsen 		return 1;
1707c18ec02fSPetter Reinholdtsen 	else
1708c18ec02fSPetter Reinholdtsen 		return 0;
1709c18ec02fSPetter Reinholdtsen }
1710c18ec02fSPetter Reinholdtsen 
1711c18ec02fSPetter Reinholdtsen static int
ipmi_lan_alert_print(struct ipmi_intf * intf,uint8_t channel,uint8_t alert)1712c18ec02fSPetter Reinholdtsen ipmi_lan_alert_print(struct ipmi_intf * intf, uint8_t channel, uint8_t alert)
1713c18ec02fSPetter Reinholdtsen {
1714c18ec02fSPetter Reinholdtsen # define PTYPE_LEN	4
1715c18ec02fSPetter Reinholdtsen # define PADDR_LEN	13
1716c18ec02fSPetter Reinholdtsen 	struct lan_param *lp_ptr = NULL;
1717c18ec02fSPetter Reinholdtsen 	int isack = 0;
1718c18ec02fSPetter Reinholdtsen 	uint8_t ptype[PTYPE_LEN];
1719c18ec02fSPetter Reinholdtsen 	uint8_t paddr[PADDR_LEN];
1720c18ec02fSPetter Reinholdtsen 
1721c18ec02fSPetter Reinholdtsen 	lp_ptr = get_lan_param_select(intf, channel, IPMI_LANP_DEST_TYPE, alert);
1722c18ec02fSPetter Reinholdtsen 	if (lp_ptr == NULL || lp_ptr->data == NULL
1723c18ec02fSPetter Reinholdtsen 			|| lp_ptr->data_len < PTYPE_LEN) {
1724c18ec02fSPetter Reinholdtsen 		return (-1);
1725c18ec02fSPetter Reinholdtsen 	}
1726c18ec02fSPetter Reinholdtsen 	memcpy(ptype, lp_ptr->data, PTYPE_LEN);
1727c18ec02fSPetter Reinholdtsen 
1728c18ec02fSPetter Reinholdtsen 	lp_ptr = get_lan_param_select(intf, channel, IPMI_LANP_DEST_ADDR, alert);
1729c18ec02fSPetter Reinholdtsen 	if (lp_ptr == NULL || lp_ptr->data == NULL
1730c18ec02fSPetter Reinholdtsen 			|| lp_ptr->data_len < PADDR_LEN) {
1731c18ec02fSPetter Reinholdtsen 		return (-1);
1732c18ec02fSPetter Reinholdtsen 	}
1733c18ec02fSPetter Reinholdtsen 	memcpy(paddr, lp_ptr->data, PADDR_LEN);
1734c18ec02fSPetter Reinholdtsen 
1735c18ec02fSPetter Reinholdtsen 	printf("%-24s: %d\n", "Alert Destination",
1736c18ec02fSPetter Reinholdtsen 			ptype[0]);
1737c18ec02fSPetter Reinholdtsen 
1738c18ec02fSPetter Reinholdtsen 	if (ptype[1] & 0x80) {
1739c18ec02fSPetter Reinholdtsen 		isack = 1;
1740c18ec02fSPetter Reinholdtsen 	}
1741c18ec02fSPetter Reinholdtsen 	printf("%-24s: %s\n", "Alert Acknowledge",
1742c18ec02fSPetter Reinholdtsen 			isack ? "Acknowledged" : "Unacknowledged");
1743c18ec02fSPetter Reinholdtsen 
1744c18ec02fSPetter Reinholdtsen 	printf("%-24s: ", "Destination Type");
1745c18ec02fSPetter Reinholdtsen 	switch (ptype[1] & 0x7) {
1746c18ec02fSPetter Reinholdtsen 	case 0:
1747c18ec02fSPetter Reinholdtsen 		printf("PET Trap\n");
1748c18ec02fSPetter Reinholdtsen 		break;
1749c18ec02fSPetter Reinholdtsen 	case 6:
1750c18ec02fSPetter Reinholdtsen 		printf("OEM 1\n");
1751c18ec02fSPetter Reinholdtsen 		break;
1752c18ec02fSPetter Reinholdtsen 	case 7:
1753c18ec02fSPetter Reinholdtsen 		printf("OEM 2\n");
1754c18ec02fSPetter Reinholdtsen 		break;
1755c18ec02fSPetter Reinholdtsen 	default:
1756c18ec02fSPetter Reinholdtsen 		printf("Unknown\n");
1757c18ec02fSPetter Reinholdtsen 		break;
1758c18ec02fSPetter Reinholdtsen 	}
1759c18ec02fSPetter Reinholdtsen 
1760c18ec02fSPetter Reinholdtsen 	printf("%-24s: %d\n",
1761c18ec02fSPetter Reinholdtsen 			isack ? "Acknowledge Timeout" : "Retry Interval",
1762c18ec02fSPetter Reinholdtsen 			ptype[2]);
1763c18ec02fSPetter Reinholdtsen 
1764c18ec02fSPetter Reinholdtsen 	printf("%-24s: %d\n", "Number of Retries",
1765c18ec02fSPetter Reinholdtsen 			ptype[3] & 0x7);
1766c18ec02fSPetter Reinholdtsen 
1767c18ec02fSPetter Reinholdtsen 	if ((paddr[1] & 0xf0) != 0) {
1768c18ec02fSPetter Reinholdtsen 		/* unknown address format */
1769c18ec02fSPetter Reinholdtsen 		printf("\n");
1770c18ec02fSPetter Reinholdtsen 		return 0;
1771c18ec02fSPetter Reinholdtsen 	}
1772c18ec02fSPetter Reinholdtsen 
1773c18ec02fSPetter Reinholdtsen 	printf("%-24s: %s\n", "Alert Gateway",
1774c18ec02fSPetter Reinholdtsen 			(paddr[2] & 1) ? "Backup" : "Default");
1775c18ec02fSPetter Reinholdtsen 
1776c18ec02fSPetter Reinholdtsen 	printf("%-24s: %d.%d.%d.%d\n", "Alert IP Address",
1777c18ec02fSPetter Reinholdtsen 			paddr[3], paddr[4], paddr[5], paddr[6]);
1778c18ec02fSPetter Reinholdtsen 
1779c18ec02fSPetter Reinholdtsen 	printf("%-24s: %02x:%02x:%02x:%02x:%02x:%02x\n", "Alert MAC Address",
1780c18ec02fSPetter Reinholdtsen 			paddr[7], paddr[8], paddr[9],
1781c18ec02fSPetter Reinholdtsen 			paddr[10], paddr[11], paddr[12]);
1782c18ec02fSPetter Reinholdtsen 
1783c18ec02fSPetter Reinholdtsen 	printf("\n");
1784c18ec02fSPetter Reinholdtsen 	return 0;
1785c18ec02fSPetter Reinholdtsen }
1786c18ec02fSPetter Reinholdtsen 
1787c18ec02fSPetter Reinholdtsen static int
ipmi_lan_alert_print_all(struct ipmi_intf * intf,uint8_t channel)1788c18ec02fSPetter Reinholdtsen ipmi_lan_alert_print_all(struct ipmi_intf * intf, uint8_t channel)
1789c18ec02fSPetter Reinholdtsen {
1790c18ec02fSPetter Reinholdtsen 	int j, ndest;
1791c18ec02fSPetter Reinholdtsen 	struct lan_param * p;
1792c18ec02fSPetter Reinholdtsen 
1793c18ec02fSPetter Reinholdtsen 	p = get_lan_param(intf, channel, IPMI_LANP_NUM_DEST);
1794c18ec02fSPetter Reinholdtsen 	if (p == NULL)
1795c18ec02fSPetter Reinholdtsen 		return -1;
1796c18ec02fSPetter Reinholdtsen 	if (p->data == NULL)
1797c18ec02fSPetter Reinholdtsen 		return -1;
1798c18ec02fSPetter Reinholdtsen 	ndest = p->data[0] & 0xf;
1799c18ec02fSPetter Reinholdtsen 
1800c18ec02fSPetter Reinholdtsen 	for (j=0; j<=ndest; j++) {
1801c18ec02fSPetter Reinholdtsen 		ipmi_lan_alert_print(intf, channel, j);
1802c18ec02fSPetter Reinholdtsen 	}
1803c18ec02fSPetter Reinholdtsen 
1804c18ec02fSPetter Reinholdtsen 	return 0;
1805c18ec02fSPetter Reinholdtsen }
1806c18ec02fSPetter Reinholdtsen 
1807c18ec02fSPetter Reinholdtsen static int
ipmi_lan_alert_set(struct ipmi_intf * intf,uint8_t chan,uint8_t alert,int argc,char ** argv)1808c18ec02fSPetter Reinholdtsen ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert,
1809c18ec02fSPetter Reinholdtsen 		   int argc, char ** argv)
1810c18ec02fSPetter Reinholdtsen {
1811c18ec02fSPetter Reinholdtsen 	struct lan_param * p;
1812c18ec02fSPetter Reinholdtsen 	uint8_t data[32], temp[32];
1813c18ec02fSPetter Reinholdtsen 	int rc = 0;
1814c18ec02fSPetter Reinholdtsen 
1815c18ec02fSPetter Reinholdtsen 	if (argc < 2) {
181675843864SZdenek Styblik 		print_lan_alert_set_usage();
1817c18ec02fSPetter Reinholdtsen 		return (-1);
1818c18ec02fSPetter Reinholdtsen 	}
1819c18ec02fSPetter Reinholdtsen 
1820c18ec02fSPetter Reinholdtsen 	if (strncmp(argv[0], "help", 4) == 0 ||
1821c18ec02fSPetter Reinholdtsen 	    strncmp(argv[1], "help", 4) == 0) {
182275843864SZdenek Styblik 		print_lan_alert_set_usage();
1823c18ec02fSPetter Reinholdtsen 		return 0;
1824c18ec02fSPetter Reinholdtsen 	}
1825c18ec02fSPetter Reinholdtsen 
1826c18ec02fSPetter Reinholdtsen 	memset(data, 0, sizeof(data));
1827c18ec02fSPetter Reinholdtsen 	memset(temp, 0, sizeof(temp));
1828c18ec02fSPetter Reinholdtsen 
1829c18ec02fSPetter Reinholdtsen 	/* alert destination ip address */
1830c18ec02fSPetter Reinholdtsen 	if (strncasecmp(argv[0], "ipaddr", 6) == 0 &&
1831c18ec02fSPetter Reinholdtsen 	    (get_cmdline_ipaddr(argv[1], temp) == 0)) {
1832c18ec02fSPetter Reinholdtsen 		/* get current parameter */
1833c18ec02fSPetter Reinholdtsen 		p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_ADDR, alert);
1834c18ec02fSPetter Reinholdtsen 		if (p == NULL) {
1835c18ec02fSPetter Reinholdtsen 			return (-1);
1836c18ec02fSPetter Reinholdtsen 		}
1837c18ec02fSPetter Reinholdtsen 		memcpy(data, p->data, p->data_len);
1838c18ec02fSPetter Reinholdtsen 		/* set new ipaddr */
1839c18ec02fSPetter Reinholdtsen 		memcpy(data+3, temp, 4);
1840c18ec02fSPetter Reinholdtsen 		printf("Setting LAN Alert %d IP Address to %d.%d.%d.%d\n", alert,
1841c18ec02fSPetter Reinholdtsen 		       data[3], data[4], data[5], data[6]);
1842c18ec02fSPetter Reinholdtsen 		rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_ADDR, data, p->data_len);
1843c18ec02fSPetter Reinholdtsen 	}
1844c18ec02fSPetter Reinholdtsen 	/* alert destination mac address */
1845c18ec02fSPetter Reinholdtsen 	else if (strncasecmp(argv[0], "macaddr", 7) == 0 &&
1846c18ec02fSPetter Reinholdtsen 		 (get_cmdline_macaddr(argv[1], temp) == 0)) {
1847c18ec02fSPetter Reinholdtsen 		/* get current parameter */
1848c18ec02fSPetter Reinholdtsen 		p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_ADDR, alert);
1849c18ec02fSPetter Reinholdtsen 		if (p == NULL) {
1850c18ec02fSPetter Reinholdtsen 			return (-1);
1851c18ec02fSPetter Reinholdtsen 		}
1852c18ec02fSPetter Reinholdtsen 		memcpy(data, p->data, p->data_len);
1853c18ec02fSPetter Reinholdtsen 		/* set new macaddr */
1854c18ec02fSPetter Reinholdtsen 		memcpy(data+7, temp, 6);
1855c18ec02fSPetter Reinholdtsen 		printf("Setting LAN Alert %d MAC Address to "
1856c18ec02fSPetter Reinholdtsen 		       "%02x:%02x:%02x:%02x:%02x:%02x\n", alert,
1857c18ec02fSPetter Reinholdtsen 		       data[7], data[8], data[9], data[10], data[11], data[12]);
1858c18ec02fSPetter Reinholdtsen 		rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_ADDR, data, p->data_len);
1859c18ec02fSPetter Reinholdtsen 	}
1860c18ec02fSPetter Reinholdtsen 	/* alert destination gateway selector */
1861c18ec02fSPetter Reinholdtsen 	else if (strncasecmp(argv[0], "gateway", 7) == 0) {
1862c18ec02fSPetter Reinholdtsen 		/* get current parameter */
1863c18ec02fSPetter Reinholdtsen 		p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_ADDR, alert);
1864c18ec02fSPetter Reinholdtsen 		if (p == NULL) {
1865c18ec02fSPetter Reinholdtsen 			return (-1);
1866c18ec02fSPetter Reinholdtsen 		}
1867c18ec02fSPetter Reinholdtsen 		memcpy(data, p->data, p->data_len);
1868c18ec02fSPetter Reinholdtsen 
1869c18ec02fSPetter Reinholdtsen 		if (strncasecmp(argv[1], "def", 3) == 0 ||
1870c18ec02fSPetter Reinholdtsen 		    strncasecmp(argv[1], "default", 7) == 0) {
1871c18ec02fSPetter Reinholdtsen 			printf("Setting LAN Alert %d to use Default Gateway\n", alert);
1872c18ec02fSPetter Reinholdtsen 			data[2] = 0;
1873c18ec02fSPetter Reinholdtsen 		}
1874c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(argv[1], "bak", 3) == 0 ||
1875c18ec02fSPetter Reinholdtsen 			 strncasecmp(argv[1], "backup", 6) == 0) {
1876c18ec02fSPetter Reinholdtsen 			printf("Setting LAN Alert %d to use Backup Gateway\n", alert);
1877c18ec02fSPetter Reinholdtsen 			data[2] = 1;
1878c18ec02fSPetter Reinholdtsen 		}
1879c18ec02fSPetter Reinholdtsen 		else {
188075843864SZdenek Styblik 			print_lan_alert_set_usage();
1881c18ec02fSPetter Reinholdtsen 			return -1;
1882c18ec02fSPetter Reinholdtsen 		}
1883c18ec02fSPetter Reinholdtsen 
1884c18ec02fSPetter Reinholdtsen 		rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_ADDR, data, p->data_len);
1885c18ec02fSPetter Reinholdtsen 	}
1886c18ec02fSPetter Reinholdtsen 	/* alert acknowledgement */
1887c18ec02fSPetter Reinholdtsen 	else if (strncasecmp(argv[0], "ack", 3) == 0) {
1888c18ec02fSPetter Reinholdtsen 		/* get current parameter */
1889c18ec02fSPetter Reinholdtsen 		p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_TYPE, alert);
1890c18ec02fSPetter Reinholdtsen 		if (p == NULL) {
1891c18ec02fSPetter Reinholdtsen 			return (-1);
1892c18ec02fSPetter Reinholdtsen 		}
1893c18ec02fSPetter Reinholdtsen 		memcpy(data, p->data, p->data_len);
1894c18ec02fSPetter Reinholdtsen 
1895c18ec02fSPetter Reinholdtsen 		if (strncasecmp(argv[1], "on", 2) == 0 ||
1896c18ec02fSPetter Reinholdtsen 		    strncasecmp(argv[1], "yes", 3) == 0) {
1897c18ec02fSPetter Reinholdtsen 			printf("Setting LAN Alert %d to Acknowledged\n", alert);
1898c18ec02fSPetter Reinholdtsen 			data[1] |= 0x80;
1899c18ec02fSPetter Reinholdtsen 		}
1900c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(argv[1], "off", 3) == 0 ||
1901c18ec02fSPetter Reinholdtsen 			 strncasecmp(argv[1], "no", 2) == 0) {
1902c18ec02fSPetter Reinholdtsen 			printf("Setting LAN Alert %d to Unacknowledged\n", alert);
1903c18ec02fSPetter Reinholdtsen 			data[1] &= ~0x80;
1904c18ec02fSPetter Reinholdtsen 		}
1905c18ec02fSPetter Reinholdtsen 		else {
190675843864SZdenek Styblik 			print_lan_alert_set_usage();
1907c18ec02fSPetter Reinholdtsen 			return -1;
1908c18ec02fSPetter Reinholdtsen 		}
1909c18ec02fSPetter Reinholdtsen 		rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_TYPE, data, p->data_len);
1910c18ec02fSPetter Reinholdtsen 	}
1911c18ec02fSPetter Reinholdtsen 	/* alert destination type */
1912c18ec02fSPetter Reinholdtsen 	else if (strncasecmp(argv[0], "type", 4) == 0) {
1913c18ec02fSPetter Reinholdtsen 		/* get current parameter */
1914c18ec02fSPetter Reinholdtsen 		p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_TYPE, alert);
1915c18ec02fSPetter Reinholdtsen 		if (p == NULL) {
1916c18ec02fSPetter Reinholdtsen 			return (-1);
1917c18ec02fSPetter Reinholdtsen 		}
1918c18ec02fSPetter Reinholdtsen 		memcpy(data, p->data, p->data_len);
1919c18ec02fSPetter Reinholdtsen 
1920c18ec02fSPetter Reinholdtsen 		if (strncasecmp(argv[1], "pet", 3) == 0) {
1921c18ec02fSPetter Reinholdtsen 			printf("Setting LAN Alert %d destination to PET Trap\n", alert);
1922c18ec02fSPetter Reinholdtsen 			data[1] &= ~0x07;
1923c18ec02fSPetter Reinholdtsen 		}
1924c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(argv[1], "oem1", 4) == 0) {
1925c18ec02fSPetter Reinholdtsen 			printf("Setting LAN Alert %d destination to OEM 1\n", alert);
1926c18ec02fSPetter Reinholdtsen 			data[1] &= ~0x07;
1927c18ec02fSPetter Reinholdtsen 			data[1] |= 0x06;
1928c18ec02fSPetter Reinholdtsen 		}
1929c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(argv[1], "oem2", 4) == 0) {
1930c18ec02fSPetter Reinholdtsen 			printf("Setting LAN Alert %d destination to OEM 2\n", alert);
1931c18ec02fSPetter Reinholdtsen 			data[1] |= 0x07;
1932c18ec02fSPetter Reinholdtsen 		}
1933c18ec02fSPetter Reinholdtsen 		else {
193475843864SZdenek Styblik 			print_lan_alert_set_usage();
1935c18ec02fSPetter Reinholdtsen 			return -1;
1936c18ec02fSPetter Reinholdtsen 		}
1937c18ec02fSPetter Reinholdtsen 		rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_TYPE, data, p->data_len);
1938c18ec02fSPetter Reinholdtsen 	}
1939c18ec02fSPetter Reinholdtsen 	/* alert acknowledge timeout or retry interval */
1940c18ec02fSPetter Reinholdtsen 	else if (strncasecmp(argv[0], "time", 4) == 0) {
1941c18ec02fSPetter Reinholdtsen 		/* get current parameter */
1942c18ec02fSPetter Reinholdtsen 		p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_TYPE, alert);
1943c18ec02fSPetter Reinholdtsen 		if (p == NULL) {
1944c18ec02fSPetter Reinholdtsen 			return (-1);
1945c18ec02fSPetter Reinholdtsen 		}
1946c18ec02fSPetter Reinholdtsen 		memcpy(data, p->data, p->data_len);
1947c18ec02fSPetter Reinholdtsen 
1948c18ec02fSPetter Reinholdtsen 		if (str2uchar(argv[1], &data[2]) != 0) {
1949c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Invalid time: %s", argv[1]);
1950c18ec02fSPetter Reinholdtsen 			return (-1);
1951c18ec02fSPetter Reinholdtsen 		}
1952c18ec02fSPetter Reinholdtsen 		printf("Setting LAN Alert %d timeout/retry to %d seconds\n", alert, data[2]);
1953c18ec02fSPetter Reinholdtsen 		rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_TYPE, data, p->data_len);
1954c18ec02fSPetter Reinholdtsen 	}
1955c18ec02fSPetter Reinholdtsen 	/* number of retries */
1956c18ec02fSPetter Reinholdtsen 	else if (strncasecmp(argv[0], "retry", 5) == 0) {
1957c18ec02fSPetter Reinholdtsen 		/* get current parameter */
1958c18ec02fSPetter Reinholdtsen 		p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_TYPE, alert);
1959c18ec02fSPetter Reinholdtsen 		if (p == NULL) {
1960c18ec02fSPetter Reinholdtsen 			return (-1);
1961c18ec02fSPetter Reinholdtsen 		}
1962c18ec02fSPetter Reinholdtsen 		memcpy(data, p->data, p->data_len);
1963c18ec02fSPetter Reinholdtsen 
1964c18ec02fSPetter Reinholdtsen 		if (str2uchar(argv[1], &data[3]) != 0) {
1965c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Invalid retry: %s", argv[1]);
1966c18ec02fSPetter Reinholdtsen 			return (-1);
1967c18ec02fSPetter Reinholdtsen 		}
1968c18ec02fSPetter Reinholdtsen 		data[3] = data[3] & 0x7;
1969c18ec02fSPetter Reinholdtsen 		printf("Setting LAN Alert %d number of retries to %d\n", alert, data[3]);
1970c18ec02fSPetter Reinholdtsen 		rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_TYPE, data, p->data_len);
1971c18ec02fSPetter Reinholdtsen 	}
1972c18ec02fSPetter Reinholdtsen 	else {
197375843864SZdenek Styblik 		print_lan_alert_set_usage();
1974c18ec02fSPetter Reinholdtsen 		return -1;
1975c18ec02fSPetter Reinholdtsen 	}
1976c18ec02fSPetter Reinholdtsen 
1977c18ec02fSPetter Reinholdtsen 	return rc;
1978c18ec02fSPetter Reinholdtsen }
1979c18ec02fSPetter Reinholdtsen 
1980c18ec02fSPetter Reinholdtsen static int
ipmi_lan_alert(struct ipmi_intf * intf,int argc,char ** argv)1981c18ec02fSPetter Reinholdtsen ipmi_lan_alert(struct ipmi_intf * intf, int argc, char ** argv)
1982c18ec02fSPetter Reinholdtsen {
1983c18ec02fSPetter Reinholdtsen 	uint8_t alert;
1984c18ec02fSPetter Reinholdtsen 	uint8_t channel = 1;
1985c18ec02fSPetter Reinholdtsen 
1986c18ec02fSPetter Reinholdtsen 	if (argc < 1) {
198775843864SZdenek Styblik 		print_lan_alert_print_usage();
198875843864SZdenek Styblik 		print_lan_alert_set_usage();
1989c18ec02fSPetter Reinholdtsen 		return (-1);
1990c18ec02fSPetter Reinholdtsen 	}
1991c18ec02fSPetter Reinholdtsen 	else if (strncasecmp(argv[0], "help", 4) == 0) {
199275843864SZdenek Styblik 		print_lan_alert_print_usage();
199375843864SZdenek Styblik 		print_lan_alert_set_usage();
1994c18ec02fSPetter Reinholdtsen 		return 0;
1995c18ec02fSPetter Reinholdtsen 	}
1996c18ec02fSPetter Reinholdtsen 
1997c18ec02fSPetter Reinholdtsen 	/* alert print [channel] [alert] */
1998c18ec02fSPetter Reinholdtsen 	if (strncasecmp(argv[0], "print", 5) == 0) {
1999c18ec02fSPetter Reinholdtsen 		if (argc < 2) {
2000c18ec02fSPetter Reinholdtsen 			channel = find_lan_channel(intf, 1);
2001c18ec02fSPetter Reinholdtsen 			if (!is_lan_channel(intf, channel)) {
2002c18ec02fSPetter Reinholdtsen 				lprintf(LOG_ERR, "Channel %d is not a LAN channel", channel);
2003c18ec02fSPetter Reinholdtsen 				return -1;
2004c18ec02fSPetter Reinholdtsen 			}
2005c18ec02fSPetter Reinholdtsen 			return ipmi_lan_alert_print_all(intf, channel);
2006c18ec02fSPetter Reinholdtsen 		}
2007c18ec02fSPetter Reinholdtsen 
2008c18ec02fSPetter Reinholdtsen 		if (strncasecmp(argv[1], "help", 4) == 0) {
200975843864SZdenek Styblik 			print_lan_alert_print_usage();
2010c18ec02fSPetter Reinholdtsen 			return 0;
2011c18ec02fSPetter Reinholdtsen 		}
2012c18ec02fSPetter Reinholdtsen 
2013c18ec02fSPetter Reinholdtsen 		if (str2uchar(argv[1], &channel) != 0) {
2014c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Invalid channel: %s", argv[1]);
2015c18ec02fSPetter Reinholdtsen 			return (-1);
2016c18ec02fSPetter Reinholdtsen 		}
2017c18ec02fSPetter Reinholdtsen 		if (!is_lan_channel(intf, channel)) {
2018c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Channel %d is not a LAN channel", channel);
2019c18ec02fSPetter Reinholdtsen 			return -1;
2020c18ec02fSPetter Reinholdtsen 		}
2021c18ec02fSPetter Reinholdtsen 
2022c18ec02fSPetter Reinholdtsen 		if (argc < 3)
2023c18ec02fSPetter Reinholdtsen 			return ipmi_lan_alert_print_all(intf, channel);
2024c18ec02fSPetter Reinholdtsen 
2025c18ec02fSPetter Reinholdtsen 		if (str2uchar(argv[2], &alert) != 0) {
2026c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Invalid alert: %s", argv[2]);
2027c18ec02fSPetter Reinholdtsen 			return (-1);
2028c18ec02fSPetter Reinholdtsen 		}
2029c18ec02fSPetter Reinholdtsen 		if (is_alert_destination(intf, channel, alert) == 0) {
2030c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Alert %d is not a valid destination", alert);
2031c18ec02fSPetter Reinholdtsen 			return -1;
2032c18ec02fSPetter Reinholdtsen 		}
2033c18ec02fSPetter Reinholdtsen 		return ipmi_lan_alert_print(intf, channel, alert);
2034c18ec02fSPetter Reinholdtsen 	}
2035c18ec02fSPetter Reinholdtsen 
2036c18ec02fSPetter Reinholdtsen 	/* alert set <channel> <alert> [option] */
2037c18ec02fSPetter Reinholdtsen 	if (strncasecmp(argv[0], "set", 3) == 0) {
2038c18ec02fSPetter Reinholdtsen 		if (argc < 5) {
203975843864SZdenek Styblik 			print_lan_alert_set_usage();
2040c18ec02fSPetter Reinholdtsen 			return (-1);
2041c18ec02fSPetter Reinholdtsen 		}
2042c18ec02fSPetter Reinholdtsen 		else if (strncasecmp(argv[1], "help", 4) == 0) {
204375843864SZdenek Styblik 			print_lan_alert_set_usage();
2044c18ec02fSPetter Reinholdtsen 			return 0;
2045c18ec02fSPetter Reinholdtsen 		}
2046c18ec02fSPetter Reinholdtsen 
2047c18ec02fSPetter Reinholdtsen 		if (str2uchar(argv[1], &channel) != 0) {
2048c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Invalid channel: %s", argv[1]);
2049c18ec02fSPetter Reinholdtsen 			return (-1);
2050c18ec02fSPetter Reinholdtsen 		}
2051c18ec02fSPetter Reinholdtsen 		if (!is_lan_channel(intf, channel)) {
2052c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Channel %d is not a LAN channel", channel);
2053c18ec02fSPetter Reinholdtsen 			return -1;
2054c18ec02fSPetter Reinholdtsen 		}
2055c18ec02fSPetter Reinholdtsen 
2056c18ec02fSPetter Reinholdtsen 		if (str2uchar(argv[2], &alert) != 0) {
2057c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Invalid alert: %s", argv[2]);
2058c18ec02fSPetter Reinholdtsen 			return (-1);
2059c18ec02fSPetter Reinholdtsen 		}
2060c18ec02fSPetter Reinholdtsen 		if (is_alert_destination(intf, channel, alert) == 0) {
2061c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Alert %d is not a valid destination", alert);
2062c18ec02fSPetter Reinholdtsen 			return -1;
2063c18ec02fSPetter Reinholdtsen 		}
2064c18ec02fSPetter Reinholdtsen 
2065c18ec02fSPetter Reinholdtsen 		return ipmi_lan_alert_set(intf, channel, alert, argc-3, &(argv[3]));
2066c18ec02fSPetter Reinholdtsen 	}
2067c18ec02fSPetter Reinholdtsen 
2068c18ec02fSPetter Reinholdtsen 	return 0;
2069c18ec02fSPetter Reinholdtsen }
2070c18ec02fSPetter Reinholdtsen 
2071c18ec02fSPetter Reinholdtsen 
2072c18ec02fSPetter Reinholdtsen static int
ipmi_lan_stats_get(struct ipmi_intf * intf,uint8_t chan)2073c18ec02fSPetter Reinholdtsen ipmi_lan_stats_get(struct ipmi_intf * intf, uint8_t chan)
2074c18ec02fSPetter Reinholdtsen {
2075c18ec02fSPetter Reinholdtsen 	int rc = 0;
2076c18ec02fSPetter Reinholdtsen 	struct ipmi_rs * rsp;
2077c18ec02fSPetter Reinholdtsen 	struct ipmi_rq req;
2078c18ec02fSPetter Reinholdtsen 	uint8_t msg_data[2];
2079c18ec02fSPetter Reinholdtsen 	uint16_t statsTemp;
2080c18ec02fSPetter Reinholdtsen 
2081c18ec02fSPetter Reinholdtsen 	if (!is_lan_channel(intf, chan)) {
2082c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Channel %d is not a LAN channel", chan);
2083c18ec02fSPetter Reinholdtsen 		return -1;
2084c18ec02fSPetter Reinholdtsen 	}
2085c18ec02fSPetter Reinholdtsen 
2086c18ec02fSPetter Reinholdtsen 	/* From here, we are ready to get the stats */
2087c18ec02fSPetter Reinholdtsen 
2088c18ec02fSPetter Reinholdtsen 	msg_data[0] = chan;
2089c18ec02fSPetter Reinholdtsen 	msg_data[1] = 0;   /* Don't clear */
2090c18ec02fSPetter Reinholdtsen 
2091c18ec02fSPetter Reinholdtsen 	memset(&req, 0, sizeof(req));
2092c18ec02fSPetter Reinholdtsen 	req.msg.netfn    = IPMI_NETFN_TRANSPORT;
2093c18ec02fSPetter Reinholdtsen 	req.msg.cmd      = IPMI_LAN_GET_STAT;
2094c18ec02fSPetter Reinholdtsen 	req.msg.data     = msg_data;
2095c18ec02fSPetter Reinholdtsen 	req.msg.data_len = 2;
2096c18ec02fSPetter Reinholdtsen 
2097c18ec02fSPetter Reinholdtsen 	rsp = intf->sendrecv(intf, &req);
2098c18ec02fSPetter Reinholdtsen 	if (rsp == NULL) {
2099c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Get LAN Stats command failed");
2100c18ec02fSPetter Reinholdtsen 		return (-1);
2101c18ec02fSPetter Reinholdtsen 	}
2102c18ec02fSPetter Reinholdtsen 
2103c18ec02fSPetter Reinholdtsen 	if (rsp->ccode > 0) {
2104c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Get LAN Stats command failed: %s",
2105c18ec02fSPetter Reinholdtsen 			val2str(rsp->ccode, completion_code_vals));
2106c18ec02fSPetter Reinholdtsen 		return (-1);
2107c18ec02fSPetter Reinholdtsen 	}
2108c18ec02fSPetter Reinholdtsen 
2109c18ec02fSPetter Reinholdtsen 	if (verbose > 1) {
2110c18ec02fSPetter Reinholdtsen 		uint8_t counter;
2111c18ec02fSPetter Reinholdtsen 		printf("--- Rx Stats ---\n");
2112c18ec02fSPetter Reinholdtsen 		for (counter=0; counter<18; counter+=2) {
2113c18ec02fSPetter Reinholdtsen 			printf("%02X", *(rsp->data + counter));
2114c18ec02fSPetter Reinholdtsen 			printf(" %02X - ", *(rsp->data + counter+1));
2115c18ec02fSPetter Reinholdtsen 		}
2116c18ec02fSPetter Reinholdtsen 		printf("\n");
2117c18ec02fSPetter Reinholdtsen 	}
2118c18ec02fSPetter Reinholdtsen 
2119c18ec02fSPetter Reinholdtsen 	statsTemp = ((*(rsp->data + 0)) << 8) | (*(rsp->data + 1));
2120c18ec02fSPetter Reinholdtsen 	printf("IP Rx Packet              : %d\n", statsTemp);
2121c18ec02fSPetter Reinholdtsen 
2122c18ec02fSPetter Reinholdtsen 	statsTemp = ((*(rsp->data + 2)) << 8) | (*(rsp->data + 3));
2123c18ec02fSPetter Reinholdtsen 	printf("IP Rx Header Errors       : %u\n", statsTemp);
2124c18ec02fSPetter Reinholdtsen 
2125c18ec02fSPetter Reinholdtsen 	statsTemp = ((*(rsp->data + 4)) << 8) | (*(rsp->data + 5));
2126c18ec02fSPetter Reinholdtsen 	printf("IP Rx Address Errors      : %u\n", statsTemp);
2127c18ec02fSPetter Reinholdtsen 
2128c18ec02fSPetter Reinholdtsen 	statsTemp = ((*(rsp->data + 6)) << 8) | (*(rsp->data + 7));
2129c18ec02fSPetter Reinholdtsen 	printf("IP Rx Fragmented          : %u\n", statsTemp);
2130c18ec02fSPetter Reinholdtsen 
2131c18ec02fSPetter Reinholdtsen 	statsTemp = ((*(rsp->data + 8)) << 8) | (*(rsp->data + 9));
2132c18ec02fSPetter Reinholdtsen 	printf("IP Tx Packet              : %u\n", statsTemp);
2133c18ec02fSPetter Reinholdtsen 
2134c18ec02fSPetter Reinholdtsen 	statsTemp = ((*(rsp->data +10)) << 8) | (*(rsp->data +11));
2135c18ec02fSPetter Reinholdtsen 	printf("UDP Rx Packet             : %u\n", statsTemp);
2136c18ec02fSPetter Reinholdtsen 
2137c18ec02fSPetter Reinholdtsen 	statsTemp = ((*(rsp->data + 12)) << 8) | (*(rsp->data + 13));
2138c18ec02fSPetter Reinholdtsen 	printf("RMCP Rx Valid             : %u\n", statsTemp);
2139c18ec02fSPetter Reinholdtsen 
2140c18ec02fSPetter Reinholdtsen 	statsTemp = ((*(rsp->data + 14)) << 8) | (*(rsp->data + 15));
2141c18ec02fSPetter Reinholdtsen 	printf("UDP Proxy Packet Received : %u\n", statsTemp);
2142c18ec02fSPetter Reinholdtsen 
2143c18ec02fSPetter Reinholdtsen 	statsTemp = ((*(rsp->data + 16)) << 8) | (*(rsp->data + 17));
2144c18ec02fSPetter Reinholdtsen 	printf("UDP Proxy Packet Dropped  : %u\n", statsTemp);
2145c18ec02fSPetter Reinholdtsen 
2146c18ec02fSPetter Reinholdtsen 	return rc;
2147c18ec02fSPetter Reinholdtsen }
2148c18ec02fSPetter Reinholdtsen 
2149c18ec02fSPetter Reinholdtsen 
2150c18ec02fSPetter Reinholdtsen static int
ipmi_lan_stats_clear(struct ipmi_intf * intf,uint8_t chan)2151c18ec02fSPetter Reinholdtsen ipmi_lan_stats_clear(struct ipmi_intf * intf, uint8_t chan)
2152c18ec02fSPetter Reinholdtsen {
2153c18ec02fSPetter Reinholdtsen 	int rc = 0;
2154c18ec02fSPetter Reinholdtsen 	struct ipmi_rs * rsp;
2155c18ec02fSPetter Reinholdtsen 	struct ipmi_rq req;
2156c18ec02fSPetter Reinholdtsen 	uint8_t msg_data[2];
2157c18ec02fSPetter Reinholdtsen 
2158c18ec02fSPetter Reinholdtsen 	if (!is_lan_channel(intf, chan)) {
2159c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, "Channel %d is not a LAN channel", chan);
2160c18ec02fSPetter Reinholdtsen 		return -1;
2161c18ec02fSPetter Reinholdtsen 	}
2162c18ec02fSPetter Reinholdtsen 
2163c18ec02fSPetter Reinholdtsen 	/* From here, we are ready to get the stats */
2164c18ec02fSPetter Reinholdtsen 	msg_data[0] = chan;
2165c18ec02fSPetter Reinholdtsen 	msg_data[1] = 1;   /* Clear */
2166c18ec02fSPetter Reinholdtsen 
2167c18ec02fSPetter Reinholdtsen 	memset(&req, 0, sizeof(req));
2168c18ec02fSPetter Reinholdtsen 	req.msg.netfn    = IPMI_NETFN_TRANSPORT;
2169c18ec02fSPetter Reinholdtsen 	req.msg.cmd      = IPMI_LAN_GET_STAT;
2170c18ec02fSPetter Reinholdtsen 	req.msg.data     = msg_data;
2171c18ec02fSPetter Reinholdtsen 	req.msg.data_len = 2;
2172c18ec02fSPetter Reinholdtsen 
2173c18ec02fSPetter Reinholdtsen 	rsp = intf->sendrecv(intf, &req);
2174c18ec02fSPetter Reinholdtsen 	if (rsp == NULL) {
2175c18ec02fSPetter Reinholdtsen 		lprintf(LOG_INFO, "Get LAN Stats command failed");
2176c18ec02fSPetter Reinholdtsen 		return (-1);
2177c18ec02fSPetter Reinholdtsen 	}
2178c18ec02fSPetter Reinholdtsen 
2179c18ec02fSPetter Reinholdtsen 	if (rsp->ccode > 0) {
2180c18ec02fSPetter Reinholdtsen 		lprintf(LOG_INFO, "Get LAN Stats command failed: %s",
2181c18ec02fSPetter Reinholdtsen 			val2str(rsp->ccode, completion_code_vals));
2182c18ec02fSPetter Reinholdtsen 		return (-1);
2183c18ec02fSPetter Reinholdtsen 	}
2184c18ec02fSPetter Reinholdtsen 
2185c18ec02fSPetter Reinholdtsen 	return rc;
2186c18ec02fSPetter Reinholdtsen }
2187c18ec02fSPetter Reinholdtsen 
218875843864SZdenek Styblik static void
print_lan_alert_print_usage(void)218975843864SZdenek Styblik print_lan_alert_print_usage(void)
219075843864SZdenek Styblik {
219175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
219275843864SZdenek Styblik "");
219375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
219475843864SZdenek Styblik "usage: lan alert print [channel number] [alert destination]");
219575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
219675843864SZdenek Styblik "");
219775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
219875843864SZdenek Styblik "Default will print all alerts for the first found LAN channel");
219975843864SZdenek Styblik }
220075843864SZdenek Styblik 
220175843864SZdenek Styblik static void
print_lan_alert_set_usage(void)220275843864SZdenek Styblik print_lan_alert_set_usage(void)
220375843864SZdenek Styblik {
220475843864SZdenek Styblik 	lprintf(LOG_NOTICE,
220575843864SZdenek Styblik "");
220675843864SZdenek Styblik 	lprintf(LOG_NOTICE,
220775843864SZdenek Styblik "usage: lan alert set <channel number> <alert destination> <command> <parameter>");
220875843864SZdenek Styblik 	lprintf(LOG_NOTICE,
220975843864SZdenek Styblik "");
221075843864SZdenek Styblik 	lprintf(LOG_NOTICE,
221175843864SZdenek Styblik "    Command/parameter options:");
221275843864SZdenek Styblik 	lprintf(LOG_NOTICE,
221375843864SZdenek Styblik "");
221475843864SZdenek Styblik 	lprintf(LOG_NOTICE,
221575843864SZdenek Styblik "    ipaddr <x.x.x.x>               Set alert IP address");
221675843864SZdenek Styblik 	lprintf(LOG_NOTICE,
221775843864SZdenek Styblik "    macaddr <x:x:x:x:x:x>          Set alert MAC address");
221875843864SZdenek Styblik 	lprintf(LOG_NOTICE,
221975843864SZdenek Styblik "    gateway <default|backup>       Set channel gateway to use for alerts");
222075843864SZdenek Styblik 	lprintf(LOG_NOTICE,
222175843864SZdenek Styblik "    ack <on|off>                   Set Alert Acknowledge on or off");
222275843864SZdenek Styblik 	lprintf(LOG_NOTICE,
222375843864SZdenek Styblik "    type <pet|oem1|oem2>           Set destination type as PET or OEM");
222475843864SZdenek Styblik 	lprintf(LOG_NOTICE,
222575843864SZdenek Styblik "    time <seconds>                 Set ack timeout or unack retry interval");
222675843864SZdenek Styblik 	lprintf(LOG_NOTICE,
222775843864SZdenek Styblik "    retry <number>                 Set number of alert retries");
222875843864SZdenek Styblik 	lprintf(LOG_NOTICE,
222975843864SZdenek Styblik "");
223075843864SZdenek Styblik }
223175843864SZdenek Styblik 
223275843864SZdenek Styblik static void
print_lan_set_usage(void)223375843864SZdenek Styblik print_lan_set_usage(void)
223475843864SZdenek Styblik {
223575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
223675843864SZdenek Styblik "");
223775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
223875843864SZdenek Styblik "usage: lan set <channel> <command> <parameter>");
223975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
224075843864SZdenek Styblik "");
224175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
224275843864SZdenek Styblik "LAN set command/parameter options:");
224375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
224475843864SZdenek Styblik "  ipaddr <x.x.x.x>               Set channel IP address");
224575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
224675843864SZdenek Styblik "  netmask <x.x.x.x>              Set channel IP netmask");
224775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
224875843864SZdenek Styblik "  macaddr <x:x:x:x:x:x>          Set channel MAC address");
224975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
225075843864SZdenek Styblik "  defgw ipaddr <x.x.x.x>         Set default gateway IP address");
225175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
225275843864SZdenek Styblik "  defgw macaddr <x:x:x:x:x:x>    Set default gateway MAC address");
225375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
225475843864SZdenek Styblik "  bakgw ipaddr <x.x.x.x>         Set backup gateway IP address");
225575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
225675843864SZdenek Styblik "  bakgw macaddr <x:x:x:x:x:x>    Set backup gateway MAC address");
225775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
225875843864SZdenek Styblik "  password <password>            Set session password for this channel");
225975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
226075843864SZdenek Styblik "  snmp <community string>        Set SNMP public community string");
226175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
226275843864SZdenek Styblik "  user                           Enable default user for this channel");
226375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
226475843864SZdenek Styblik "  access <on|off>                Enable or disable access to this channel");
226575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
226675843864SZdenek Styblik "  alert <on|off>                 Enable or disable PEF alerting for this channel");
226775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
226875843864SZdenek Styblik "  arp respond <on|off>           Enable or disable BMC ARP responding");
226975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
227075843864SZdenek Styblik "  arp generate <on|off>          Enable or disable BMC gratuitous ARP generation");
227175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
227275843864SZdenek Styblik "  arp interval <seconds>         Set gratuitous ARP generation interval");
227375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
227475843864SZdenek Styblik "  vlan id <off|<id>>             Disable or enable VLAN and set ID (1-4094)");
227575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
227675843864SZdenek Styblik "  vlan priority <priority>       Set vlan priority (0-7)");
227775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
227875843864SZdenek Styblik "  auth <level> <type,..>         Set channel authentication types");
227975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
228075843864SZdenek Styblik "    level  = CALLBACK, USER, OPERATOR, ADMIN");
228175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
228275843864SZdenek Styblik "    type   = NONE, MD2, MD5, PASSWORD, OEM");
228375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
228475843864SZdenek Styblik "  ipsrc <source>                 Set IP Address source");
228575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
228675843864SZdenek Styblik "    none   = unspecified source");
228775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
228875843864SZdenek Styblik "    static = address manually configured to be static");
228975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
229075843864SZdenek Styblik "    dhcp   = address obtained by BMC running DHCP");
229175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
229275843864SZdenek Styblik "    bios   = address loaded by BIOS or system software");
229375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
229475843864SZdenek Styblik "  cipher_privs XXXXXXXXXXXXXXX   Set RMCP+ cipher suite privilege levels");
229575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
229675843864SZdenek Styblik "    X = Cipher Suite Unused");
229775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
229875843864SZdenek Styblik "    c = CALLBACK");
229975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
230075843864SZdenek Styblik "    u = USER");
230175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
230275843864SZdenek Styblik "    o = OPERATOR");
230375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
230475843864SZdenek Styblik "    a = ADMIN");
230575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
230675843864SZdenek Styblik "    O = OEM");
230775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
230875843864SZdenek Styblik "");
2309*89e9e634SDmitry Bazhenov 	lprintf(LOG_NOTICE,
2310*89e9e634SDmitry Bazhenov "  bad_pass_thresh <thresh_num> <1|0> <reset_interval> <lockout_interval>\n"
2311*89e9e634SDmitry Bazhenov "                                Set bad password threshold");
231275843864SZdenek Styblik }
231375843864SZdenek Styblik 
231475843864SZdenek Styblik static void
print_lan_set_access_usage(void)231575843864SZdenek Styblik print_lan_set_access_usage(void)
231675843864SZdenek Styblik {
231775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
231875843864SZdenek Styblik "lan set access <on|off>");
231975843864SZdenek Styblik }
232075843864SZdenek Styblik 
232175843864SZdenek Styblik static void
print_lan_set_arp_usage(void)232275843864SZdenek Styblik print_lan_set_arp_usage(void)
232375843864SZdenek Styblik {
232475843864SZdenek Styblik 	lprintf(LOG_NOTICE,
232575843864SZdenek Styblik "lan set <channel> arp respond <on|off>");
232675843864SZdenek Styblik 	lprintf(LOG_NOTICE,
232775843864SZdenek Styblik "lan set <channel> arp generate <on|off>");
232875843864SZdenek Styblik 	lprintf(LOG_NOTICE,
232975843864SZdenek Styblik "lan set <channel> arp interval <seconds>");
233075843864SZdenek Styblik 	lprintf(LOG_NOTICE,
233175843864SZdenek Styblik "");
233275843864SZdenek Styblik 	lprintf(LOG_NOTICE,
233375843864SZdenek Styblik "example: lan set 7 arp gratuitous off");
233475843864SZdenek Styblik }
233575843864SZdenek Styblik 
233675843864SZdenek Styblik static void
print_lan_set_auth_usage(void)233775843864SZdenek Styblik print_lan_set_auth_usage(void)
233875843864SZdenek Styblik {
233975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
234075843864SZdenek Styblik "lan set <channel> auth <level> <type,type,...>");
234175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
234275843864SZdenek Styblik "  level = CALLBACK, USER, OPERATOR, ADMIN");
234375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
234475843864SZdenek Styblik "  types = NONE, MD2, MD5, PASSWORD, OEM");
234575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
234675843864SZdenek Styblik "example: lan set 7 auth ADMIN PASSWORD,MD5");
234775843864SZdenek Styblik }
234875843864SZdenek Styblik 
234975843864SZdenek Styblik static void
print_lan_set_bakgw_usage(void)235075843864SZdenek Styblik print_lan_set_bakgw_usage(void)
235175843864SZdenek Styblik {
235275843864SZdenek Styblik 	lprintf(LOG_NOTICE,
235375843864SZdenek Styblik "LAN set backup gateway commands: ipaddr, macaddr");
235475843864SZdenek Styblik }
235575843864SZdenek Styblik 
235675843864SZdenek Styblik static void
print_lan_set_cipher_privs_usage(void)235775843864SZdenek Styblik print_lan_set_cipher_privs_usage(void)
235875843864SZdenek Styblik {
235975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
236075843864SZdenek Styblik "lan set <channel> cipher_privs XXXXXXXXXXXXXXX");
236175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
236275843864SZdenek Styblik "    X = Cipher Suite Unused");
236375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
236475843864SZdenek Styblik "    c = CALLBACK");
236575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
236675843864SZdenek Styblik "    u = USER");
236775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
236875843864SZdenek Styblik "    o = OPERATOR");
236975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
237075843864SZdenek Styblik "    a = ADMIN");
237175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
237275843864SZdenek Styblik "    O = OEM");
237375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
237475843864SZdenek Styblik "");
237575843864SZdenek Styblik }
237675843864SZdenek Styblik 
237775843864SZdenek Styblik static void
print_lan_set_defgw_usage(void)237875843864SZdenek Styblik print_lan_set_defgw_usage(void)
237975843864SZdenek Styblik {
238075843864SZdenek Styblik 	lprintf(LOG_NOTICE,
238175843864SZdenek Styblik "LAN set default gateway Commands: ipaddr, macaddr");
238275843864SZdenek Styblik }
238375843864SZdenek Styblik 
238475843864SZdenek Styblik static void
print_lan_set_ipsrc_usage(void)238575843864SZdenek Styblik print_lan_set_ipsrc_usage(void)
238675843864SZdenek Styblik {
238775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
238875843864SZdenek Styblik "lan set <channel> ipsrc <source>");
238975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
239075843864SZdenek Styblik "  none   = unspecified");
239175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
239275843864SZdenek Styblik "  static = static address (manually configured)");
239375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
239475843864SZdenek Styblik "  dhcp   = address obtained by BMC running DHCP");
239575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
239675843864SZdenek Styblik "  bios   = address loaded by BIOS or system software");
239775843864SZdenek Styblik }
239875843864SZdenek Styblik 
239975843864SZdenek Styblik static void
print_lan_set_snmp_usage(void)240075843864SZdenek Styblik print_lan_set_snmp_usage(void)
240175843864SZdenek Styblik {
240275843864SZdenek Styblik 	lprintf(LOG_NOTICE,
240375843864SZdenek Styblik "lan set <channel> snmp <community string>");
240475843864SZdenek Styblik }
240575843864SZdenek Styblik 
240675843864SZdenek Styblik static void
print_lan_set_vlan_usage(void)240775843864SZdenek Styblik print_lan_set_vlan_usage(void)
240875843864SZdenek Styblik {
240975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
241075843864SZdenek Styblik "lan set <channel> vlan id <id>");
241175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
241275843864SZdenek Styblik "lan set <channel> vlan id off");
241375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
241475843864SZdenek Styblik "lan set <channel> vlan priority <priority>");
241575843864SZdenek Styblik }
2416c18ec02fSPetter Reinholdtsen 
2417c18ec02fSPetter Reinholdtsen /*
2418c18ec02fSPetter Reinholdtsen  * print_lan_usage
2419c18ec02fSPetter Reinholdtsen  */
2420c18ec02fSPetter Reinholdtsen static void
print_lan_usage(void)2421c18ec02fSPetter Reinholdtsen print_lan_usage(void)
2422c18ec02fSPetter Reinholdtsen {
242375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
242475843864SZdenek Styblik "LAN Commands:");
242575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
242675843864SZdenek Styblik "		   print [<channel number>]");
242775843864SZdenek Styblik 	lprintf(LOG_NOTICE,
242875843864SZdenek Styblik "		   set <channel number> <command> <parameter>");
242975843864SZdenek Styblik 	lprintf(LOG_NOTICE,
243075843864SZdenek Styblik "		   alert print <channel number> <alert destination>");
243175843864SZdenek Styblik 	lprintf(LOG_NOTICE,
243275843864SZdenek Styblik "		   alert set <channel number> <alert destination> <command> <parameter>");
243375843864SZdenek Styblik 	lprintf(LOG_NOTICE,
243475843864SZdenek Styblik "		   stats get [<channel number>]");
243575843864SZdenek Styblik 	lprintf(LOG_NOTICE,
243675843864SZdenek Styblik "		   stats clear [<channel number>]");
2437c18ec02fSPetter Reinholdtsen }
2438c18ec02fSPetter Reinholdtsen 
2439c18ec02fSPetter Reinholdtsen 
2440c18ec02fSPetter Reinholdtsen int
ipmi_lanp_main(struct ipmi_intf * intf,int argc,char ** argv)2441c18ec02fSPetter Reinholdtsen ipmi_lanp_main(struct ipmi_intf * intf, int argc, char ** argv)
2442c18ec02fSPetter Reinholdtsen {
2443c18ec02fSPetter Reinholdtsen 	int rc = 0;
2444c18ec02fSPetter Reinholdtsen 	uint8_t chan = 0;
2445c18ec02fSPetter Reinholdtsen 
2446c18ec02fSPetter Reinholdtsen 	if (argc == 0) {
2447c18ec02fSPetter Reinholdtsen 		print_lan_usage();
2448c18ec02fSPetter Reinholdtsen 		return (-1);
2449c18ec02fSPetter Reinholdtsen 	} else if (strncmp(argv[0], "help", 4) == 0) {
2450c18ec02fSPetter Reinholdtsen 		print_lan_usage();
2451c18ec02fSPetter Reinholdtsen 		return 0;
2452c18ec02fSPetter Reinholdtsen 	}
2453c18ec02fSPetter Reinholdtsen 
2454c18ec02fSPetter Reinholdtsen 	chan = find_lan_channel(intf, 1);
2455c18ec02fSPetter Reinholdtsen 
2456c18ec02fSPetter Reinholdtsen 	if (strncmp(argv[0], "printconf", 9) == 0 ||
2457c18ec02fSPetter Reinholdtsen 			strncmp(argv[0], "print", 5) == 0)
2458c18ec02fSPetter Reinholdtsen 	{
2459c18ec02fSPetter Reinholdtsen 		if (argc > 2) {
2460c18ec02fSPetter Reinholdtsen 			print_lan_usage();
2461c18ec02fSPetter Reinholdtsen 			return (-1);
2462c18ec02fSPetter Reinholdtsen 		} else if (argc == 2) {
2463c18ec02fSPetter Reinholdtsen 			if (str2uchar(argv[1], &chan) != 0) {
2464c18ec02fSPetter Reinholdtsen 				lprintf(LOG_ERR, "Invalid channel: %s", argv[1]);
2465c18ec02fSPetter Reinholdtsen 				return (-1);
2466c18ec02fSPetter Reinholdtsen 			}
2467*89e9e634SDmitry Bazhenov 		} else {
2468*89e9e634SDmitry Bazhenov 			chan = find_lan_channel(intf, 1);
2469c18ec02fSPetter Reinholdtsen 		}
2470c18ec02fSPetter Reinholdtsen 		if (!is_lan_channel(intf, chan)) {
2471c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Invalid channel: %d", chan);
2472c18ec02fSPetter Reinholdtsen 			return (-1);
2473c18ec02fSPetter Reinholdtsen 		}
2474c18ec02fSPetter Reinholdtsen 		rc = ipmi_lan_print(intf, chan);
2475c18ec02fSPetter Reinholdtsen 	} else if (strncmp(argv[0], "set", 3) == 0) {
2476c18ec02fSPetter Reinholdtsen 		rc = ipmi_lan_set(intf, argc-1, &(argv[1]));
2477c18ec02fSPetter Reinholdtsen 	} else if (strncmp(argv[0], "alert", 5) == 0) {
2478c18ec02fSPetter Reinholdtsen 		rc = ipmi_lan_alert(intf, argc-1, &(argv[1]));
2479c18ec02fSPetter Reinholdtsen 	} else if (strncmp(argv[0], "stats", 5) == 0) {
2480c18ec02fSPetter Reinholdtsen 		if (argc < 2) {
2481c18ec02fSPetter Reinholdtsen 			print_lan_usage();
2482c18ec02fSPetter Reinholdtsen 			return (-1);
2483c18ec02fSPetter Reinholdtsen 		} else if (argc == 3) {
2484c18ec02fSPetter Reinholdtsen 			if (str2uchar(argv[2], &chan) != 0) {
2485c18ec02fSPetter Reinholdtsen 				lprintf(LOG_ERR, "Invalid channel: %s", argv[2]);
2486c18ec02fSPetter Reinholdtsen 				return (-1);
2487c18ec02fSPetter Reinholdtsen 			}
2488*89e9e634SDmitry Bazhenov 		} else {
2489*89e9e634SDmitry Bazhenov 			chan = find_lan_channel(intf, 1);
2490c18ec02fSPetter Reinholdtsen 		}
2491c18ec02fSPetter Reinholdtsen 		if (!is_lan_channel(intf, chan)) {
2492c18ec02fSPetter Reinholdtsen 			lprintf(LOG_ERR, "Invalid channel: %d", chan);
2493c18ec02fSPetter Reinholdtsen 			return (-1);
2494c18ec02fSPetter Reinholdtsen 		}
2495c18ec02fSPetter Reinholdtsen 		if (strncmp(argv[1], "get", 3) == 0) {
2496c18ec02fSPetter Reinholdtsen 			rc = ipmi_lan_stats_get(intf, chan);
2497c18ec02fSPetter Reinholdtsen 		} else if (strncmp(argv[1], "clear", 5) == 0) {
2498c18ec02fSPetter Reinholdtsen 			rc = ipmi_lan_stats_clear(intf, chan);
2499c18ec02fSPetter Reinholdtsen 		} else {
2500c18ec02fSPetter Reinholdtsen 			print_lan_usage();
2501c18ec02fSPetter Reinholdtsen 			return (-1);
2502c18ec02fSPetter Reinholdtsen 		}
2503c18ec02fSPetter Reinholdtsen 	} else {
2504c18ec02fSPetter Reinholdtsen 		lprintf(LOG_NOTICE, "Invalid LAN command: %s", argv[0]);
2505c18ec02fSPetter Reinholdtsen 		return (-1);
2506c18ec02fSPetter Reinholdtsen 	}
2507c18ec02fSPetter Reinholdtsen 	return rc;
2508c18ec02fSPetter Reinholdtsen }
2509