osmo-qcdiag/src/diag_cmd.c

87 lines
2.6 KiB
C

/*
* (C) 2013-2016 by Harald Welte <laforge@gnumonks.org>
*
* originally based on earlier code from Dieter Spaar and Holger
* Freyther, though by now almost entirely rewritten. Nevertheless,
* thanks to Dieter and Holger!
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <osmocom/core/gsmtap.h>
#include <osmocom/core/gsmtap_util.h>
#include "protocol/protocol.h"
#include "protocol/diagcmd.h"
#include "diag_cmd.h"
#include "diag_log.h"
#include "diag_msg.h"
/***********************************************************************
* CMD Dispatch
***********************************************************************/
static diag_cmd_handler *cmd_handlers[0xff];
/* called by individual modules to register their own decoders */
void diag_cmd_reg_dispatch(const struct diag_cmd_dispatch_tbl *tbl, unsigned int size)
{
unsigned int i;
for (i = 0; i < size; i++) {
printf("Registering CMD dispatch for 0x%02x\n", tbl[i].code);
cmd_handlers[tbl[i].code] = tbl[i].handler;
}
}
int diag_process_msg(struct diag_instance *di, struct msgb *msg)
{
uint8_t cmd = msg->l2h[0];
if (di->gsmtap) {
// process(di, msgb_l2(msg), msgb_l2len(msg));
}
switch (cmd) {
case DIAG_LOG_F:
diag_log_handle(di, msg);
msgb_free(msg);
return 1;
case DIAG_BAD_CMD_F:
fprintf(stderr, "BAD COMMAND: %s\n", msgb_hexdump(msg));
return 0;
case DIAG_BAD_PARM_F:
fprintf(stderr, "BAD PARAMETER: %s\n", msgb_hexdump(msg));
return 0;
case DIAG_BAD_LEN_F:
fprintf(stderr, "BAD LENGTH: %s\n", msgb_hexdump(msg));
return 0;
default:
if (cmd_handlers[cmd]) {
(cmd_handlers[cmd])(di, msg);
msgb_free(msg);
return 1;
} else {
/* swallow config messages */
if(msg->l2h[0] != DIAG_LOG_CONFIG_F && msg->l2h[0] != DIAG_EXT_MSG_CONFIG_F)
printf("Got %d bytes data of unknown payload type 0x%02x: %s\n",
msgb_length(msg), msg->l2h[0],
osmo_hexdump(msgb_data(msg), msgb_length(msg)));
return 0;
}
break;
}
}