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