diff -r 000000000000 -r 2b3e5ec03512 applib/dtn_ipc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applib/dtn_ipc.h Thu Apr 21 14:57:45 2011 +0100 @@ -0,0 +1,151 @@ +/* + * Copyright 2004-2006 Intel Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef DTN_IPC_H +#define DTN_IPC_H + +#include + +#ifdef __CYGWIN__ +#include +#include +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************* + * + * Internal structures and functions that implement the DTN + * IPC layer. Generally, this is not exposed to applications. + * + *************************************************************/ + +/** + * DTN IPC version. Just a simple number for now; we can refine it to + * a major/minor version later if desired. + * + * This currently cannot exceed 16 bits in width. + * + * Make sure to bump this when changing any data structures, message + * types, adding functions, etc. + */ +#define DTN_IPC_VERSION 7 + +/** + * Default api ports. The handshake port is used for initial contact + * with the daemon to establish a session, and the latter is used for + * individual sessions. + */ +#define DTN_IPC_PORT 5010 + +/** + * The maximum IPC message size (in bytes). Used primarily for + * efficiency in buffer allocation since the transport uses TCP. + */ +#define DTN_MAX_API_MSG 65536 + +/** + * State of a DTN IPC channel. + */ +struct dtnipc_handle { + int sock; ///< Socket file descriptor + int err; ///< Error code + int in_poll; ///< Flag to register a call to poll() + int debug; ///< Debug flag for channel + char buf[DTN_MAX_API_MSG]; ///< send/recv buffer + XDR xdr_encode; ///< XDR encoder + XDR xdr_decode; ///< XDR decoder + unsigned int total_sent; ///< Counter for debugging + unsigned int total_rcvd; ///< Counter for debugging +}; + +typedef struct dtnipc_handle dtnipc_handle_t; + +/** + * Type codes for api messages. + */ +typedef enum { + DTN_OPEN = 1, + DTN_CLOSE = 2, + DTN_LOCAL_EID = 3, + DTN_REGISTER = 4, + DTN_UNREGISTER = 5, + DTN_FIND_REGISTRATION = 6, + DTN_CHANGE_REGISTRATION = 7, + DTN_BIND = 8, + DTN_UNBIND = 9, + DTN_SEND = 10, + DTN_RECV = 11, + DTN_BEGIN_POLL = 12, + DTN_CANCEL_POLL = 13, + DTN_CANCEL = 14, + DTN_SESSION_UPDATE = 15 +} dtnapi_message_type_t; + +/** + * Type code to string conversion routine. + */ +const char* dtnipc_msgtoa(u_int8_t type); + +/* + * Initialize the handle structure and a new ipc session with the + * daemon. + * + * Returns 0 on success, -1 on error. + */ +int dtnipc_open(dtnipc_handle_t* handle); + +/* + * Clean up the handle. dtnipc_open must have already been called on + * the handle. + * + * Returns 0 on success, -1 on error. + */ +int dtnipc_close(dtnipc_handle_t* handle); + +/* + * Send a message over the dtn ipc protocol. + * + * Returns 0 on success, -1 on error. + */ +int dtnipc_send(dtnipc_handle_t* handle, dtnapi_message_type_t type); + +/* + * Receive a message response on the ipc channel. May block if there + * is no pending message. + * + * Sets status to the server-returned status code and returns the + * length of any reply message on success, returns -1 on internal + * error. + */ +int dtnipc_recv(dtnipc_handle_t* handle, int* status); + +/** + * Send a message and wait for a response over the dtn ipc protocol. + * + * Returns 0 on success, -1 on error. + */ +int dtnipc_send_recv(dtnipc_handle_t* handle, dtnapi_message_type_t type); + + +#ifdef __cplusplus +} +#endif + +#endif /* DTN_IPC_H */