blob: 14f494ac5ae6a17f15958b139258ebe00c16073a [file] [log] [blame]
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +02001
2#include <stdlib.h>
Harald Weltef5d6fee2016-01-13 22:29:10 +01003#include <inttypes.h>
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +02004#include <stddef.h>
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +02005#include <stdio.h>
6#include <string.h>
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +02007#include <time.h>
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +02008
9#include <sys/stat.h>
10#include <fcntl.h>
11#include <unistd.h>
12#include <errno.h>
13
Harald Welte211dd6c2016-01-13 00:18:49 +010014#include <osmocom/core/msgb.h>
Harald Welte234b56b2016-12-23 23:44:19 +010015#include <osmocom/core/serial.h>
Harald Welte211dd6c2016-01-13 00:18:49 +010016
Harald Weltebd448582016-12-23 23:41:14 +010017#include "diag_io.h"
Harald Welte211dd6c2016-01-13 00:18:49 +010018#include "protocol.h"
Harald Weltefaea7542016-12-24 01:21:03 +010019#include "diag_log.h"
Harald Weltef5d6fee2016-01-13 22:29:10 +010020#include "diagcmd.h"
Harald Welte211dd6c2016-01-13 00:18:49 +010021
Harald Welte4359a482016-12-23 23:56:26 +010022/* handler for EXT MSG */
23static int diag_rx_ext_msg_f(const uint8_t *data, const size_t len)
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +020024{
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +020025 const struct ext_log_msg *msg;
Harald Weltecd877f12016-12-23 20:04:27 +010026 const char *file = NULL, *fmt;
27 unsigned int num_args;
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +020028
29 if (len < sizeof(struct ext_log_msg)) {
Harald Welte4359a482016-12-23 23:56:26 +010030 printf("too short ext_log_msg.\n");
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +020031 return -1;
32 }
33
34 msg = (struct ext_log_msg *) data;
Harald Weltecd877f12016-12-23 20:04:27 +010035 num_args = msg->num_args;
36 fmt = (const char *) msg->params + num_args*sizeof(msg->params[0]);
37 file = fmt + strlen(fmt) + 1;
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +020038
Harald Welte2c363752016-12-24 00:19:55 +010039 printf("MSG(%u|%s:%u): ", diag_ts_to_epoch(msg->timestamp), file, msg->line_nr);
Harald Weltecd877f12016-12-23 20:04:27 +010040 switch (num_args) {
41 case 0:
42 fputs(fmt, stdout);
43 break;
44 case 1:
45 printf(fmt, msg->params[0]);
46 break;
47 case 2:
48 printf(fmt, msg->params[0], msg->params[1]);
49 break;
50 case 3:
51 printf(fmt, msg->params[0], msg->params[1], msg->params[2]);
52 break;
53 case 4:
54 printf(fmt, msg->params[0], msg->params[1], msg->params[2], msg->params[3]);
55 break;
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +020056 }
Harald Weltecd877f12016-12-23 20:04:27 +010057 fputc('\n', stdout);
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +020058 return 0;
59}
60
Harald Weltef5d6fee2016-01-13 22:29:10 +010061/*********/
62
Harald Weltebd448582016-12-23 23:41:14 +010063static void diag_process_msg(struct diag_instance *di, struct msgb *msg)
Harald Weltef5d6fee2016-01-13 22:29:10 +010064{
Harald Weltebd448582016-12-23 23:41:14 +010065 switch (msg->l2h[0]) {
66 case DIAG_LOG_F:
Harald Weltefaea7542016-12-24 01:21:03 +010067 diag_log_handle(di, msg);
Harald Weltebd448582016-12-23 23:41:14 +010068 break;
69 case DIAG_EXT_MSG_F:
Harald Welte4359a482016-12-23 23:56:26 +010070 diag_rx_ext_msg_f(msgb_data(msg), msgb_length(msg));
Harald Weltebd448582016-12-23 23:41:14 +010071 break;
72 default:
Harald Welte2c363752016-12-24 00:19:55 +010073 printf("Got %d bytes data of unknown payload type 0x%02x: %s\n",
74 msgb_length(msg), msg->l2h[0],
75 osmo_hexdump(msgb_data(msg), msgb_length(msg)));
Harald Weltebd448582016-12-23 23:41:14 +010076 break;
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020077 }
Harald Weltebd448582016-12-23 23:41:14 +010078 msgb_free(msg);
79}
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020080
Harald Welte272b4ae2016-12-23 23:28:28 +010081static void do_configure(struct diag_instance *di)
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020082{
Harald Weltef5d6fee2016-01-13 22:29:10 +010083 static uint8_t timestamp[] = { DIAG_TS_F };
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020084 static const uint8_t enable_evt_report[] = {
Harald Weltef5d6fee2016-01-13 22:29:10 +010085 DIAG_EVENT_REPORT_F, 0x01
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020086 };
87 static const uint8_t disable_evt_report[] = {
Harald Weltef5d6fee2016-01-13 22:29:10 +010088 DIAG_EVENT_REPORT_F, 0x00
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020089 };
90 static const uint8_t extended_report_cfg[] = {
Harald Weltef5d6fee2016-01-13 22:29:10 +010091 /* command code */
92 DIAG_EXT_MSG_CONFIG_F,
93 /* sub command */
94 0x04,
95 /* subsystem ID range start */
96 0x00, 0x00,
97 /* subsystem ID range end */
98 0x00, 0x00,
99 /* pad */
100 0x00, 0x00,
101 /* array of runtime masks */
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200102 0x02, 0x00, 0x00, 0x00,
103 };
104
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200105 /* TODO: introduce a wait for response kind of method */
Harald Welte272b4ae2016-12-23 23:28:28 +0100106 diag_transmit_buf(di, timestamp, sizeof(timestamp));
Harald Weltebd448582016-12-23 23:41:14 +0100107 diag_read(di);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200108
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +0200109 /* enable|disable the event report */
110#if 0
Harald Welte272b4ae2016-12-23 23:28:28 +0100111 diag_transmit_buf(di, enable_evt_report, sizeof(enable_evt_report));
Harald Weltebd448582016-12-23 23:41:14 +0100112 diag_read(di);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100113#else
Harald Welte272b4ae2016-12-23 23:28:28 +0100114 diag_transmit_buf(di, disable_evt_report, sizeof(disable_evt_report));
Harald Weltebd448582016-12-23 23:41:14 +0100115 diag_read(di);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100116#endif
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200117
Harald Welte272b4ae2016-12-23 23:28:28 +0100118 diag_transmit_buf(di, extended_report_cfg, sizeof(extended_report_cfg));
Harald Weltebd448582016-12-23 23:41:14 +0100119 diag_read(di);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200120
Harald Weltefaea7542016-12-24 01:21:03 +0100121#if 0
Harald Weltef5d6fee2016-01-13 22:29:10 +0100122 printf("GSM\n");
123 struct msgb *msg = gen_log_config_set_mask(5, 1064);
124#if 0
125 for (int i = 0; i < 1064; i++)
126 log_config_set_mask_bit(msg, i);
127#endif
128
129 log_config_set_mask_bit(msg, LOG_GSM_RR_CONTROL_CHANNEL_PARAMS_C);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100130
Harald Weltef5d6fee2016-01-13 22:29:10 +0100131 log_config_set_mask_bit(msg, LOG_GPRS_RLC_UL_ACKNACK_PARAMS_VER2_C);
132 log_config_set_mask_bit(msg, LOG_GPRS_RLC_DL_ACKNACK_PARAMS_VER2_C);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100133 log_config_set_mask_bit(msg, LOG_EGPRS_RLC_DL_HEADER_C);
134 log_config_set_mask_bit(msg, LOG_EGPRS_RLC_UL_HEADER_C);
135
Harald Weltef5d6fee2016-01-13 22:29:10 +0100136 log_config_set_mask_bit(msg, LOG_GPRS_LLC_PERIODIC_STATS_C);
137
138 log_config_set_mask_bit(msg, LOG_GPRS_SNDCP_UL_TCP_HDR_C);
139 log_config_set_mask_bit(msg, LOG_GPRS_SNDCP_DL_TCP_HDR_C);
Harald Welte211dd6c2016-01-13 00:18:49 +0100140 log_config_set_mask_bit(msg, 546);
141 log_config_set_mask_bit(msg, 547);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100142 log_config_set_mask_bit(msg, LOG_EGPRS_MAC_UL_ACKNACK_C);
143 log_config_set_mask_bit(msg, LOG_EGPRS_MAC_DL_ACKNACK_C);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100144
Harald Welte272b4ae2016-12-23 23:28:28 +0100145 diag_transmit_msgb(di, msg);
Harald Weltebd448582016-12-23 23:41:14 +0100146 diag_read(di);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100147
148 printf("WCDMA\n");
149 msg = gen_log_config_set_mask(4, 1064);
150#if 0
151 for (int i = 0; i < 1064; i++)
152 log_config_set_mask_bit(msg, i);
153#endif
154 log_config_set_mask_bit(msg, 0x125);
155 log_config_set_mask_bit(msg, 0x126);
156 log_config_set_mask_bit(msg, 0x127);
157 log_config_set_mask_bit(msg, 0x128);
158 log_config_set_mask_bit(msg, 0x129);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100159
Harald Welte272b4ae2016-12-23 23:28:28 +0100160 diag_transmit_msgb(di, msg);
Harald Weltebd448582016-12-23 23:41:14 +0100161 diag_read(di);
Harald Weltefaea7542016-12-24 01:21:03 +0100162#else
163 diag_log_enable_all_supported(di);
164#endif
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200165}
166
167int main(int argc, char **argv)
168{
Harald Welte272b4ae2016-12-23 23:28:28 +0100169 struct diag_instance di;
Harald Welte4e06b5c2016-12-23 22:56:06 +0100170 int i;
Harald Welte272b4ae2016-12-23 23:28:28 +0100171 int rc;
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200172
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200173 if (argc < 2) {
174 printf("Invoke with %s PATH_TO_SERIAL\n",
175 argv[0]);
176 return EXIT_FAILURE;
177 }
178
Harald Welte272b4ae2016-12-23 23:28:28 +0100179 memset(&di, 0, sizeof(di));
Harald Weltebd448582016-12-23 23:41:14 +0100180 di.rx.rcvmsg = &diag_process_msg;
181 di.fd = osmo_serial_init(argv[1], 921600);
Harald Welte272b4ae2016-12-23 23:28:28 +0100182 if (di.fd < 0)
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200183 return EXIT_FAILURE;
184
Harald Welte272b4ae2016-12-23 23:28:28 +0100185 do_configure(&di);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200186
Harald Weltef5d6fee2016-01-13 22:29:10 +0100187 while (1) {
188 i++;
Harald Weltebd448582016-12-23 23:41:14 +0100189 rc = diag_read(&di);
Harald Welte272b4ae2016-12-23 23:28:28 +0100190 if (rc == -EIO)
191 break;
Harald Weltef5d6fee2016-01-13 22:29:10 +0100192#if 0
193 /* some packets need to be explicitly requested and
194 * don't appear automatically */
195 if (i % 10 == 0) {
196 struct msgb *msg = diag_gsm_make_log_pack_req(LOG_GPRS_LLC_PDU_STATS_C , 0, 0);
197 printf("Requesting LLC stats...(%s)\n", osmo_hexdump(msgb_data(msg), msgb_length(msg)));
Harald Welte272b4ae2016-12-23 23:28:28 +0100198 diag_transmit_msgb(&di, msg);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100199 }
200#endif
201
202 }
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200203}