Planned for 1.0 * portability: o add at least one OS other than Linux o compile with at least one compiler other than GCC - stable API (freeze code base) - advanced backend protocol capabilities (1/3): (un-)ordered send mode (i.e. for video streaming: QoS) (2/3): unicast/multicast (3/3): encryption mode - IPv6 support - write generic streaming functionality with (see IDL): o input: any struct o ouput: pack/unpack functions (C-code) - add at least one more backend o SCTP backend o job backend (simple process management) o XMMS remote control backend using libXMMS (optional: simple, but funny!) o UDP backend Changes between 0.7 and 0.8 (released 27-02-2006) - major rewrite of the design with the following aims: o no backends - instead, a peer-to-peer layout is implemented o simplified plugins (with only 4 functions) o similar user API o much cleaner interfaces (internal API) o better test-cases - though reimplemented, many parts could be reused, such as mutex pools, threading, signals, etc. - direct access to filedescriptors is made possible with the psi_getFD() call - a packet transfer protocol is not yet implemented Changes between 0.6 and 0.7 (last changed 04-10-2005 - never released!) - depends on PSIutil 1.5 - rename PSInet to PSIroads. Versioning remains the same - added likely(cond) and unlikely(cond) macros for checks (in PSIutil/typedef.h) - added -ffast-math flag to CFLAGS in Makefile - changed author email host to project-psi.org - peer_connect() function now creates a connecting client backend using the new PSI URI protocol - new backend: auth_backend handles URI requests, which contains user, passwd and hostname fields. This backend is currently inactive, though. - fixed some memleaks - socket.[ch] now moved to TCP plugin. - target hostname is now resolved on backend creation with gethostbyname(). Also, we now use a permanent connection for each peer (sethostent()) - sending behaviour changed: buffer is now partitioned into PSI_NET_BUFSIZE large blocks while sending - assuming ISO C99 conformimng compiler - i.e., gcc 3.x or higher. Hence, code like the following is allowed: for (int i=0; i < x; i++) { ... } - C++ wrapper classes implemented - connecting to services is now possible via sbe_connect(), which takes a transport backend (i.e., psi-tcp) as argument for peer communication. The target peer instance routes the request internally to service backend, and replies the backend address to the requesting backend - improved POSIX thread handling: o using condition variables for thread synchronization (PSIutil/psi_signal_*()) o pthread_detach() is called on thread cleanup - polished API (see below) - almost complete Doxygen documentation written - mutex pools implemented - peer message dispatcher: o messages can be routed to service backends o peer generic (not backend specific) services can be implemented here - fixed: COPYING updated - API changes: o kill_backend() -> be_remove() o peer and be structs now contain a thread handle, which consists of a thread ID (pthread_t), a thread attribute (pthread_attr_t) and a list of mutexes (pthread_mutex_t) o removed all receive buffer parameters (rBuf) o socket_be_create() -> socket_be_init() o plugin->proto changed to plugin->id of type 'unsigned long' o renamed net_cap_t into psi_plugin_cap_t, which now is defined for each plugin o socket_close moved to tcp_backend and renamed to be_close (plugin field) o handle_kill_chunk now static in socket.c o chunk_t struct is now psi_chunk_t: - net_types_t removed - the chunk is split into a header (16 byte) and a variable length data stream - header is defined as follows: struct chunk_header { uint16_t flags; /* chunk flags */ uint16_t req_id; /* request ID */ psi_addr_t src; /* optional - enabled by flags */ psi_addr_t dst; /* optional - enabled by flags */ uint32_t size; /* length of data stream */ }; o sendMessage() -> psi_send() (slightly changed prototype) o socket_listen_thread_main() -> be_listen_loop() (now in backend.c) o socket_recv_thread_main() -> be_recv_loop() (now in be_recv.c) o socket_send_ordered()/socket_recv_ordered() -> be_send()/be_recv() o PSIutil: 'export' keyword renamed to PSIEXPORT (for C++ compatibility) o _null_send_fn() renamed to be_null_send_fn() (now exported) o psi_be_status_t now in backend.h (was in typedef.h) o replaced callback mechanism (be->event struct) by a much simpler variant. Note, that no mutex locking is performed internally. o be_getByID() -> peer_get_be() (takes psi_addr_t as argument) o renamed some attribute macros to ATTRIBUTE_* (see PSIutil/typedef.h) - API removals: - moved puri.[ch] to PSIutil/puri.[ch]: - puri_parse() - puri_assemble() - removed io_common/io_model_pthread files. This functionality is now located in PSIutil/psi_thread.[ch]: - exit_self() - join_from_background() - detach_self() - moved some basic definitions from PSIroads/typedef.h to PSIutil/typedef.h (i.e., export keyword) - removed 'mode' field in psi_backend_t struct - handle_check_passwd() - passwd_file in peer->set struct removed - peer_addUser() removed (for now) - obsolete phfs_backend.c removed - obsolete recv_packet.[ch] files removed - moved all plugin functions to PSIutil - removed convertChunk() - removed be_*_tcp functions - removed PSI_PROTO_* macros - removed psi_proto_t type - removed psi_[dont]_free() functions (now in PSIutil/psi_thread) - removed be_cleanup() function (be_remove() handles this already) - removed (*destr)() field from psi_backend_t*, since backends are required to be malloc'ed anyway. - removed be_recv_raw() function from socket.[ch] (was not implemented) - obsolete notify_be_cleanup() removed - removed net_proto.[ch]: - killChunk() - dbgChunk() - dumpStream() - obsolete per packet compression removed (net_compress.[ch]) - rBuf struct from socket_be_t - removed options.[ch] - removed some unused macros in typedef.h - psi_net_set_t struct and psi_net_t->set field removed - CI and CI_num fields in psi_net_t struct removed - removed authCall structs from psi_net_t struct - removed psi_cleanup_file() - be->send() removed (solely using be->plugin->send()) - be_getID() and be_getTID() removed - peer_getID(), peer_getTID() and peer_getByID() removed - PSI_PROTO_ macros completely removed - psi_net_t->status field removed - removed PSI_DEFAULT_QUEUE macro - recent API additions: + peer_connect() and peer_connect2() + peer_service() and peer_service2() + peer_query_info() + peer_refresh_info_cache() + peer_get_sender() + be_is_null() + be_signal_*() + peer_signal_*() + be_signal_*() + sbe_init() + sbe_connect() + sbe_accept() + sbe_dispatch() + sbe_send() + mtx_pool_*() Changes between 0.5 and 0.6 (released 12-01-2005) - depends on PSIutil 1.4 - fixed performance regression: a nanosleep call was forgotten in a loop. - files.h added: it contains macros for files and paths - added -fvisibility=hidden flag. This causes no function to be exported, unless API functions are marked with the 'export' attribute. This pseudo-keyword is defined as __attribute__((visibility("default"))). This flag is placed into the PICFLAG in makefactory/CC by default. - some code/API cleanup: private/protected/public scheme from OOP-languages adapted into code. Not all files have been updated yet, however, the most important ones are. - PSI_PROTO_* macros removed from typedef.h. Each backend has to define its own (unique) PSI_PROTO_* macro - added Uniform Resource Identifier (puri.c/puri.h). These uniquely identify any object within the network - added req_id field into networking packets (chunks): o PSI_MODE_NEGOTIATE indicates, whether this field is used. o a message can now request an answer o maximum number of pending messages is set to 65536 o static negotiation now implemented with this field. The API, however, might change when generic, adaptive negotiation is fully implemented - socket.[ch] added: o several functions moved from backend.[ch] and recv_packet.[ch] o recv_packet.[ch] removed. o generic backend constructors/destructors added to the plugin structure o all socket backends (TCP, UNIX, ...) should inherit from socket.[ch] - null_recv_fn() and null_send_fn() set be->send()/be->recv() - be->msgQueue removed - removed deprecated and (currently) unused params/options stuff. These mechanisms will be reintroduced later again - changed buffer handling: o buffer adjustment on runtime is now forbidden (this deprecates peer->set.mss) o be->recv_buf was replaced by a struct 'rBuf' containing a data, size and destr field (similar to chunk_t). o listeners do not need a buffer o be_connect_*() and be_listen_*() functions now may be called with a static buffer as be argument. - added more logging verbosity. psi_showStats(), be_showStats(), peer_echo() and be_echo() added - psi_strm_to_uintX() and psi_uintX_to_strm() macros added for portable integer network type conversion - API changes: o createPeer() -> peer_create() o shutdownPeer() -> peer_cleanup() o psi_getPeer[T]ID() -> peer_get[T]ID() o psi_getPeerByNum() -> peer_getByID() o psi_showStats -> peer_showStats() o be_connect() -> (removed) o be_listen() -> (removed) o psi_getBE -> be_getByID() (moved from peer.[ch] to backend.[ch]) o PURI functions added: puri_parse(), puri_assemble() and puri_free() o directory backend functions: be_{listen|connect}_dir[_va]() o null backend functions: _{listen|connect}_null[_va]() o various changes in backend API (see above: buffer handling, socket_be_t) o export keyword (see above) o removed all remaining inline attributes from API calls o added psi_strm_to_uintX() macros replacing memcpy (see above) o accordingly added psi_uintX_to_strm() macros o be_setEstablish_fn() added. - major updates to backend handling methods: o Now any new protocol or backend type needs to implement certain set of methods, and return a handle associated to a certain protocol number o null_plugin added (PSI_PROTO_NULL) o file access backend type added. This enables local directory operations available with PSI_PROTO_DIR backends. This backend is yet incomplete due to missing routing/forwarding and negotiation capabilities. Changes between 0.4 and 0.5 (released 26-09-2004) - depends on PSIutil 1.3.1 or higher - bigPackets completely removed and replaced by a general receive method. See be_recv(). Also, chunk maximum size has been raised to 4 GB. - packet_t struct completely removed - rewritten negotiate / packetfilter mechanism - per packet compression now works - enable more 'debugging' : psi_showStats() dumps everything regarding a connection (backend) - event callbacks recvFilter (now pipeline) and negotiate are now implemented per backend instead of per peer - raw (TCP) send/recv mode (PSI_MODE_RAW) (overrides the PSInet protocol) - PSIutil : user/password management integration - PSIworld : much improved Makesystem - peer->backends.primary and psi_set_primary() removed, though they were unneeded - chunk_t* cloneChunk(chunk_t* src, chunk_t* dest) API call: makes a deep-copy of a chunk. If cnk->destr() is psi_free(), set it to psi_dont_free(). - cnk->destr() prototype changed from (*)(void*) to (*)(void*,uint). - PSIutil : base64 converted passwords. Note: authentication is yet deactivated - added Unix Domain Protocol support (PSI_PROTO_UNIX) - unified (thus heavily changed) backend model: o psi_connect()/psi_listen() API calls changed o psi_activate_be() call added: it takes an abstract psi_conn_t handle and plugs a backend onto a peer. o thread handling changed: Unix Domain Protocol and probably others don't need a listening thread. This case is handled by the existance of a psi_conn_t->thread() function. - psi_net_com_t struct dropped. we solely use psi_net_t structs for peer and CI representation. - peer numbering scheme added: o for every peer, the numbering ' : ' will be used, where '0 : ' represents all backends of the peer itself. o psi_getID() API call returns backend ID. o psi_getPeerID() call returns 0 or the client instance ID if an owner exists. o be_echo() call added. - makefactory/include/portable.h dropped for now. - peer/backend shutdown tweaked - detach_thread() call added - lots of gdb/valgrind failures and warnings removed - all includes were replaced by - netConsole testing console much improved. Changes between 0.3 and 0.4 (released 15-03-2004) - frontend API/model changes: we no longer have explicite server or clients, but rather 'peer' communication to each other. each peer can have backends (listener, sender, receiver) connected , which act autonomously within a peer - debugging console added (PSIutil/console) - threads now properly spawn and join - receive process rewritten: receiver now acts blocking in an own thread - removed some unneeded struct fields, i.e rcvQueue in server/client structs wasn't needed anymore - 2004 copyright added - examples in test/PSInet now use sigaction instead of signal. they also make "green" debug output - simple authentification model implemented (PSIutil/auth) - almost complete backend rewrite - backend API/model changes: now a connection object is created, then a number of connections can be plugged into it. - backend test for tcp added (needs updating)