goto err;
}
forb_proto_send(peer, codec);
-err:
forb_peer_put(peer);
+err:
+ ;
}
static void
-process_request(forb_port_t *port, CDR_Codec *codec)
+process_request(forb_port_t *port, CDR_Codec *codec, uint32_t message_size)
{
forb_iop_request_header request_header;
CORBA_boolean ret;
struct forb_env env;
CDR_Codec reply_codec;
forb_exec_req_t *exec_req;
-
+ uint32_t req_size, data_size, header_size;
+
+ data_size = CDR_data_size(codec);
ret = forb_iop_request_header_deserialize(codec, &request_header);
if (!ret) {
ul_logerr("Malformed request recevied\n");
env.major = FORB_EX_COMM_FAILURE;
goto out;
- }
+ }
+ header_size = data_size - CDR_data_size(codec);
+ req_size = message_size - header_size;
+
+ ul_logdeb("rcvd request: id=%u, iface=%s, method=%hd\n",
+ request_header.request_id,
+ request_header.iface,
+ request_header.method_index);
obj = forb_key_to_object(forb, request_header.objkey);
if (!obj) {
exec_req->source = request_header.source;
exec_req->obj = obj;
exec_req->method_index = request_header.method_index;
- #warning TODO
- /* exec_req->codec = ....; */
+ /* Copy the request to exec_req */
+ CDR_codec_init_static(&exec_req->codec);
+ ret = CDR_buffer_init(&exec_req->codec,
+ req_size,
+ 0);
+ if (!ret) {
+ env.major = FORB_EX_NO_MEMORY;
+ ul_logerr("No memory for executor request bufer\n");
+ goto send_execption;
+ }
+ exec_req->codec.data_endian = codec->data_endian;
+ CDR_buffer_gets(codec, exec_req->codec.buffer, req_size);
+ /* TODO: Use better data structure for incomming
+ buffer to achieve zero-copy behaviour. */
forb_exec_req_ins_tail(obj->executor, exec_req);
} else {
env.major = FORB_EX_NO_MEMORY;
forb_iop_reply_header rh;
forb_t *forb = port->forb;
forb_request_t *req;
-
+
forb_iop_reply_header_deserialize(codec, &rh);
req = forb_request_find(forb, &rh.request_id);
if (!req) {
/* printf("Hello received at port %p\n", port); */
forb_server_id_deserialize(codec, &server_id);
+ {
+ char str[60];
+ ul_logdeb("rcvd hello from %s\n", forb_server_id_to_string(str, &server_id, sizeof(str)));
+ }
if (port->proto->deserialize_addr) {
port->proto->deserialize_addr(codec, &addr);
}
}
static void
-process_message(forb_port_t *port, forb_iop_message_header *mh, CDR_Codec *codec)
+process_message(forb_port_t *port, const forb_iop_message_header *mh,
+ CDR_Codec *codec)
{
+ CORBA_long data_size = CDR_data_size(codec);
/* TODO: Check destination address, whether the message is for
* us or should be routed. */
* the message according mh.message_size. */
switch (mh->message_type) {
case forb_iop_REQUEST:
- process_request(port, codec);
+ process_request(port, codec, mh->message_size);
break;
case forb_iop_REPLY:
- process_reply(port, codec);
+ process_reply(port, codec);
break;
case forb_iop_HELLO:
- process_hello(port, codec);
+ process_hello(port, codec);
break;
default:
break;
}
+ if (CDR_data_size(codec) != data_size - mh->message_size) {
+ ul_logerr("Message handled incorrectly\n");
+ }
}
/**