blob: b17106d2f0ee5b2ed75798231a74b25babef692b [file] [log] [blame]
Harald Welte0e509162016-12-24 01:32:10 +01001
2#include <stdlib.h>
3#include <stdio.h>
4#include <string.h>
5
6#include <osmocom/core/msgb.h>
Harald Welte6fc7f682016-12-24 10:01:28 +01007#include <osmocom/core/bit16gen.h>
8#include <osmocom/core/bit32gen.h>
Harald Welte0e509162016-12-24 01:32:10 +01009
Harald Welte84ec50f2016-12-24 10:16:00 +010010#include "protocol/protocol.h"
Harald Welte0e509162016-12-24 01:32:10 +010011#include "diag_msg.h"
Harald Welte84ec50f2016-12-24 10:16:00 +010012#include "protocol/diagcmd.h"
Harald Welte0e509162016-12-24 01:32:10 +010013
Harald Welte6fc7f682016-12-24 10:01:28 +010014struct diag_set_rt_mask_req {
15 uint8_t cmd_code;
16 uint8_t sub_cmd;
17 uint16_t ssid_start;
18 uint16_t ssid_end;
19 uint16_t _pad;
20 uint32_t runtime_mask[1];
21};
22
23#define MSG_EXT_SUBCMD_SET_RT_MASK 4
24
25struct msgb *gen_msg_config_set_rt_mask(uint16_t ssid, uint32_t runtime_mask)
26{
27 struct msgb *msg = msgb_alloc(DIAG_MAX_REQ_SIZE, "Diag Msg Config");
28 struct diag_set_rt_mask_req *dsrmr;
29
30 msg->l2h = msgb_put(msg, sizeof(*dsrmr));
31 dsrmr = (struct diag_set_rt_mask_req *) msg->l2h;
32 dsrmr->cmd_code = DIAG_EXT_MSG_CONFIG_F;
33 dsrmr->sub_cmd = MSG_EXT_SUBCMD_SET_RT_MASK;
34 osmo_store16le(ssid, &dsrmr->ssid_start);
35 osmo_store16le(ssid, &dsrmr->ssid_end);
36 osmo_store32le(runtime_mask, &dsrmr->runtime_mask[0]);
37
38 return msg;
39}
40
41int diag_msg_config_set_rt_mask(struct diag_instance *di, uint16_t ssid, uint32_t runtime_mask)
42{
43 struct msgb *msg = gen_msg_config_set_rt_mask(ssid, runtime_mask);
44 diag_transmit_msgb(di, msg);
45 diag_read(di);
46
47 return 0;
48}
Harald Welte0e509162016-12-24 01:32:10 +010049
50/* handler for EXT MSG */
51int diag_rx_ext_msg_f(struct diag_instance *di, struct msgb *msgb)
52{
53 const uint8_t *data = msgb_data(msgb);
54 const size_t len = msgb_length(msgb);
55 const struct ext_log_msg *msg;
56 const char *file = NULL, *fmt;
57 unsigned int num_args;
58
59 if (len < sizeof(struct ext_log_msg)) {
60 printf("too short ext_log_msg.\n");
61 return -1;
62 }
63
64 msg = (struct ext_log_msg *) data;
65 num_args = msg->num_args;
66 fmt = (const char *) msg->params + num_args*sizeof(msg->params[0]);
67 file = fmt + strlen(fmt) + 1;
68
69 printf("MSG(%u|%s:%u): ", diag_ts_to_epoch(msg->timestamp), file, msg->line_nr);
70 switch (num_args) {
71 case 0:
72 fputs(fmt, stdout);
73 break;
74 case 1:
75 printf(fmt, msg->params[0]);
76 break;
77 case 2:
78 printf(fmt, msg->params[0], msg->params[1]);
79 break;
80 case 3:
81 printf(fmt, msg->params[0], msg->params[1], msg->params[2]);
82 break;
83 case 4:
84 printf(fmt, msg->params[0], msg->params[1], msg->params[2], msg->params[3]);
85 break;
86 }
87 fputc('\n', stdout);
88 return 0;
89}
90
91