view rvinterf/lowlevel/clientcmd.c @ 395:8891c3d0c68a

fc-loadtool: pass abb[rw] commands through to loadagent
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Wed, 11 Jun 2014 17:49:13 +0000
parents cb833ff54d88
children 2682003dcba7
line wrap: on
line source

/*
 * This rvinterf module implements the handling of client commands.
 */

#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h>
#include "../include/pktmux.h"
#include "../include/limits.h"
#include "../include/localsock.h"
#include "client.h"

void
process_msg_from_client(cli)
	struct client *cli;
{
	int c;
	char logmsg[128];

	switch (cli->rx_buf[0]) {
	case CLI2RVI_WANT_RVTRACE:
		if (cli->rx_msglen != 9) {
			send_local_msg_to_client(cli, "-Bad command length");
			return;
		}
		c = cli->int_rvt_count;
		if (c >= MAX_RVT_INTEREST) {
			send_local_msg_to_client(cli,
					"-Error: too many RVT interests");
			return;
		}
		cli->int_rvt_mask[c] = cli->rx_buf[1] << 24 |
					cli->rx_buf[2] << 16 |
					cli->rx_buf[3] << 8 | cli->rx_buf[4];
		cli->int_rvt_match[c] = cli->rx_buf[5] << 24 |
					cli->rx_buf[6] << 16 |
					cli->rx_buf[7] << 8 | cli->rx_buf[8];
#if 0
		sprintf(logmsg,
		"*** Client program interested in RVT mask %08X match %08X",
			cli->int_rvt_mask[c], cli->int_rvt_match[c]);
		output_line(logmsg);
#endif
		cli->int_rvt_count++;
		send_local_msg_to_client(cli, "+OK");
		return;
	case CLI2RVI_WANT_MUXPROTO:
		if (cli->rx_msglen != 2) {
			send_local_msg_to_client(cli, "-Bad command length");
			return;
		}
		if (cli->rx_buf[1] < 0x12 || cli->rx_buf[1] > 0x18) {
			send_local_msg_to_client(cli,
					"-Unsupported protocol MUX value");
			return;
		}
#if 0
		sprintf(logmsg,
			"*** Client program interested in MUX proto %02X",
			cli->rx_buf[1]);
		output_line(logmsg);
#endif
		cli->int_proto[cli->rx_buf[1] - 0x12] = 1;
		send_local_msg_to_client(cli, "+OK");
		return;
	case CLI2RVI_RESET_PACKET_RX:
		cli->int_rvt_count = 0;
		bzero(cli->int_proto, sizeof(cli->int_proto));
		send_local_msg_to_client(cli, "+OK");
		return;
	case CLI2RVI_PKT_TO_TARGET:
		c = cli->rx_msglen - 1;
		if (c < 1 || c > MAX_PKT_TO_TARGET) {
			send_local_msg_to_client(cli,
						 "-Invalid Tx packet length");
			return;
		}
		send_pkt_to_target(cli->rx_buf + 1, c);
		log_sent_packet(cli->rx_buf + 1, c);
		return;
	case CLI2RVI_RAWBYTES_TO_TARGET:
		/* To be implemented */
	default:
		send_local_msg_to_client(cli, "-Unimplemented command");
	}
}