blob: 05cfe59972bee5dc02804f061b758211576faf5f [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>
15
16#include "framing.h"
17#include "protocol.h"
18#include "serial.h"
19#include "config.h"
Harald Weltef5d6fee2016-01-13 22:29:10 +010020#include "diagcmd.h"
21#include "diag_gsm.h"
22#include "log_codes_gsm.h"
23#include "log_codes_wcdma.h"
Harald Weltee1d8ef92016-12-22 11:16:33 +010024#include "log_codes_qmi.h"
Harald Weltef5d6fee2016-01-13 22:29:10 +010025#include "diag_wcdma.h"
26#include "gprs_rlc.h"
27#include "gprs_mac.h"
Harald Weltee1d8ef92016-12-22 11:16:33 +010028#include "qmi_decode.h"
Harald Welte211dd6c2016-01-13 00:18:49 +010029
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020030char *DumpBYTEs(unsigned char *p, long n, int nBytesPerRow /* = 16 */, char *szLineSep /* = "\n" */, int bRaw /* = FALSE */, const char *szIndent /* = "" */)
31{
Harald Weltef5d6fee2016-01-13 22:29:10 +010032 int i;
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +020033 char szBuf[20];
34 static char szRes[4 * 1024];
35
36 szRes[0] = 0;
37
38 if(n == 0)
39 return szRes;
40
41 memset(szBuf, 0, sizeof(szBuf));
42 for(i = 0; i < n; i++)
43 {
44 if(i % nBytesPerRow == 0)
45 {
46 strcat(szRes, szIndent);
47 if(!bRaw)
48 sprintf(szRes + strlen(szRes), "%04d : ", i);
49 }
50
51 sprintf(szRes + strlen(szRes), "%02X ", p[i]);
52 szBuf[i % nBytesPerRow] = (char)((p[i] < 128 && p[i] >= ' ') ? p[i] : '.');
53
54 if((i + 1) % nBytesPerRow == 0)
55 {
56 if(bRaw)
57 sprintf(szRes + strlen(szRes), "%s", szLineSep);
58 else
59 sprintf(szRes + strlen(szRes), " %s%s", szBuf, szLineSep);
60 memset(szBuf, 0, sizeof(szBuf));
61 }
62 }
63
64 if(i % nBytesPerRow != 0)
65 {
66 if(bRaw)
67 sprintf(szRes + strlen(szRes), "%s", szLineSep);
68 else
69 {
70 n = nBytesPerRow - i % nBytesPerRow;
71 for(i = 0; i < n ; i++)
72 sprintf(szRes + strlen(szRes), " ");
73 sprintf(szRes + strlen(szRes), " %s%s", szBuf, szLineSep);
74 }
75 }
76
77 return szRes;
78}
79
Harald Welte211dd6c2016-01-13 00:18:49 +010080static int transmit_msgb(int fd, struct msgb *msg)
81{
82 int out_len, rc;
83 uint8_t packet[MAX_PACKET * 2];
84
85 out_len = frame_pack(msgb_data(msg), msgb_length(msg),
86 packet, sizeof(packet));
87 if (out_len < 0) {
88 printf("Failed to pack packet\n");
89 return -1;
90 }
91
92 rc = write(fd, packet, out_len);
93 if (rc != out_len) {
94 printf("Short write on packet.\n");
95 return -1;
96 }
97
98 msgb_free(msg);
99
100 return 0;
101}
102
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200103static int transmit_packet(int fd, const uint8_t *data, size_t data_len)
104{
105 int out_len, rc;
106 uint8_t packet[MAX_PACKET * 2];
107
108 out_len = frame_pack(data, data_len, packet, sizeof(packet));
109 if (out_len < 0) {
110 printf("Failed to pack packet\n");
111 return -1;
112 }
113
114 rc = write(fd, packet, out_len);
115 if (rc != out_len) {
116 printf("Short write on packet.\n");
117 return -1;
118 }
119
120 return 0;
121}
122
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +0200123static int dump_log(const uint8_t *data, const size_t len)
124{
125 size_t i, file_len;
126 size_t params = 0;
127 const struct ext_log_msg *msg;
128 const char *file = NULL, *log;
129 struct tm *tm;
130 time_t now;
131 const size_t str_len = len - offsetof(struct ext_log_msg, data);
132
133 time(&now);
134 tm = localtime(&now);
135
136 if (len < sizeof(struct ext_log_msg)) {
137 printf("too short log message.\n");
138 return -1;
139 }
140
141 msg = (struct ext_log_msg *) data;
142 log = (const char *) msg->data;
143
144 /*
145 * Check if it is null terminated and how many parameters it
146 * might have. This counts all '%' but doesn't take '%%' into
147 * account.
148 */
149 for (i = 0; i < str_len; ++i) {
150 if (log[i] == '%')
151 params += 1;
152 else if (log[i] == '\0' && i + 1 < str_len) {
153 file = &log[i + 1];
154 file_len = str_len - i - 1;
155 break;
156 }
157 }
158
159 if (file_len == 0 || file[file_len - 1] != '\0') {
160 printf("File too short or not null terminated\n");
161 return -2;
162 }
163
164 if (params > 3) {
165 printf("Too many parameters in the log message.\n");
166 return -1;
167 }
168
169 if (!file) {
170 printf("The file is not present..\n");
171 return -2;
172 }
173
Holger Hans Peter Freyther3b4e2e52013-05-31 09:53:59 +0200174 printf("%.2d:%.2d:%.2d %-20s: ",
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +0200175 tm->tm_hour, tm->tm_min, tm->tm_sec,
176 file);
177 printf(log, msg->params[0], msg->params[1], msg->params[2]);
178 printf("\n");
179 return 0;
180}
181
Harald Weltef5d6fee2016-01-13 22:29:10 +0100182static void handle_rr_sig_msg(struct log_hdr *lh, struct msgb *msg)
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200183{
Harald Weltef5d6fee2016-01-13 22:29:10 +0100184 struct diag_gsm_rr_msg *rm = (struct diag_gsm_rr_msg *) msgb_data(msg);
185
186 printf("RR: %02x %02x %u: %s\n", rm->chan_type, rm->msg_type,
187 rm->length, osmo_hexdump(msgb_data(msg), rm->length));
188}
189
190static void handle_rr_state_msg(struct log_hdr *lh, struct msgb *msg)
191{
192 struct diag_gsm_rr_state *rrs = (struct diag_gsm_rr_state *) msgb_data(msg);
193 printf("RR-STATE { state=%s, substate=%u, status=%u, mode=%u }\n",
194 get_value_string(diag_gsm_rr_st_vals, rrs->state)
195 , rrs->substate, rrs->status, rrs->mode);
196
197}
198
199static void handle_grr_state_msg(struct log_hdr *lh, struct msgb *msg)
200{
201 struct diag_gprs_grr_state *rrs = (struct diag_gprs_grr_state *) msgb_data(msg);
202
203 printf("GRR-STATE { active=%u, state=%s }\n", rrs->active_state,
204 get_value_string(diag_gprs_grr_st_vals, rrs->grr_state));
205}
206
207static void handle_rrc_sig_msg(struct log_hdr *lh, struct msgb *msg)
208{
209 struct diag_umts_rrc_msg *rrm = (struct diag_umts_rrc_msg *) msgb_data(msg);
210
211 printf("RRC: %u %u %u: %s\n", rrm->chan_type, rrm->rb_id, rrm->length,
212 osmo_hexdump(msgb_data(msg), rrm->length));
213}
214
215static void handle_rlc_ul_abnrml_rls(struct log_hdr *lh, struct msgb *msg)
216{
217 struct gprs_rlc_ul_abnrml_rls_counts *arc;
218 arc = (struct gprs_rlc_ul_abnrml_rls_counts *) msgb_data(msg);
219
220 printf("RLC-UL-ABNRML-RLS-COUNTS { access_reject_cnt=%u, arc_retry_cnt=%u, arc_wo_retry_cnt=%u, arc_sys_info_cnt=%u }",
221 arc->access_reject_cnt, arc->arc_retry_cnt, arc->arc_wo_retry_cnt, arc->arc_sys_info_cnt);
222}
223
224static void handle_mac_sign_msg(struct log_hdr *lh, struct msgb *msg)
225{
226 struct gprs_mac_signalling_msg *msm;
227 msm = (struct gprs_mac_signalling_msg *) msgb_data(msg);
228 printf("MAC-SIGN-MSG { chan_type=%s, msg_type=%s, msg=%s }\n",
229 get_value_string(gprs_mac_chan_type_vals, msm->chan_type),
230 get_value_string(gprs_mac_msg_type_vals, msm->msg_type),
231 osmo_hexdump(msm->msg, msm->msg_len));
232}
233
234static void handle_llc_me_info(struct log_hdr *lh, struct msgb *msg)
235{
236 struct diag_gprs_llme_info *gli;
237 gli = (struct diag_gprs_llme_info *) msgb_data(msg);
238 printf("LLC-ME-INFO { state=%s, xid_version=%u, tlli_new=0x%08x, tlli_old=0x%08x, gea=%u, key=%s }\n",
239 get_value_string(diag_gprs_llme_st_vals, gli->state), gli->xid_version,
240 gli->tlli_new, gli->tlli_old, gli->enc_alg,
241 osmo_hexdump_nospc(gli->enc_key, sizeof(gli->enc_key)));
242}
243
244static void handle_llc_pdu_stats(struct log_hdr *lh, struct msgb *msg)
245{
246 struct diag_gprs_llc_stats *gls;
247 gls = (struct diag_gprs_llc_stats *) msgb_data(msg);
248 printf("LLC-PDU-STATS-ACK { sap=%u, l3pdu_tx=%u, octet_tx=%u, octet_retrans=%u, l3pdu_rx=%u, octet_rx=%u }\n",
249 gls->sapi, gls->ack_l3pdu_tx, gls->ack_octet_tx, gls->ack_l3pdu_retrans, gls->ack_l3pdu_rx, gls->ack_octet_rx);
250 printf("LLC-PDU-STATS-UNACK { sapi=%u, l3pdu_tx=%u, octet_tx=%u, l3pdu_rx=%u, octet_rx=%u }\n",
251 gls->sapi, gls->unack_l3pdu_tx, gls->unack_octet_tx, gls->unack_l3pdu_rx, gls->unack_octet_rx);
252 printf("LLC-PDU-STATS-LLPDU { tx=%u, rx=%u, fcs_err=%u, frm_rej=%u, tlli_err=%u, addr_err=%u, short_err=%u }\n",
253 gls->llpdu_tx, gls->llpdu_rx, gls->llpdu_fcs_err, gls->llpdu_frm_rej, gls->llpdu_tlli_err, gls->llpdu_addr_err, gls->llpdu_short_err);
254}
255
256static void handle_mac_state(struct log_hdr *lh, struct msgb *msg)
257{
258 struct gprs_mac_state_change *msc;
259 msc = (struct gprs_mac_state_change *) msgb_data(msg);
260 const char *name = "";
261
262 switch (msc->mac_mode) {
263 case NULL_MODE:
264 name = get_value_string(gprs_mac_null_substate_vals, msc->mac_null_fsm_state);
265 break;
266 case IDLE_MODE:
267 name = get_value_string(gprs_mac_idle_substate_vals, msc->mac_idle_fsm_state);
268 break;
269 case TRANSFER_MODE:
270 name = get_value_string(gprs_mac_transfer_substate_vals, msc->mac_transfer_fsm_state);
271 break;
272 }
273
274 printf("MAC-STATE { mode=%s, state=%s }\n",
275 get_value_string(gprs_mac_mode_vals, msc->mac_mode), name);
276}
277
278static void handle_mac_dl_tbf_est(struct log_hdr *lh, struct msgb *msg)
279{
280 struct gprs_mac_dl_tbf_est *dte;
281 dte = (struct gprs_mac_dl_tbf_est *) msgb_data(msg);
282
283 printf("MAC-DL-TBF-EST { tfi=%u, rlc_mode=%u, dl_ts_bmap=0x%x, is_egprs=%u, egprs_win_size=%u, egprs_link_qual_mode=%u, bep_period2=%u }\n",
284 dte->dl_tfi, dte->rlc_mode, dte->dl_ts_bmap, dte->is_egprs_tbf, dte->egprs_win_size, dte->egprs_link_qual_mode, dte->bep_period2);
285}
286
287static void handle_mac_ul_tbf_est(struct log_hdr *lh, struct msgb *msg)
288{
289 struct gprs_mac_ul_tbf_est *ute;
290 ute = (struct gprs_mac_ul_tbf_est *) msgb_data(msg);
291
292 printf("MAC-UL-TBF-EST { tbf_req_cause=%u, acc_granted=%u, radio_prio=%u, peak_tput=%u, ul_tfi=%u, rlc_mode=%u, ul_ts_bmap=0x%x, is_egprs=%u, egprs_win_size=%u, resegment=%u, bep_period2=%u }\n",
293 ute->tbf_req_cause, ute->acc_granted, ute->radio_prio, ute->peak_tput, ute->ul_tfi, ute->rlc_mode, ute->ul_ts_bmap, ute->is_egprs_tbf, ute->egprs_win_size, ute->resegment, ute->bep_period2);
294}
295
Harald Welte97d30422016-12-19 21:18:06 +0100296static void handle_mac_dl_tbf_rel(struct log_hdr *lh, struct msgb *msg)
297{
298 struct gprs_mac_tbf_release *tr;
299 tr = (struct gprs_mac_tbf_release *) msgb_data(msg);
300
301 printf("MAC-DL-TBF-REL { tfi=%u, fail_cause=%u }\n", tr->tfi, tr->fail_cause);
302}
303
304static void handle_mac_ul_tbf_rel(struct log_hdr *lh, struct msgb *msg)
305{
306 struct gprs_mac_tbf_release *tr;
307 tr = (struct gprs_mac_tbf_release *) msgb_data(msg);
308
309 printf("MAC-DL-TBF-REL { tfi=%u, fail_cause=%u }\n", tr->tfi, tr->fail_cause);
310}
311
Harald Weltef5d6fee2016-01-13 22:29:10 +0100312static void handle_rlc_ul_evt_cnt(struct log_hdr *lh, struct msgb *msg)
313{
314 struct gprs_rlc_ul_event_counts *uec;
315 uec = (struct gprs_rlc_ul_event_counts *) msgb_data(msg);
316
317 printf("RLC-UL-EVT-CNT { llc_event_cnt=%u, mac_event_cnt=%u, pl1_event_cnt=%u, tmr_event_cnt=%u }\n",
318 uec->llc_event_cnt, uec->mac_event_cnt, uec->pl1_event_cnt, uec->tmr_event_cnt);
319}
320
321static void handle_rlc_ul_stats(struct log_hdr *lh, struct msgb *msg)
322{
323 struct gprs_rlc_ul_stats *uls;
324 uls = (struct gprs_rlc_ul_stats *) msgb_data(msg);
325
326 printf("RLC-UL-STATS { state=%s(%s), FIXME... }\n",
327 get_value_string(gprs_rlc_ul_state_vals, uls->rlc_ul_state),
328 get_value_string(gprs_rlc_ul_substate_vals, uls->rlc_ul_substate));
329}
330
331static void handle_rlc_dl_stats(struct log_hdr *lh, struct msgb *msg)
332{
333 struct gprs_rlc_dl_stats *dls;
334 dls = (struct gprs_rlc_dl_stats *) msgb_data(msg);
335
336 printf("RLC-DL-STATS { state=%s, FIXME... }\n",
337 get_value_string(gprs_rlc_dl_state_vals, dls->rlc_dl_state));
338}
339
340static void handle_rlc_rel(struct log_hdr *lh, struct msgb *msg)
341{
342 struct gprs_rlc_release_ind *rli;
343 rli = (struct gprs_rlc_release_ind *) msgb_data(msg);
344 char ud = 'D';
345
346 if (lh->code == LOG_GPRS_RLC_UL_RELEASE_IND_C)
347 ud ='U';
348
349 printf("RLC-%cL-RELEASE { tfi=%u, cause=%u }\n", ud, rli->tfi, rli->cause);
350}
351
352
353
354struct log_dispatch_tbl {
355 uint16_t code;
356 void (*handler)(struct log_hdr *lh, struct msgb *msg);
357};
358
359#define GSM(x) (0x5000 + x)
360#define UMTS(x) (0x4000 + x)
361
362static const struct log_dispatch_tbl log_tbl[] = {
363 { GSM(LOG_GSM_RR_SIGNALING_MESSAGE_C), handle_rr_sig_msg },
364 { GSM(LOG_GSM_RR_STATE_C), handle_rr_state_msg },
365 { GSM(LOG_GPRS_LLC_ME_INFO_C), handle_llc_me_info },
366 { GSM(LOG_GPRS_LLC_PDU_STATS_C), handle_llc_pdu_stats },
367 { GSM(LOG_GPRS_GRR_STATE_C), handle_grr_state_msg },
368 { GSM(LOG_GPRS_RLC_UL_ABNRML_RLS_COUNTS_C), handle_rlc_ul_abnrml_rls },
369 { GSM(LOG_GPRS_RLC_UL_EVENT_COUNTS_C), handle_rlc_ul_evt_cnt },
370 { GSM(LOG_GPRS_RLC_UL_RELEASE_IND_C), handle_rlc_rel },
371 { GSM(LOG_GPRS_RLC_DL_RELEASE_IND_C), handle_rlc_rel },
372 { GSM(LOG_GPRS_MAC_SIGNALLING_MESSAGE_C), handle_mac_sign_msg },
373 { GSM(LOG_GPRS_MAC_STATE_C), handle_mac_state },
374 { GSM(LOG_GPRS_MAC_DL_TBF_ESTABLISH_C), handle_mac_dl_tbf_est },
375 { GSM(LOG_GPRS_MAC_UL_TBF_ESTABLISH_C), handle_mac_ul_tbf_est },
Harald Welte97d30422016-12-19 21:18:06 +0100376 { GSM(LOG_GPRS_MAC_DL_TBF_RELEASE_C), handle_mac_dl_tbf_rel },
377 { GSM(LOG_GPRS_MAC_UL_TBF_RELEASE_C), handle_mac_ul_tbf_rel },
Harald Weltef5d6fee2016-01-13 22:29:10 +0100378 { GSM(LOG_GPRS_RLC_UL_STATS_C), handle_rlc_ul_stats },
379 { GSM(LOG_GPRS_RLC_DL_STATS_C), handle_rlc_dl_stats },
380 { UMTS(LOG_WCDMA_SIGNALING_MSG_C), handle_rrc_sig_msg },
381};
382
383static void diag_log_handle(struct msgb *msg)
384{
385 struct diag_log_hdr *dlh;
386 struct log_hdr *lh;
387 int i;
388
389 dlh = (struct diag_log_hdr *) msg->data;
390 /* FIXME: verify length */
391 msg->l3h = msgb_pull(msg, sizeof(*dlh));
392
393 lh = (struct log_hdr *) msg->l3h;
394 /* FIXME: verify length */
395 msgb_pull(msg, sizeof(*lh));
396
397 for (i = 0; i < ARRAY_SIZE(log_tbl); i++) {
398 if (log_tbl[i].code == lh->code) {
399 log_tbl[i].handler(lh, msg);
400 return;
401 }
402 }
403
404 printf("LOG(0x%04x, %"PRIu64"u, %u): %s\n", lh->code, lh->ts, lh->len,
405 osmo_hexdump(lh->data, lh->len));
Harald Weltee1d8ef92016-12-22 11:16:33 +0100406
407 uint8_t subsys = lh->code >> 12;
408
409 if (subsys == 0x01 &&
410 ((lh->code & 0xfff) >= LOG_QMI_RESERVED_CODES_BASE_C) &&
411 ((lh->code & 0xfff) <= LOG_QMI_LAST_C))
412 dump_qmi_msg(lh->data, lh->len);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100413}
414
415/*********/
416
417static int do_read(int fd)
418{
419 uint8_t buf[MAX_PACKET*2];
420 struct msgb *msg = msgb_alloc(MAX_PACKET, "DIAG Rx");
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200421 int rc;
422
423 rc = read(fd, buf, sizeof(buf));
424 if (rc <= 0 ) {
425 printf("Short read!\n");
426 exit(EXIT_FAILURE);
427 }
428
Harald Weltef5d6fee2016-01-13 22:29:10 +0100429 rc = frame_unpack(buf, rc, msgb_data(msg));
430 if (rc <= 0) {
431 msgb_free(msg);
432 return rc;
433 }
434 msg->l2h = msgb_put(msg, rc);
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +0200435
Harald Weltef5d6fee2016-01-13 22:29:10 +0100436 switch (msg->l2h[0]) {
437 case DIAG_LOG_F:
438 diag_log_handle(msg);
439 break;
440 case DIAG_EXT_MSG_F:
441 dump_log(msgb_data(msg), msgb_length(msg));
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +0200442 break;
443 default:
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200444 printf("Got %d data of payload\n", rc);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100445 printf("%s\n", DumpBYTEs(msgb_data(msg), msgb_length(msg), 16, "\n", 0, ""));
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +0200446 break;
447 };
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200448
Harald Weltef5d6fee2016-01-13 22:29:10 +0100449 msgb_free(msg);
450
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200451 return rc;
452}
453
454static void do_configure(int fd)
455{
Harald Weltef5d6fee2016-01-13 22:29:10 +0100456 static uint8_t timestamp[] = { DIAG_TS_F };
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200457 static const uint8_t enable_evt_report[] = {
Harald Weltef5d6fee2016-01-13 22:29:10 +0100458 DIAG_EVENT_REPORT_F, 0x01
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200459 };
460 static const uint8_t disable_evt_report[] = {
Harald Weltef5d6fee2016-01-13 22:29:10 +0100461 DIAG_EVENT_REPORT_F, 0x00
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200462 };
463 static const uint8_t extended_report_cfg[] = {
Harald Weltef5d6fee2016-01-13 22:29:10 +0100464 /* command code */
465 DIAG_EXT_MSG_CONFIG_F,
466 /* sub command */
467 0x04,
468 /* subsystem ID range start */
469 0x00, 0x00,
470 /* subsystem ID range end */
471 0x00, 0x00,
472 /* pad */
473 0x00, 0x00,
474 /* array of runtime masks */
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200475 0x02, 0x00, 0x00, 0x00,
476 };
477
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200478 /* TODO: introduce a wait for response kind of method */
479 transmit_packet(fd, timestamp, sizeof(timestamp));
Harald Weltef5d6fee2016-01-13 22:29:10 +0100480 do_read(fd);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200481
Holger Hans Peter Freyther93b625b2013-05-31 09:52:26 +0200482 /* enable|disable the event report */
483#if 0
484 transmit_packet(fd, enable_evt_report, sizeof(enable_evt_report));
Harald Weltef5d6fee2016-01-13 22:29:10 +0100485 do_read(fd);
486#else
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200487 transmit_packet(fd, disable_evt_report, sizeof(disable_evt_report));
Harald Weltef5d6fee2016-01-13 22:29:10 +0100488 do_read(fd);
489#endif
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200490
491 transmit_packet(fd, extended_report_cfg, sizeof(extended_report_cfg));
Harald Weltef5d6fee2016-01-13 22:29:10 +0100492 do_read(fd);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200493
Harald Weltef5d6fee2016-01-13 22:29:10 +0100494 printf("GSM\n");
495 struct msgb *msg = gen_log_config_set_mask(5, 1064);
496#if 0
497 for (int i = 0; i < 1064; i++)
498 log_config_set_mask_bit(msg, i);
499#endif
500
501 log_config_set_mask_bit(msg, LOG_GSM_RR_CONTROL_CHANNEL_PARAMS_C);
502 log_config_set_mask_bit(msg, LOG_GSM_RR_SIGNALING_MESSAGE_C);
503 log_config_set_mask_bit(msg, LOG_GSM_RR_STATE_C);
504
505 log_config_set_mask_bit(msg, LOG_GPRS_GRR_STATE_C);
506
507 log_config_set_mask_bit(msg, LOG_GPRS_RLC_UL_ABNRML_RLS_COUNTS_C);
508 log_config_set_mask_bit(msg, LOG_GPRS_RLC_UL_EVENT_COUNTS_C);
509 log_config_set_mask_bit(msg, LOG_GPRS_RLC_UL_STATS_C);
510 log_config_set_mask_bit(msg, LOG_GPRS_RLC_DL_STATS_C);
511 log_config_set_mask_bit(msg, LOG_GPRS_RLC_UL_ACKNACK_PARAMS_VER2_C);
512 log_config_set_mask_bit(msg, LOG_GPRS_RLC_DL_ACKNACK_PARAMS_VER2_C);
513 log_config_set_mask_bit(msg, LOG_GPRS_RLC_UL_RELEASE_IND_C);
514 log_config_set_mask_bit(msg, LOG_GPRS_RLC_DL_RELEASE_IND_C);
515 log_config_set_mask_bit(msg, LOG_EGPRS_RLC_DL_HEADER_C);
516 log_config_set_mask_bit(msg, LOG_EGPRS_RLC_UL_HEADER_C);
517
518 log_config_set_mask_bit(msg, LOG_GPRS_LLC_ME_INFO_C);
519 log_config_set_mask_bit(msg, LOG_GPRS_LLC_PDU_STATS_C);
520 log_config_set_mask_bit(msg, LOG_GPRS_LLC_PERIODIC_STATS_C);
521
522 log_config_set_mask_bit(msg, LOG_GPRS_SNDCP_UL_TCP_HDR_C);
523 log_config_set_mask_bit(msg, LOG_GPRS_SNDCP_DL_TCP_HDR_C);
Harald Welte211dd6c2016-01-13 00:18:49 +0100524 log_config_set_mask_bit(msg, 546);
525 log_config_set_mask_bit(msg, 547);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100526 log_config_set_mask_bit(msg, LOG_GPRS_MAC_STATE_C);
527 log_config_set_mask_bit(msg, LOG_GPRS_MAC_SIGNALLING_MESSAGE_C);
528 log_config_set_mask_bit(msg, LOG_GPRS_MAC_UL_TBF_ESTABLISH_C);
529 log_config_set_mask_bit(msg, LOG_GPRS_MAC_DL_TBF_ESTABLISH_C);
530 log_config_set_mask_bit(msg, LOG_EGPRS_MAC_UL_ACKNACK_C);
531 log_config_set_mask_bit(msg, LOG_EGPRS_MAC_DL_ACKNACK_C);
532 log_config_set_mask_bit(msg, LOG_GPRS_MAC_UL_TBF_RELEASE_C);
533 log_config_set_mask_bit(msg, LOG_GPRS_MAC_DL_TBF_RELEASE_C);
534
Harald Welte211dd6c2016-01-13 00:18:49 +0100535 transmit_msgb(fd, msg);
Harald Weltef5d6fee2016-01-13 22:29:10 +0100536 do_read(fd);
537
538 printf("WCDMA\n");
539 msg = gen_log_config_set_mask(4, 1064);
540#if 0
541 for (int i = 0; i < 1064; i++)
542 log_config_set_mask_bit(msg, i);
543#endif
544 log_config_set_mask_bit(msg, 0x125);
545 log_config_set_mask_bit(msg, 0x126);
546 log_config_set_mask_bit(msg, 0x127);
547 log_config_set_mask_bit(msg, 0x128);
548 log_config_set_mask_bit(msg, 0x129);
549 log_config_set_mask_bit(msg, LOG_WCDMA_SIGNALING_MSG_C);
550
551 transmit_msgb(fd, msg);
552 do_read(fd);
553
Harald Weltee1d8ef92016-12-22 11:16:33 +0100554
555 printf("Core\n");
556 msg = gen_log_config_set_mask(1, 1064);
557 log_config_set_mask_bit(msg, LOG_QMI_CALL_FLOW_C);
558 log_config_set_mask_bit(msg, LOG_QMI_SUPPORTED_INTERFACES_C);
559 for (int i = 0; i < 16*2; i++)
560 log_config_set_mask_bit(msg, LOG_QMI_RESERVED_CODES_BASE_C+i);
561 for (int i = LOG_QMI_RESERVED_CODES_BASE_C; i < LOG_QMI_LAST_C; i++)
562 log_config_set_mask_bit(msg, i);
563
564 transmit_msgb(fd, msg);
565 do_read(fd);
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200566}
567
568int main(int argc, char **argv)
569{
Harald Weltef5d6fee2016-01-13 22:29:10 +0100570 int flags, i;
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200571
572 int fd, rc;
573 if (argc < 2) {
574 printf("Invoke with %s PATH_TO_SERIAL\n",
575 argv[0]);
576 return EXIT_FAILURE;
577 }
578
579 /* Use nonblock as the device might block otherwise */
580 fd = open(argv[1], O_RDWR | O_NOCTTY | O_SYNC | O_NONBLOCK);
581 if (fd < 0) {
582 printf("Opening the serial failed: %d/%s\n",
583 errno, strerror(errno));
584 return EXIT_FAILURE;
585 }
586
587 flags = fcntl(fd, F_GETFL, 0);
588 if (flags < 0) {
589 printf("Failed to get the flags.\n");
590 return EXIT_FAILURE;
591 }
592
593 flags &= ~O_NONBLOCK;
594 rc = fcntl(fd, F_SETFL, flags);
595 if (rc != 0) {
596 printf("Failed to set the flags.\n");
597 return EXIT_FAILURE;
598 }
599
600 rc = serial_configure(fd);
601 if (rc != 0)
602 return EXIT_FAILURE;
603
604 do_configure(fd);
605
Harald Weltef5d6fee2016-01-13 22:29:10 +0100606 while (1) {
607 i++;
608 do_read(fd);
609#if 0
610 /* some packets need to be explicitly requested and
611 * don't appear automatically */
612 if (i % 10 == 0) {
613 struct msgb *msg = diag_gsm_make_log_pack_req(LOG_GPRS_LLC_PDU_STATS_C , 0, 0);
614 printf("Requesting LLC stats...(%s)\n", osmo_hexdump(msgb_data(msg), msgb_length(msg)));
615 transmit_msgb(fd, msg);
616 }
617#endif
618
619 }
Holger Hans Peter Freytherae73a052013-05-31 09:51:53 +0200620}