blob: fceb9db3786b1cc40f1ac6e0011dffd57975722e [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 Weltefaea7542016-12-24 01:21:03 +010018#include "diag_log.h"
Harald Welte0e509162016-12-24 01:32:10 +010019#include "diag_msg.h"
Harald Welte84ec50f2016-12-24 10:16:00 +010020#include "protocol/protocol.h"
21#include "protocol/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 };
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020052
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020053 /* TODO: introduce a wait for response kind of method */
Harald Welte272b4ae2016-12-23 23:28:28 +010054 diag_transmit_buf(di, timestamp, sizeof(timestamp));
Harald Weltebd448582016-12-23 23:41:14 +010055 diag_read(di);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020056
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +020057 /* enable|disable the event report */
58#if 0
Harald Welte272b4ae2016-12-23 23:28:28 +010059 diag_transmit_buf(di, enable_evt_report, sizeof(enable_evt_report));
Harald Weltebd448582016-12-23 23:41:14 +010060 diag_read(di);
Harald Weltef5d6fee2016-01-13 22:29:10 +010061#else
Harald Welte272b4ae2016-12-23 23:28:28 +010062 diag_transmit_buf(di, disable_evt_report, sizeof(disable_evt_report));
Harald Weltebd448582016-12-23 23:41:14 +010063 diag_read(di);
Harald Weltef5d6fee2016-01-13 22:29:10 +010064#endif
Harald Welte6fc7f682016-12-24 10:01:28 +010065 diag_msg_config_set_rt_mask(di, MSG_SSID_LINUX_DATA, 0xffffffff);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020066
Harald Weltefaea7542016-12-24 01:21:03 +010067#if 0
Harald Weltef5d6fee2016-01-13 22:29:10 +010068 printf("GSM\n");
69 struct msgb *msg = gen_log_config_set_mask(5, 1064);
70#if 0
71 for (int i = 0; i < 1064; i++)
72 log_config_set_mask_bit(msg, i);
73#endif
74
75 log_config_set_mask_bit(msg, LOG_GSM_RR_CONTROL_CHANNEL_PARAMS_C);
Harald Weltef5d6fee2016-01-13 22:29:10 +010076
Harald Weltef5d6fee2016-01-13 22:29:10 +010077 log_config_set_mask_bit(msg, LOG_GPRS_RLC_UL_ACKNACK_PARAMS_VER2_C);
78 log_config_set_mask_bit(msg, LOG_GPRS_RLC_DL_ACKNACK_PARAMS_VER2_C);
Harald Weltef5d6fee2016-01-13 22:29:10 +010079 log_config_set_mask_bit(msg, LOG_EGPRS_RLC_DL_HEADER_C);
80 log_config_set_mask_bit(msg, LOG_EGPRS_RLC_UL_HEADER_C);
81
Harald Weltef5d6fee2016-01-13 22:29:10 +010082 log_config_set_mask_bit(msg, LOG_GPRS_LLC_PERIODIC_STATS_C);
83
84 log_config_set_mask_bit(msg, LOG_GPRS_SNDCP_UL_TCP_HDR_C);
85 log_config_set_mask_bit(msg, LOG_GPRS_SNDCP_DL_TCP_HDR_C);
Harald Welte211dd6c2016-01-13 00:18:49 +010086 log_config_set_mask_bit(msg, 546);
87 log_config_set_mask_bit(msg, 547);
Harald Weltef5d6fee2016-01-13 22:29:10 +010088 log_config_set_mask_bit(msg, LOG_EGPRS_MAC_UL_ACKNACK_C);
89 log_config_set_mask_bit(msg, LOG_EGPRS_MAC_DL_ACKNACK_C);
Harald Weltef5d6fee2016-01-13 22:29:10 +010090
Harald Welte272b4ae2016-12-23 23:28:28 +010091 diag_transmit_msgb(di, msg);
Harald Weltebd448582016-12-23 23:41:14 +010092 diag_read(di);
Harald Weltef5d6fee2016-01-13 22:29:10 +010093
94 printf("WCDMA\n");
95 msg = gen_log_config_set_mask(4, 1064);
96#if 0
97 for (int i = 0; i < 1064; i++)
98 log_config_set_mask_bit(msg, i);
99#endif
100 log_config_set_mask_bit(msg, 0x125);
101 log_config_set_mask_bit(msg, 0x126);
102 log_config_set_mask_bit(msg, 0x127);
103 log_config_set_mask_bit(msg, 0x128);
104 log_config_set_mask_bit(msg, 0x129);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100105
Harald Welte272b4ae2016-12-23 23:28:28 +0100106 diag_transmit_msgb(di, msg);
Harald Weltebd448582016-12-23 23:41:14 +0100107 diag_read(di);
Harald Weltefaea7542016-12-24 01:21:03 +0100108#else
109 diag_log_enable_all_supported(di);
110#endif
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200111}
112
113int main(int argc, char **argv)
114{
Harald Welte272b4ae2016-12-23 23:28:28 +0100115 struct diag_instance di;
Harald Welte4e06b5c2016-12-23 22:56:06 +0100116 int i;
Harald Welte272b4ae2016-12-23 23:28:28 +0100117 int rc;
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200118
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200119 if (argc < 2) {
120 printf("Invoke with %s PATH_TO_SERIAL\n",
121 argv[0]);
122 return EXIT_FAILURE;
123 }
124
Harald Welte272b4ae2016-12-23 23:28:28 +0100125 memset(&di, 0, sizeof(di));
Harald Weltebd448582016-12-23 23:41:14 +0100126 di.rx.rcvmsg = &diag_process_msg;
127 di.fd = osmo_serial_init(argv[1], 921600);
Harald Welte272b4ae2016-12-23 23:28:28 +0100128 if (di.fd < 0)
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200129 return EXIT_FAILURE;
130
Harald Welte272b4ae2016-12-23 23:28:28 +0100131 do_configure(&di);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200132
Harald Weltef5d6fee2016-01-13 22:29:10 +0100133 while (1) {
134 i++;
Harald Weltebd448582016-12-23 23:41:14 +0100135 rc = diag_read(&di);
Harald Welte272b4ae2016-12-23 23:28:28 +0100136 if (rc == -EIO)
137 break;
Harald Weltef5d6fee2016-01-13 22:29:10 +0100138#if 0
139 /* some packets need to be explicitly requested and
140 * don't appear automatically */
141 if (i % 10 == 0) {
142 struct msgb *msg = diag_gsm_make_log_pack_req(LOG_GPRS_LLC_PDU_STATS_C , 0, 0);
143 printf("Requesting LLC stats...(%s)\n", osmo_hexdump(msgb_data(msg), msgb_length(msg)));
Harald Welte272b4ae2016-12-23 23:28:28 +0100144 diag_transmit_msgb(&di, msg);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100145 }
146#endif
147
148 }
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200149}