blob: c432d547fb57f0686b759f84867fa1a12ab21365 [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 Welte0e509162016-12-24 01:32:10 +010020#include "diag_msg.h"
Harald Weltef5d6fee2016-01-13 22:29:10 +010021#include "diagcmd.h"
Harald Welte211dd6c2016-01-13 00:18:49 +010022
Harald Weltef5d6fee2016-01-13 22:29:10 +010023/*********/
24
Harald Weltebd448582016-12-23 23:41:14 +010025static void diag_process_msg(struct diag_instance *di, struct msgb *msg)
Harald Weltef5d6fee2016-01-13 22:29:10 +010026{
Harald Weltebd448582016-12-23 23:41:14 +010027 switch (msg->l2h[0]) {
28 case DIAG_LOG_F:
Harald Weltefaea7542016-12-24 01:21:03 +010029 diag_log_handle(di, msg);
Harald Weltebd448582016-12-23 23:41:14 +010030 break;
31 case DIAG_EXT_MSG_F:
Harald Welte0e509162016-12-24 01:32:10 +010032 diag_rx_ext_msg_f(di, msg);
Harald Weltebd448582016-12-23 23:41:14 +010033 break;
34 default:
Harald Welte2c363752016-12-24 00:19:55 +010035 printf("Got %d bytes data of unknown payload type 0x%02x: %s\n",
36 msgb_length(msg), msg->l2h[0],
37 osmo_hexdump(msgb_data(msg), msgb_length(msg)));
Harald Weltebd448582016-12-23 23:41:14 +010038 break;
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020039 }
Harald Weltebd448582016-12-23 23:41:14 +010040 msgb_free(msg);
41}
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020042
Harald Welte272b4ae2016-12-23 23:28:28 +010043static void do_configure(struct diag_instance *di)
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020044{
Harald Weltef5d6fee2016-01-13 22:29:10 +010045 static uint8_t timestamp[] = { DIAG_TS_F };
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020046 static const uint8_t enable_evt_report[] = {
Harald Weltef5d6fee2016-01-13 22:29:10 +010047 DIAG_EVENT_REPORT_F, 0x01
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020048 };
49 static const uint8_t disable_evt_report[] = {
Harald Weltef5d6fee2016-01-13 22:29:10 +010050 DIAG_EVENT_REPORT_F, 0x00
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020051 };
52 static const uint8_t extended_report_cfg[] = {
Harald Weltef5d6fee2016-01-13 22:29:10 +010053 /* command code */
54 DIAG_EXT_MSG_CONFIG_F,
55 /* sub command */
56 0x04,
57 /* subsystem ID range start */
58 0x00, 0x00,
59 /* subsystem ID range end */
60 0x00, 0x00,
61 /* pad */
62 0x00, 0x00,
63 /* array of runtime masks */
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020064 0x02, 0x00, 0x00, 0x00,
65 };
66
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020067 /* TODO: introduce a wait for response kind of method */
Harald Welte272b4ae2016-12-23 23:28:28 +010068 diag_transmit_buf(di, timestamp, sizeof(timestamp));
Harald Weltebd448582016-12-23 23:41:14 +010069 diag_read(di);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020070
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +020071 /* enable|disable the event report */
72#if 0
Harald Welte272b4ae2016-12-23 23:28:28 +010073 diag_transmit_buf(di, enable_evt_report, sizeof(enable_evt_report));
Harald Weltebd448582016-12-23 23:41:14 +010074 diag_read(di);
Harald Weltef5d6fee2016-01-13 22:29:10 +010075#else
Harald Welte272b4ae2016-12-23 23:28:28 +010076 diag_transmit_buf(di, disable_evt_report, sizeof(disable_evt_report));
Harald Weltebd448582016-12-23 23:41:14 +010077 diag_read(di);
Harald Weltef5d6fee2016-01-13 22:29:10 +010078#endif
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020079
Harald Welte272b4ae2016-12-23 23:28:28 +010080 diag_transmit_buf(di, extended_report_cfg, sizeof(extended_report_cfg));
Harald Weltebd448582016-12-23 23:41:14 +010081 diag_read(di);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020082
Harald Weltefaea7542016-12-24 01:21:03 +010083#if 0
Harald Weltef5d6fee2016-01-13 22:29:10 +010084 printf("GSM\n");
85 struct msgb *msg = gen_log_config_set_mask(5, 1064);
86#if 0
87 for (int i = 0; i < 1064; i++)
88 log_config_set_mask_bit(msg, i);
89#endif
90
91 log_config_set_mask_bit(msg, LOG_GSM_RR_CONTROL_CHANNEL_PARAMS_C);
Harald Weltef5d6fee2016-01-13 22:29:10 +010092
Harald Weltef5d6fee2016-01-13 22:29:10 +010093 log_config_set_mask_bit(msg, LOG_GPRS_RLC_UL_ACKNACK_PARAMS_VER2_C);
94 log_config_set_mask_bit(msg, LOG_GPRS_RLC_DL_ACKNACK_PARAMS_VER2_C);
Harald Weltef5d6fee2016-01-13 22:29:10 +010095 log_config_set_mask_bit(msg, LOG_EGPRS_RLC_DL_HEADER_C);
96 log_config_set_mask_bit(msg, LOG_EGPRS_RLC_UL_HEADER_C);
97
Harald Weltef5d6fee2016-01-13 22:29:10 +010098 log_config_set_mask_bit(msg, LOG_GPRS_LLC_PERIODIC_STATS_C);
99
100 log_config_set_mask_bit(msg, LOG_GPRS_SNDCP_UL_TCP_HDR_C);
101 log_config_set_mask_bit(msg, LOG_GPRS_SNDCP_DL_TCP_HDR_C);
Harald Welte211dd6c2016-01-13 00:18:49 +0100102 log_config_set_mask_bit(msg, 546);
103 log_config_set_mask_bit(msg, 547);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100104 log_config_set_mask_bit(msg, LOG_EGPRS_MAC_UL_ACKNACK_C);
105 log_config_set_mask_bit(msg, LOG_EGPRS_MAC_DL_ACKNACK_C);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100106
Harald Welte272b4ae2016-12-23 23:28:28 +0100107 diag_transmit_msgb(di, msg);
Harald Weltebd448582016-12-23 23:41:14 +0100108 diag_read(di);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100109
110 printf("WCDMA\n");
111 msg = gen_log_config_set_mask(4, 1064);
112#if 0
113 for (int i = 0; i < 1064; i++)
114 log_config_set_mask_bit(msg, i);
115#endif
116 log_config_set_mask_bit(msg, 0x125);
117 log_config_set_mask_bit(msg, 0x126);
118 log_config_set_mask_bit(msg, 0x127);
119 log_config_set_mask_bit(msg, 0x128);
120 log_config_set_mask_bit(msg, 0x129);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100121
Harald Welte272b4ae2016-12-23 23:28:28 +0100122 diag_transmit_msgb(di, msg);
Harald Weltebd448582016-12-23 23:41:14 +0100123 diag_read(di);
Harald Weltefaea7542016-12-24 01:21:03 +0100124#else
125 diag_log_enable_all_supported(di);
126#endif
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200127}
128
129int main(int argc, char **argv)
130{
Harald Welte272b4ae2016-12-23 23:28:28 +0100131 struct diag_instance di;
Harald Welte4e06b5c2016-12-23 22:56:06 +0100132 int i;
Harald Welte272b4ae2016-12-23 23:28:28 +0100133 int rc;
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200134
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200135 if (argc < 2) {
136 printf("Invoke with %s PATH_TO_SERIAL\n",
137 argv[0]);
138 return EXIT_FAILURE;
139 }
140
Harald Welte272b4ae2016-12-23 23:28:28 +0100141 memset(&di, 0, sizeof(di));
Harald Weltebd448582016-12-23 23:41:14 +0100142 di.rx.rcvmsg = &diag_process_msg;
143 di.fd = osmo_serial_init(argv[1], 921600);
Harald Welte272b4ae2016-12-23 23:28:28 +0100144 if (di.fd < 0)
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200145 return EXIT_FAILURE;
146
Harald Welte272b4ae2016-12-23 23:28:28 +0100147 do_configure(&di);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200148
Harald Weltef5d6fee2016-01-13 22:29:10 +0100149 while (1) {
150 i++;
Harald Weltebd448582016-12-23 23:41:14 +0100151 rc = diag_read(&di);
Harald Welte272b4ae2016-12-23 23:28:28 +0100152 if (rc == -EIO)
153 break;
Harald Weltef5d6fee2016-01-13 22:29:10 +0100154#if 0
155 /* some packets need to be explicitly requested and
156 * don't appear automatically */
157 if (i % 10 == 0) {
158 struct msgb *msg = diag_gsm_make_log_pack_req(LOG_GPRS_LLC_PDU_STATS_C , 0, 0);
159 printf("Requesting LLC stats...(%s)\n", osmo_hexdump(msgb_data(msg), msgb_length(msg)));
Harald Welte272b4ae2016-12-23 23:28:28 +0100160 diag_transmit_msgb(&di, msg);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100161 }
162#endif
163
164 }
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200165}