key_e,
prng_param_e,
raw_data_e,
- status_e
- nopdu_e,
+ status_e,
+ nopdu_e
} pdu_t;
typedef struct {
int offset = 1;
comm_t *comm = NULL;
- service_t serv = NULL;
+ service_t *serv = NULL;
/* find MOREP by service name */
for (int i = 0; ((service_list + i)->service_id != noserv_e) && (serv == NULL); i++) {
service_t *s = service_list + i;
VERBOSE (morep, TRACE, PRINTF ("test %c[%s]\n", *line, s->name));
if (strncmp (line + offset, s->name, strlen (s->name)) == 0) {
comm = mode ? &(s->rx) : &(s->tx);
- serv = s->service_id;
+ serv = s;
offset += strlen (s->name);
}
}
/* find MOREP by ethertype */
- for (int j = 0; (j < nbcomms) && (comm == NULL); i++) {
+ for (int j = 0; (j < nbcomms) && (comm == NULL); j++) {
comm_t *c = comm_list + j;
VERBOSE (morep, TRACE, PRINTF ("test %c[%s]\n", c->mode ? 'T' : 'R', c->etype));
if ((strncmp (line + offset, c->etype, strlen (c->etype)) == 0) && (c->mode == mode)) {
/* get message type by name */
for (int i = 0; ((message_list + i)->service_id != noserv_e) && (msg == NULL); i++) {
message_t *m = message_list + i;
- VERBOSE (morep, TRACE, PRINT ("test %s\n", m->name));
+ VERBOSE (morep, TRACE, PRINTF ("test %s\n", m->name));
if (strncmp (line + offset, m->name, strlen (m->name)) == 0) {
msg = m;
offset += strlen (m->name);
VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s' (%d)\n", line, offset));
continue;
}
+ /* find message */
+ for (int i = 0; ((message_list + i)->service_id != noserv_e) && (msg == NULL); i++) {
+ message_t *m = message_list + i;
+ if ((m->service_id == serv->service_id) && (m->msgtype == msgtype)) {
+ msg = m;
+ }
+ }
}
/* check message and service */
- if (serv->service_id != m->service_id) {
- VERBOSE (morep, WARNING, PRINTF ("message %s is not allowed for service %S (line '%s')\n", msg->name, serv->name, line);
+ if (serv->service_id != msg->service_id) {
+ VERBOSE (morep, WARNING, PRINTF ("message %s is not allowed for service %s (line '%s')\n", msg->name, serv->name, line));
continue;
}
- msg_channel CHANNEL_t = {0};
- msg_clear_data CLEAR_DATA_t = {0};
- msg_encrypted_data ENCRYPTED_DATA_t = {0};
- msg_key KEY_t = {0};
- msg_prng_param PRNG_PARAM_t = {0};
- msg_raw_data RAW_DATA_t = {0};
- msg_status STATUS_t = {0};
+ CHANNEL_t msg_channel = {0};
+ CLEAR_DATA_t msg_clear_data = {0};
+ ENCRYPTED_DATA_t msg_encrypted_data = {0};
+ KEY_t msg_key = {0};
+ PRNG_PARAM_t msg_prng_param = {0};
+ RAW_DATA_t msg_raw_data = {0};
+ STATUS_t msg_status = {0};
int seqnum = -1;
+ int len = 0;
+ pdu_t pdu;
if (mode == 1) { /* transmit */
/* parse message */
- int rc = -1;
- switch (serv->pdu) {
+ pdu = msg->pdu;
+ switch (pdu) {
case channel_e:
- rc = parse_channel (line + offset, &msg_channel);
+ parse_channel (line + offset, &msg_channel);
break;
case clear_data_e:
- rc = parse_clear_data (line + offset, &msg_clear_data);
+ parse_clear_data (line + offset, &msg_clear_data);
break;
case encrypted_data_e:
- rc = parse_encrypted_data (line + offset, &msg_encrypted_data);
+ parse_encrypted_data (line + offset, &msg_encrypted_data);
break;
case key_e:
- rc = parse_key (line + offset, &msg_key);
+ parse_key (line + offset, &msg_key);
break;
case prng_param_e:
- rc = parse_prng_param (line + offset, &msg_prng_param);
+ parse_prng_param (line + offset, &msg_prng_param);
break;
case raw_data_e:
- rc = parse_raw_data (line + offset, &msg_raw_data);
+ parse_raw_data (line + offset, &msg_raw_data);
break;
case status_e:
- rc = parse_status (line + offset, &msg_status);
+ parse_status (line + offset, &msg_status);
break;
- }
- if (rc != 0) {
+ default:
VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s' (%d)\n", line, offset));
continue;
}
/* send message */
uint8_t payload[1496] = {0};
- int len = -1;
- switch (serv->pdu) {
+ switch (pdu) {
case channel_e:
- rc = serial_channel (&msg_channel, payload, sizeof (payload));
+ len = serial_channel (&msg_channel, payload, sizeof (payload));
break;
case clear_data_e:
- rc = serial_clear_data (&msg_clear_data, payload, sizeof (payload));
+ len = serial_clear_data (&msg_clear_data, payload, sizeof (payload));
break;
case encrypted_data_e:
- rc = serial_encrypted_data (&msg_encrypted_data, payload, sizeof (payload));
+ len = serial_encrypted_data (&msg_encrypted_data, payload, sizeof (payload));
break;
case key_e:
- rc = serial_key (&msg_key, payload, sizeof (payload));
+ len = serial_key (&msg_key, payload, sizeof (payload));
break;
case prng_param_e:
- rc = serial_prng_param (&msg_prng_param, payload, sizeof (payload));
+ len = serial_prng_param (&msg_prng_param, payload, sizeof (payload));
break;
case raw_data_e:
- rc = serial_raw_data (&msg_raw_data, payload, sizeof (payload));
+ len = serial_raw_data (&msg_raw_data, payload, sizeof (payload));
break;
case status_e:
- rc = serial_status (&msg_status, payload, sizeof (payload));
+ len = serial_status (&msg_status, payload, sizeof (payload));
break;
+ default:
+ len = 0;
}
seqnum = MOREP_Send (comm->morep, msg->msgtype, payload, len);
} else { /* receive */
- uint8_t rxmsgtype = 0;
- uint8_t rxpayload[1496] = {0};
- int rxlen = -1;
- int seqnum = MOREP_Receive (comm->morep, &rxmsgtype, rxpayload, &rxlen);
+ uint8_t msgtype = 0;
+ uint8_t payload[1496] = {0};
+ int seqnum = MOREP_Receive (comm->morep, &msgtype, payload, &len);
/* check pdu type */
- pdu_t pdu = undef_pdu_e;
- for (int i = 0; ((message_list + i)->service_id) && (pdu == undef_e); i++) {
+ pdu = undef_pdu_e;
+ for (int i = 0; ((message_list + i)->service_id) && (pdu == undef_pdu_e); i++) {
message_t *m = message_list + i;
- if ((m->service_id == serv->service_id) && (m->msgtype == rxmsgtype)) {
+ if ((m->service_id == serv->service_id) && (m->msgtype == msgtype)) {
pdu = m->pdu;
}
}
/* check msg type */
- if (rxmsgtype != msgtype) {
- VERBOSE (morep, WARNING, PRINTF ("R%sx SEQ=%d MSG=%d: expected msgtype %d\n", comm->etype, seqnum, rxmsgtype, msg->msgtype));
+ if (msgtype != msg->msgtype) {
+ VERBOSE (morep, WARNING, PRINTF ("R%sx SEQ=%d MSG=%d: expected msgtype %d\n", comm->etype, seqnum, msgtype, msg->msgtype));
}
/* deserialize message */
- int rc = -1;
switch (pdu) {
case channel_e:
- rc = deserial_channel (rxpayload, rxlen, &msg_channel);
+ deserial_channel (payload, len, &msg_channel);
break;
case clear_data_e:
- rc = deserial_clear_data (rxpayload, rxlen, &msg_clear_data);
+ deserial_clear_data (payload, len, &msg_clear_data);
break;
case encrypted_data_e:
- rc = deserial_encrypted_data (rxpayload, rxlen, &msg_encrypted_data);
+ deserial_encrypted_data (payload, len, &msg_encrypted_data);
break;
case key_e:
- rc = deserial_key (rxpayload, rxlen, &msg_key);
+ deserial_key (payload, len, &msg_key);
break;
case prng_param_e:
- rc = deserial_prng_param (rxpayload, rxlen, &msg_prng_param);
+ deserial_prng_param (payload, len, &msg_prng_param);
break;
case raw_data_e:
- rc = deserial_raw_data (rxpayload, rxlen, &msg_raw_data);
+ deserial_raw_data (payload, len, &msg_raw_data);
break;
case status_e:
- rc = deserial_status (rxpayload, rxlen, &msg_status);
+ deserial_status (payload, len, &msg_status);
break;
- }
- if (rc != 0) {
- VERBOSE (morep, WARNING, PRINTF ("can't deserialize message R%s[%02x]'\n", comm->etype, rxmsgtype));
+ default:
+ VERBOSE (morep, WARNING, PRINTF ("can't deserialize message R%s[%02x]'\n", comm->etype, msgtype));
continue;
}
/* log message */
if (log) {
fprintf (log, "%c%s[%s] SEG=%d MSG=%d LEN=%d %s ", mode ? 'T' : 'R', serv->name, comm->etype, seqnum, msg->msgtype, len, msg->name);
- char * buffer[1496 * 3 + 256] = {0};
- switch (serv->service_id) {
+ char buffer[1496 * 3 + 256] = {0};
+ switch (pdu) {
case channel_e:
- rc = serial_channel (&msg_channel, buffer, sizeof (buffer));
+ format_channel (&msg_channel, buffer, sizeof (buffer));
break;
case clear_data_e:
- rc = serial_clear_data (&msg_clear_data, buffer, sizeof (buffer));
+ format_clear_data (&msg_clear_data, buffer, sizeof (buffer));
break;
case encrypted_data_e:
- rc = serial_encrypted_data (&msg_encrypted_data, buffer, sizeof (buffer));
+ format_encrypted_data (&msg_encrypted_data, buffer, sizeof (buffer));
break;
case key_e:
- rc = serial_key (&msg_key, buffer, sizeof (buffer));
+ format_key (&msg_key, buffer, sizeof (buffer));
break;
case prng_param_e:
- rc = serial_prng_param (&msg_prng_param, buffer, sizeof (buffer));
+ format_prng_param (&msg_prng_param, buffer, sizeof (buffer));
break;
case raw_data_e:
- rc = serial_raw_data (&msg_raw_data, buffer, sizeof (buffer));
+ format_raw_data (&msg_raw_data, buffer, sizeof (buffer));
break;
case status_e:
- rc = serial_status (&msg_status, buffer, sizeof (buffer));
+ format_status (&msg_status, buffer, sizeof (buffer));
break;
+ default:
+ snprintf (buffer, sizeof (buffer), "unknown payload");
}
fprintf (log, "%s\n", buffer);
}