xref: /openbsd-src/usr.sbin/iscsid/logmsg.c (revision e86986b3b6611db1d88c59a137bd284148cada85)
1*e86986b3Sbenno /*	$OpenBSD: logmsg.c,v 1.1 2016/09/02 16:22:31 benno Exp $ */
2*e86986b3Sbenno 
3*e86986b3Sbenno /*
4*e86986b3Sbenno  * Copyright (c) 2009 Claudio Jeker <claudio@openbsd.org>
5*e86986b3Sbenno  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
6*e86986b3Sbenno  *
7*e86986b3Sbenno  * Permission to use, copy, modify, and distribute this software for any
8*e86986b3Sbenno  * purpose with or without fee is hereby granted, provided that the above
9*e86986b3Sbenno  * copyright notice and this permission notice appear in all copies.
10*e86986b3Sbenno  *
11*e86986b3Sbenno  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12*e86986b3Sbenno  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13*e86986b3Sbenno  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14*e86986b3Sbenno  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15*e86986b3Sbenno  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16*e86986b3Sbenno  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17*e86986b3Sbenno  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18*e86986b3Sbenno  */
19*e86986b3Sbenno 
20*e86986b3Sbenno #include <arpa/inet.h>
21*e86986b3Sbenno #include <endian.h>
22*e86986b3Sbenno #include <event.h>
23*e86986b3Sbenno #include <scsi/iscsi.h>
24*e86986b3Sbenno #include <stdio.h>
25*e86986b3Sbenno #include <string.h>
26*e86986b3Sbenno #include <sys/queue.h>
27*e86986b3Sbenno #include <sys/socket.h>
28*e86986b3Sbenno #include <sys/types.h>
29*e86986b3Sbenno 
30*e86986b3Sbenno #include "iscsid.h"
31*e86986b3Sbenno #include "log.h"
32*e86986b3Sbenno 
33*e86986b3Sbenno extern int	 debug;
34*e86986b3Sbenno extern int	 verbose;
35*e86986b3Sbenno 
36*e86986b3Sbenno void
log_hexdump(void * buf,size_t len)37*e86986b3Sbenno log_hexdump(void *buf, size_t len)
38*e86986b3Sbenno {
39*e86986b3Sbenno 	u_char b[16];
40*e86986b3Sbenno 	size_t i, j, l;
41*e86986b3Sbenno 
42*e86986b3Sbenno 	if (!debug)
43*e86986b3Sbenno 		return;
44*e86986b3Sbenno 
45*e86986b3Sbenno 	for (i = 0; i < len; i += l) {
46*e86986b3Sbenno 		fprintf(stderr, "%4zi:", i);
47*e86986b3Sbenno 		l = sizeof(b) < len - i ? sizeof(b) : len - i;
48*e86986b3Sbenno 		memcpy(b, (char *)buf + i, l);
49*e86986b3Sbenno 
50*e86986b3Sbenno 		for (j = 0; j < sizeof(b); j++) {
51*e86986b3Sbenno 			if (j % 2 == 0)
52*e86986b3Sbenno 				fprintf(stderr, " ");
53*e86986b3Sbenno 			if (j % 8 == 0)
54*e86986b3Sbenno 				fprintf(stderr, " ");
55*e86986b3Sbenno 			if (j < l)
56*e86986b3Sbenno 				fprintf(stderr, "%02x", (int)b[j]);
57*e86986b3Sbenno 			else
58*e86986b3Sbenno 				fprintf(stderr, "  ");
59*e86986b3Sbenno 		}
60*e86986b3Sbenno 		fprintf(stderr, "  |");
61*e86986b3Sbenno 		for (j = 0; j < l; j++) {
62*e86986b3Sbenno 			if (b[j] >= 0x20 && b[j] <= 0x7e)
63*e86986b3Sbenno 				fprintf(stderr, "%c", b[j]);
64*e86986b3Sbenno 			else
65*e86986b3Sbenno 				fprintf(stderr, ".");
66*e86986b3Sbenno 		}
67*e86986b3Sbenno 		fprintf(stderr, "|\n");
68*e86986b3Sbenno 	}
69*e86986b3Sbenno }
70*e86986b3Sbenno 
71*e86986b3Sbenno void
log_pdu(struct pdu * p,int all)72*e86986b3Sbenno log_pdu(struct pdu *p, int all)
73*e86986b3Sbenno {
74*e86986b3Sbenno 	struct iscsi_pdu *pdu;
75*e86986b3Sbenno 	void *b;
76*e86986b3Sbenno 	size_t s;
77*e86986b3Sbenno 
78*e86986b3Sbenno 	if (!debug)
79*e86986b3Sbenno 		return;
80*e86986b3Sbenno 
81*e86986b3Sbenno 	if (!(pdu = pdu_getbuf(p, NULL, PDU_HEADER))) {
82*e86986b3Sbenno 		log_debug("empty pdu");
83*e86986b3Sbenno 		return;
84*e86986b3Sbenno 	}
85*e86986b3Sbenno 
86*e86986b3Sbenno 	fprintf(stderr, "PDU: op %x%s flags %02x%02x%02x ahs %d len %d\n",
87*e86986b3Sbenno 		ISCSI_PDU_OPCODE(pdu->opcode), ISCSI_PDU_I(pdu) ? " I" : "",
88*e86986b3Sbenno 		pdu->flags, pdu->_reserved1[0], pdu->_reserved1[1],
89*e86986b3Sbenno 		pdu->ahslen, pdu->datalen[0] << 16 | pdu->datalen[1] << 8 |
90*e86986b3Sbenno 		pdu->datalen[2]);
91*e86986b3Sbenno 	fprintf(stderr, "     lun %02x%02x%02x%02x%02x%02x%02x%02x itt %u "
92*e86986b3Sbenno 	    "cmdsn %u expstatsn %u\n", pdu->lun[0], pdu->lun[1], pdu->lun[2],
93*e86986b3Sbenno 	    pdu->lun[3], pdu->lun[4], pdu->lun[5], pdu->lun[6], pdu->lun[7],
94*e86986b3Sbenno 	    ntohl(pdu->itt), ntohl(pdu->cmdsn), ntohl(pdu->expstatsn));
95*e86986b3Sbenno 	log_hexdump(pdu, sizeof(*pdu));
96*e86986b3Sbenno 
97*e86986b3Sbenno 	if (all && (b = pdu_getbuf(p, &s, PDU_DATA)))
98*e86986b3Sbenno 		log_hexdump(b, s);
99*e86986b3Sbenno }
100