The Protean Protocol Prototyping Library (ProtoLib) is a cross-platform C/C++ library that allows applications to be built while supporting a variety of platforms including Linux, Windows, WinCE/PocketPC, MacOS, FreeBSD, Solaris, etc as well as the simulation environments of NS2 and Opnet.

Overview

Protolib is not so much a library as it is a toolkit. "Protokit" is a term we have gravitated towards. In either case, the goal of the Protolib is to provide a set of simple, cross-platform C++ classes that allow development of network protocols and applications that can run on different platforms and in network simulation environments. While Protolib provides an overall framework for developing working protocol implementations, applications, and simulation modules, the individual classes are designed for use as stand-alone components when possible. Although Protolib is principally for research purposes, the code has been constructed to provide robust, efficient performance and adaptability to real applications. In some cases, the code consists of data structures, etc useful in protocol implementations and, in other cases, provides common, cross-platform interfaces to system services and functions (e.g., sockets, timers, routing tables, etc).

Currently Protolib supports most Unix platforms (including MacOS X) and WIN32 platforms. The most recent version also supports building Protolib-based code for the ns-2 and OPNET simulation environments. Some code is also provided to allow code based on Protolib to be used in a wxWidgets application. The wxWidgets project is a cross-platform graphical user interface (GUI) toolkit for creating applications using the C++ programming language. We have used that wxWidgets for providing graphical user interfaces for some of our prototype network applications.

Some of the Classes Available

This table provides a listing and explanation of many of the classes contained in Protolib. Work is in progress to create and embed Doxygen-based documentation within the Protolib source code tree.

ProtoAddress
Network address container class with support for IPv4, IPv6, ETH, and "SIM" address types. Also includes functions for name/address resolution.
ProtoSocket
Network socket container class that provides consistent interface for use of operating system (or simulation environment) transport sockets. Provides support for synchronous notification to ProtoSocket::Listeners. The ProtoSocket class may be used stand-alone, or with other classes described below. A ProtoSocket may be instantiated as either a UDP or TCP socket.
ProtoTimer
This is a generic timer class which will notify a ProtoTimer::Listener upon timeout.
ProtoTimerMgr
This class manages ProtoTimer instances when they are "activated". The ProtoDispatcher(see below) derives from this to manage ProtoTimers for an application. (The ProtoSimAgent base class contains a ProtoTimerMgr to similarly manage timers for a simulation instance).
ProtoTree
Flexible implementation of a Patricia tree data structure. Includes a ProtoTree::Item which may be derived from or used as a container for whatever data structures and application may require.
ProtoRouteTable
Class based on the ProtoTree Patricia tree to store routing table information. Uses the ProtoAddress class to store network routing addresses. It's a pretty dumbed-down routing table at the moment, but may be enhanced in the future. Example use of the ProtoTree.
ProtoRouteMgr
Base class used to provide a common interface to system (or other external) router tables. Implementations for Linux, BSD (incl. MacOS), and Win32/WinCE are included. Implementations for other routing/forwarding daemons like Quagga or Xorp may be provided in the future.
ProtoPkt
Base class for a suite of network protocol packet/message building/parsing classes that provide methods for setting/getting protocol field values to/from a buffer.
ProtoPktIP
Classes are provided for building/parsing IPv4 and IPv6 packets to/from a buffer space. A ProtoPktUDP class is also provided.
ProtoPktRTP
Useful for building/parsing Real-Time Protocol (RTP), RFC3550, messages.
ProtoGraph
Base class for managing graph data structures.
ManetMsg
Class that implements the General packet format being developed by the IETF MANET working group (based on ProtoPkt).
ManetGraph
Derived from ProtoGraph and uses ProtoAddress structures to provide a suitable graph structure for keeping and exploring multi-hop network state. Supports a notion of multiple interfaces per node, etc.
ProtoBitmask
Classes for managing and manipulating bitmasks to maintain binary state. A "sliding" bitmask class is provided that uses a circular buffer approach to maintain continuing, sequenced state.
ProtoXml
Classes for parsing and creating XML content.
ProtoPipe
Socket-like mechanism (with both datagram and stream support) useful for interprocess communications (uses Unix domain sockets on Unix, other stuff on Win32 & WinCE)
ProtoCap
Interface class for raw MAC-layer packet capture. Platform implementations of this class vary including a "libpcap" based implementation.
ProtoDetour
Inbound/outbound packet _interception_ class. Platform implementations vary ... but generally leverages system firewall interfaces. A Win32 version based around NDIS intermediate driver is in progress.
ProtoChannel
Base class for hooking into asynchronous I/O (via Unix file descriptors or Win32 HANDLEs). Used as base class for ProtoPipe, ProtoDetour, ProtoCap, etc (ProtoSocket is currently an exception here because of distinction of SOCKETs vs. HANDLEs on Win32 platforms - This may be revisited in the future).
ProtoDispatcher
This class provides a core around which Unix and Win32 applications using Protolib can be implemented. It's "Run()" method provides a "main loop" which uses the "select()" system call on Unix and the similar "MsgWaitForMultipleObjectsEx()" system call on Win32. It is planned to eventually provide some built-in support for threading in the future (e.g. the ProtoDispatcher::Run() method might execute in a thread, dispatching events to a parent thread).
ProtoApp
Provides a base class for implementing Protolib-based command-line applications. Note that "ProtoApp" and "ProtoSimAgent" are designed such that subclasses can be derived from either to reuse the same code in either a real-world applications or as an "agent" (entity) within a network simulation environment (e.g. ns-2, OPNET). Also note a built-in "background" command is included for Win32 to launch the app without a terminal window.
wxProtoApp
Base class that can be used to create applications using Protolib components and the wxWidgets GUI toolkit.
ProtoSimAgent
Base class for simulation agent derivations. Currently an ns-2 agent base class is derived from this, but it is possible that other simulation environments (e.g. OPNET, Qualnet) might be supported in a similar fashion.
NsProtoSimAgent
Simulation agent base class for creating ns-2 instantiations of Protolib-based network protocols and applications.
OpnetProtoSimProcess
Simulation process base class for creating OPNET instantiations of Protolib-based network protocols and applications.
ProtoExample
Example class which derives either from ProtoApp or NsProtoSimAgent, depending upon compile-time macro definitions. It provides equivalent functionality in either the simulation environment or as a real-world command-line application. It demonstrates the use/operation of ProtoSocket based UDP transmission/reception, a ProtoTimer, and an example ProtoSocket-based TCP client-server exchange. (NOTE: Protolib TCP operation is not yet supported in the ns-2 simulation environment. This will completed in the near future. The plan is to extend ns-2 TCP agents to support actual transfer of user data to support this.)

Downloads

Protolib source code is available at: http://downloads.pf.itd.nrl.navy.mil/protolib. However, it is important to note that the tarballs (other than the "nightly build") are not updated very often and the appropriate version of the Protolib source tree is generally packaged as part of source code distributions for stable releases of other NRL/Protean products.

Contact Info

If you are interested in more information about ProtoLib, please contact protolib_info@nrl.navy.mil.